In the Linux kernel, the following vulnerability has been resolved:
mm: swap: fix race between free_swap_and_cache() and swapoff()
There was previously a theoretical window where swapoff() could run and teardown a swap_info_struct while a call to free_swap_and_cache() was running in another thread. This could cause, amongst other bad possibilities, swap_page_trans_huge_swapped() (called by free_swap_and_cache()) to access the freed memory for swap_map.
This is a theoretical problem and I haven't been able to provoke it from a test case. But there has been agreement based on code review that this is possible (see link below).
Fix it by using get_swap_device()/put_swap_device(), which will stall swapoff(). There was an extra check in _swap_info_get() to confirm that the swap entry was not free. This isn't present in get_swap_device() because it doesn't make sense in general due to the race between getting the reference and swapoff. So I've added an equivalent check directly in free_swap_and_cache().
Details of how to provoke one possible issue (thanks to David Hildenbrand for deriving this):
--8<-----
__swap_entry_free() might be the last user and result in "count == SWAP_HAS_CACHE".
swapoff->try_to_unuse() will stop as soon as soon as si->inuse_pages==0.
So the question is: could someone reclaim the folio and turn si->inuse_pages==0, before we completed swap_page_trans_huge_swapped().
Imagine the following: 2 MiB folio in the swapcache. Only 2 subpages are still references by swap entries.
Process 1 still references subpage 0 via swap entry. Process 2 still references subpage 1 via swap entry.
Process 1 quits. Calls free_swap_and_cache(). -> count == SWAP_HAS_CACHE [then, preempted in the hypervisor etc.]
Process 2 quits. Calls free_swap_and_cache(). -> count == SWAP_HAS_CACHE
Process 2 goes ahead, passes swap_page_trans_huge_swapped(), and calls __try_to_reclaim_swap().
__try_to_reclaim_swap()->folio_free_swap()->delete_from_swap_cache()-> put_swap_folio()->free_swap_slot()->swapcache_free_entries()-> swap_entry_free()->swap_range_free()-> ... WRITE_ONCE(si->inuse_pages, si->inuse_pages - nr_entries);
What stops swapoff to succeed after process 2 reclaimed the swap cache but before process1 finished its call to swap_page_trans_huge_swapped()?
--8<-----
CVSS Details
- CVSS 3.1 Base Score: 7
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Alma_linux | — | Upgrade kernel-coreUpgrade kernel-modulesUpgrade kernel-rt-debug-coreUpgrade kernel-develUpgrade kernel-rt-develUpgrade kernel-debug-modulesUpgrade kernel-rt-debug-kvmUpgrade kernel-zfcpdump-develUpgrade kernel-zfcpdumpUpgrade kernel-debug-coreUpgrade kernel-rt-modules-extraUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-debug-develUpgrade kernel-tools-libsUpgrade kernel-rt-kvmUpgrade kernel-modules-extraUpgrade kernel-rt-debug-modulesUpgrade kernelUpgrade bpftoolUpgrade kernel-rt-debugUpgrade kernel-rt-modulesUpgrade kernel-rt-coreUpgrade kernel-debugUpgrade kernel-cross-headersUpgrade perfUpgrade kernel-toolsUpgrade kernel-rt-debug-develUpgrade kernel-docUpgrade kernel-abi-stablelistsUpgrade kernel-zfcpdump-coreUpgrade kernel-rt-debug-modules-extraUpgrade kernel-zfcpdump-modulesUpgrade kernel-rtUpgrade kernel-debug-modules-extraUpgrade kernel-headersUpgrade python3-perfUpgrade kernel-tools-libs-devel | Aug 12, 2024 | May 1, 2024 |
| Amazon Linux Ami 2 | — | Upgrade python-perfUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-headersUpgrade kernel-debuginfoUpgrade bpftool-debuginfoUpgrade kernel-tools-debuginfoUpgrade perfUpgrade perf-debuginfoUpgrade python-perf-debuginfoUpgrade kernel-tools-develUpgrade bpftoolUpgrade kernel-livepatch-5.10.215-203.850Upgrade kernel-toolsUpgrade kernel-develUpgrade kernelUpgrade kernel-livepatch-5.15.156-102.160Upgrade kernel-debuginfo-common-x86_64 | Aug 14, 2024 | May 1, 2024 |
| Amazon_linux_2023 | — | Upgrade kernel-toolsUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-libbpf-develUpgrade python3-perfUpgrade kernel-modules-extra-commonUpgrade python3-perf-debuginfoUpgrade kernel-tools-develUpgrade bpftoolUpgrade kernel-libbpf-staticUpgrade kernelUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-libbpfUpgrade kernel-tools-debuginfoUpgrade kernel-livepatch-6.1.84-99.169Upgrade kernel-debuginfoUpgrade kernel-modules-extraUpgrade bpftool-debuginfoUpgrade perf-debuginfoUpgrade perfUpgrade kernel-headersUpgrade kernel-devel | Feb 17, 2025 | May 1, 2024 |
| Debian | — | Upgrade linux | May 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp10 | — | Upgrade python3-perfUpgrade kernelUpgrade kernel-abi-stablelistsUpgrade kernel-tools-libsUpgrade kernel-tools | Jul 16, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade kernel-abi-stablelistsUpgrade bpftoolUpgrade kernel-toolsUpgrade kernel-tools-libsUpgrade python3-perfUpgrade kernel | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade python3-perfUpgrade kernel-toolsUpgrade kernel-tools-libsUpgrade bpftoolUpgrade kernel-abi-stablelistsUpgrade kernel | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade kernel-toolsUpgrade kernelUpgrade kernel-tools-libsUpgrade python3-perf | Jul 17, 2024 | May 1, 2024 |
| Oracle_linux | — | Upgrade kernel | Aug 16, 2024 | May 1, 2024 |
| Redhat_linux | — | No solution existsUpgrade kernel-rtUpgrade kernel | Aug 12, 2024 | May 1, 2024 |
| Rocky_linux | — | Upgrade kernel-debug-modulesUpgrade kernel-rt-debugUpgrade kernel-cross-headersUpgrade kernel-rt-debuginfo-common-x86_64Upgrade kernelUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-rt-develUpgrade python3-perf-debuginfoUpgrade kernel-rt-kvmUpgrade kernel-debug-debuginfoUpgrade kernel-tools-libs-develUpgrade kernel-rt-debug-coreUpgrade kernel-tools-libsUpgrade bpftoolUpgrade kernel-debug-modules-extraUpgrade kernel-rt-modules-extraUpgrade kernel-rt-coreUpgrade kernel-rt-debug-debuginfoUpgrade kernel-rt-debug-modulesUpgrade perfUpgrade kernel-modulesUpgrade kernel-rt-debug-kvmUpgrade kernel-coreUpgrade kernel-rt-modulesUpgrade kernel-tools-debuginfoUpgrade kernel-toolsUpgrade kernel-rtUpgrade kernel-rt-debug-develUpgrade kernel-debug-coreUpgrade perf-debuginfoUpgrade kernel-modules-extraUpgrade bpftool-debuginfoUpgrade kernel-rt-debuginfoUpgrade kernel-rt-debug-modules-extraUpgrade kernel-debug-develUpgrade kernel-debuginfoUpgrade kernel-headersUpgrade python3-perfUpgrade kernel-develUpgrade kernel-debug | Aug 22, 2024 | May 1, 2024 |
| Suse | — | Upgrade gfs2-kmp-rtUpgrade kernel-64kb-livepatch-develUpgrade kernel-symsUpgrade kernel-default-develUpgrade kernel-default-livepatch-develUpgrade kernel-docsUpgrade dtb-caviumUpgrade kernel-zfcpdumpUpgrade dtb-apmUpgrade dtb-xilinxUpgrade dlm-kmp-azureUpgrade kernel-64kb-optionalUpgrade kernel-64kbUpgrade kselftests-kmp-rtUpgrade kernel-debug-develUpgrade kernel-devel-rtUpgrade dtb-amazonUpgrade dtb-armUpgrade dtb-mediatekUpgrade ocfs2-kmp-azureUpgrade dlm-kmp-64kbUpgrade kernel-default-optionalUpgrade kernel-kvmsmall-livepatch-develUpgrade dtb-alteraUpgrade kernel-64kb-extraUpgrade kselftests-kmp-defaultUpgrade dtb-amdUpgrade kernel-debugUpgrade cluster-md-kmp-rtUpgrade kernel-64kb-develUpgrade gfs2-kmp-64kbUpgrade dtb-allwinnerUpgrade dtb-hisiliconUpgrade kernel-default-extraUpgrade reiserfs-kmp-defaultUpgrade kernel-source-azureUpgrade kernel-default-vdsoUpgrade kernel-rt-livepatchUpgrade kernel-develUpgrade ocfs2-kmp-defaultUpgrade gfs2-kmp-azureUpgrade kernel-rt_debug-livepatch-develUpgrade dtb-renesasUpgrade kernel-rt-develUpgrade kselftests-kmp-64kbUpgrade kernel-obs-qaUpgrade reiserfs-kmp-azureUpgrade kernel-kvmsmall-develUpgrade gfs2-kmp-defaultUpgrade dtb-appleUpgrade kernel-default-baseUpgrade cluster-md-kmp-azureUpgrade ocfs2-kmp-rtUpgrade kernel-rt-extraUpgrade ocfs2-kmp-64kbUpgrade kernel-rt-vdsoUpgrade dtb-sprdUpgrade dtb-rockchipUpgrade cluster-md-kmp-defaultUpgrade kernel-obs-buildUpgrade dtb-qcomUpgrade dtb-marvellUpgrade kernel-azureUpgrade dtb-lgUpgrade kernel-kvmsmall-vdsoUpgrade kernel-debug-vdsoUpgrade kernel-azure-livepatch-develUpgrade dtb-nvidiaUpgrade dlm-kmp-rtUpgrade kernel-azure-extraUpgrade kernel-source-rtUpgrade reiserfs-kmp-rtUpgrade kernel-sourceUpgrade kernel-rt_debug-develUpgrade kernel-azure-optionalUpgrade kernel-azure-develUpgrade dtb-exynosUpgrade kernel-syms-azureUpgrade reiserfs-kmp-64kbUpgrade kernel-debug-livepatch-develUpgrade kselftests-kmp-azureUpgrade kernel-default-base-rebuildUpgrade kernel-defaultUpgrade kernel-azure-vdsoUpgrade dtb-amlogicUpgrade kernel-rt-livepatch-develUpgrade kernel-docs-htmlUpgrade kernel-devel-azureUpgrade dtb-socionextUpgrade cluster-md-kmp-64kbUpgrade dtb-broadcomUpgrade kernel-rtUpgrade kernel-default-livepatchUpgrade dlm-kmp-defaultUpgrade kernel-kvmsmallUpgrade kernel-source-vanillaUpgrade kernel-rt_debugUpgrade dtb-freescaleUpgrade kernel-syms-rtUpgrade kernel-rt-optionalUpgrade kernel-rt_debug-vdsoUpgrade kernel-macros | May 15, 2024 | May 1, 2024 |
| Ubuntu | — | Upgrade linux-image-virtual-hwe-24.04Upgrade linux-image-5.4.0-1081-ibmUpgrade linux-image-4.15.0-1174-awsUpgrade linux-image-6.8.0-1009-awsUpgrade linux-image-6.8.0-1006-oemUpgrade linux-image-oracle-lts-22.04Upgrade linux-image-5.15.0-1058-raspiUpgrade linux-image-generic-lpaeUpgrade linux-image-oem-20.04Upgrade linux-image-gcp-lts-20.04Upgrade linux-image-bluefieldUpgrade linux-image-lowlatency-hwe-16.04Upgrade linux-image-oem-osp1Upgrade linux-image-5.4.0-198-genericUpgrade linux-image-gcp-lts-18.04Upgrade linux-image-genericUpgrade linux-image-intelUpgrade linux-image-4.15.0-1182-azureUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-5.15.0-1065-gcpUpgrade linux-image-5.4.0-1044-iotUpgrade linux-image-gcpUpgrade linux-image-5.15.0-116-generic-64kUpgrade linux-image-6.8.0-35-lowlatency-64kUpgrade linux-image-lowlatency-hwe-18.04Upgrade linux-image-4.15.0-1136-oracleUpgrade linux-image-5.4.0-1134-awsUpgrade linux-image-5.15.0-1058-ibmUpgrade linux-image-5.4.0-1138-gcpUpgrade linux-image-5.15.0-1068-azureUpgrade linux-image-intel-iotgUpgrade linux-image-awsUpgrade linux-image-oracleUpgrade linux-image-gkeUpgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-5.15.0-116-genericUpgrade linux-image-generic-hwe-18.04Upgrade linux-image-snapdragon-hwe-18.04Upgrade linux-image-oracle-64kUpgrade linux-image-6.8.0-1006-oracleUpgrade linux-image-virtualUpgrade linux-image-gcp-lts-22.04Upgrade linux-image-gkeopUpgrade linux-image-5.15.0-1060-nvidia-lowlatencyUpgrade linux-image-5.4.0-1122-kvmUpgrade linux-image-6.8.0-1008-azure-fdeUpgrade linux-image-5.15.0-1060-intel-iotgUpgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-gkeop-5.15Upgrade linux-image-azure-lts-18.04Upgrade linux-image-raspi2Upgrade linux-image-oracle-lts-20.04Upgrade linux-image-raspi-hwe-18.04Upgrade linux-image-oem-20.04dUpgrade linux-image-azure-fde-lts-22.04Upgrade linux-image-5.15.0-1068-azure-fdeUpgrade linux-image-virtual-hwe-16.04Upgrade linux-image-azure-cvmUpgrade linux-image-azure-lts-20.04Upgrade linux-image-oem-24.04Upgrade linux-image-5.4.0-1118-raspiUpgrade linux-image-xilinx-zynqmpUpgrade linux-image-5.15.0-1060-nvidiaUpgrade linux-image-oemUpgrade linux-image-generic-hwe-16.04Upgrade linux-image-virtual-hwe-18.04Upgrade linux-image-5.4.0-198-lowlatencyUpgrade linux-image-5.15.0-1035-xilinx-zynqmpUpgrade linux-image-6.8.0-1004-gkeUpgrade linux-image-6.8.0-35-lowlatencyUpgrade linux-image-aws-lts-18.04Upgrade linux-image-oem-24.04aUpgrade linux-image-lowlatency-64kUpgrade linux-image-5.4.0-1101-gkeopUpgrade linux-image-6.8.0-1006-oracle-64kUpgrade linux-image-5.15.0-116-generic-lpaeUpgrade linux-image-5.4.0-1053-xilinx-zynqmpUpgrade linux-image-oem-20.04cUpgrade linux-image-gkeop-5.4Upgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-azure-fdeUpgrade linux-image-6.8.0-1005-raspiUpgrade linux-image-azureUpgrade linux-image-4.15.0-230-genericUpgrade linux-image-5.15.0-1064-gcpUpgrade linux-image-oracle-lts-18.04Upgrade linux-image-nvidiaUpgrade linux-image-4.15.0-230-lowlatencyUpgrade linux-image-generic-hwe-20.04Upgrade linux-image-6.8.0-1006-ibmUpgrade linux-image-kvmUpgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-aws-hweUpgrade linux-image-ibm-lts-24.04Upgrade linux-image-gke-5.15Upgrade linux-image-ibm-lts-20.04Upgrade linux-image-oem-20.04bUpgrade linux-image-5.4.0-1139-azureUpgrade linux-image-5.15.0-1048-gkeopUpgrade linux-image-5.15.0-116-lowlatencyUpgrade linux-image-6.8.0-35-genericUpgrade linux-image-5.4.0-1094-bluefieldUpgrade linux-image-5.15.0-1063-oracleUpgrade linux-image-6.8.0-35-generic-64kUpgrade linux-image-5.15.0-1065-awsUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-ibm-classicUpgrade linux-image-5.15.0-1062-kvmUpgrade linux-image-azure-lts-22.04Upgrade linux-image-4.15.0-1157-kvmUpgrade linux-image-raspiUpgrade linux-image-6.8.0-1008-azureUpgrade linux-image-raspi-nolpaeUpgrade linux-image-virtual-hwe-20.04Upgrade linux-image-lowlatencyUpgrade linux-image-aws-lts-22.04Upgrade linux-image-5.15.0-116-lowlatency-64kUpgrade linux-image-5.4.0-1133-oracleUpgrade linux-image-ibmUpgrade linux-image-4.15.0-1167-gcpUpgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-5.15.0-1062-gkeUpgrade linux-image-aws-lts-20.04Upgrade linux-image-5.4.0-198-generic-lpaeUpgrade linux-image-6.8.0-1008-gcpUpgrade linux-image-generic-64k | Jul 1, 2024 | May 1, 2024 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | Jan 20, 2025 | May 1, 2024 |
Prioritise with Active Threat Intelligence
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub