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