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