KernelScan.io

HIGH Introduced in 6.18

drm FolioOrder UAF

CVE-2026-89805

CVSS 7.8 / 10.0 NVD

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

KernelScan AI7.0HIGH

01

In the Linux kernel, the following vulnerability has been resolved: drm/pagemap: Fix folio allocation fallback and use-after-put drm_pagemap_migrate_populate_ram_pfn() had two issues when populating RAM PFNs with higher-order folios: 1. The higher-order vma_alloc_folio()/folio_alloc() calls did not pass __GFP_NOWARN, so a THP allocation failure under memory pressure would spam the kernel log, and there was no fallback path despite a TODO comment stating one was needed. Add __GFP_NOWARN to the higher-order allocation and, on failure, fall back to order-0 allocations for the entire range originally covered by the failed higher-order allocation, leaving MIGRATE_PFN_COMPOUND unset for those PFNs. 2. In the free_pages error path, order was computed via folio_order(page_folio(page)) *after* put_page(page) had already dropped the reference, resulting in a use-after-free/put when that was the last reference on the page. Compute order before releasing the page. Introducing the fallback in 1. also requires the source page array handed to ->copy_to_ram() to be built differently. Both callers only populated the entry at the head of each source folio, relying on the copy callback to derive the rest of the folio from the order recorded in the matching drm_pagemap_addr. Once the destination has been demoted to order-0 folios the drm_pagemap_addr entries are per-page, so a source page is needed for every one of them; leaving them NULL makes the copy callback stop after the first page and the remainder of the range is never copied. The source folio is only split later, by migrate_vma_pages() / migrate_device_pages(), so its order cannot be used to detect the demotion - test the destination for MIGRATE_PFN_COMPOUND instead. Factor the array population out into drm_pagemap_migrate_populate_src_pages() and use it from both drm_pagemap_evict_to_ram() and __drm_pagemap_migrate_to_ram().

02

Engine v0.6.0

Risk summary

A local user with access to a GPU device using the DRM pagemap infrastructure can trigger a use-after-free in the kernel's GPU memory migration error path. The bug occurs when memory pressure causes a higher-order folio allocation to fail and the cleanup path accesses a page after its last reference has been dropped. Successful exploitation could lead to kernel memory corruption, privilege escalation, or a system crash.

Affecteddrivers/gpu/drm/drm_pagemap.c (drm/pagemap)

Vulnerability analysis

In the DRM pagemap subsystem's GPU-to-RAM memory migration path, the error cleanup routine drops a page's reference count before computing the folio order needed to advance the cleanup loop. When that put is the last reference, the folio is freed and the subsequent order computation reads freed memory. The fix computes the order before releasing the page, and additionally adds a fallback to order-0 allocations when a higher-order allocation fails under memory pressure, along with correcting the source page array population so that demoted ranges are fully copied. This is reachable by any local user with access to a GPU device that uses the DRM pagemap infrastructure, though triggering the vulnerable error path requires sufficient memory pressure to cause the initial higher-order allocation to fail.

03

BranchIntroducedFixed inPatch commit
7.26.187.2.510e92e18e3da
mainline6.187.3-rc2df72e55e754c