{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2025-40155", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2025-04-16T07:20:57.176Z", "datePublished": "2025-11-12T10:23:28.718Z", "dateUpdated": "2026-08-05T12:08:07.016Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T12:08:07.016Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\niommu/vt-d: debugfs: Fix legacy mode page table dump logic\n\nIn legacy mode, SSPTPTR is ignored if TT is not 00b or 01b. SSPTPTR\nmaybe uninitialized or zero in that case and may cause oops like:\n\n Oops: general protection fault, probably for non-canonical address\n 0xf00087d3f000f000: 0000 [#1] SMP NOPTI\n CPU: 2 UID: 0 PID: 786 Comm: cat Not tainted 6.16.0 #191 PREEMPT(voluntary)\n Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.17.0-5.fc42 04/01/2014\n RIP: 0010:pgtable_walk_level+0x98/0x150\n RSP: 0018:ffffc90000f279c0 EFLAGS: 00010206\n RAX: 0000000040000000 RBX: ffffc90000f27ab0 RCX: 000000000000001e\n RDX: 0000000000000003 RSI: f00087d3f000f000 RDI: f00087d3f0010000\n RBP: ffffc90000f27a00 R08: ffffc90000f27a98 R09: 0000000000000002\n R10: 0000000000000000 R11: 0000000000000000 R12: f00087d3f000f000\n R13: 0000000000000000 R14: 0000000040000000 R15: ffffc90000f27a98\n FS: 0000764566dcb740(0000) GS:ffff8881f812c000(0000) knlGS:0000000000000000\n CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033\n CR2: 0000764566d44000 CR3: 0000000109d81003 CR4: 0000000000772ef0\n PKRU: 55555554\n Call Trace:\n \n pgtable_walk_level+0x88/0x150\n domain_translation_struct_show.isra.0+0x2d9/0x300\n dev_domain_translation_struct_show+0x20/0x40\n seq_read_iter+0x12d/0x490\n...\n\nAvoid walking the page table if TT is not 00b or 01b." } ], "metrics": [ { "cvssV3_1": { "version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:H", "baseScore": 7.3, "baseSeverity": "HIGH" }, "scenarios": [ { "lang": "en", "value": "AV:L - The only path into `domain_translation_struct_show()` is a local `read()` on the debugfs node `/sys/kernel/debug/iommu/intel//domain_translation_struct`; the function has no other caller and no network, adjacent-radio, or peripheral-originated input reaches it.\nAC:L - Once a device's context entry uses TT=`CONTEXT_TT_PASS_THROUGH` — the routine state produced by `iommu=pt` or an identity domain — a single `cat` deterministically walks an unprogrammed SSPTPTR, with no race to win, no timing window, and no memory-layout requirement the attacker must influence.\nPR:L - The file is created world-readable (mode 0444) under 0755 directories with no capability check on the path, so any unprivileged local user reaches it on the debug/development, industrial and embedded x86 deployments that mount debugfs traversable (`mode=755` or uid/gid options) — which is precisely the class of system on which `CONFIG_INTEL_IOMMU_DEBUGFS` is enabled in the first place.\nUI:N - The attacker triggers the fault entirely inside their own `read()` on the debugfs file; no other user or process must mount, open, or configure anything.\nS:U - The bogus walk and the resulting oops stay wholly inside the host kernel's own security authority — this is a kernel-side dump of page tables, not a bypass of DMA/IOMMU isolation, and no VM, hypervisor, or sandbox boundary is crossed.\nC:H - With SSPTPTR unset, `pgtable_walk_level()` reads 512 raw 64-bit words per level from `phys_to_virt()` of unvalidated physical addresses and `dump_page_info()` prints those words verbatim into the reader's seq_file, and each \"present\" word steers the recursion to a further arbitrary 52-bit physical address — an unbounded out-of-bounds read of kernel physical memory disclosed straight to userspace.\nI:L - The path performs no out-of-bounds write, use-after-free, or type confusion and so builds no control-flow primitive, but the unvalidated `phys_to_virt()` reads can land on memory-mapped device registers that are mapped in the x86-64 direct map below `max_pfn`, where a read has side effects such as clearing status bits.\nA:H - Following a garbage physical address produces an immediate general protection fault in `pgtable_walk_level()`, killing the reader and escalating to a full panic under `panic_on_oops`; worse, the fault occurs while `iommu->lock` is held, so the spinlock is never released and every later domain attach/detach or context-mapping operation on that DMAR unit deadlocks." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "drivers/iommu/intel/debugfs.c" ], "versions": [ { "version": "2b437e80456654df3980706384065d444f4bb54d", "lessThan": "d8cf7b59c49f9118fa875462e18686cb6b131bb5", "status": "affected", "versionType": "git" }, { "version": "2b437e80456654df3980706384065d444f4bb54d", "lessThan": "df2bf759a0bdb71f13e327d7527260d09facc055", "status": "affected", "versionType": "git" }, { "version": "2b437e80456654df3980706384065d444f4bb54d", "lessThan": "fbe6070c73badca726e4ff7877320e6c62339917", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "drivers/iommu/intel/debugfs.c" ], "versions": [ { "version": "6.7", "status": "affected" }, { "version": "0", "lessThan": "6.7", "status": "unaffected", "versionType": "semver" }, { "version": "6.12.53", "lessThanOrEqual": "6.12.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.17.3", "lessThanOrEqual": "6.17.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.18", "lessThanOrEqual": "*", "status": "unaffected", "versionType": "original_commit_for_fix" } ] } ], "cpeApplicability": [ { "nodes": [ { "operator": "OR", "negate": false, "cpeMatch": [ { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.7", "versionEndExcluding": "6.12.53" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.7", "versionEndExcluding": "6.17.3" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.7", "versionEndExcluding": "6.18" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/d8cf7b59c49f9118fa875462e18686cb6b131bb5" }, { "url": "https://git.kernel.org/stable/c/df2bf759a0bdb71f13e327d7527260d09facc055" }, { "url": "https://git.kernel.org/stable/c/fbe6070c73badca726e4ff7877320e6c62339917" } ], "title": "iommu/vt-d: debugfs: Fix legacy mode page table dump logic", "x_generator": { "engine": "bippy-1.2.0" } } } }