{"id":"CVE-2026-89995","state":"PUBLISHED","title":"dma-direct: return struct page from dma_direct_alloc_from_pool()","description":"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.","publishedAt":"2026-09-16T10:33:07.962Z","updatedAt":"2026-10-30T12:33:44.174Z","severity":{"score":8.8,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"1ca96bbfef42bbfb139cc6eb1d940c8ca9046f95","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"7801e616fbe3661f9471b2e9bfcb1ed35460bf16","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"c3fdb94da43ff23287f85664174c45c45e881a3f","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"408ff2d5bf555bd3f4c84a2edb95c0690bf9edc8","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"feeb2ef775081a6c188cdd10e7a45369a07ce531","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"94a04ad732c9f8b9554270fc4038a06737de5c22","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/dma/direct.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"5.10","status":"affected"},{"version":"0","status":"unaffected","lessThan":"5.10","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.160","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.110","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.51","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.5","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/dma/direct.c"]}],"references":["https://git.kernel.org/stable/c/1ca96bbfef42bbfb139cc6eb1d940c8ca9046f95","https://git.kernel.org/stable/c/7801e616fbe3661f9471b2e9bfcb1ed35460bf16","https://git.kernel.org/stable/c/c3fdb94da43ff23287f85664174c45c45e881a3f","https://git.kernel.org/stable/c/408ff2d5bf555bd3f4c84a2edb95c0690bf9edc8","https://git.kernel.org/stable/c/feeb2ef775081a6c188cdd10e7a45369a07ce531","https://git.kernel.org/stable/c/94a04ad732c9f8b9554270fc4038a06737de5c22"],"weaknesses":[],"ingestedAt":"2026-10-30T12:52:04.348Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/89xxx/CVE-2026-89995.json","commit":"1f312381e38164a43607eebab851b151dd16861e","baselineCommit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-89995","state":"PUBLISHED","datePublished":"2026-09-16T10:33:07.962Z","dateUpdated":"2026-10-30T12:33:44.174Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-09-11T19:38:34.780Z"},"containers":{"cna":{"title":"dma-direct: return struct page from dma_direct_alloc_from_pool()","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."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"1ca96bbfef42bbfb139cc6eb1d940c8ca9046f95","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"7801e616fbe3661f9471b2e9bfcb1ed35460bf16","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"c3fdb94da43ff23287f85664174c45c45e881a3f","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"408ff2d5bf555bd3f4c84a2edb95c0690bf9edc8","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"feeb2ef775081a6c188cdd10e7a45369a07ce531","versionType":"git"},{"version":"5b138c534fda57c2ebc1e6de72578aa1d70788a6","status":"affected","lessThan":"94a04ad732c9f8b9554270fc4038a06737de5c22","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/dma/direct.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"5.10","status":"affected"},{"version":"0","status":"unaffected","lessThan":"5.10","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.160","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.110","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.51","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.5","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/dma/direct.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/1ca96bbfef42bbfb139cc6eb1d940c8ca9046f95"},{"url":"https://git.kernel.org/stable/c/7801e616fbe3661f9471b2e9bfcb1ed35460bf16"},{"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"}],"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."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-10-30T12:33:44.174Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.10","versionEndExcluding":"6.1.191"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.10","versionEndExcluding":"6.6.160"},{"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"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}