CVE-2026-89758 Overview
CVE-2026-89758 is a Linux kernel memory management vulnerability in the mm/mempolicy subsystem. The flaw affects queue_folios_pmd(), which fails to skip non-present Page Middle Directory (PMD) entries when queueing folios. Since commit 368076f52ebe added device-private Transparent Huge Page (THP) support, a PMD may hold a device-private swap entry after a Heterogeneous Memory Management (HMM) GPU driver migrates an anonymous THP folio to device memory. Passing such a PMD to pmd_folio() treats the softleaf encoding as a hardware Page Frame Number (PFN) and returns a bogus folio pointer.
Critical Impact
Local attackers with GPU workload access can trigger kernel oops conditions, VM_BUG_ON firings on debug kernels, or silent isolation of unrelated live folios from the Least Recently Used (LRU) list.
Affected Products
- Linux kernel versions containing commit 368076f52ebe ("mm/huge_memory: add device-private THP support to PMD operations")
- Systems running HMM-based GPU drivers using migrate_vma_pages()
- Distributions shipping affected mainline kernel builds prior to the fix commits
Discovery Timeline
- 2026-09-11 - CVE-2026-89758 published to the National Vulnerability Database (NVD)
- 2026-09-13 - Last updated in NVD database
Technical Details for CVE-2026-89758
Vulnerability Analysis
The vulnerability resides in queue_folios_pmd(), invoked under pmd_trans_huge_lock() during memory policy walks. The pmd_is_huge() check returns true for any non-present, non-none huge PMD softleaf, including device-private swap entries introduced by HMM-based GPU migration. The function previously assumed either a present THP or a migration entry, but device-private PMDs now bypass those assumptions.
When queue_folios_pmd() calls pmd_folio() on a device-private PMD, the routine interprets the swap-entry encoding as a physical PFN. The resulting folio pointer references arbitrary memory, producing outcomes that range from VM_BUG_ON() panics on debug kernels to oops conditions from bogus vmemmap dereferences. In aliasing cases, the kernel silently isolates an unrelated live folio from the LRU, corrupting page accounting.
Root Cause
The root cause is missing validation of PMD state before folio lookup. The fix mirrors the logic in queue_folios_pte_range() by handling non-present entries before dereferencing them. Migration entries continue to count as failures, while other non-present PMDs such as device-private entries are skipped safely.
Attack Vector
Exploitation requires local access and low privileges on a system running an HMM-based GPU driver. An attacker first triggers migrate_vma_pages() through legitimate GPU workload operations to leave a device-private PMD in an anonymous THP mapping. The attacker then invokes mbind(), migrate_pages(), or set_mempolicy_home_node() on that address range to reach the vulnerable code path. See the kernel git commit fix for the corrected walk logic.
Detection Methods for CVE-2026-89758
Indicators of Compromise
- Kernel oops messages referencing queue_folios_pmd, pmd_folio, or vmemmap addresses in dmesg or /var/log/kern.log
- VM_BUG_ON() triggers in mm/mempolicy.c on debug kernels
- Unexpected LRU accounting anomalies or folio isolation events during GPU workload execution
Detection Strategies
- Audit running kernel versions against the fix commits 2858b4027f491e6fdb8ee2d8923798b619bf2791 and 3d927093b2add7ced588a926c3dc5d7a83f18596
- Monitor for processes invoking mbind(), migrate_pages(), or set_mempolicy_home_node() on ranges shared with GPU device memory
- Correlate GPU driver activity involving migrate_vma_pages() with subsequent NUMA memory policy syscalls from the same process
Monitoring Recommendations
- Enable kernel crash collection with kdump to capture stack traces referencing the affected walk callbacks
- Ingest dmesg and audit logs into a centralized data lake for cross-host correlation of MM subsystem faults
- Track syscall patterns from workloads on GPU-enabled compute nodes to identify anomalous memory policy manipulation
How to Mitigate CVE-2026-89758
Immediate Actions Required
- Apply the upstream fix commits 2858b4027f491e6fdb8ee2d8923798b619bf2791 and 3d927093b2add7ced588a926c3dc5d7a83f18596 to affected kernels
- Prioritize patching on hosts running HMM-based GPU drivers with anonymous THP enabled
- Restrict local execution on GPU compute nodes to trusted users pending patch deployment
Patch Information
The fix updates queue_folios_pmd() to handle non-present PMD entries before invoking pmd_folio(). Migration entries are recorded as failures while device-private and other non-present entries are skipped. Patches are available in the kernel git commit fix and the follow-up commit. Distribution maintainers should backport both patches to supported stable kernel branches.
Workarounds
- Disable Transparent Huge Pages for anonymous mappings by setting /sys/kernel/mm/transparent_hugepage/enabled to never
- Restrict use of HMM-based GPU drivers on multi-tenant systems until the kernel is patched
- Limit access to mbind(), migrate_pages(), and set_mempolicy_home_node() through seccomp filters on untrusted workloads
# Disable anonymous THP as a temporary mitigation
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Verify current setting
cat /sys/kernel/mm/transparent_hugepage/enabled
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

