Cloudanix VulnDB

CVE-2026-31456

Medium · 4.7

CVSS

4.7

EPSS

0.1%

Published

Apr 22, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A local user may be able to crash affected Linux systems by triggering a rare timing bug in how the kernel reads memory mappings.

Exploitation
Local Privilege
Attacker needs
Low Privilege
Complexity
High
Impact
Denial Of Service
Component
OS kernel
Class
Race Condition
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

This is a Linux kernel memory-management race condition in the page table walking code. A concurrent split of a PUD-sized mapping and a refault of the same PUD leaf entry can cause the kernel to descend into a PMD range that is no longer valid. Under the right timing, this results in a kernel page fault and BUG/Oops in page-walking paths such as walk_pgd_range(), __walk_page_range(), walk_page_vma(), and show_numa_map(). The practical technical impact is local denial of service through a kernel crash or system instability; the published CVSS vector indicates local access, low privileges, high attack complexity, no user interaction, and high availability impact, with no expected confidentiality or integrity impact.

Why it matters to the business

Successful exploitation can crash or destabilize affected Linux systems, interrupting workloads, virtualized infrastructure, GPU/VFIO passthrough hosts, or systems where processes interact with large memory mappings and NUMA reporting. Because exploitation requires local low-privileged access and precise race timing, broad internet-scale exploitation is unlikely; however, multi-user servers, shared compute platforms, virtualization hosts, and environments running untrusted local workloads have higher operational exposure. The vulnerability is not listed in CISA KEV, has no known ransomware association, no known public exploit maturity, and has a very low, flat EPSS score, so remediation should be prioritized based on system criticality and local-user exposure rather than emergency internet-facing risk.

How an attack unfolds

An attacker first needs the ability to run code or trigger reads as a local low-privileged user on an affected Linux system. They then attempt to create timing conditions where one thread is walking a process address space, for example by repeatedly reading /proc/<pid>/numa_maps, while another thread or subsystem causes concurrent changes to large page table entries, such as refaulting or splitting a PUD leaf mapping. The published reproducer context involves reading numa_maps while VFIO-PCI is setting up DMA through vfio_pin_pages_remote on a large BAR mapping. If the race is won, the kernel may attempt to walk a PMD range that has disappeared, triggering an invalid memory access in page-walking code and producing a kernel Oops or BUG. The expected attacker outcome is a denial-of-service crash or forced reboot, not privilege escalation or data theft based on the provided impact vector.

How to fix it

Upgrade to a Linux kernel build that includes the upstream fix for the mm/pagewalk race, specifically the change that validates the PUD entry in walk_pmd_range() using a stable pudp_get() snapshot and retries with ACTION_AGAIN when the PUD is not present or is a leaf. No exact fixed package versions were provided in the input, so use your Linux distribution vendor's security advisories and kernel changelogs to identify the corrected kernel for your release stream. Where immediate patching is not possible, reduce exposure by limiting local shell access, restricting untrusted workloads, reducing access to VFIO device passthrough capabilities, and applying least privilege to users and services that can interact with /proc process memory-map interfaces. For highly available systems, schedule kernel updates with reboot planning because kernel remediation generally requires booting into the patched kernel.

How to confirm the fix worked

Confirm the running kernel is a vendor-supported build that includes the mm/pagewalk fix for this issue, not merely that the package is installed on disk. Validate with uname -r, package-manager kernel version checks, and vendor advisory mapping for the deployed distribution. After updating, reboot into the patched kernel and verify that the vulnerable code path no longer crashes under regression testing that exercises concurrent /proc/<pid>/numa_maps reads and large mapping or VFIO-related activity. Review kernel logs after testing for absence of Oops/BUG traces referencing walk_pgd_range, walk_pmd_range, __walk_page_range, walk_page_vma, or show_numa_map. In fleet scanning, flag systems running affected kernel builds, especially those that allow local untrusted users, containers with elevated host access, or VFIO-PCI passthrough workloads.

Typical attack path

  1. Gain local code execution or shell access on an affected Linux host as a low-privileged user.
  2. Identify a target process or workload with large mappings or conditions that exercise PUD/PMD page-table walking, such as VFIO-PCI DMA setup with large BAR mappings.
  3. Repeatedly trigger page-table walking paths, such as reading /proc/<pid>/numa_maps for the target process.
  4. Concurrently trigger mapping changes, refaults, or page-table splits that race with the page walker.
  5. Win the race so the kernel descends into an invalid PMD range after the PUD state changed.
  6. Cause a kernel BUG/Oops and degrade availability through a crash, hang, or required reboot.

How to detect it

Look for evidence of kernel crashes or instability rather than network indicators. Primary sources are kernel ring buffer logs, system journal entries, /var/log/kern.log, /var/log/messages, crash dumps, kdump/vmcore artifacts, hypervisor console logs, and monitoring alerts for unexpected reboots. Search for Oops or BUG traces that include page-walking functions such as walk_pgd_range, walk_pmd_range, __walk_page_range, walk_page_vma, and show_numa_map. Correlate these events with local process activity involving reads of /proc/<pid>/numa_maps and workloads using VFIO-PCI passthrough, large BAR mappings, or DMA setup. If auditd, eBPF telemetry, or EDR process monitoring is available, review repeated or high-frequency access to /proc/*/numa_maps shortly before the crash. Absence of these artifacts does not prove non-exploitation because a full system crash can truncate logs; persistent crash dumps and remote log forwarding improve confidence.

  • BUG: unable to handle page fault for address:
  • Oops: Oops: 0000
  • RIP: 0010:walk_pgd_range
  • __walk_page_range+
  • walk_page_vma+
  • show_numa_map+
  • seq_read_iter+
  • vfio_pin_pages_remote
  • vfio-pci
  • /proc/*/numa_maps
  • walk_pmd_range
  • ACTION_AGAIN
  • PGD 0 P4D 0

What your security team should do

  • Prioritize patching shared Linux systems, virtualization hosts, GPU/VFIO passthrough hosts, high-availability servers, and platforms that run untrusted local workloads.
  • Track the relevant Linux distribution advisory and deploy the first vendor kernel that includes the mm/pagewalk PUD validation fix; reboot systems into the patched kernel.
  • Harden local access while patching is pending: remove unnecessary shell accounts, restrict sudo pathways, and limit who can run workloads on affected hosts.
  • Restrict VFIO-PCI passthrough and similar device/DMA setup capabilities to trusted administrators or trusted workloads only.
  • Monitor kernel logs for Oops/BUG signatures in page-walking paths and correlate with local user activity and reads of /proc/<pid>/numa_maps.
  • Because EPSS is very low, KEV status is false, and exploit maturity is none, handle this as a local availability-risk patch rather than an internet-facing emergency, unless the affected host supports untrusted multi-tenant workloads.
  • Include this vulnerability in kernel lifecycle management checks to ensure installed, running, and fallback boot kernels are all remediated or controlled.

The record

In the Linux kernel, the following vulnerability has been resolved: mm/pagewalk: fix race between concurrent split and refault The splitting of a PUD entry in walk_pud_range() can race with a concurrent thread refaulting the PUD leaf entry causing it to try walking a PMD range that has disappeared. An example and reproduction of this is to try reading numa_maps of a process while VFIO-PCI is setting up DMA (specifically the vfio_pin_pages_remote call) on a large BAR for that process. This will trigger a kernel BUG: vfio-pci 0000:03:00.0: enabling device (0000 -> 0002) BUG: unable to handle page fault for address: ffffa23980000000 PGD 0 P4D 0 Oops: Oops: 0000 [#1] SMP NOPTI ... RIP: 0010:walk_pgd_range+0x3b5/0x7a0 Code: 8d 43 ff 48 89 44 24 28 4d 89 ce 4d 8d a7 00 00 20 00 48 8b 4c 24 28 49 81 e4 00 00 e0 ff 49 8d 44 24 ff 48 39 c8 4c 0f 43 e3 <49> f7 06 9f ff ff ff 75 3b 48 8b 44 24 20 48 8b 40 28 48 85 c0 74 RSP: 0018:ffffac23e1ecf808 EFLAGS: 00010287 RAX: 00007f44c01fffff RBX: 00007f4500000000 RCX: 00007f44ffffffff RDX: 0000000000000000 RSI: 000ffffffffff000 RDI: ffffffff93378fe0 RBP: ffffac23e1ecf918 R08: 0000000000000004 R09: ffffa23980000000 R10: 0000000000000020 R11: 0000000000000004 R12: 00007f44c0200000 R13: 00007f44c0000000 R14: ffffa23980000000 R15: 00007f44c0000000 FS: 00007fe884739580(0000) GS:ffff9b7d7a9c0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffffa23980000000 CR3: 000000c0650e2005 CR4: 0000000000770ef0 PKRU: 55555554 Call Trace: <TASK> __walk_page_range+0x195/0x1b0 walk_page_vma+0x62/0xc0 show_numa_map+0x12b/0x3b0 seq_read_iter+0x297/0x440 seq_read+0x11d/0x140 vfs_read+0xc2/0x340 ksys_read+0x5f/0xe0 do_syscall_64+0x68/0x130 ? get_page_from_freelist+0x5c2/0x17e0 ? mas_store_prealloc+0x17e/0x360 ? vma_set_page_prot+0x4c/0xa0 ? __alloc_pages_noprof+0x14e/0x2d0 ? __mod_memcg_lruvec_state+0x8d/0x140 ? __lruvec_stat_mod_folio+0x76/0xb0 ? __folio_mod_stat+0x26/0x80 ? do_anonymous_page+0x705/0x900 ? __handle_mm_fault+0xa8d/0x1000 ? __count_memcg_events+0x53/0xf0 ? handle_mm_fault+0xa5/0x360 ? do_user_addr_fault+0x342/0x640 ? arch_exit_to_user_mode_prepare.constprop.0+0x16/0xa0 ? irqentry_exit_to_user_mode+0x24/0x100 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7fe88464f47e Code: c0 e9 b6 fe ff ff 50 48 8d 3d be 07 0b 00 e8 69 01 02 00 66 0f 1f 84 00 00 00 00 00 64 8b 04 25 18 00 00 00 85 c0 75 14 0f 05 <48> 3d 00 f0 ff ff 77 5a c3 66 0f 1f 84 00 00 00 00 00 48 83 ec 28 RSP: 002b:00007ffe6cd9a9b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000000 RAX: ffffffffffffffda RBX: 0000000000020000 RCX: 00007fe88464f47e RDX: 0000000000020000 RSI: 00007fe884543000 RDI: 0000000000000003 RBP: 00007fe884543000 R08: 00007fe884542010 R09: 0000000000000000 R10: fffffffffffffbc5 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000003 R14: 0000000000020000 R15: 0000000000020000 </TASK> Fix this by validating the PUD entry in walk_pmd_range() using a stable snapshot (pudp_get()). If the PUD is not present or is a leaf, retry the walk via ACTION_AGAIN instead of descending further. This mirrors the retry logic in walk_pte_range(), which lets walk_pmd_range() retry if the PTE is not being got by pte_offset_map_lock().

Affected packages

Ecosystem Package Introduced Fixed

Related vulnerabilities