Cloudanix VulnDB

CVE-2026-98166

High · 7.8

CVSS

7.8

EPSS

0.2%

Published

Oct 6, 2026

CISA due date

—

Cloudanix analysis

Schedule a fix SSVC: Track

A bug in Linux graphics memory handling can cause the computer to crash after waking from hibernation or when programs exit.

Exploitation
Local Privilege
Attacker needs
Low Privilege
Complexity
Moderate
Impact
Full Compromise
Component
OS kernel
Class
Use After Free
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

Use-after-free in TTM bulk-move LRU cursors: successful ttm_tt_swapout() no longer removes the resource from its bulk_move range, leaving pos->first/pos->last pointers dangling after the resource is later freed via ttm_resource_free or ttm_bo_set_bulk_move.

Why it matters to the business

Linux systems using affected DRM/TTM graphics drivers experience crashes minutes to hours after hibernation or during process exit/reboot following hibernation, causing system instability and potential data loss in environments that rely on suspend-to-disk.

How an attack unfolds

An attacker with local access triggers memory pressure or explicit hibernation to cause swapout of TTM resources; the dangling bulk-move cursor is later dereferenced by ttm_lru_bulk_move_tail, ttm_resource_move_to_lru_tail or ttm_resource_manager_next, resulting in list corruption, NULL dereference or WARN, manifesting as a kernel panic.

How to fix it

Apply the upstream fix that restores the ttm_resource_del_bulk_move_unevictable call on every successful swapout (test condition "!ret" changed to success count > 0); update to a kernel containing commit equivalent to the referenced change; reboot after upgrade.

How to confirm the fix worked

Confirm the kernel contains the corrected condition in ttm_bo_swapout_cb; run repeated hibernate-then-resume cycles while monitoring for ttm_resource warnings or panics; verify ttm_resource_del_bulk_move_unevictable is called on every swapout via function tracing.

Typical attack path

  1. Obtain local unprivileged access on a vulnerable Linux kernel
  2. Induce hibernation or sustained memory pressure to force ttm_tt_swapout on populated TTM objects
  3. Trigger subsequent TTM operations (ttm_bo_set_bulk_move, resource free, or LRU walk) that dereference the stale bulk-move cursor
  4. Observe kernel panic from list_del corruption, resv WARN, or NULL dereference in TTM LRU code

How to detect it

Search kernel logs and crash dumps for TTM LRU messages including resv WARN, list_del corruption in ttm_resource_move_to_lru_tail, NULL dereference in ttm_resource_manager_next, or absence of ttm_resource_del_bulk_move_unevictable calls during swapout; correlate with hibernation events.

  • list_del corruption
  • ttm_lru_bulk_move_add
  • ttm_resource_move_to_lru_tail
  • ttm_resource_manager_next
  • resv WARN

What your security team should do

  • Prioritize kernel update on all systems that perform hibernation or use AMD/TTM graphics drivers
  • Monitor kernel logs for TTM LRU corruption messages until patches are deployed
  • Test hibernation workloads in a lab environment before rolling out the fixed kernel
  • Disable hibernation where operationally feasible until remediation is complete

The record

In the Linux kernel, the following vulnerability has been resolved: drm/ttm: fix swapped-out resources never leaving their bulk_move range ttm_tt_swapout() returns the number of pages swapped out on success and a negative error code on failure; for a populated ttm it never returns zero. Commit b2ed01e7ad3d ("drm/ttm: Fix ttm_bo_swapout() infinite LRU walk on swapout failure") moved the bulk_move bookkeeping in ttm_bo_swapout_cb() under "if (!ret)", so the ttm_resource_del_bulk_move_unevictable() / ttm_resource_move_to_lru_tail() pair is now skipped on every successful swapout. The equivalent change for the shrinker in commit 1d59f36e95f7 ("drm/ttm: Fix ttm_bo_shrink() infinite LRU walk on backup failure") tests "lret > 0", which is what was intended here as well. Before b2ed01e7ad3d the resource was taken off the bulk_move before the swapout; since then a swapped-out resource stays inside its BO's bulk_move range (and on the manager LRU) although it is unevictable. When it is later freed or the BO leaves the bulk_move (ttm_resource_free(), ttm_bo_set_bulk_move() via amdgpu_vm_bo_del()), ttm_resource_del_bulk_move() skips it because of its !ttm_resource_unevictable() guard, so a range endpoint in pos->first / pos->last is left pointing at freed memory. The next ttm_lru_bulk_move_tail() or ttm_resource_add_bulk_move() on that cursor is a use-after-free, seen as the resv WARN in ttm_lru_bulk_move_add(), "list_del corruption" in ttm_resource_move_to_lru_tail() or a NULL dereference in ttm_resource_manager_next() -- minutes to hours after a hibernation, or at process exit / reboot following one. Samuel Ainsworth's analysis of drm/amd issue 5387 (see Link) identified the dangling cursor; the missing removal at swapout time is the reason it dangles. Testing the condition for success restores the removal. On an AMD Phoenix APU (ASUS UM3406GA, gfx1103) running suspend-then-hibernate on a 7.0.y stable kernel carrying the backport (Ubuntu 7.0.0-31) the bug crashed 5 of 18 hibernation cycles; a function profile of one hibernation showed 336 ttm_tt_swapout() calls and zero ttm_resource_del_bulk_move_unevictable() calls. With this change the removal happens for every swapped-out resource and 12 further cycles were clean.

Affected packages

Ecosystem Package Introduced Fixed