{"api_version":"1","generated_at":"2026-09-20T00:12:21+00:00","cve":"CVE-2026-89940","urls":{"html":"https://cve.report/CVE-2026-89940","api":"https://cve.report/api/cve/CVE-2026-89940.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-89940","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-89940"},"summary":{"title":"iio: buffer: Tie IIO dma fence lock lifetime to the fence","description":"In the Linux kernel, the following vulnerability has been resolved:\n\niio: buffer: Tie IIO dma fence lock lifetime to the fence\n\nThe `iio_dma_fence` implementation currently uses a lock embedded in the\n`iio_dmabuf_priv`. But the `iio_dma_fence` can outlive the\n`iio_dmabuf_priv`, which can cause a use-after-free.\n\nTie the lifetime of the lock to the lifetime of the fence by embedding them\nin the same struct.\n\nWe can't just hold a reference to the `iio_dmabuf_priv` from the\n`iio_dma_fence` since `iio_buffer_dmabuf_release()` might sleep and the\nfence release callback is not allowed to sleep.\n\nNote that the `dma_fence` framework now has an internal lock that gets used\nwhen the passing `NULL` for `lock` in `dma_fence_init()`, but in order to\nallow this patch to be backportable use an external lock.","state":"PUBLISHED","assigner":"Linux","published_at":"2026-09-16 11:17:03","updated_at":"2026-09-16 15:18:19"},"problem_types":[],"metrics":[{"version":"3.1","source":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","type":"Secondary","score":"7.8","severity":"HIGH","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","data":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH","attackVector":"LOCAL","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"HIGH"}},{"version":"3.1","source":"CNA","type":"DECLARED","score":"7.8","severity":"HIGH","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","data":{"baseScore":7.8,"baseSeverity":"HIGH","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","version":"3.1"}}],"references":[{"url":"https://git.kernel.org/stable/c/6865d79fca17a80fbd60c12550ca9a5e0e20e0eb","name":"https://git.kernel.org/stable/c/6865d79fca17a80fbd60c12550ca9a5e0e20e0eb","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/f25ec4627d935dedfb5fe83bd2c2678cdcc19611","name":"https://git.kernel.org/stable/c/f25ec4627d935dedfb5fe83bd2c2678cdcc19611","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/510497e31be4f241103507315a859e2085ccb081","name":"https://git.kernel.org/stable/c/510497e31be4f241103507315a859e2085ccb081","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/8b3e221590181a8beb3735bbabf166df02c839b5","name":"https://git.kernel.org/stable/c/8b3e221590181a8beb3735bbabf166df02c839b5","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-89940","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-89940","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f 6865d79fca17a80fbd60c12550ca9a5e0e20e0eb git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f 510497e31be4f241103507315a859e2085ccb081 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f 8b3e221590181a8beb3735bbabf166df02c839b5 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f f25ec4627d935dedfb5fe83bd2c2678cdcc19611 git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 6.11","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.11 semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.12.110 6.12.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.18.51 6.18.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.2.5 7.2.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.3-rc1 * original_commit_for_fix","platforms":[]}],"timeline":[],"solutions":[],"workarounds":[],"exploits":[],"credits":[],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":null,"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"defaultStatus":"unaffected","product":"Linux","programFiles":["drivers/iio/industrialio-buffer.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"lessThan":"6865d79fca17a80fbd60c12550ca9a5e0e20e0eb","status":"affected","version":"3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f","versionType":"git"},{"lessThan":"510497e31be4f241103507315a859e2085ccb081","status":"affected","version":"3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f","versionType":"git"},{"lessThan":"8b3e221590181a8beb3735bbabf166df02c839b5","status":"affected","version":"3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f","versionType":"git"},{"lessThan":"f25ec4627d935dedfb5fe83bd2c2678cdcc19611","status":"affected","version":"3e26d9f08fbe0b73e951a5e810fdb7a332b7e37f","versionType":"git"}]},{"defaultStatus":"affected","product":"Linux","programFiles":["drivers/iio/industrialio-buffer.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"status":"affected","version":"6.11"},{"lessThan":"6.11","status":"unaffected","version":"0","versionType":"semver"},{"lessThanOrEqual":"6.12.*","status":"unaffected","version":"6.12.110","versionType":"semver"},{"lessThanOrEqual":"6.18.*","status":"unaffected","version":"6.18.51","versionType":"semver"},{"lessThanOrEqual":"7.2.*","status":"unaffected","version":"7.2.5","versionType":"semver"},{"lessThanOrEqual":"*","status":"unaffected","version":"7.3-rc1","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"cpeMatch":[{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.12.110","versionStartIncluding":"6.11","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"6.18.51","versionStartIncluding":"6.11","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.2.5","versionStartIncluding":"6.11","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.3-rc1","versionStartIncluding":"6.11","vulnerable":true}],"negate":false,"operator":"OR"}]}],"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\niio: buffer: Tie IIO dma fence lock lifetime to the fence\n\nThe `iio_dma_fence` implementation currently uses a lock embedded in the\n`iio_dmabuf_priv`. But the `iio_dma_fence` can outlive the\n`iio_dmabuf_priv`, which can cause a use-after-free.\n\nTie the lifetime of the lock to the lifetime of the fence by embedding them\nin the same struct.\n\nWe can't just hold a reference to the `iio_dmabuf_priv` from the\n`iio_dma_fence` since `iio_buffer_dmabuf_release()` might sleep and the\nfence release callback is not allowed to sleep.\n\nNote that the `dma_fence` framework now has an internal lock that gets used\nwhen the passing `NULL` for `lock` in `dma_fence_init()`, but in order to\nallow this patch to be backportable use an external lock."}],"metrics":[{"cvssV3_1":{"baseScore":7.8,"baseSeverity":"HIGH","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","version":"3.1"},"scenarios":[{"lang":"en","value":"AV:L - The use-after-free is reached through local IIO_BUFFER_DMABUF_ATTACH/ENQUEUE/DETACH ioctls on an anonymous iio:buffer fd from IIO_BUFFER_GET_FD_IOCTL on /dev/iio:deviceN; it is not reachable from network packet processing or adjacent-link protocols.\nAC:L - The attacker fully controls the lifetime mismatch: they attach and enqueue a DMA-BUF so the dma_fence lock lives in iio_dmabuf_priv, then detach so priv is freed while the fence remains in the DMA-BUF reservation, and later DMA_BUF_IOCTL_SYNC/wait takes that freed lock.\nPR:L - The IIO open and ioctl path has no capability check, only filesystem access to the device node. On Android phones, industrial converters, and embedded systems exposing this DMA-BUF buffer API, /dev/iio:device* is commonly group-accessible without init-namespace root.\nUI:N - The attacker opens the IIO device, issues the DMA-BUF attach/enqueue/detach ioctls, and waits on their own DMA-BUF file descriptor; no separate victim action is required.\nS:U - This is a standard in-kernel heap use-after-free of iio_dmabuf_priv within the host kernel's security authority, not a VM escape, IOMMU boundary bypass, or sandbox escape.\nC:H - The dma_fence retains a pointer to a spinlock embedded in freed iio_dmabuf_priv; later fence wait/sync operations use that lock, a slab use-after-free that can be turned into an arbitrary kernel memory read via heap spraying.\nI:H - The same use-after-free of iio_dmabuf_priv lets an attacker reclaim the object and corrupt dma_fence lock and callback state during later wait or signaling paths, enabling heap corruption, arbitrary write, and control-flow hijacking.\nA:H - Taking a spinlock in already-freed iio_dmabuf_priv memory causes a kernel oops, BUG, or panic; any use-after-free is high availability impact even when not fully exploited."}]}],"providerMetadata":{"dateUpdated":"2026-09-16T14:40:26.549Z","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux"},"references":[{"url":"https://git.kernel.org/stable/c/6865d79fca17a80fbd60c12550ca9a5e0e20e0eb"},{"url":"https://git.kernel.org/stable/c/510497e31be4f241103507315a859e2085ccb081"},{"url":"https://git.kernel.org/stable/c/8b3e221590181a8beb3735bbabf166df02c839b5"},{"url":"https://git.kernel.org/stable/c/f25ec4627d935dedfb5fe83bd2c2678cdcc19611"}],"title":"iio: buffer: Tie IIO dma fence lock lifetime to the fence","x_generator":{"engine":"bippy-1.2.0"}}},"cveMetadata":{"assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","assignerShortName":"Linux","cveId":"CVE-2026-89940","datePublished":"2026-09-16T10:32:28.395Z","dateReserved":"2026-09-11T19:38:34.776Z","dateUpdated":"2026-09-16T14:40:26.549Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-09-16 11:17:03","lastModifiedDate":"2026-09-16 15:18:19","problem_types":[],"metrics":{"cvssMetricV31":[{"source":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","type":"Secondary","cvssData":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH","attackVector":"LOCAL","attackComplexity":"LOW","privilegesRequired":"LOW","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"HIGH"},"exploitabilityScore":1.8,"impactScore":5.9}]},"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"89940","Ordinal":"1","Title":"iio: buffer: Tie IIO dma fence lock lifetime to the fence","CVE":"CVE-2026-89940","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"89940","Ordinal":"1","NoteData":"In the Linux kernel, the following vulnerability has been resolved:\n\niio: buffer: Tie IIO dma fence lock lifetime to the fence\n\nThe `iio_dma_fence` implementation currently uses a lock embedded in the\n`iio_dmabuf_priv`. But the `iio_dma_fence` can outlive the\n`iio_dmabuf_priv`, which can cause a use-after-free.\n\nTie the lifetime of the lock to the lifetime of the fence by embedding them\nin the same struct.\n\nWe can't just hold a reference to the `iio_dmabuf_priv` from the\n`iio_dma_fence` since `iio_buffer_dmabuf_release()` might sleep and the\nfence release callback is not allowed to sleep.\n\nNote that the `dma_fence` framework now has an internal lock that gets used\nwhen the passing `NULL` for `lock` in `dma_fence_init()`, but in order to\nallow this patch to be backportable use an external lock.","Type":"Description","Title":"iio: buffer: Tie IIO dma fence lock lifetime to the fence"}]}}}