CVE-2025-38730 (GCVE-0-2025-38730)
Vulnerability from cvelistv5
Published
2025-09-04 15:33
Modified
2026-08-05 12:04
Summary
In the Linux kernel, the following vulnerability has been resolved: io_uring/net: commit partial buffers on retry Ring provided buffers are potentially only valid within the single execution context in which they were acquired. io_uring deals with this and invalidates them on retry. But on the networking side, if MSG_WAITALL is set, or if the socket is of the streaming type and too little was processed, then it will hang on to the buffer rather than recycle or commit it. This is problematic for two reasons: 1) If someone unregisters the provided buffer ring before a later retry, then the req->buf_list will no longer be valid. 2) If multiple sockers are using the same buffer group, then multiple receives can consume the same memory. This can cause data corruption in the application, as either receive could land in the same userspace buffer. Fix this by disallowing partial retries from pinning a provided buffer across multiple executions, if ring provided buffers are used.
Impacted products
Vendor Product Version
Linux Linux Version: c56e022c0a27142b7b59ae6bdf45f86bf4b298a1
Version: c56e022c0a27142b7b59ae6bdf45f86bf4b298a1
Version: c56e022c0a27142b7b59ae6bdf45f86bf4b298a1
Version: c56e022c0a27142b7b59ae6bdf45f86bf4b298a1
Version: c56e022c0a27142b7b59ae6bdf45f86bf4b298a1
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "io_uring/net.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "3b53dc1c641f2884d4750fc25aaf6c36b90db606",
              "status": "affected",
              "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1",
              "versionType": "git"
            },
            {
              "lessThan": "fe9da1812f8697a38f7e30991d568ec199e16059",
              "status": "affected",
              "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1",
              "versionType": "git"
            },
            {
              "lessThan": "21a4ddb0f5e933f372808c10b9ac704505751bb1",
              "status": "affected",
              "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1",
              "versionType": "git"
            },
            {
              "lessThan": "2eb7937b5fc7fcd90eab7bebb0181214b61b9283",
              "status": "affected",
              "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1",
              "versionType": "git"
            },
            {
              "lessThan": "41b70df5b38bc80967d2e0ed55cc3c3896bba781",
              "status": "affected",
              "version": "c56e022c0a27142b7b59ae6bdf45f86bf4b298a1",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "io_uring/net.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.4"
            },
            {
              "lessThan": "6.4",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.103",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.44",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.15.*",
              "status": "unaffected",
              "version": "6.15.11",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.16.*",
              "status": "unaffected",
              "version": "6.16.2",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "6.17",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.103",
                  "versionStartIncluding": "6.4",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.44",
                  "versionStartIncluding": "6.4",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.15.11",
                  "versionStartIncluding": "6.4",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.16.2",
                  "versionStartIncluding": "6.4",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.17",
                  "versionStartIncluding": "6.4",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "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-\u003ebuf_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": {
            "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 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 \u2014 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-\u003ebuf_list` is dereferenced after `kfree()`, and in the `IOBL_INC` path `bl-\u003ebuf_ring`, `bl-\u003ehead` and `bl-\u003emask` 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\u0027s received data into a buffer owned by another connection.\nI:H - `io_kbuf_commit()` writes `bl-\u003ehead += nr` into freed memory, and `io_kbuf_inc_commit()` performs `buf-\u003elen -= this_len; buf-\u003eaddr += 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."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-05T12:04:20.617Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "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"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2025-38730",
    "datePublished": "2025-09-04T15:33:27.691Z",
    "dateReserved": "2025-04-16T04:51:24.033Z",
    "dateUpdated": "2026-08-05T12:04:20.617Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…