CVE-2026-31686
High · 7.8CVSS
7.8
EPSS
0.1%
Published
Apr 27, 2026
CISA due date
—
Cloudanix analysis
A flaw in some Linux kernels can let someone with local access crash a system or possibly take control of it, so affected systems should be updated.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Moderate
- Impact
- Privilege Gain
- Component
- OS kernel
- Class
- Memory Corruption
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Medium
What it actually does
This is a Linux kernel memory-management flaw in KASAN page-table shadow cleanup. The vulnerable code assumes that page-table descriptor memory is always aligned as a full struct page, but on some architectures and page-size configurations, such as PowerPC with 64K pages, page-table objects may be allocated from slab caches instead. When persistent memory or similar memory mappings are removed, the kernel can free the wrong address or free the same page-table backing object twice, causing heap corruption. Because this occurs in kernel memory-management code, the practical impact can range from a kernel panic or denial of service to potential local privilege escalation if an attacker can reliably trigger and shape the memory corruption. The CVSS vector indicates local access with low privileges and no user interaction, with high confidentiality, integrity, and availability impact.
Why it matters to the business
Successful exploitation could allow a local user or process to crash affected Linux systems or potentially gain elevated kernel-level privileges, which can disrupt workloads, compromise sensitive data, and undermine host isolation. The issue is most relevant to systems running affected Linux kernels with the vulnerable KASAN memory-management code path, especially architectures and configurations where page-table allocations are slab-backed rather than full-page aligned. It is not currently listed in CISA KEV, is not known to be used in ransomware campaigns, has no public exploit maturity reported, and has a very low and flat EPSS score, so broad internet-scale exploitation is unlikely; however, kernel local privilege escalation and crash bugs should still be prioritized on multi-user, shared, high-availability, or production infrastructure.
How an attack unfolds
An attacker first needs local code execution on an affected Linux host. They then attempt to reach the vulnerable memory-unmapping path by causing creation and removal of memory mappings that exercise KASAN page-table shadow cleanup, such as workflows involving persistent memory device mapping, unbinding, or memory hot-remove style operations. On vulnerable architecture and kernel configurations, kasan_free_pxd() may compute the object to free using page-based alignment assumptions that do not match the actual slab allocation. During cleanup, the kernel may attempt to free an already-freed or incorrect slab object, producing double-free memory corruption. In the simplest outcome, this triggers a KASAN report, kernel taint, oops, panic, or system instability. A more capable attacker would try to groom kernel heap allocations around the double-free to convert the corruption into controlled kernel memory modification and privilege escalation. There are no named threat actors, KEV listing, or public exploit maturity associated with this issue in the provided intelligence.
How to fix it
Upgrade to a Linux kernel version or distribution kernel package that includes the upstream fix for the KASAN page-table descriptor free logic. No exact fixed package versions were provided, so use the security advisory and errata from the relevant Linux distribution, appliance vendor, cloud image provider, or kernel maintainer. Where immediate patching is not possible, reduce exposure by restricting local shell access, limiting access to privileged device-management operations such as persistent memory management and sysfs driver unbind operations, removing unnecessary persistent memory tooling from untrusted hosts, and enforcing least privilege for users and services. Because this is a kernel memory-corruption issue, mitigations should be treated as temporary; the durable fix is to deploy a patched kernel and reboot into it.
How to confirm the fix worked
Confirm the running kernel has been updated to a vendor build that contains the fix, not merely that packages were installed. Validate with commands such as `uname -a`, distribution package queries, and vendor advisory mapping for the deployed kernel build. On source-built kernels, confirm the KASAN page-table cleanup change is present in the mm/kasan code path and that kasan_free_pxd() uses the page-table start address rather than deriving a virtual address from pxd_page() in the vulnerable manner. Reboot after patching and verify the active kernel is the fixed kernel. For exposure validation, review whether affected architectures, KASAN-enabled kernels, persistent memory, memory hotplug, or similar mapping teardown paths are present. If safe in a test environment only, reproduce the previously failing PMEM mapping/unmapping workflow and confirm there are no KASAN double-free reports, kernel oopses, or slab invalid-free messages.
Typical attack path
- Gain local execution on an affected Linux system, typically as an unprivileged or low-privileged user.
- Identify whether the host runs a vulnerable kernel, architecture, page-size configuration, and memory-management configuration that can reach the affected KASAN page-table cleanup path.
- Trigger creation and teardown of relevant memory mappings, such as persistent memory or device-backed memory mappings that call into memunmap_pages() and KASAN shadow removal.
- Cause kasan_remove_zero_shadow() and kasan_free_pxd() to process a page-table descriptor whose allocation is not full-page aligned.
- Induce an invalid free or double free in kernel slab/page-table memory.
- Use the resulting condition to crash the kernel, or attempt kernel heap grooming to turn the memory corruption into privilege escalation.
How to detect it
Look for evidence of attempted or successful triggering in kernel logs, persistent logs, crash dumps, audit logs, and EDR telemetry. Useful sources include `dmesg`, `/var/log/kern.log`, `/var/log/messages`, `/var/log/syslog`, `journalctl -k`, kernel crash dump directories, pstore/ramoops, auditd records for sysfs writes, and process execution logs for memory-management tooling such as `ndctl`. Focus on KASAN reports showing double-free or invalid-free events in `kasan_remove_zero_shadow`, `kasan_free_pxd`, `memunmap_pages`, page-table slab caches such as `pgtable-*`, or stack traces involving sysfs driver unbind. Also review for suspicious local users or services repeatedly invoking persistent memory commands, writing to `/sys/bus/*/drivers/*/unbind`, or causing kernel oops/panic events. Absence of these artifacts does not prove non-exploitation, because a successful privilege-escalation attempt may avoid a visible crash, and systems without persistent kernel logging may lose evidence after reboot.
- BUG: KASAN: double-free in kasan_remove_zero_shadow
- kasan_report_invalid_free
- kasan_remove_zero_shadow
- kasan_free_pxd
- memunmap_pages
- Free of addr
- belongs to the cache pgtable-
- pgtable-2^9
- Disabling lock debugging due to kernel taint
- device_unbind_cleanup
- device_release_driver_internal
- unbind_store
- drv_attr_store
- sysfs_kf_write
- kernfs_fop_write_iter
- Comm: ndctl
- /sys/bus/*/drivers/*/unbind
- ndctl
What your security team should do
- Inventory Linux systems running affected kernel lines, prioritizing PowerPC, large-page configurations, KASAN-enabled kernels, persistent memory systems, memory hotplug systems, and shared multi-user hosts.
- Apply vendor kernel updates that include the fix, then reboot and verify the active running kernel version.
- Prioritize patching for systems where untrusted users, containers, build jobs, HPC users, or application workloads can obtain local execution.
- Restrict access to persistent memory administration, device unbind interfaces, memory hotplug operations, and sysfs driver-management paths to trusted administrators only.
- Monitor kernel logs for KASAN double-free reports, invalid frees, slab allocator warnings, oopses, or panics involving kasan_remove_zero_shadow(), kasan_free_pxd(), memunmap_pages(), ndctl, or driver unbind operations.
- Treat unexplained kernel crashes on affected systems as potentially security-relevant and preserve kernel logs, crash dumps, and audit records before rebooting or reimaging.
- Because EPSS is low, KEV is false, and no exploit maturity is reported, schedule remediation according to kernel local privilege escalation policy, but do not defer on shared or high-impact infrastructure.
The record
In the Linux kernel, the following vulnerability has been resolved: mm/kasan: fix double free for kasan pXds kasan_free_pxd() assumes the page table is always struct page aligned. But that's not always the case for all architectures. E.g. In case of powerpc with 64K pagesize, PUD table (of size 4096) comes from slab cache named pgtable-2^9. Hence instead of page_to_virt(pxd_page()) let's just directly pass the start of the pxd table which is passed as the 1st argument. This fixes the below double free kasan issue seen with PMEM: radix-mmu: Mapped 0x0000047d10000000-0x0000047f90000000 with 2.00 MiB pages ================================================================== BUG: KASAN: double-free in kasan_remove_zero_shadow+0x9c4/0xa20 Free of addr c0000003c38e0000 by task ndctl/2164 CPU: 34 UID: 0 PID: 2164 Comm: ndctl Not tainted 6.19.0-rc1-00048-gea1013c15392 #157 VOLUNTARY Hardware name: IBM,9080-HEX POWER10 (architected) 0x800200 0xf000006 of:IBM,FW1060.00 (NH1060_012) hv:phyp pSeries Call Trace: dump_stack_lvl+0x88/0xc4 (unreliable) print_report+0x214/0x63c kasan_report_invalid_free+0xe4/0x110 check_slab_allocation+0x100/0x150 kmem_cache_free+0x128/0x6e0 kasan_remove_zero_shadow+0x9c4/0xa20 memunmap_pages+0x2b8/0x5c0 devm_action_release+0x54/0x70 release_nodes+0xc8/0x1a0 devres_release_all+0xe0/0x140 device_unbind_cleanup+0x30/0x120 device_release_driver_internal+0x3e4/0x450 unbind_store+0xfc/0x110 drv_attr_store+0x78/0xb0 sysfs_kf_write+0x114/0x140 kernfs_fop_write_iter+0x264/0x3f0 vfs_write+0x3bc/0x7d0 ksys_write+0xa4/0x190 system_call_exception+0x190/0x480 system_call_vectored_common+0x15c/0x2ec ---- interrupt: 3000 at 0x7fff93b3d3f4 NIP: 00007fff93b3d3f4 LR: 00007fff93b3d3f4 CTR: 0000000000000000 REGS: c0000003f1b07e80 TRAP: 3000 Not tainted (6.19.0-rc1-00048-gea1013c15392) MSR: 800000000280f033 <SF,VEC,VSX,EE,PR,FP,ME,IR,DR,RI,LE> CR: 48888208 XER: 00000000 <...> NIP [00007fff93b3d3f4] 0x7fff93b3d3f4 LR [00007fff93b3d3f4] 0x7fff93b3d3f4 ---- interrupt: 3000 The buggy address belongs to the object at c0000003c38e0000 which belongs to the cache pgtable-2^9 of size 4096 The buggy address is located 0 bytes inside of 4096-byte region [c0000003c38e0000, c0000003c38e1000) The buggy address belongs to the physical page: page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x3c38c head: order:2 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 memcg:c0000003bfd63e01 flags: 0x63ffff800000040(head|node=6|zone=0|lastcpupid=0x7ffff) page_type: f5(slab) raw: 063ffff800000040 c000000140058980 5deadbeef0000122 0000000000000000 raw: 0000000000000000 0000000080200020 00000000f5000000 c0000003bfd63e01 head: 063ffff800000040 c000000140058980 5deadbeef0000122 0000000000000000 head: 0000000000000000 0000000080200020 00000000f5000000 c0000003bfd63e01 head: 063ffff800000002 c00c000000f0e301 00000000ffffffff 00000000ffffffff head: ffffffffffffffff 0000000000000000 00000000ffffffff 0000000000000004 page dumped because: kasan: bad access detected [ 138.953636] [ T2164] Memory state around the buggy address: [ 138.953643] [ T2164] c0000003c38dff00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 138.953652] [ T2164] c0000003c38dff80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 138.953661] [ T2164] >c0000003c38e0000: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 138.953669] [ T2164] ^ [ 138.953675] [ T2164] c0000003c38e0080: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 138.953684] [ T2164] c0000003c38e0100: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 138.953692] [ T2164] ================================================================== [ 138.953701] [ T2164] Disabling lock debugging due to kernel taint
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| openSUSE:Tumbleweed | kernel-source | 0 | 7.0.3-1.1 |
Related vulnerabilities
- CVE-2026-53354 In the Linux kernel, the following vulnerability has been resolved: arm64: errata… Also affects kernel-source
- CVE-2026-53325 In the Linux kernel, the following vulnerability has been resolved: agp/amd64: Fix broken… Also affects kernel-source
- CVE-2026-52946 In the Linux kernel, the following vulnerability has been resolved: fs/fcntl: fix… Also affects kernel-source
- CVE-2026-52907 In the Linux kernel, the following vulnerability has been resolved: media: rockchip… Also affects kernel-source
- CVE-2026-52906 In the Linux kernel, the following vulnerability has been resolved: 9p: fix access mode… Also affects kernel-source
- CVE-2026-52905 In the Linux kernel, the following vulnerability has been resolved: mm/damon/core… Also affects kernel-source
- CVE-2026-52904 In the Linux kernel, the following vulnerability has been resolved: drm/nouveau: fix… Also affects kernel-source
- CVE-2026-46332 In the Linux kernel, the following vulnerability has been resolved: greybus… Also affects kernel-source