{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2025-38730", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2025-04-16T04:51:24.033Z", "datePublished": "2025-09-04T15:33:27.691Z", "dateUpdated": "2026-08-05T12:04:20.617Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T12:04:20.617Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nio_uring/net: commit partial buffers on retry\n\nRing provided buffers are potentially only valid within the single\nexecution context in which they were acquired. io_uring deals with this\nand invalidates them on retry. But on the networking side, if\nMSG_WAITALL is set, or if the socket is of the streaming type and too\nlittle was processed, then it will hang on to the buffer rather than\nrecycle or commit it. This is problematic for two reasons:\n\n1) If someone unregisters the provided buffer ring before a later retry,\n then the req->buf_list will no longer be valid.\n\n2) If multiple sockers are using the same buffer group, then multiple\n receives can consume the same memory. This can cause data corruption\n in the application, as either receive could land in the same\n userspace buffer.\n\nFix this by disallowing partial retries from pinning a provided buffer\nacross multiple executions, if ring provided buffers are used." } ], "metrics": [ { "cvssV3_1": { "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" }, "scenarios": [ { "lang": "en", "value": "AV:L - The vulnerability is reached through the io_uring submission/registration syscall interface (`io_uring_setup`, `IORING_REGISTER_PBUF_RING`/`IORING_UNREGISTER_PBUF_RING`, SQE submission), which requires local access to the machine. Per kernel scoring guidance io_uring is a local attack surface, even though the socket data that triggers the partial-transfer state can come from a peer.\nAC:L - The attacker controls every element of the sequence — it owns both ends of the socket (socketpair or loopback TCP), so it decides exactly when a short `MSG_WAITALL` read occurs and when the remainder is delivered, and it issues the `IORING_UNREGISTER_PBUF_RING` in between. This is deterministic ordering rather than a race, and heap grooming of the freed `io_buffer_list` slot is standard and attacker-influenced.\nPR:L - Only an ordinary unprivileged local user account is needed; creating an io_uring instance, registering/unregistering a provided buffer ring, and creating sockets require no capabilities and no user-namespace tricks. No `CAP_*` check exists anywhere on the path.\nUI:N - The attacking process performs all steps itself within its own io_uring instance and sockets. No victim action or interaction is required.\nS:U - The corruption is of kernel heap memory belonging to the same kernel security authority, giving a classic local privilege escalation. No VM, IOMMU, or other security-authority boundary is crossed.\nC:H - The stale `req->buf_list` is dereferenced after `kfree()`, and in the `IOBL_INC` path `bl->buf_ring`, `bl->head` and `bl->mask` are all read from the reclaimed object and used to dereference an attacker-chosen address, yielding an arbitrary kernel read primitive. Additionally the buffer-aliasing half of the bug leaks one socket's received data into a buffer owned by another connection.\nI:H - `io_kbuf_commit()` writes `bl->head += nr` into freed memory, and `io_kbuf_inc_commit()` performs `buf->len -= this_len; buf->addr += this_len` through a fully attacker-controlled pointer, giving an arbitrary read-modify-write that is readily leveraged into control-flow hijack and root escalation. The bug also silently corrupts application data across sockets sharing a buffer group.\nA:H - Using a freed `struct io_buffer_list` and dereferencing its stale `buf_ring` pointer reliably produces an oops/panic (KASAN use-after-free, wild pointer write), and the attacker can repeat it at will to bring the system down." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "io_uring/net.c" ], "versions": [ { "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1", "lessThan": "3b53dc1c641f2884d4750fc25aaf6c36b90db606", "status": "affected", "versionType": "git" }, { "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1", "lessThan": "fe9da1812f8697a38f7e30991d568ec199e16059", "status": "affected", "versionType": "git" }, { "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1", "lessThan": "21a4ddb0f5e933f372808c10b9ac704505751bb1", "status": "affected", "versionType": "git" }, { "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1", "lessThan": "2eb7937b5fc7fcd90eab7bebb0181214b61b9283", "status": "affected", "versionType": "git" }, { "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1", "lessThan": "41b70df5b38bc80967d2e0ed55cc3c3896bba781", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "io_uring/net.c" ], "versions": [ { "version": "6.4", "status": "affected" }, { "version": "0", "lessThan": "6.4", "status": "unaffected", "versionType": "semver" }, { "version": "6.6.103", "lessThanOrEqual": "6.6.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.12.44", "lessThanOrEqual": "6.12.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.15.11", "lessThanOrEqual": "6.15.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.16.2", "lessThanOrEqual": "6.16.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.17", "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.4", "versionEndExcluding": "6.6.103" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.4", "versionEndExcluding": "6.12.44" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.4", "versionEndExcluding": "6.15.11" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.4", "versionEndExcluding": "6.16.2" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.4", "versionEndExcluding": "6.17" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/3b53dc1c641f2884d4750fc25aaf6c36b90db606" }, { "url": "https://git.kernel.org/stable/c/fe9da1812f8697a38f7e30991d568ec199e16059" }, { "url": "https://git.kernel.org/stable/c/21a4ddb0f5e933f372808c10b9ac704505751bb1" }, { "url": "https://git.kernel.org/stable/c/2eb7937b5fc7fcd90eab7bebb0181214b61b9283" }, { "url": "https://git.kernel.org/stable/c/41b70df5b38bc80967d2e0ed55cc3c3896bba781" } ], "title": "io_uring/net: commit partial buffers on retry", "x_generator": { "engine": "bippy-1.2.0" } } } }