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