data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-93284 in the interactive tracker

CVE-2026-93284

drm/pagemap: dma-unmap pages before handling migration errors

8.8 EPSS 0.1% AV:L

Published 2026-09-24 (24 days ago) by the Linux kernel CNA. Subsystem drivers/gpu. Debian urgency: unimportant.

What to do, per Debian release

Debian's own status for CVE-2026-93284 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormnot affected6.1.190-1Nothing to do. bookworm never shipped the vulnerable code.
Debian 13trixienot affected6.12.113-1Nothing to do. trixie never shipped the vulnerable code.
Debian 14forkyfixed7.2.9-1Update the kernel and reboot. Fixed in 7.2.9-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.9-1Update the kernel and reboot. Fixed in 7.2.9-1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

drm_pagemap_migrate_unmap_pages() relies on the pages array to determine which pages require DMA unmapping. However, drm_pagemap_migration_unlock_put_pages() clears the array as part of its cleanup, leaving drm_pagemap_migrate_unmap_pages() with no valid page information if it is called afterward. Call drm_pagemap_migrate_unmap_pages() before drm_pagemap_migration_unlock_put_pages() so the pages array remains valid during DMA unmapping.

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

drivers/gpu/drm/drm_pagemap.c

What this is
DRM DRIVERS AND MISC GPU PATCHESMAINTAINERS section matched on drivers/gpu/drm/ · Maintained
Kernel module
drm_gpusvm_helper

Check it on the machine

grep -wE 'CONFIG_DRM_GPUSVM|CONFIG_ZONE_DEVICE' /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

lsmod | grep -w drm_gpusvm_helper

Prints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.

Show whether Debian builds this, per release

Debian builds this, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed. The build rule could not be established for 2 releases, so nothing is claimed about those.

  • bookworm, trixie?
  • forky, sidMnot built on amd64/cloud-amd64, arm64/arm64-16k, arm64/cloud-arm64, armhf/armmp, armhf/armmp-lpae, loong64/loong64, ppc64el/powerpc64le-64k, s390x/s390x
?
not established - no Makefile entry for the affected file
M
a module where it is built at all; some flavours do not build it

Where a release above reads "not established", no build rule for the affected file was found in that release's kernel tree. That is a gap in this lookup, not a finding that the code is absent.

Build switches
CONFIG_DRM_GPUSVM, CONFIG_ZONE_DEVICE
Reads as
all on means the file is compiled; any one off means it is not.

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-09-24 (24 days ago)source
CVSS
8.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.13%, higher than 2.1% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
unimportantsource
Subsystem
drivers/gpu

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
6.176.18.53e4331c6644db
6.177.2.9415f5a755cec
6.177.39e6372ec2a39

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:LAttack vector, local
Local ioctl/fault path only: DRM_IOCTL_XE_VM_CREATE (FAULT_MODE) and DRM_IOCTL_XE_VM_BIND (CPU_ADDR_MIRROR) on /dev/dri/renderD* migrate the caller's anonymous range to VRAM, then do_swap_page() invokes drm_pagemap_migrate_to_ram() -> __drm_pagemap_migrate_to_ram(), or xe_bo_move() calls xe_svm_bo_evict() -> drm_pagemap_evict_to_ram(). No remote protocol byte reaches those functions.
AC:LAttack complexity, low
The attacker creates the SVM range, migrates it to VRAM, and CPU-faults or TTM-evicts it. After drm_pagemap_migrate_map_system_pages() has dma_map_page()'d dest folios, they force err_finalize by exhausting gt->usm.bb_pool so xe_svm_copy_to_ram()/xe_bb_new() returns -ENOMEM, or by fragmenting IOVA so dma_iova_try_alloc() fails and a later dma_map_page() returns -EFAULT. No victim timing.
PR:LPrivileges required, low
DRM_IOCTL_XE_VM_CREATE and DRM_IOCTL_XE_VM_BIND are DRM_RENDER_ALLOW; xe_vm_create_ioctl() performs no capable() or DRM-master check. An unprivileged local user with typical render/video-group access to /dev/dri/renderD* on an Intel Xe discrete GPU (CONFIG_DRM_XE_PAGEMAP defaults to y) can create a fault-mode VM and reach the patched functions.
UI:NUser interaction, none
The attacking process opens the render node, creates its own fault-mode VM, CPU_ADDR_MIRROR-binds its anonymous mapping, prefetches or GPU-faults it into VRAM, then CPU-accesses or forces TTM eviction. No other user must mount a filesystem or open a file.
S:CScope, changed
On err_finalize, drm_pagemap_migration_unlock_put_pages() folio_put()s the destination RAM folios and zeros migrate_pfn, so drm_pagemap_migrate_unmap_pages() sees a NULL page and skips dma_unmap_page(). Those IOMMU PTEs remain aimed at pages already returned to the buddy allocator, which is an IOMMU/DMA isolation bypass.
C:HConfidentiality impact, high
Destination folios from drm_pagemap_migrate_populate_ram_pfn() are put while still dma_map_page()'d. Recycled host pages stay IOMMU-reachable through the leaked translation, so later DMA can disclose their new kernel or cross-process contents rather than a bounded pointer leak.
I:HIntegrity impact, high
The leaked mappings are DMA_FROM_DEVICE (Xe copy-from-VRAM via xe_svm_copy_to_ram()). After folio_put(), a GPU/IOMMU transaction through those IOVAs writes into whatever reused the physical pages, an arbitrary physical write through the IOMMU rather than a bounded corruption.
A:HAvailability impact, high
Each failed __drm_pagemap_migrate_to_ram()/drm_pagemap_evict_to_ram() leaks that range's dma_map_page() IOVAs; the attacker loops CPU faults after inducing xe_bb_new() or map errors. Unbounded IOVA growth wedges later maps, and DMA into buddy-reused pages oopses or panics, not a mere slowdown.