Files
vuln-cve/data/2026/89xxx/CVE-2026-89996.json
T

210 lines
12 KiB
JSON

{
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"cveMetadata": {
"cveId": "CVE-2026-89996",
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"state": "PUBLISHED",
"assignerShortName": "Linux",
"dateReserved": "2026-09-11T19:38:34.780Z",
"datePublished": "2026-09-16T10:33:08.620Z",
"dateUpdated": "2026-10-30T12:33:45.249Z"
},
"containers": {
"cna": {
"providerMetadata": {
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux",
"dateUpdated": "2026-10-30T12:33:45.249Z"
},
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\ndma-buf: dma-heap: don't publish fd before copy_to_user() succeeds\n\nDMA_HEAP_IOCTL_ALLOC allocates a dma-buf and installs an fd into the\ncaller's fd table via dma_buf_fd() -> fd_install() before\ndma_heap_ioctl() copies the result back to userspace. If the trailing\ncopy_to_user() fails, userspace never learns the fd number, but the\nfd (and the underlying dma-buf reference) are already visible to\nother threads in the same process and are leaked for the lifetime of\nthe process.\n\nThe obvious \"close it on the failure path\" fix is unsafe: once\nfd_install() has run, another thread can already dup() the fd, send\nit via SCM_RIGHTS, or close() it and let its number be reused, so a\nsubsequent close_fd() from the ioctl path can operate on an unrelated\nfile. This was pointed out by Christian König on v1 [1].\n\nRestructure the allocation path so that fd_install() is the last,\nunfailable step of a successful ioctl:\n\n 1. heap->ops->allocate() creates the dma_buf.\n 2. get_unused_fd_flags() reserves an fd number in the caller's\n fd table without publishing it, so\n no other thread can observe it.\n 3. copy_to_user() delivers the fd number to userspace;\n on failure the fd is returned with\n put_unused_fd() and the dma_buf\n reference is dropped with\n dma_buf_put(), leaving no user-\n visible state behind.\n 4. dma_buf_fd_install() publishes the fd and emits the\n trace_dma_buf_fd tracepoint -- from\n here on the ioctl cannot fail.\n\nA new dma_buf_fd_install() helper is introduced in dma-buf.c to wrap\nfd_install() together with the DMA_BUF_TRACE() call, preserving the\nexport tracing that dma_buf_fd() provides. dma_heap_ioctl_allocate()\nis refactored to return the struct dma_buf * directly (returning\nERR_PTR on failure) so the caller holds the dmabuf reference across\nsteps 3 and 4.\n\nThe failure at step 3 is easily reachable from userspace: pass a\nstruct dma_heap_allocation_data that lives in a page whose protection\nis flipped to PROT_READ between copy_from_user() and copy_to_user()\n(e.g. via mprotect()). Before this change each such ioctl leaks one\ndmabuf fd; after it, the fd table is unchanged on failure and only\n/dev/dma_heap/<name> remains open.\n\nNo UAPI or heap-driver interface change.\n\n[1] https://lore.kernel.org/dri-devel/175e98de-f414-47d7-81c1-c0fe0a8f7f62@amd.com/"
}
],
"affected": [
{
"product": "Linux",
"vendor": "Linux",
"defaultStatus": "unaffected",
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"programFiles": [
"drivers/dma-buf/dma-buf.c",
"drivers/dma-buf/dma-heap.c",
"include/linux/dma-buf.h"
],
"versions": [
{
"version": "c02a81fba74fe3488ad6b08bfb5a1329005418f8",
"lessThan": "1953ef8d11eb5870fe621259708a90900bead272",
"status": "affected",
"versionType": "git"
},
{
"version": "c02a81fba74fe3488ad6b08bfb5a1329005418f8",
"lessThan": "ad61defb3e66ac0c598ad6f39b57f15784543d46",
"status": "affected",
"versionType": "git"
},
{
"version": "c02a81fba74fe3488ad6b08bfb5a1329005418f8",
"lessThan": "1bf6083a41f810d760c4dcd1b80c5194a92575aa",
"status": "affected",
"versionType": "git"
},
{
"version": "c02a81fba74fe3488ad6b08bfb5a1329005418f8",
"lessThan": "69d57dbadb27ffd5eef34fd184bab145500cdabc",
"status": "affected",
"versionType": "git"
},
{
"version": "c02a81fba74fe3488ad6b08bfb5a1329005418f8",
"lessThan": "0d4a5d218055db29b50cc07d3d73d27007c2a391",
"status": "affected",
"versionType": "git"
},
{
"version": "c02a81fba74fe3488ad6b08bfb5a1329005418f8",
"lessThan": "30d0aff2c65a277135cfd8ea28fa1ee75e0ea4e0",
"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/dma-buf/dma-buf.c",
"drivers/dma-buf/dma-heap.c",
"include/linux/dma-buf.h"
],
"versions": [
{
"version": "5.6",
"status": "affected"
},
{
"version": "0",
"lessThan": "5.6",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.1.191",
"lessThanOrEqual": "6.1.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.6.160",
"lessThanOrEqual": "6.6.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.12.112",
"lessThanOrEqual": "6.12.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.18.52",
"lessThanOrEqual": "6.18.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "7.2.5",
"lessThanOrEqual": "7.2.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "7.3",
"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.6",
"versionEndExcluding": "6.1.191"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "5.6",
"versionEndExcluding": "6.6.160"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "5.6",
"versionEndExcluding": "6.12.112"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "5.6",
"versionEndExcluding": "6.18.52"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "5.6",
"versionEndExcluding": "7.2.5"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "5.6",
"versionEndExcluding": "7.3"
}
]
}
]
}
],
"references": [
{
"url": "https://git.kernel.org/stable/c/1953ef8d11eb5870fe621259708a90900bead272"
},
{
"url": "https://git.kernel.org/stable/c/ad61defb3e66ac0c598ad6f39b57f15784543d46"
},
{
"url": "https://git.kernel.org/stable/c/1bf6083a41f810d760c4dcd1b80c5194a92575aa"
},
{
"url": "https://git.kernel.org/stable/c/69d57dbadb27ffd5eef34fd184bab145500cdabc"
},
{
"url": "https://git.kernel.org/stable/c/0d4a5d218055db29b50cc07d3d73d27007c2a391"
},
{
"url": "https://git.kernel.org/stable/c/30d0aff2c65a277135cfd8ea28fa1ee75e0ea4e0"
}
],
"title": "dma-buf: dma-heap: don't publish fd before copy_to_user() succeeds",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
}
}