CVE-2026-63884

Source
https://cve.org/CVERecord?id=CVE-2026-63884
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-63884.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2026-63884
Downstream
Published
2026-07-19T14:54:57.520Z
Modified
2026-07-22T05:29:58.249987038Z
Severity
  • 7.8 (High) CVSS_V3 - CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H CVSS Calculator
Summary
drm/i915: Fix potential UAF in TTM object purge
Details

In the Linux kernel, the following vulnerability has been resolved:

drm/i915: Fix potential UAF in TTM object purge

TLDR: The bo->ttm object might be changed by calling ttmbovalidate(), move casting it to an i915_tt object later to actually get the right pointer.

A user reported hitting the following bug under heavy use on DG2:

[26620.095550] Oops: general protection fault, probably for non-canonical address 0xa56b6b6b6b6b6b8b: 0000 1 SMP NOPTI [26620.095556] CPU: 2 UID: 0 PID: 631 Comm: Xorg Not tainted 6.18.8 #1 PREEMPT(lazy) [26620.095558] Hardware name: ASRock B850M Steel Legend WiFi/B850M Steel Legend WiFi, BIOS 3.50 09/18/2025 [26620.095559] RIP: 0010:i915ttmpurge+0x84/0x100 [i915] [26620.095604] Code: 00 00 00 48 8d 54 24 10 48 89 e6 48 89 fb e8 83 aa ae ff 85 c0 75 6f 48 83 bb a8 01 00 00 00 74 2c 48 8b 45 78 48 85 c0 74 23 <48> 8b 78 20 48 c7 c2 ff ff ff ff 31 f6 e8 7a 73 e3 e0 48 8b 7d 78 [26620.095605] RSP: 0018:ffffc90005fd7430 EFLAGS: 00010282 [26620.095607] RAX: a56b6b6b6b6b6b6b RBX: ffff8881f46c3dc0 RCX: 0000000000000000 [26620.095608] RDX: 0000000000000000 RSI: 0000000000000246 RDI: 00000000ffffffff [26620.095609] RBP: ffff888289610f00 R08: 0000000000000001 R09: ffff88823b022000 [26620.095609] R10: ffff888103029b28 R11: ffff8881fc7f3800 R12: ffff88810b6150d0 [26620.095609] R13: ffff888289610f00 R14: 0000000000000000 R15: ffff8881f46c3dc0 [26620.095610] FS: 00007f1004d86900(0000) GS:ffff88901c858000(0000) knlGS:0000000000000000 [26620.095611] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [26620.095611] CR2: 00007f0fdf489000 CR3: 000000035b0c1000 CR4: 0000000000750ef0 [26620.095612] PKRU: 55555554 [26620.095612] Call Trace: [26620.095615] <TASK> [26620.095615] i915ttmmove+0x2b9/0x420 [i915] [26620.095642] ? ttmttinit+0x65/0x80 [ttm] [26620.095644] ? i915ttmttcreate+0xc6/0x150 [i915] [26620.095667] ttmbohandlemovemem+0xb6/0x160 [ttm] [26620.095669] ttmboevict+0x100/0x150 [ttm] [26620.095671] ? preemptcountadd+0x64/0xa0 [26620.095673] ? rawspinlock+0xe/0x30 [26620.095675] ? rawspinunlock+0xd/0x30 [26620.095675] ? i915gemobjectevictable+0xb7/0xd0 [i915] [26620.095704] ttmboevictcb+0x6e/0xd0 [ttm] [26620.095705] ttmlruwalkforevict+0xa6/0x200 [ttm] [26620.095708] ttmboallocresource+0x185/0x4f0 [ttm] [26620.095709] ? initobject+0x62/0xd0 [26620.095712] ttmbovalidate+0x7a/0x180 [ttm] [26620.095713] ? rawspinunlock_irqrestore+0x16/0x30 [26620.095714] __i915ttmgetpages+0xb0/0x170 [i915] [26620.095737] i915ttmgetpages+0x9f/0x150 [i915] [26620.095759] ? i915gemdoexecbuffer+0xedc/0x2b40 [i915] [26620.095786] ? allocdebugprocessing+0xd0/0x100 [26620.095787] ? rawspinunlockirqrestore+0x16/0x30 [26620.095788] ? i915vma_instance+0xa0/0x4e0 [i915] [26620.095822] __i915gemobjectgetpages+0x2f/0x40 [i915] [26620.095848] i915vmapinww+0x706/0x980 [i915] [26620.095875] ? i915gemdoexecbuffer+0xedc/0x2b40 [i915] [26620.095904] ebvalidatevmas+0x170/0xa00 [i915] [26620.095930] i915gemdoexecbuffer+0x1201/0x2b40 [i915] [26620.095953] ? allocdebugprocessing+0xd0/0x100 [26620.095954] ? rawspinunlockirqrestore+0x16/0x30 [26620.095955] ? i915gemexecbuffer2ioctl+0xc9/0x240 [i915] [26620.095977] ? __wakeupsynckey+0x32/0x50 [26620.095979] ? i915gemexecbuffer2ioctl+0xc9/0x240 [i915] [26620.096001] ? __slaballoc.isra.0+0x67/0xc0 [26620.096003] i915gemexecbuffer2ioctl+0x11a/0x240 [i915]

Results from decode_stacktrace.sh pointed to dereference of a file pointer field of a i915 TTM page vector container associated with an object being purged on eviction. That path is taken when the object is marked as no longer needed.

Code analysis revealed a possibility of the i915 TTM page vector container being replaced with a new instance inside a function that purges content of the object, should it be still busy. That function is called, indirectly via a more general function that changes the object's placement and caching policy, ---truncated---

Database specific
{
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/63xxx/CVE-2026-63884.json",
    "cna_assigner": "Linux"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
7ae034590ceaefd4d37465e3434877acfbadf411
Fixed
df73f3bc731af1c39ac5405bc59c4e7c6f8e9117
Fixed
28b22dbaf407598cb3bb1d2c586a6f8018690ac2
Fixed
073bcbc95e9648c976da1654c7590a8d6ee12c2d
Fixed
c9ae7e7e3bc98615364313b08d7acea5239ded0b
Fixed
a29654d451bbffe63d584a4cf64ad0efce6bcf1c
Fixed
5c4063c87a619e4df954c179d24628636f5db15f

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-63884.json"

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
5.17.0
Fixed
6.1.176
Type
ECOSYSTEM
Events
Introduced
6.2.0
Fixed
6.6.143
Type
ECOSYSTEM
Events
Introduced
6.7.0
Fixed
6.12.93
Type
ECOSYSTEM
Events
Introduced
6.13.0
Fixed
6.18.35
Type
ECOSYSTEM
Events
Introduced
6.19.0
Fixed
7.0.12

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-63884.json"