{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2026-46135", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2026-05-13T15:03:33.099Z", "datePublished": "2026-05-28T09:35:49.828Z", "dateUpdated": "2026-08-05T12:29:58.184Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T12:29:58.184Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnvmet-tcp: fix race between ICReq handling and queue teardown\n\nnvmet_tcp_handle_icreq() updates queue->state after sending an\nInitialization Connection Response (ICResp), but it does so without\nserializing against target-side queue teardown.\n\nIf an NVMe/TCP host sends an Initialization Connection Request\n(ICReq) and immediately closes the connection, target-side teardown\nmay start in softirq context before io_work drains the already\nbuffered ICReq. In that case, nvmet_tcp_schedule_release_queue()\nsets queue->state to NVMET_TCP_Q_DISCONNECTING and drops the queue\nreference under state_lock.\n\nIf io_work later processes that ICReq, nvmet_tcp_handle_icreq() can\nstill overwrite the state back to NVMET_TCP_Q_LIVE. That defeats the\nDISCONNECTING-state guard in nvmet_tcp_schedule_release_queue() and\nallows a later socket state change to re-enter teardown and issue a\nsecond kref_put() on an already released queue.\n\nThe ICResp send failure path has the same problem. If teardown has\nalready moved the queue to DISCONNECTING, a send error can still\noverwrite the state with NVMET_TCP_Q_FAILED, again reopening the\nwindow for a second teardown path to drop the queue reference.\n\nFix this by serializing both post-send state transitions with\nstate_lock and bailing out if teardown has already started.\n\nUse -ESHUTDOWN as an internal sentinel for that bail-out path rather\nthan propagating it as a transport error like -ECONNRESET. Keep\nnvmet_tcp_socket_error() setting rcv_state to NVMET_TCP_RECV_ERR before\nhonoring that sentinel so receive-side parsing stays quiesced until the\nexisting release path completes." } ], "metrics": [ { "cvssV3_1": { "version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "baseScore": 9.8, "baseSeverity": "CRITICAL" }, "scenarios": [ { "lang": "en", "value": "AV:N - The bug is in the NVMe-over-TCP target driver, which processes PDUs from remote network peers on a listening TCP port (default 4420); the race is triggered by sending an ICReq and closing the connection — purely remote network operations.\nAC:L - The attacker controls both sides of the race (sends the ICReq, then immediately closes the connection) and can open unlimited connections to reliably win the timing window between softirq teardown and io_work processing, so success does not depend on conditions beyond the attacker's control.\nPR:N - The ICReq is the first PDU of the NVMe/TCP connection handshake and is handled entirely pre-authentication; an unauthenticated remote attacker need only connect and send an ICReq, with no credentials required in the default non-TLS configuration.\nUI:N - The attacker initiates the connection and triggers the race entirely on their own; no action from any local user or victim is required.\nS:U - The corruption is confined to the kernel's own memory and security authority; there is no crossing of a VM, IOMMU, or sandbox boundary.\nC:H - The double kref_put produces a use-after-free of the queue object, and per kernel UAF guidance this gives the attacker control over freed object contents, enabling arbitrary kernel memory disclosure.\nI:H - The use-after-free / double-free enables heap spraying to reclaim the freed allocation, providing a write primitive and potential control-flow hijack, so integrity impact is high.\nA:H - The refcount underflow and resulting use-after-free reliably cause kernel oops/panic, taking down the target system." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "drivers/nvme/target/tcp.c" ], "versions": [ { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "b7dd4d27aa70bd98bb10572310e913668baf6a65", "status": "affected", "versionType": "git" }, { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "9c63cf80895a70eb4fcfcaa725bb1ac9ae76f02b", "status": "affected", "versionType": "git" }, { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "6f96dea4819d122737b217ea16660d255abbf8c6", "status": "affected", "versionType": "git" }, { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "5f0b95ef68ab9afba75b20eebf436130f80c161a", "status": "affected", "versionType": "git" }, { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "49891c8fe0cb43fbbe480da1cdccfbbaeb820cb3", "status": "affected", "versionType": "git" }, { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "67e1aaf93b495c2f10bc8a5fbba575fbb7f449b6", "status": "affected", "versionType": "git" }, { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "dcfe4d1f7960e7d1c01642318f3aae1a604f8508", "status": "affected", "versionType": "git" }, { "version": "872d26a391da92ed8f0c0f5cb5fef428067b7f30", "lessThan": "5293a8882c549fab4a878bc76b0b6c951f980a61", "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/nvme/target/tcp.c" ], "versions": [ { "version": "5.0", "status": "affected" }, { "version": "0", "lessThan": "5.0", "status": "unaffected", "versionType": "semver" }, { "version": "5.10.261", "lessThanOrEqual": "5.10.*", "status": "unaffected", "versionType": "semver" }, { "version": "5.15.212", "lessThanOrEqual": "5.15.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.1.178", "lessThanOrEqual": "6.1.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.6.144", "lessThanOrEqual": "6.6.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.12.88", "lessThanOrEqual": "6.12.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.18.30", "lessThanOrEqual": "6.18.*", "status": "unaffected", "versionType": "semver" }, { "version": "7.0.7", "lessThanOrEqual": "7.0.*", "status": "unaffected", "versionType": "semver" }, { "version": "7.1", "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.0", "versionEndExcluding": "5.10.261" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "5.15.212" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "6.1.178" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "6.6.144" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "6.12.88" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "6.18.30" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "7.0.7" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.0", "versionEndExcluding": "7.1" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/b7dd4d27aa70bd98bb10572310e913668baf6a65" }, { "url": "https://git.kernel.org/stable/c/9c63cf80895a70eb4fcfcaa725bb1ac9ae76f02b" }, { "url": "https://git.kernel.org/stable/c/6f96dea4819d122737b217ea16660d255abbf8c6" }, { "url": "https://git.kernel.org/stable/c/5f0b95ef68ab9afba75b20eebf436130f80c161a" }, { "url": "https://git.kernel.org/stable/c/49891c8fe0cb43fbbe480da1cdccfbbaeb820cb3" }, { "url": "https://git.kernel.org/stable/c/67e1aaf93b495c2f10bc8a5fbba575fbb7f449b6" }, { "url": "https://git.kernel.org/stable/c/dcfe4d1f7960e7d1c01642318f3aae1a604f8508" }, { "url": "https://git.kernel.org/stable/c/5293a8882c549fab4a878bc76b0b6c951f980a61" } ], "title": "nvmet-tcp: fix race between ICReq handling and queue teardown", "x_generator": { "engine": "bippy-1.2.0" } } } }