Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1336 CNY

100%

CVE-2024-46787— userfaultfd: fix checks for huge PMDs

Quick assessment

Affected
Linux Linux
Exploitation
No confirmed in-the-wild exploitation; assess based on exposure
Recommended action
Check the vendor advisory and references for a fixed version. If immediate upgrade is impossible, restrict exposure and increase monitoring.

Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel存在安全漏洞。攻击者利用该漏洞导致资源访问冲突。

CVSS 7.8 · High EPSS 0.22% · P13

Possible ATT&CK Techniques 1 AI

T1059 · Command and Scripting Interpreter

Affected Version Matrix 8

VendorProduct Version RangeStatus
Linux Linux c1a4de99fada21e2e9251e52cbb51eff5aadc757< 3c6b4bcf37845c9359aed926324bed66bdd2448d affected
c1a4de99fada21e2e9251e52cbb51eff5aadc757< 98cc18b1b71e23fe81a5194ed432b20c2d81a01a affected
c1a4de99fada21e2e9251e52cbb51eff5aadc757< 71c186efc1b2cf1aeabfeff3b9bd5ac4c5ac14d8 affected
4.3 affected
< 4.3 unaffected
6.6.51≤ 6.6.* unaffected
6.10.10≤ 6.10.* unaffected
6.11≤ * unaffected
Get alerts for future matching vulnerabilities Log in to subscribe

I. Basic Information for CVE-2024-46787

Vulnerability Information

Have questions about the vulnerability? See if Shenlong's analysis helps!
View Shenlong Deep Dive ↗

Although we use advanced large model technology, its output may still contain inaccurate or outdated information.Shenlong tries to ensure data accuracy, but please verify and judge based on the actual situation.

Vulnerability Title
userfaultfd: fix checks for huge PMDs
Source: CVE Program / CVE List V5
Vulnerability Description
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.
Source: CVE Program / CVE List V5
CVSS Information
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Source: CVE Program / CVE List V5
Vulnerability Type
N/A
Source: CVE Program / CVE List V5
Vulnerability Title
Linux kernel 安全漏洞
Source: CNNVD (China National Vulnerability Database)
Vulnerability Description
Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel存在安全漏洞。攻击者利用该漏洞导致资源访问冲突。
Source: CNNVD (China National Vulnerability Database)
CVSS Information
N/A
Source: CNNVD (China National Vulnerability Database)
Vulnerability Type
N/A
Source: CNNVD (China National Vulnerability Database)

Affected Products

Vendor Product Affected Versions CPE Subscribe
Linux Linux c1a4de99fada21e2e9251e52cbb51eff5aadc757 ~ 3c6b4bcf37845c9359aed926324bed66bdd2448d -
Linux Linux 4.3 -

II. Public POCs for CVE-2024-46787

# POC Description Source Link Shenlong Link
AI-Generated POC Premium

No public POC found.

Login to generate AI POC

III. Intelligence Information for CVE-2024-46787

登录查看更多情报信息。

Patches & Fixes for CVE-2024-46787 (3)

Same Patch Batch · Linux · 2024-09-18 · 85 CVEs total

CVE-2024-46717 9.8 CRITICAL net/mlx5e: SHAMPO, Fix incorrect page release
CVE-2024-46736 9.8 CRITICAL smb: client: fix double put of @cfile in smb2_rename_path()
CVE-2024-46796 9.8 CRITICAL smb: client: fix double put of @cfile in smb2_set_path_size()
CVE-2024-46755 8.8 HIGH wifi: mwifiex: Do not return unused priv in mwifiex_get_priv_by_id()
CVE-2024-46750 7.8 HIGH PCI: Add missing bridge lock to pci_bus_lock()
CVE-2024-46788 7.8 HIGH tracing/osnoise: Use a cpumask to know what threads are kthreads
CVE-2024-46792 7.8 HIGH riscv: misaligned: Restrict user access to kernel memory
CVE-2024-46734 7.8 HIGH btrfs: fix race between direct IO write and fsync when using same fd
CVE-2024-46738 7.8 HIGH VMCI: Fix use-after-free when removing resource in vmci_resource_remove()
CVE-2024-46740 7.8 HIGH binder: fix UAF caused by offsets overwrite
CVE-2024-46781 7.8 HIGH nilfs2: fix missing cleanup on rollforward recovery error
CVE-2024-46746 7.8 HIGH HID: amd_sfh: free driver_data after destroying hid device
CVE-2024-46780 7.8 HIGH nilfs2: protect references to superblock parameters exposed in sysfs
CVE-2024-46741 7.8 HIGH misc: fastrpc: Fix double free of 'buf' in error path
CVE-2024-46751 7.8 HIGH btrfs: don't BUG_ON() when 0 reference count at btrfs_lookup_extent_info()
CVE-2024-46777 7.8 HIGH udf: Avoid excessive partition lengths
CVE-2024-46754 7.8 HIGH bpf: Remove tst_run from lwt_seg6local_prog_ops.
CVE-2024-46762 7.8 HIGH xen: privcmd: Fix possible access to a freed kirqfd instance
CVE-2024-46765 7.8 HIGH ice: protect XDP configuration with a mutex
CVE-2024-46771 7.8 HIGH can: bcm: Remove proc entry when dev is unregistered.

Showing top 20 of 85 CVEs. View all on vendor page &rarr; →

IV. Related Vulnerabilities

V. Comments for CVE-2024-46787

No comments yet


Leave a comment