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-rt-kvmUpgrade kernel-rt-debug-coreUpgrade kernel-debugUpgrade kernel-rt-modules-extraUpgrade kernelUpgrade kernel-debug-coreUpgrade kernel-tools-libsUpgrade kernel-modules-extraUpgrade bpftoolUpgrade kernel-debug-develUpgrade kernel-modulesUpgrade kernel-rt-debugUpgrade kernel-zfcpdump-modules-extraUpgrade kernel-rt-develUpgrade kernel-rt-coreUpgrade kernel-develUpgrade kernel-debug-modulesUpgrade kernel-rt-debug-kvmUpgrade kernel-zfcpdumpUpgrade kernel-rt-modulesUpgrade kernel-coreUpgrade kernel-rt-debug-modulesUpgrade kernel-zfcpdump-develUpgrade kernel-rt-debug-modules-extraUpgrade kernel-zfcpdump-modulesUpgrade kernel-zfcpdump-coreUpgrade kernel-tools-libs-develUpgrade kernel-headersUpgrade kernel-rtUpgrade kernel-cross-headersUpgrade kernel-rt-debug-develUpgrade perfUpgrade kernel-debug-modules-extraUpgrade kernel-docUpgrade kernel-toolsUpgrade python3-perfUpgrade kernel-abi-stablelists | Aug 12, 2024 | May 1, 2024 |
| Amazon Linux Ami 2 | — | Upgrade perfUpgrade kernel-headersUpgrade python-perf-debuginfoUpgrade kernel-debuginfoUpgrade kernel-debuginfo-common-aarch64Upgrade bpftool-debuginfoUpgrade python-perfUpgrade kernel-tools-debuginfoUpgrade perf-debuginfoUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-livepatch-5.15.156-102.160Upgrade bpftoolUpgrade kernel-tools-develUpgrade kernel-develUpgrade kernelUpgrade kernel-toolsUpgrade kernel-livepatch-5.10.215-203.850 | Aug 14, 2024 | May 1, 2024 |
| Amazon_linux_2023 | — | Upgrade kernel-debuginfoUpgrade perfUpgrade kernel-tools-debuginfoUpgrade kernel-develUpgrade kernel-headersUpgrade kernel-libbpfUpgrade kernel-livepatch-6.1.84-99.169Upgrade kernel-modules-extraUpgrade perf-debuginfoUpgrade bpftool-debuginfoUpgrade python3-perfUpgrade kernelUpgrade kernel-tools-develUpgrade kernel-modules-extra-commonUpgrade python3-perf-debuginfoUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-libbpf-staticUpgrade kernel-toolsUpgrade kernel-debuginfo-common-aarch64Upgrade bpftoolUpgrade kernel-libbpf-devel | Feb 17, 2025 | May 1, 2024 |
| Debian | — | Upgrade linux | May 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp10 | — | Upgrade python3-perfUpgrade kernel-tools-libsUpgrade kernel-toolsUpgrade kernelUpgrade kernel-abi-stablelists | Jul 16, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade kernel-tools-libsUpgrade kernelUpgrade python3-perfUpgrade kernel-toolsUpgrade bpftoolUpgrade kernel-abi-stablelists | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade kernelUpgrade kernel-tools-libsUpgrade bpftoolUpgrade kernel-abi-stablelistsUpgrade kernel-toolsUpgrade python3-perf | Oct 8, 2024 | May 1, 2024 |
| Huawei Euleros 2_0_sp9 | — | Upgrade python3-perfUpgrade kernel-toolsUpgrade kernelUpgrade kernel-tools-libs | 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-debuginfo-common-x86_64Upgrade kernel-rt-debugUpgrade kernel-debug-modulesUpgrade kernelUpgrade kernel-tools-libsUpgrade kernel-cross-headersUpgrade python3-perf-debuginfoUpgrade kernel-rt-develUpgrade kernel-rt-kvmUpgrade kernel-debug-modules-extraUpgrade kernel-tools-libs-develUpgrade kernel-rt-modules-extraUpgrade kernel-rt-debuginfo-common-x86_64Upgrade kernel-rt-debug-coreUpgrade bpftoolUpgrade kernel-rt-debug-debuginfoUpgrade kernel-rt-coreUpgrade kernel-debug-debuginfoUpgrade perfUpgrade kernel-tools-debuginfoUpgrade kernel-headersUpgrade kernel-toolsUpgrade kernel-rtUpgrade kernel-modulesUpgrade bpftool-debuginfoUpgrade kernel-rt-debuginfoUpgrade kernel-modules-extraUpgrade kernel-coreUpgrade kernel-rt-debug-kvmUpgrade perf-debuginfoUpgrade kernel-debugUpgrade kernel-debug-develUpgrade kernel-rt-debug-modules-extraUpgrade kernel-debuginfoUpgrade kernel-develUpgrade python3-perfUpgrade kernel-rt-debug-develUpgrade kernel-debug-coreUpgrade kernel-rt-modulesUpgrade kernel-rt-debug-modules | Aug 22, 2024 | May 1, 2024 |
| Suse | — | Upgrade kernel-docsUpgrade kernel-zfcpdumpUpgrade kernel-default-livepatch-develUpgrade gfs2-kmp-azureUpgrade kernel-symsUpgrade dtb-xilinxUpgrade kernel-64kb-optionalUpgrade dtb-appleUpgrade ocfs2-kmp-azureUpgrade kernel-default-develUpgrade dtb-alteraUpgrade dtb-apmUpgrade ocfs2-kmp-defaultUpgrade cluster-md-kmp-azureUpgrade kernel-devel-rtUpgrade kernel-obs-qaUpgrade dlm-kmp-azureUpgrade kernel-64kbUpgrade kernel-default-baseUpgrade kernel-rt-develUpgrade kselftests-kmp-64kbUpgrade kernel-default-optionalUpgrade kernel-default-vdsoUpgrade kernel-kvmsmall-develUpgrade kernel-default-extraUpgrade kernel-rt_debug-livepatch-develUpgrade dtb-allwinnerUpgrade kernel-debugUpgrade kernel-develUpgrade kernel-debug-develUpgrade dtb-renesasUpgrade dlm-kmp-64kbUpgrade kernel-64kb-livepatch-develUpgrade kernel-source-azureUpgrade kernel-64kb-extraUpgrade dtb-amdUpgrade kernel-rt-livepatchUpgrade kernel-kvmsmall-livepatch-develUpgrade cluster-md-kmp-rtUpgrade reiserfs-kmp-defaultUpgrade dtb-caviumUpgrade gfs2-kmp-64kbUpgrade dtb-hisiliconUpgrade dtb-armUpgrade kselftests-kmp-rtUpgrade dtb-amazonUpgrade gfs2-kmp-rtUpgrade kselftests-kmp-defaultUpgrade reiserfs-kmp-azureUpgrade gfs2-kmp-defaultUpgrade dtb-mediatekUpgrade ocfs2-kmp-rtUpgrade kernel-64kb-develUpgrade kernel-azure-livepatch-develUpgrade kernel-azureUpgrade dtb-marvellUpgrade kernel-azure-extraUpgrade kernel-rt-extraUpgrade dtb-lgUpgrade kernel-obs-buildUpgrade dtb-nvidiaUpgrade dlm-kmp-rtUpgrade kernel-kvmsmall-vdsoUpgrade kernel-debug-vdsoUpgrade kernel-debug-livepatch-develUpgrade reiserfs-kmp-64kbUpgrade kselftests-kmp-azureUpgrade kernel-defaultUpgrade kernel-default-base-rebuildUpgrade kernel-syms-azureUpgrade kernel-rt-optionalUpgrade kernel-syms-rtUpgrade kernel-rtUpgrade dtb-freescaleUpgrade kernel-source-vanillaUpgrade reiserfs-kmp-rtUpgrade kernel-source-rtUpgrade kernel-sourceUpgrade kernel-rt_debug-develUpgrade kernel-azure-develUpgrade dtb-exynosUpgrade kernel-rt_debugUpgrade kernel-kvmsmallUpgrade kernel-default-livepatchUpgrade dlm-kmp-defaultUpgrade kernel-azure-optionalUpgrade dtb-rockchipUpgrade kernel-macrosUpgrade dtb-broadcomUpgrade cluster-md-kmp-defaultUpgrade kernel-rt_debug-vdsoUpgrade kernel-devel-azureUpgrade cluster-md-kmp-64kbUpgrade kernel-azure-vdsoUpgrade kernel-rt-livepatch-develUpgrade kernel-rt-vdsoUpgrade dtb-sprdUpgrade dtb-socionextUpgrade kernel-docs-htmlUpgrade dtb-amlogicUpgrade dtb-qcomUpgrade ocfs2-kmp-64kb | May 15, 2024 | May 1, 2024 |
| Ubuntu | — | Upgrade linux-image-virtual-hwe-18.04Upgrade linux-image-5.15.0-1035-xilinx-zynqmpUpgrade linux-image-5.15.0-1068-azureUpgrade linux-image-gcp-lts-22.04Upgrade linux-image-bluefieldUpgrade linux-image-oem-24.04Upgrade linux-image-6.8.0-1006-oracleUpgrade linux-image-oem-osp1Upgrade linux-image-genericUpgrade linux-image-generic-lpaeUpgrade linux-image-raspi2Upgrade linux-image-5.15.0-1068-azure-fdeUpgrade linux-image-gcpUpgrade linux-image-lowlatency-hwe-16.04Upgrade linux-image-5.4.0-198-lowlatencyUpgrade linux-image-intelUpgrade linux-image-oem-20.04Upgrade linux-image-5.15.0-116-generic-64kUpgrade linux-image-oracle-64kUpgrade linux-image-virtual-hwe-16.04Upgrade linux-image-5.15.0-1060-nvidia-lowlatencyUpgrade linux-image-5.15.0-1065-gcpUpgrade linux-image-6.8.0-35-lowlatencyUpgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-5.4.0-198-genericUpgrade linux-image-oracle-lts-22.04Upgrade linux-image-gkeop-5.15Upgrade linux-image-6.8.0-1006-oemUpgrade linux-image-gcp-lts-20.04Upgrade linux-image-virtual-hwe-24.04Upgrade linux-image-generic-hwe-16.04Upgrade linux-image-oem-24.04aUpgrade linux-image-gcp-lts-18.04Upgrade linux-image-4.15.0-1182-azureUpgrade linux-image-oracleUpgrade linux-image-5.4.0-1118-raspiUpgrade linux-image-5.15.0-116-genericUpgrade linux-image-4.15.0-1174-awsUpgrade linux-image-5.15.0-1060-intel-iotgUpgrade linux-image-snapdragon-hwe-18.04Upgrade linux-image-azure-lts-20.04Upgrade linux-image-6.8.0-1004-gkeUpgrade linux-image-oem-20.04dUpgrade linux-image-xilinx-zynqmpUpgrade linux-image-6.8.0-1009-awsUpgrade linux-image-intel-iotgUpgrade linux-image-5.4.0-1122-kvmUpgrade linux-image-5.4.0-1138-gcpUpgrade linux-image-virtualUpgrade linux-image-azure-fde-lts-22.04Upgrade linux-image-5.15.0-1058-raspiUpgrade linux-image-generic-hwe-18.04Upgrade linux-image-gkeUpgrade linux-image-5.4.0-1081-ibmUpgrade linux-image-5.15.0-1058-ibmUpgrade linux-image-oemUpgrade linux-image-gkeopUpgrade linux-image-azure-cvmUpgrade linux-image-4.15.0-1136-oracleUpgrade linux-image-raspi-hwe-18.04Upgrade linux-image-6.8.0-1008-azure-fdeUpgrade linux-image-5.4.0-1134-awsUpgrade linux-image-azure-lts-18.04Upgrade linux-image-generic-hwe-24.04Upgrade linux-image-6.8.0-35-lowlatency-64kUpgrade linux-image-lowlatency-hwe-18.04Upgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-oracle-lts-20.04Upgrade linux-image-aws-lts-18.04Upgrade linux-image-5.4.0-1044-iotUpgrade linux-image-5.15.0-1060-nvidiaUpgrade linux-image-awsUpgrade linux-image-lowlatencyUpgrade linux-image-6.8.0-35-genericUpgrade linux-image-5.15.0-1062-kvmUpgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-5.15.0-1062-gkeUpgrade linux-image-5.15.0-1063-oracleUpgrade linux-image-5.4.0-198-generic-lpaeUpgrade linux-image-6.8.0-1008-gcpUpgrade linux-image-4.15.0-230-genericUpgrade linux-image-azure-fdeUpgrade linux-image-azureUpgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-5.15.0-116-lowlatency-64kUpgrade linux-image-aws-lts-20.04Upgrade linux-image-5.4.0-1101-gkeopUpgrade linux-image-ibm-classicUpgrade linux-image-5.15.0-116-generic-lpaeUpgrade linux-image-oracle-lts-18.04Upgrade linux-image-gkeop-5.4Upgrade linux-image-5.15.0-116-lowlatencyUpgrade linux-image-6.8.0-1008-azureUpgrade linux-image-ibmUpgrade linux-image-aws-lts-22.04Upgrade linux-image-5.15.0-1065-awsUpgrade linux-image-4.15.0-230-lowlatencyUpgrade linux-image-6.8.0-1006-ibmUpgrade linux-image-azure-lts-22.04Upgrade linux-image-6.8.0-35-generic-64kUpgrade linux-image-4.15.0-1157-kvmUpgrade linux-image-raspiUpgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-generic-hwe-20.04Upgrade linux-image-lowlatency-64kUpgrade linux-image-ibm-lts-24.04Upgrade linux-image-oem-20.04cUpgrade linux-image-5.4.0-1094-bluefieldUpgrade linux-image-5.4.0-1053-xilinx-zynqmpUpgrade linux-image-6.8.0-1005-raspiUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-generic-64kUpgrade linux-image-nvidiaUpgrade linux-image-virtual-hwe-20.04Upgrade linux-image-6.8.0-1006-oracle-64kUpgrade linux-image-5.4.0-1133-oracleUpgrade linux-image-oem-20.04bUpgrade linux-image-5.15.0-1064-gcpUpgrade linux-image-aws-hweUpgrade linux-image-kvmUpgrade linux-image-5.4.0-1139-azureUpgrade linux-image-5.15.0-1048-gkeopUpgrade linux-image-gke-5.15Upgrade linux-image-raspi-nolpaeUpgrade linux-image-ibm-lts-20.04Upgrade linux-image-4.15.0-1167-gcp | 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