{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-89995","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-09-11T19:38:34.780Z","datePublished":"2026-09-16T10:33:07.962Z","dateUpdated":"2026-09-16T14:41:10.079Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-09-16T14:41:10.079Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\ndma-direct: return struct page from dma_direct_alloc_from_pool()\n\nCommit 5b138c534fda (\"dma-direct: factor out a dma_direct_alloc_from_pool\nhelper\") changed dma_direct_alloc_from_pool() to return the CPU address\nfrom dma_alloc_from_pool(). That fits dma_direct_alloc(), but\ndma_direct_alloc_pages() also uses the helper and expects a struct page *.\n\nFix this by making dma_direct_alloc_from_pool() return the struct page *\nagain, and pass the CPU address back through an out-parameter for the\ndma_direct_alloc() caller."}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","baseScore":8.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:A - dma_direct_alloc_pages() takes the buggy pool path from dma_alloc_noncoherent(GFP_ATOMIC) in ath11k_peer_rx_tid_setup(), which runs when a same-LAN WiFi peer associates or starts a Block Ack. On SEV/TDX/CCA guests and SME hosts, force_dma_unencrypted() is true, so a wireless attacker reaches the type confusion without a wired/Internet service.\nAC:L - The peer fully controls association and ADDBA, so the GFP_ATOMIC dma_alloc_pages() call is deterministic with no race to win. Confidential-computing dma-direct (atomic decrypted pool, no IOMMU) is the scored deployment, not an uninfluenced memory layout or rare extra config.\nPR:N - ath11k peer/TID setup and the cdns3 gadget GFP_ATOMIC dma_alloc_noncoherent() path run in kernel interrupt/softirq context with no host account, capability, or user-namespace check. An unauthenticated WiFi peer (or USB gadget host) is sufficient.\nUI:N - Peer creation and Block Ack setup are 802.11 protocol operations. Once the interface is up as an AP/hotspot or an already-associated STA, exploitation needs no victim mount, open, or other interactive step.\nS:U - The allocator returns a CPU virtual address as a struct page *, corrupting page and DMA bookkeeping in the same kernel. This is not a VM escape, IOMMU bypass, or host/guest confidential-computing boundary crossing.\nC:H - Callers treat the kernel VA as a struct page, so page_to_virt/page_address/page_to_pfn compute wrong addresses and dma_mmap_pages() can remap a bogus PFN into userspace. That type confusion is an arbitrary kernel-memory disclosure primitive.\nI:H - sg_set_page, page_address stores, dma_set_encrypted(), and dma_free_contiguous() then operate on the fake page pointer, writing, re-encrypting, or freeing the wrong memory. That is an arbitrary kernel write/free primitive usable for control-flow hijack.\nA:H - Interpreting a DMA pool virtual address as a struct page * causes invalid vmemmap/page-flag accesses and buddy frees, which oops or panic the kernel even when not fully turned into a stable read/write primitive."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/dma/direct.c"],"versions":[{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","lessThan":"c3fdb94da43ff23287f85664174c45c45e881a3f","status":"affected","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","lessThan":"408ff2d5bf555bd3f4c84a2edb95c0690bf9edc8","status":"affected","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","lessThan":"feeb2ef775081a6c188cdd10e7a45369a07ce531","status":"affected","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","lessThan":"94a04ad732c9f8b9554270fc4038a06737de5c22","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/dma/direct.c"],"versions":[{"version":"5.10","status":"affected"},{"version":"0","lessThan":"5.10","status":"unaffected","versionType":"semver"},{"version":"6.12.110","lessThanOrEqual":"6.12.*","status":"unaffected","versionType":"semver"},{"version":"6.18.51","lessThanOrEqual":"6.18.*","status":"unaffected","versionType":"semver"},{"version":"7.2.5","lessThanOrEqual":"7.2.*","status":"unaffected","versionType":"semver"},{"version":"7.3-rc1","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":"5.10","versionEndExcluding":"6.12.110"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.10","versionEndExcluding":"6.18.51"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.10","versionEndExcluding":"7.2.5"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.10","versionEndExcluding":"7.3-rc1"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/c3fdb94da43ff23287f85664174c45c45e881a3f"},{"url":"https://git.kernel.org/stable/c/408ff2d5bf555bd3f4c84a2edb95c0690bf9edc8"},{"url":"https://git.kernel.org/stable/c/feeb2ef775081a6c188cdd10e7a45369a07ce531"},{"url":"https://git.kernel.org/stable/c/94a04ad732c9f8b9554270fc4038a06737de5c22"}],"title":"dma-direct: return struct page from dma_direct_alloc_from_pool()","x_generator":{"engine":"bippy-1.2.0"}}}}