In the Linux kernel, the following vulnerability has been resolved:
userfaultfd: fix checks for huge PMDs
Patch series "userfaultfd: fix races around pmd_trans_huge() check", v2.
The pmd_trans_huge() code in mfill_atomic() is wrong in three different ways depending on kernel version:
1. The pmd_trans_huge() check is racy and can lead to a BUG_ON() (if you hit the right two race windows) - I've tested this in a kernel build with some extra mdelay() calls. See the commit message for a description of the race scenario. On older kernels (before 6.5), I think the same bug can even theoretically lead to accessing transhuge page contents as a page table if you hit the right 5 narrow race windows (I haven't tested this case). 2. As pointed out by Qi Zheng, pmd_trans_huge() is not sufficient for detecting PMDs that don't point to page tables. On older kernels (before 6.5), you'd just have to win a single fairly wide race to hit this. I've tested this on 6.1 stable by racing migration (with a mdelay() patched into try_to_migrate()) against UFFDIO_ZEROPAGE - on my x86 VM, that causes a kernel oops in ptlock_ptr(). 3. On newer kernels (>=6.5), for shmem mappings, khugepaged is allowed to yank page tables out from under us (though I haven't tested that), so I think the BUG_ON() checks in mfill_atomic() are just wrong.
I decided to write two separate fixes for these (one fix for bugs 1+2, one fix for bug 3), so that the first fix can be backported to kernels affected by bugs 1+2.
This patch (of 2):
This fixes two issues.
I discovered that the following race can occur:
mfill_atomic other thread ============ ============ <zap PMD> pmdp_get_lockless() [reads none pmd] <bail if trans_huge> <if none:> <pagefault creates transhuge zeropage> __pte_alloc [no-op] <zap PMD> <bail if pmd_trans_huge(*dst_pmd)> BUG_ON(pmd_none(*dst_pmd))
I have experimentally verified this in a kernel with extra mdelay() calls; the BUG_ON(pmd_none(*dst_pmd)) triggers.
On kernels newer than commit 0d940a9b270b ("mm/pgtable: allow pte_offset_map[_lock]() to fail"), this can't lead to anything worse than a BUG_ON(), since the page table access helpers are actually designed to deal with page tables concurrently disappearing; but on older kernels (<=6.4), I think we could probably theoretically race past the two BUG_ON() checks and end up treating a hugepage as a page table.
The second issue is that, as Qi Zheng pointed out, there are other types of huge PMDs that pmd_trans_huge() can't catch: devmap PMDs and swap PMDs (in particular, migration PMDs).
On <=6.4, this is worse than the first issue: If mfill_atomic() runs on a PMD that contains a migration entry (which just requires winning a single, fairly wide race), it will pass the PMD to pte_offset_map_lock(), which assumes that the PMD points to a page table.
Breakage follows: First, the kernel tries to take the PTE lock (which will crash or maybe worse if there is no "struct page" for the address bits in the migration entry PMD - I think at least on X86 there usually is no corresponding "struct page" thanks to the PTE inversion mitigation, amd64 looks different).
If that didn't crash, the kernel would next try to write a PTE into what it wrongly thinks is a page table.
As part of fixing these issues, get rid of the check for pmd_trans_huge() before __pte_alloc() - that's redundant, we're going to have to check for that after the __pte_alloc() anyway.
Backport note: pmdp_get_lockless() is pmd_read_atomic() in older kernels.
CVSS Details
- CVSS 3.1 Base Score: 7.8
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Debian | — | Upgrade linux | May 15, 2025 | Sep 18, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade bpftoolUpgrade kernelUpgrade python3-perfUpgrade kernel-abi-stablelistsUpgrade kernel-tools-libsUpgrade kernel-tools | Dec 12, 2024 | Sep 18, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade kernel-abi-stablelistsUpgrade kernel-tools-libsUpgrade kernel-toolsUpgrade python3-perfUpgrade kernelUpgrade bpftool | Dec 12, 2024 | Sep 18, 2024 |
| Redhat_linux | — | Upgrade kernelNo solution existsUpgrade kernel-rt | May 15, 2025 | Sep 18, 2024 |
| Suse | — | Upgrade kernel-source-vanillaUpgrade dtb-xilinxUpgrade gfs2-kmp-64kbUpgrade kernel-default-vdsoUpgrade kernel-source-azureUpgrade kernel-symsUpgrade dtb-amlogicUpgrade dtb-apmUpgrade dtb-freescaleUpgrade gfs2-kmp-rtUpgrade kernel-64kb-livepatch-develUpgrade kernel-kvmsmall-develUpgrade kernel-kvmsmall-livepatch-develUpgrade dlm-kmp-64kbUpgrade kselftests-kmp-64kbUpgrade ocfs2-kmp-defaultUpgrade kernel-rt-optionalUpgrade cluster-md-kmp-azureUpgrade kernel-rt-vdsoUpgrade dtb-exynosUpgrade kernel-devel-azureUpgrade dtb-lgUpgrade kernel-sourceUpgrade dtb-allwinnerUpgrade dtb-caviumUpgrade dtb-qcomUpgrade kernel-obs-qaUpgrade dtb-amazonUpgrade kernel-azure-optionalUpgrade dtb-broadcomUpgrade kernel-64kbUpgrade kernel-zfcpdumpUpgrade ocfs2-kmp-rtUpgrade kernel-syms-azureUpgrade kernel-azure-livepatch-develUpgrade kernel-default-base-rebuildUpgrade kernel-default-develUpgrade kernel-rt_debug-develUpgrade kernel-devel-rtUpgrade kernel-rt-develUpgrade kernel-azure-develUpgrade kernel-macrosUpgrade kernel-rt-livepatchUpgrade kernel-kvmsmallUpgrade kernel-default-optionalUpgrade gfs2-kmp-azureUpgrade cluster-md-kmp-rtUpgrade dtb-mediatekUpgrade kernel-default-extraUpgrade dtb-alteraUpgrade reiserfs-kmp-azureUpgrade kernel-rtUpgrade kernel-source-rtUpgrade kselftests-kmp-azureUpgrade kernel-default-livepatchUpgrade ocfs2-kmp-64kbUpgrade reiserfs-kmp-64kbUpgrade kernel-develUpgrade kernel-defaultUpgrade dtb-sprdUpgrade kernel-debug-livepatch-develUpgrade dtb-appleUpgrade kernel-docsUpgrade dtb-amdUpgrade kernel-default-manUpgrade kernel-debug-vdsoUpgrade dtb-socionextUpgrade cluster-md-kmp-64kbUpgrade kselftests-kmp-rtUpgrade kernel-default-livepatch-develUpgrade kernel-azure-vdsoUpgrade reiserfs-kmp-rtUpgrade kernel-kvmsmall-vdsoUpgrade kernel-64kb-extraUpgrade kernel-azure-extraUpgrade kernel-rt_debug-livepatch-develUpgrade kernel-debug-develUpgrade kernel-debugUpgrade kernel-syms-rtUpgrade kernel-azure-baseUpgrade dlm-kmp-azureUpgrade dtb-nvidiaUpgrade kselftests-kmp-defaultUpgrade dtb-renesasUpgrade gfs2-kmp-defaultUpgrade dtb-rockchipUpgrade kernel-rt_debugUpgrade ocfs2-kmp-azureUpgrade kernel-64kb-optionalUpgrade kernel-64kb-develUpgrade dlm-kmp-rtUpgrade reiserfs-kmp-defaultUpgrade kernel-obs-buildUpgrade dtb-marvellUpgrade kernel-rt_debug-vdsoUpgrade kernel-rt-extraUpgrade dtb-hisiliconUpgrade dlm-kmp-defaultUpgrade dtb-armUpgrade kernel-azureUpgrade cluster-md-kmp-defaultUpgrade kernel-rt-livepatch-develUpgrade kernel-docs-htmlUpgrade kernel-default-base | Dec 5, 2025 | Jun 3, 2025 |
| Ubuntu | — | Upgrade linux-image-oem-osp1Upgrade linux-image-4.15.0-1137-fipsUpgrade linux-image-gcp-fips-5.15Upgrade linux-image-ibm-lts-20.04Upgrade linux-image-nvidia-5.15Upgrade linux-image-5.4.0-1107-bluefieldUpgrade linux-image-virtual-hwe-24.04Upgrade linux-image-generic-64k-5.15Upgrade linux-image-oem-22.04cUpgrade linux-image-6.8.0-50-generic-64kUpgrade linux-image-kvm-5.4Upgrade linux-image-5.15.0-1084-oracleUpgrade linux-image-4.15.0-2083-gcp-fipsUpgrade linux-image-virtual-hwe-16.04Upgrade linux-image-gke-5.15Upgrade linux-image-ibm-classicUpgrade linux-image-5.15.0-1029-nvidia-tegra-igxUpgrade linux-image-5.4.0-1094-ibmUpgrade linux-image-intel-iotg-5.15Upgrade linux-image-lowlatency-hwe-16.04Upgrade linux-image-azure-fips-5.15Upgrade linux-image-6.8.0-1015-gkeUpgrade linux-image-gkeopUpgrade linux-image-oem-24.04Upgrade linux-image-oem-24.04aUpgrade linux-image-lowlatency-64kUpgrade linux-image-aws-lts-20.04Upgrade linux-image-5.15.0-1082-intel-iotgUpgrade linux-image-nvidia-tegraUpgrade linux-image-nvidia-tegra-igx-rt-5.15Upgrade linux-image-azure-lts-18.04Upgrade linux-image-5.15.0-1079-ibmUpgrade linux-image-6.8.0-50-lowlatency-64kUpgrade linux-image-5.15.0-1087-awsUpgrade linux-image-6.8.0-1017-oracle-64kUpgrade linux-image-4.15.0-1144-oracleUpgrade linux-image-6.8.0-1019-nvidia-lowlatency-64kUpgrade linux-image-oracle-lts-20.04Upgrade linux-image-nvidia-tegra-5.15Upgrade linux-image-xilinx-zynqmp-5.4Upgrade linux-image-intel-iotgUpgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-azureUpgrade linux-image-6.8.0-1019-nvidia-64kUpgrade linux-image-lowlatencyUpgrade linux-image-intel-iot-realtimeUpgrade linux-image-nvidia-lowlatency-5.15Upgrade linux-image-oem-20.04bUpgrade linux-image-lowlatency-hwe-24.04Upgrade linux-image-gcp-4.15Upgrade linux-image-gkeop-6.8Upgrade linux-image-lowlatency-5.4Upgrade linux-image-oem-20.04cUpgrade linux-image-6.8.0-1017-ibmUpgrade linux-image-aws-lts-22.04Upgrade linux-image-5.15.0-1092-azureUpgrade linux-image-aws-5.4Upgrade linux-image-5.15.0-1029-nvidia-tegra-igx-rtUpgrade linux-image-5.4.0-1148-aws-fipsUpgrade linux-image-5.4.0-1154-azure-fipsUpgrade linux-image-bluefield-5.4Upgrade linux-image-oemUpgrade linux-image-oem-22.04Upgrade linux-image-azure-lts-22.04Upgrade linux-image-4.15.0-1175-gcpUpgrade linux-image-fips-5.15Upgrade linux-image-4.15.0-239-lowlatencyUpgrade linux-image-gcp-fipsUpgrade linux-image-6.8.0-1019-nvidiaUpgrade linux-image-aws-4.15Upgrade linux-image-5.4.0-1052-iotUpgrade linux-image-6.8.0-1002-gkeopUpgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-gkeUpgrade linux-image-6.8.0-1016-raspiUpgrade linux-image-aws-fipsUpgrade linux-image-5.15.0-1051-xilinx-zynqmpUpgrade linux-image-oem-22.04aUpgrade linux-image-oracle-5.15Upgrade linux-image-genericUpgrade linux-image-nvidia-tegra-igx-rtUpgrade linux-image-6.8.0-1020-awsUpgrade linux-image-generic-lts-xenialUpgrade linux-image-6.8.0-1020-azureUpgrade linux-image-fipsUpgrade linux-image-lowlatency-5.15Upgrade linux-image-generic-lpae-5.15Upgrade linux-image-xilinx-zynqmpUpgrade linux-image-aws-64k-lts-22.04Upgrade linux-image-azure-lts-20.04Upgrade linux-image-6.8.0-1018-oemUpgrade linux-image-virtual-5.4Upgrade linux-image-generic-lpaeUpgrade linux-image-kvm-5.15Upgrade linux-image-gcp-fips-4.15Upgrade linux-image-generic-64kUpgrade linux-image-5.15.0-1069-gkeopUpgrade linux-image-virtual-hwe-20.04Upgrade linux-image-nvidia-tegra-rt-5.15Upgrade linux-image-raspi2Upgrade linux-image-5.15.0-1083-raspiUpgrade linux-image-5.15.0-143-genericUpgrade linux-image-lowlatency-64k-hwe-22.04Upgrade linux-image-nvidia-tegra-rtUpgrade linux-image-5.4.0-1151-gcpUpgrade linux-image-5.4.0-1122-fipsUpgrade linux-image-4.15.0-1182-awsUpgrade linux-image-ibm-5.15Upgrade linux-image-4.4.0-1183-awsUpgrade linux-image-5.15.0-1094-azure-fipsUpgrade linux-image-5.4.0-1131-raspiUpgrade linux-image-gcp-lts-22.04Upgrade linux-image-snapdragon-5.4Upgrade linux-image-nvidia-64k-hwe-22.04Upgrade linux-image-5.4.0-1135-kvmUpgrade linux-image-nvidiaUpgrade linux-image-raspiUpgrade linux-image-ibmUpgrade linux-image-lowlatency-64k-hwe-24.04Upgrade linux-image-nvidia-tegra-igx-5.15Upgrade linux-image-4.4.0-1145-awsUpgrade linux-image-snapdragon-hwe-18.04Upgrade linux-image-5.15.0-1094-azureUpgrade linux-image-intelUpgrade linux-image-5.15.0-1084-gkeUpgrade linux-image-azure-4.15Upgrade linux-image-virtual-hwe-22.04Upgrade linux-image-generic-hwe-20.04Upgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-nvidia-tegra-igxUpgrade linux-image-oracle-lts-22.04Upgrade linux-image-6.8.0-50-genericUpgrade linux-image-oem-20.04Upgrade linux-image-generic-5.15Upgrade linux-image-xilinx-zynqmp-5.15Upgrade linux-image-oracle-4.15Upgrade linux-image-5.15.0-1081-nvidiaUpgrade linux-image-5.15.0-1083-kvmUpgrade linux-image-6.8.0-1019-gcpUpgrade linux-image-5.15.0-143-fipsUpgrade linux-image-4.4.0-1146-kvmUpgrade linux-image-oracleUpgrade linux-image-gcpUpgrade linux-image-gcp-lts-20.04Upgrade linux-image-bluefieldUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-5.4.0-219-generic-lpaeUpgrade linux-image-lowlatency-hwe-22.04Upgrade linux-image-5.15.0-1087-aws-fipsUpgrade linux-image-intel-iot-realtime-5.15Upgrade linux-image-awsUpgrade linux-image-oracle-5.4Upgrade linux-image-5.4.0-1151-gcp-fipsUpgrade linux-image-generic-5.4Upgrade linux-image-oracle-lts-18.04Upgrade linux-image-5.4.0-1146-oracleUpgrade linux-image-gcp-lts-18.04Upgrade linux-image-4.4.0-1115-fipsUpgrade linux-image-raspi-hwe-18.04Upgrade linux-image-4.4.0-270-lowlatencyUpgrade linux-image-azure-cvmUpgrade linux-image-4.15.0-1165-kvmUpgrade linux-image-realtimeUpgrade linux-image-5.4.0-1066-xilinx-zynqmpUpgrade linux-image-5.4.0-1148-awsUpgrade linux-image-azure-fipsUpgrade linux-image-nvidia-64k-6.8Upgrade linux-image-5.15.0-143-lowlatencyUpgrade linux-image-5.15.0-1040-nvidia-tegra-rtUpgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-raspi-5.15Upgrade linux-image-oem-20.04dUpgrade linux-image-nvidia-6.8Upgrade linux-image-generic-hwe-16.04Upgrade linux-image-generic-hwe-18.04Upgrade linux-image-gcp-fips-5.4Upgrade linux-image-4.4.0-270-genericUpgrade linux-image-aws-fips-4.15Upgrade linux-image-5.15.0-143-lowlatency-64kUpgrade linux-image-5.15.0-1086-gcpUpgrade linux-image-5.15.0-1040-nvidia-tegraUpgrade linux-image-gcp-5.15Upgrade linux-image-5.15.0-1081-nvidia-lowlatencyUpgrade linux-image-virtual-lts-xenialUpgrade linux-image-virtual-5.15Upgrade linux-image-raspi-nolpaeUpgrade linux-image-lowlatency-lts-xenialUpgrade linux-image-generic-64k-hwe-22.04Upgrade linux-image-lowlatency-64k-5.15Upgrade linux-image-generic-lpae-5.4Upgrade linux-image-5.4.0-219-lowlatencyUpgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-nvidia-64kUpgrade linux-image-5.15.0-143-generic-lpaeUpgrade linux-image-kvmUpgrade linux-image-oem-22.04bUpgrade linux-image-5.15.0-1080-intel-iot-realtimeUpgrade linux-image-oracle-64kUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-ibm-5.4Upgrade linux-image-gcp-5.4Upgrade linux-image-6.8.0-1017-oracleUpgrade linux-image-azure-5.15Upgrade linux-image-nvidia-hwe-22.04Upgrade linux-image-5.15.0-1087-realtimeUpgrade linux-image-6.8.0-1020-azure-fdeUpgrade linux-image-5.4.0-1153-azureUpgrade linux-image-aws-64k-5.15Upgrade linux-image-gkeop-5.15Upgrade linux-image-4.15.0-239-genericUpgrade linux-image-5.4.0-219-genericUpgrade linux-image-5.15.0-1083-intel-iotgUpgrade linux-image-azure-fips-5.4Upgrade linux-image-fips-5.4Upgrade linux-image-aws-lts-18.04Upgrade linux-image-5.15.0-143-generic-64kUpgrade linux-image-aws-fips-5.4Upgrade linux-image-4.15.0-1190-azureUpgrade linux-image-aws-5.15Upgrade linux-image-5.15.0-1086-gcp-fipsUpgrade linux-image-virtualUpgrade linux-image-aws-hweUpgrade linux-image-4.15.0-2099-azure-fipsUpgrade linux-image-6.8.0-50-lowlatencyUpgrade linux-image-virtual-hwe-18.04Upgrade linux-image-6.8.0-1019-nvidia-lowlatencyUpgrade linux-image-aws-fips-5.15Upgrade linux-image-4.15.0-2120-aws-fipsUpgrade linux-image-lowlatency-hwe-18.04Upgrade linux-image-azure-5.4Upgrade linux-image-generic-hwe-22.04Upgrade linux-image-oem-22.04dUpgrade linux-image-azure-fdeUpgrade linux-image-5.15.0-1087-aws-64kUpgrade linux-image-raspi-5.4Upgrade linux-image-nvidia-lowlatency-64kUpgrade linux-image-ibm-lts-24.04 | Dec 13, 2024 | Sep 18, 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