CVE-2026-99227 (GCVE-0-2026-99227)

Vulnerability from cvelistv5 – Published: 2026-11-02 16:06 – Updated: 2026-11-03 19:12
VLAI
Title
io_uring/waitid: prevent cancel reference wrap
Summary
In the Linux kernel, the following vulnerability has been resolved: io_uring/waitid: prevent cancel reference wrap io_waitid packs the cancellation state into bit 31 of ->refs and uses bits 30:0 as a 31-bit reference counter: #define IO_WAITID_CANCEL_FLAG BIT(31) #define IO_WAITID_REF_MASK GENMASK(30, 0) __io_waitid_cancel() marks a request canceled, then increments the low bits of ->refs to claim completion ownership. When another path owns the request, the increment remains even though cancellation returns false. The request remains discoverable by cancellation, so repeated failed attempts can wrap the 31-bit reference field to zero. A later cancellation can claim ownership and complete the request a second time. Use atomic_fetch_or() when setting the cancel flag and inspect the old flag value. The first cancel attempt continues to the existing ownership increment, preserving its wake and issuer handoff semantics. Later attempts see the cancel flag and return without incrementing the reference field. This makes repeated failed cancellation attempts idempotent while leaving the first-cancel state transitions unchanged.
Assigner
Linux CNA under the mitre root
CNA scorecard D 53/100 over 6637 records in the last 180 days details
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: f31ecf671ddc498f20219453395794ff2383e06b , < 20b67288574c7c3df6b8ea7ed3b7af90a868006f (git)
Affected: f31ecf671ddc498f20219453395794ff2383e06b , < 5bfeee1774791602a0d53eb717f00f172127a017 (git)
Affected: f31ecf671ddc498f20219453395794ff2383e06b , < 857aa2012b91cad6fdef54a4b6c632d9d0b6e64f (git)
Affected: f31ecf671ddc498f20219453395794ff2383e06b , < 22fb4a4518e305164c7f203608287564de292f34 (git)
Affected: f31ecf671ddc498f20219453395794ff2383e06b , < 98787d3fa4e99564d2b2bc21255b21f670c450d0 (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.7
Unaffected: 0 , < 6.7 (semver)
Unaffected: 6.12.115 , ≤ 6.12.* (semver)
Unaffected: 6.18.60 , ≤ 6.18.* (semver)
Unaffected: 7.2.14 , ≤ 7.2.* (semver)
Unaffected: 7.3.1 , ≤ 7.3.* (semver)
Unaffected: 7.4-rc1 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "io_uring/waitid.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "20b67288574c7c3df6b8ea7ed3b7af90a868006f",
              "status": "affected",
              "version": "f31ecf671ddc498f20219453395794ff2383e06b",
              "versionType": "git"
            },
            {
              "lessThan": "5bfeee1774791602a0d53eb717f00f172127a017",
              "status": "affected",
              "version": "f31ecf671ddc498f20219453395794ff2383e06b",
              "versionType": "git"
            },
            {
              "lessThan": "857aa2012b91cad6fdef54a4b6c632d9d0b6e64f",
              "status": "affected",
              "version": "f31ecf671ddc498f20219453395794ff2383e06b",
              "versionType": "git"
            },
            {
              "lessThan": "22fb4a4518e305164c7f203608287564de292f34",
              "status": "affected",
              "version": "f31ecf671ddc498f20219453395794ff2383e06b",
              "versionType": "git"
            },
            {
              "lessThan": "98787d3fa4e99564d2b2bc21255b21f670c450d0",
              "status": "affected",
              "version": "f31ecf671ddc498f20219453395794ff2383e06b",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "io_uring/waitid.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.7"
            },
            {
              "lessThan": "6.7",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.115",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.60",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.14",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.3.*",
              "status": "unaffected",
              "version": "7.3.1",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.4-rc1",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.115",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.60",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.14",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3.1",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.4-rc1",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nio_uring/waitid: prevent cancel reference wrap\n\nio_waitid packs the cancellation state into bit 31 of -\u003erefs and uses\nbits 30:0 as a 31-bit reference counter:\n\n  #define IO_WAITID_CANCEL_FLAG BIT(31)\n  #define IO_WAITID_REF_MASK    GENMASK(30, 0)\n\n__io_waitid_cancel() marks a request canceled, then increments the low\nbits of -\u003erefs to claim completion ownership. When another path owns the\nrequest, the increment remains even though cancellation returns false.\nThe request remains discoverable by cancellation, so repeated failed\nattempts can wrap the 31-bit reference field to zero. A later\ncancellation can claim ownership and complete the request a second time.\n\nUse atomic_fetch_or() when setting the cancel flag and inspect the old\nflag value. The first cancel attempt continues to the existing ownership\nincrement, preserving its wake and issuer handoff semantics. Later\nattempts see the cancel flag and return without incrementing the\nreference field.\n\nThis makes repeated failed cancellation attempts idempotent while\nleaving the first-cancel state transitions unchanged."
        }
      ],
      "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 wrap is triggered from local io_uring_enter() IORING_OP_ASYNC_CANCEL or io_uring_register(IORING_REGISTER_SYNC_CANCEL), which reach the patched __io_waitid_cancel() via io_try_cancel()-\u003eio_waitid_cancel()-\u003eio_cancel_remove()-\u003eio_waitid_cancel_cb(). Per kernel guidance, io_uring is Local; no remote protocol carries the cancel.\nAC:L - The attacker creates an IORING_SETUP_DEFER_TASKRUN ring, submits IORING_OP_WAITID, forks/exits a child so io_waitid_wait() takes a ref and queues io_waitid_cb() without running it (enter without IORING_ENTER_GETEVENTS), then repeats cancel until the 31-bit IO_WAITID_REF_MASK in iw-\u003erefs wraps. The sequence is fully attacker-controlled.\nPR:L - io_uring_setup() calls io_uring_allowed() and sysctl_io_uring_disabled defaults to 0. IORING_OP_WAITID and IORING_OP_ASYNC_CANCEL have no capability check, and waiting on the attacker\u2019s own children via kernel_waitid_prepare() needs none.\nUI:N - The attacker creates the ring, submits the WAITID SQE, forks the child that wakes io_waitid_wait(), and issues the repeated cancels against that request. No other user must act.\nS:U - Double-complete of the waitid io_kiocb and the resulting work_list corruption stay inside the host kernel. This is ordinary in-kernel UAF/LPE, not a VM, IOMMU, or sandbox boundary crossing.\nC:H - After the wrap, __io_waitid_cancel() claims the still-listed request and io_req_queue_tw_complete() mpscq_push()es the same io_kiocb already queued by io_waitid_wait(), so the consumer later walks a freed req_cachep object. That UAF read of the recycled request is High confidentiality.\nI:H - The same double mpscq_push writes node-\u003enext (including an A-\u003eA cycle) on an io_kiocb that io_waitid_complete() has already torn down; after io_req_task_complete() frees it, reclaim of that slab object is a UAF write of a list next pointer and a second completion, i.e. High integrity.\nA:H - The A-\u003eA work_list cycle hangs __io_run_local_work() under uring_lock (soft lockup), and the subsequent pop of the freed io_kiocb oopses. Any kernel hang or UAF crash is High availability."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-11-03T19:12:59.440Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/20b67288574c7c3df6b8ea7ed3b7af90a868006f"
        },
        {
          "url": "https://git.kernel.org/stable/c/5bfeee1774791602a0d53eb717f00f172127a017"
        },
        {
          "url": "https://git.kernel.org/stable/c/857aa2012b91cad6fdef54a4b6c632d9d0b6e64f"
        },
        {
          "url": "https://git.kernel.org/stable/c/22fb4a4518e305164c7f203608287564de292f34"
        },
        {
          "url": "https://git.kernel.org/stable/c/98787d3fa4e99564d2b2bc21255b21f670c450d0"
        }
      ],
      "title": "io_uring/waitid: prevent cancel reference wrap",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-99227",
    "datePublished": "2026-11-02T16:06:36.101Z",
    "dateReserved": "2026-09-25T10:25:14.402Z",
    "dateUpdated": "2026-11-03T19:12:59.440Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-99227",
      "date": "2026-11-04",
      "epss": "0.0012",
      "percentile": "0.01845"
    },
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "defaultStatus": "unaffected",
                "product": "Linux",
                "programFiles": [
                  "io_uring/waitid.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "lessThan": "20b67288574c7c3df6b8ea7ed3b7af90a868006f",
                    "status": "affected",
                    "version": "f31ecf671ddc498f20219453395794ff2383e06b",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "5bfeee1774791602a0d53eb717f00f172127a017",
                    "status": "affected",
                    "version": "f31ecf671ddc498f20219453395794ff2383e06b",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "857aa2012b91cad6fdef54a4b6c632d9d0b6e64f",
                    "status": "affected",
                    "version": "f31ecf671ddc498f20219453395794ff2383e06b",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "22fb4a4518e305164c7f203608287564de292f34",
                    "status": "affected",
                    "version": "f31ecf671ddc498f20219453395794ff2383e06b",
                    "versionType": "git"
                  },
                  {
                    "lessThan": "98787d3fa4e99564d2b2bc21255b21f670c450d0",
                    "status": "affected",
                    "version": "f31ecf671ddc498f20219453395794ff2383e06b",
                    "versionType": "git"
                  }
                ]
              },
              {
                "defaultStatus": "affected",
                "product": "Linux",
                "programFiles": [
                  "io_uring/waitid.c"
                ],
                "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
                "vendor": "Linux",
                "versions": [
                  {
                    "status": "affected",
                    "version": "6.7"
                  },
                  {
                    "lessThan": "6.7",
                    "status": "unaffected",
                    "version": "0",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.12.*",
                    "status": "unaffected",
                    "version": "6.12.115",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "6.18.*",
                    "status": "unaffected",
                    "version": "6.18.60",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "7.2.*",
                    "status": "unaffected",
                    "version": "7.2.14",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "7.3.*",
                    "status": "unaffected",
                    "version": "7.3.1",
                    "versionType": "semver"
                  },
                  {
                    "lessThanOrEqual": "*",
                    "status": "unaffected",
                    "version": "7.4-rc1",
                    "versionType": "original_commit_for_fix"
                  }
                ]
              }
            ],
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nio_uring/waitid: prevent cancel reference wrap\n\nio_waitid packs the cancellation state into bit 31 of -\u003erefs and uses\nbits 30:0 as a 31-bit reference counter:\n\n  #define IO_WAITID_CANCEL_FLAG BIT(31)\n  #define IO_WAITID_REF_MASK    GENMASK(30, 0)\n\n__io_waitid_cancel() marks a request canceled, then increments the low\nbits of -\u003erefs to claim completion ownership. When another path owns the\nrequest, the increment remains even though cancellation returns false.\nThe request remains discoverable by cancellation, so repeated failed\nattempts can wrap the 31-bit reference field to zero. A later\ncancellation can claim ownership and complete the request a second time.\n\nUse atomic_fetch_or() when setting the cancel flag and inspect the old\nflag value. The first cancel attempt continues to the existing ownership\nincrement, preserving its wake and issuer handoff semantics. Later\nattempts see the cancel flag and return without incrementing the\nreference field.\n\nThis makes repeated failed cancellation attempts idempotent while\nleaving the first-cancel state transitions unchanged."
          }
        ],
        "id": "CVE-2026-99227",
        "lastModified": "2026-11-03T20:18:28.357",
        "metrics": {
          "cvssMetricV31": [
            {
              "cvssData": {
                "attackComplexity": "LOW",
                "attackVector": "LOCAL",
                "availabilityImpact": "HIGH",
                "baseScore": 7.8,
                "baseSeverity": "HIGH",
                "confidentialityImpact": "HIGH",
                "integrityImpact": "HIGH",
                "privilegesRequired": "LOW",
                "scope": "UNCHANGED",
                "userInteraction": "NONE",
                "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
                "version": "3.1"
              },
              "exploitabilityScore": 1.8,
              "impactScore": 5.9,
              "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
              "type": "Secondary"
            }
          ]
        },
        "published": "2026-11-02T16:17:47.420",
        "references": [
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/20b67288574c7c3df6b8ea7ed3b7af90a868006f"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/22fb4a4518e305164c7f203608287564de292f34"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/5bfeee1774791602a0d53eb717f00f172127a017"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/857aa2012b91cad6fdef54a4b6c632d9d0b6e64f"
          },
          {
            "source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
            "url": "https://git.kernel.org/stable/c/98787d3fa4e99564d2b2bc21255b21f670c450d0"
          }
        ],
        "sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "vulnStatus": "Received"
      }
    },
    "redhat_vex": {
      "aggregate_severity": "Important",
      "current_release_date": "2026-11-05T00:20:21+00:00",
      "cve": "CVE-2026-99227",
      "id": "CVE-2026-99227",
      "initial_release_date": "2026-11-02T16:06:36.101000+00:00",
      "product_status:known_affected": "111",
      "product_status:known_not_affected": "93",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: kernel: Privilege escalation via reference counter wrap in io_uring",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-99227.json",
      "version": "3"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline

Sightings and recorded dates, grouped by day · UTC

JSON
Events included in the timeline

Loading timeline…


    Loading…

    Loading…

    Loading…

    Related by attack behaviour

    Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.