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.
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Debian | — | Upgrade linux | May 15, 2025 | Sep 18, 2024 |
| Huawei Euleros 2_0_sp11 | — | Upgrade kernel-tools-libsUpgrade kernel-toolsUpgrade kernel-abi-stablelistsUpgrade bpftoolUpgrade kernelUpgrade python3-perf | Dec 12, 2024 | Sep 18, 2024 |
| Huawei Euleros 2_0_sp12 | — | Upgrade kernel-toolsUpgrade kernel-abi-stablelistsUpgrade kernel-tools-libsUpgrade kernelUpgrade bpftoolUpgrade python3-perf | Dec 12, 2024 | Sep 18, 2024 |
| Redhat_linux | — | No solution existsUpgrade kernel-rtUpgrade kernel | May 15, 2025 | Sep 18, 2024 |
| Suse | — | Upgrade dtb-socionextUpgrade dtb-appleUpgrade dtb-amdUpgrade dtb-sprdUpgrade kernel-debug-vdsoUpgrade kernel-debug-livepatch-develUpgrade kernel-defaultUpgrade kernel-default-manUpgrade kselftests-kmp-defaultUpgrade kernel-docsUpgrade kernel-rt_debugUpgrade dlm-kmp-azureUpgrade kernel-default-baseUpgrade dtb-marvellUpgrade dtb-nvidiaUpgrade kernel-rt-extraUpgrade kernel-obs-buildUpgrade kernel-rt_debug-vdsoUpgrade kernel-default-livepatch-develUpgrade dtb-rockchipUpgrade cluster-md-kmp-64kbUpgrade kernel-64kb-develUpgrade kernel-azure-vdsoUpgrade kernel-kvmsmall-vdsoUpgrade reiserfs-kmp-rtUpgrade kernel-azure-baseUpgrade kernel-azure-extraUpgrade kernel-64kb-extraUpgrade kernel-debugUpgrade kselftests-kmp-rtUpgrade kernel-rt_debug-livepatch-develUpgrade kernel-syms-rtUpgrade kernel-debug-develUpgrade kernel-64kb-optionalUpgrade dlm-kmp-rtUpgrade reiserfs-kmp-defaultUpgrade dtb-hisiliconUpgrade ocfs2-kmp-azureUpgrade kernel-azureUpgrade kernel-docs-htmlUpgrade dtb-armUpgrade cluster-md-kmp-defaultUpgrade dlm-kmp-defaultUpgrade kernel-rt-livepatch-develUpgrade dtb-renesasUpgrade gfs2-kmp-defaultUpgrade dtb-exynosUpgrade kernel-default-base-rebuildUpgrade dlm-kmp-64kbUpgrade ocfs2-kmp-defaultUpgrade kernel-rt-livepatchUpgrade kernel-default-develUpgrade kernel-devel-azureUpgrade dtb-amazonUpgrade kernel-develUpgrade kernel-azure-optionalUpgrade kernel-64kbUpgrade dtb-lgUpgrade dtb-caviumUpgrade kernel-sourceUpgrade kernel-rtUpgrade kernel-default-livepatchUpgrade kernel-default-extraUpgrade dtb-alteraUpgrade reiserfs-kmp-azureUpgrade ocfs2-kmp-64kbUpgrade kernel-source-rtUpgrade dtb-mediatekUpgrade kselftests-kmp-azureUpgrade dtb-apmUpgrade gfs2-kmp-rtUpgrade dtb-amlogicUpgrade kselftests-kmp-64kbUpgrade kernel-kvmsmall-livepatch-develUpgrade kernel-kvmsmall-develUpgrade kernel-64kb-livepatch-develUpgrade dtb-freescaleUpgrade kernel-kvmsmallUpgrade kernel-default-optionalUpgrade reiserfs-kmp-64kbUpgrade kernel-rt-develUpgrade kernel-macrosUpgrade kernel-obs-qaUpgrade kernel-rt-vdsoUpgrade dtb-qcomUpgrade ocfs2-kmp-rtUpgrade kernel-zfcpdumpUpgrade kernel-rt-optionalUpgrade kernel-azure-develUpgrade cluster-md-kmp-azureUpgrade kernel-syms-azureUpgrade kernel-rt_debug-develUpgrade kernel-devel-rtUpgrade kernel-azure-livepatch-develUpgrade cluster-md-kmp-rtUpgrade dtb-broadcomUpgrade gfs2-kmp-64kbUpgrade dtb-xilinxUpgrade kernel-symsUpgrade kernel-source-vanillaUpgrade kernel-source-azureUpgrade kernel-default-vdsoUpgrade dtb-allwinnerUpgrade gfs2-kmp-azure | Dec 5, 2025 | Jun 3, 2025 |
| Ubuntu | — | Upgrade linux-image-oracle-lts-22.04Upgrade linux-image-6.8.0-50-genericUpgrade linux-image-gcp-lts-20.04Upgrade linux-image-5.15.0-1087-aws-fipsUpgrade linux-image-5.15.0-1087-realtimeUpgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-gcpUpgrade linux-image-5.15.0-143-fipsUpgrade linux-image-4.15.0-239-genericUpgrade linux-image-gcp-fips-5.4Upgrade linux-image-5.4.0-1151-gcp-fipsUpgrade linux-image-5.15.0-1081-nvidia-lowlatencyUpgrade linux-image-gcp-5.15Upgrade linux-image-raspi-5.15Upgrade linux-image-generic-hwe-16.04Upgrade linux-image-aws-fips-4.15Upgrade linux-image-virtual-lts-xenialUpgrade linux-image-generic-hwe-20.04Upgrade linux-image-nvidia-lowlatencyUpgrade linux-image-nvidia-tegra-igxUpgrade linux-image-5.4.0-219-genericUpgrade linux-image-aws-64k-5.15Upgrade linux-image-azure-5.15Upgrade linux-image-ibm-5.4Upgrade linux-image-nvidia-lowlatency-64kUpgrade linux-image-oracle-4.15Upgrade linux-image-6.8.0-1019-gcpUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-5.15.0-1081-nvidiaUpgrade linux-image-oracle-64kUpgrade linux-image-6.8.0-1020-azure-fdeUpgrade linux-image-oem-20.04dUpgrade linux-image-nvidia-6.8Upgrade linux-image-4.4.0-1115-fipsUpgrade linux-image-4.4.0-270-genericUpgrade linux-image-azure-5.4Upgrade linux-image-kvmUpgrade linux-image-4.15.0-1165-kvmUpgrade linux-image-gcp-5.4Upgrade linux-image-lowlatency-lts-xenialUpgrade linux-image-raspi-hwe-18.04Upgrade linux-image-5.15.0-143-generic-lpaeUpgrade linux-image-5.4.0-1148-awsUpgrade linux-image-5.4.0-219-generic-lpaeUpgrade linux-image-nvidia-hwe-22.04Upgrade linux-image-gkeop-5.15Upgrade linux-image-6.8.0-50-lowlatencyUpgrade linux-image-aws-5.15Upgrade linux-image-virtual-hwe-18.04Upgrade linux-image-raspi-nolpaeUpgrade linux-image-aws-hweUpgrade linux-image-aws-lts-18.04Upgrade linux-image-azure-fips-5.4Upgrade linux-image-realtimeUpgrade linux-image-4.15.0-2099-azure-fipsUpgrade linux-image-5.15.0-1083-intel-iotgUpgrade linux-image-fips-5.4Upgrade linux-image-5.15.0-143-generic-64kUpgrade linux-image-aws-fips-5.4Upgrade linux-image-lowlatency-hwe-18.04Upgrade linux-image-aws-fips-5.15Upgrade linux-image-5.15.0-1087-aws-64kUpgrade linux-image-virtualUpgrade linux-image-4.15.0-1190-azureUpgrade linux-image-azure-cvmUpgrade linux-image-4.15.0-2120-aws-fipsUpgrade linux-image-generic-64k-hwe-22.04Upgrade linux-image-generic-lpae-5.4Upgrade linux-image-awsUpgrade linux-image-5.15.0-1086-gcp-fipsUpgrade linux-image-intel-iot-realtime-5.15Upgrade linux-image-oem-22.04bUpgrade linux-image-4.4.0-270-lowlatencyUpgrade linux-image-generic-hwe-22.04Upgrade linux-image-6.8.0-1019-nvidia-lowlatencyUpgrade linux-image-azure-fipsUpgrade linux-image-4.4.0-1146-kvmUpgrade linux-image-gcp-lts-18.04Upgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-5.4.0-219-lowlatencyUpgrade linux-image-nvidia-64kUpgrade linux-image-bluefieldUpgrade linux-image-5.15.0-1080-intel-iot-realtimeUpgrade linux-image-5.4.0-1066-xilinx-zynqmpUpgrade linux-image-oem-22.04dUpgrade linux-image-oracleUpgrade linux-image-azure-fdeUpgrade linux-image-oracle-5.4Upgrade linux-image-5.15.0-1040-nvidia-tegraUpgrade linux-image-5.15.0-1040-nvidia-tegra-rtUpgrade linux-image-generic-5.4Upgrade linux-image-xilinx-zynqmp-5.15Upgrade linux-image-6.8.0-1017-oracleUpgrade linux-image-generic-5.15Upgrade linux-image-5.4.0-1153-azureUpgrade linux-image-lowlatency-hwe-22.04Upgrade linux-image-5.15.0-1086-gcpUpgrade linux-image-oracle-lts-18.04Upgrade linux-image-5.4.0-1146-oracleUpgrade linux-image-5.15.0-143-lowlatencyUpgrade linux-image-nvidia-64k-6.8Upgrade linux-image-raspi-5.4Upgrade linux-image-virtual-5.15Upgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-generic-hwe-18.04Upgrade linux-image-lowlatency-64k-5.15Upgrade linux-image-5.15.0-1083-kvmUpgrade linux-image-oem-20.04Upgrade linux-image-5.15.0-143-lowlatency-64kUpgrade linux-image-ibm-lts-24.04Upgrade linux-image-oem-osp1Upgrade linux-image-generic-lpaeUpgrade linux-image-nvidiaUpgrade linux-image-5.15.0-1069-gkeopUpgrade linux-image-virtual-hwe-20.04Upgrade linux-image-5.4.0-1148-aws-fipsUpgrade linux-image-oemUpgrade linux-image-generic-64kUpgrade linux-image-6.8.0-1002-gkeopUpgrade linux-image-lowlatency-64k-hwe-24.04Upgrade linux-image-aws-fipsUpgrade linux-image-azure-4.15Upgrade linux-image-aws-4.15Upgrade linux-image-6.8.0-1019-nvidiaUpgrade linux-image-6.8.0-1016-raspiUpgrade linux-image-generic-lts-xenialUpgrade linux-image-5.4.0-1135-kvmUpgrade linux-image-6.8.0-1020-azureUpgrade linux-image-nvidia-5.15Upgrade linux-image-5.15.0-1084-gkeUpgrade linux-image-6.8.0-1020-awsUpgrade linux-image-6.8.0-50-lowlatency-64kUpgrade linux-image-6.8.0-1017-oracle-64kUpgrade linux-image-5.15.0-1079-ibmUpgrade linux-image-5.4.0-1052-iotUpgrade linux-image-gcp-lts-22.04Upgrade linux-image-genericUpgrade linux-image-ibmUpgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-gkeUpgrade linux-image-raspiUpgrade linux-image-4.15.0-239-lowlatencyUpgrade linux-image-5.15.0-1087-awsUpgrade linux-image-lowlatencyUpgrade linux-image-nvidia-tegra-igx-5.15Upgrade linux-image-ibm-lts-20.04Upgrade linux-image-ibm-classicUpgrade linux-image-xilinx-zynqmpUpgrade linux-image-6.8.0-1018-oemUpgrade linux-image-azure-lts-20.04Upgrade linux-image-virtual-5.4Upgrade linux-image-oem-22.04aUpgrade linux-image-generic-lpae-5.15Upgrade linux-image-fipsUpgrade linux-image-5.15.0-1051-xilinx-zynqmpUpgrade linux-image-nvidia-64k-hwe-22.04Upgrade linux-image-oracle-5.15Upgrade linux-image-nvidia-tegra-igx-rtUpgrade linux-image-lowlatency-5.15Upgrade linux-image-intel-iotgUpgrade linux-image-6.8.0-50-generic-64kUpgrade linux-image-oem-20.04cUpgrade linux-image-gke-5.15Upgrade linux-image-4.15.0-1137-fipsUpgrade linux-image-5.15.0-1029-nvidia-tegra-igxUpgrade linux-image-intel-iotg-5.15Upgrade linux-image-virtual-hwe-16.04Upgrade linux-image-5.4.0-1107-bluefieldUpgrade linux-image-oem-22.04cUpgrade linux-image-generic-64k-5.15Upgrade linux-image-kvm-5.4Upgrade linux-image-gcp-fips-5.15Upgrade linux-image-5.4.0-1094-ibmUpgrade linux-image-snapdragon-hwe-18.04Upgrade linux-image-virtual-hwe-24.04Upgrade linux-image-snapdragon-5.4Upgrade linux-image-azure-lts-18.04Upgrade linux-image-5.15.0-1083-raspiUpgrade linux-image-5.15.0-143-genericUpgrade linux-image-5.4.0-1151-gcpUpgrade linux-image-lowlatency-64k-hwe-22.04Upgrade linux-image-nvidia-tegra-rtUpgrade linux-image-4.4.0-1183-awsUpgrade linux-image-nvidia-tegra-rt-5.15Upgrade linux-image-4.15.0-1182-awsUpgrade linux-image-raspi2Upgrade linux-image-5.4.0-1131-raspiUpgrade linux-image-aws-lts-20.04Upgrade linux-image-ibm-5.15Upgrade linux-image-oem-22.04Upgrade linux-image-xilinx-zynqmp-5.4Upgrade linux-image-5.15.0-1094-azure-fipsUpgrade linux-image-nvidia-tegra-5.15Upgrade linux-image-lowlatency-hwe-24.04Upgrade linux-image-intel-iot-realtimeUpgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-gcp-4.15Upgrade linux-image-5.4.0-1122-fipsUpgrade linux-image-azureUpgrade linux-image-6.8.0-1019-nvidia-64kUpgrade linux-image-5.15.0-1084-oracleUpgrade linux-image-oem-24.04aUpgrade linux-image-oracle-lts-20.04Upgrade linux-image-nvidia-lowlatency-5.15Upgrade linux-image-oem-20.04bUpgrade linux-image-intelUpgrade linux-image-aws-lts-22.04Upgrade linux-image-gkeopUpgrade linux-image-6.8.0-1017-ibmUpgrade linux-image-aws-5.4Upgrade linux-image-4.15.0-2083-gcp-fipsUpgrade linux-image-5.15.0-1092-azureUpgrade linux-image-gkeop-6.8Upgrade linux-image-bluefield-5.4Upgrade linux-image-lowlatency-5.4Upgrade linux-image-aws-64k-lts-22.04Upgrade linux-image-fips-5.15Upgrade linux-image-kvm-5.15Upgrade linux-image-azure-lts-22.04Upgrade linux-image-5.15.0-1082-intel-iotgUpgrade linux-image-5.15.0-1094-azureUpgrade linux-image-lowlatency-64kUpgrade linux-image-azure-fips-5.15Upgrade linux-image-6.8.0-1015-gkeUpgrade linux-image-4.4.0-1145-awsUpgrade linux-image-gcp-fipsUpgrade linux-image-4.15.0-1144-oracleUpgrade linux-image-6.8.0-1019-nvidia-lowlatency-64kUpgrade linux-image-lowlatency-hwe-16.04Upgrade linux-image-gcp-fips-4.15Upgrade linux-image-oem-24.04Upgrade linux-image-nvidia-tegra-igx-rt-5.15Upgrade linux-image-4.15.0-1175-gcpUpgrade linux-image-nvidia-tegraUpgrade linux-image-5.4.0-1154-azure-fipsUpgrade linux-image-virtual-hwe-22.04Upgrade linux-image-5.15.0-1029-nvidia-tegra-igx-rt | Dec 13, 2024 | Sep 18, 2024 |
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