HIGH Introduced in 3.7
arm64 ShowPte UAF
CVE-2026-93239
CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
01Description
In the Linux kernel, the following vulnerability has been resolved: arm64: mm: Fix the lockless page-table walk in show_pte() show_pte() walks page tables locklessly and can run with interrupts enabled. A concurrent teardown can free a table page while it is being walked. It can also clear a parent entry after show_pte() checked it; the regular pXd_offset() helpers then reread the cleared entry and can derive a bogus lower-level pointer and fault again. Use the lockless offset helpers with the saved parent entries, as gup_fast() does, and pass the saved PMD to pte_offset_map(). For task page tables, arm64 selects MMU_GATHER_RCU_TABLE_FREE. Disable local interrupts around the walk to hold off RCU-deferred table frees and block the tlb_remove_table_sync_one() IPI until the walk is finished. Place the IRQ guard after the header print. This does not make the output a consistent snapshot, but prevents the task page-table walk from dereferencing a released table page or deriving a pointer from a different parent value.
02KernelScan AI Analysis
Risk summary
Any local process on an arm64 system can trigger a race condition in the kernel's page-table diagnostic path, causing use-after-free when page tables are concurrently torn down during a page fault. This can crash the kernel or potentially leak kernel memory from freed pages. No special privileges are required to trigger the race.
Vulnerability analysis
The kernel's page-table diagnostic routine on arm64 walks page tables without holding locks or disabling interrupts, so a concurrent memory unmap operation can free a page-table page while it is still being read. A concurrent teardown can also clear a parent entry after it was checked, causing the standard offset helpers to reread the cleared value and derive a bogus lower-level pointer. The fix switches to lockless offset helpers that use saved copies of parent entries, passes the locally saved PMD value instead of a pointer to the live page, and disables local interrupts for the duration of the walk to block RCU-deferred page frees. Any local process can trigger this by inducing a page fault on an address whose page tables are being concurrently torn down by another thread or by munmap; no special privileges are required.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 6.6 | 3.7 | 6.6.157 | 08d931a0a850 |
| 6.12 | 3.7 | 6.12.110 | b28fe65a36b8 |
| 6.18 | 3.7 | 6.18.51 | 68cbd70795dd |
| 7.2 | 3.7 | 7.2.5 | 0f05d95b9916 |
| mainline | 3.7 | 7.3-rc2 | a77644d009de |
| cip/6.12 | 3.7 | 6.12.111-cip32 | b28fe65a36b8 |