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