{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2025-22068","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2024-12-29T08:45:45.814Z","datePublished":"2025-04-16T14:12:21.436Z","dateUpdated":"2026-08-05T11:56:29.279Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-08-05T11:56:29.279Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nublk: make sure ubq->canceling is set when queue is frozen\n\nNow ublk driver depends on `ubq->canceling` for deciding if the request\ncan be dispatched via uring_cmd & io_uring_cmd_complete_in_task().\n\nOnce ubq->canceling is set, the uring_cmd can be done via ublk_cancel_cmd()\nand io_uring_cmd_done().\n\nSo set ubq->canceling when queue is frozen, this way makes sure that the\nflag can be observed from ublk_queue_rq() reliably, and avoids\nuse-after-free on uring_cmd."}],"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 - Triggering requires local access to the ublk control/char/block devices (`/dev/ublk-control`, `/dev/ublkcN`, `/dev/ublkbN`) and io_uring syscalls. There is no remote or adjacent-network path into `ublk_queue_rq()` or the uring_cmd cancel handler.\nAC:L - The attacker controls both sides of the race — it submits a continuous block-I/O stream to its own ublk block device while concurrently closing the io_uring ring or killing the ublk server task to drive `ublk_uring_cmd_cancel_fn()` → `ublk_abort_requests()`. The window can be retried indefinitely at no cost, and ublk is enabled in mainstream distribution kernels.\nPR:L - `ublk_ctrl_add_dev()` explicitly allows a caller without CAP_SYS_ADMIN to create a device with `UBLK_F_UNPRIVILEGED_DEV`, with subsequent control commands gated only by `inode_permission()` on the owner-owned char device, so an ordinary local user can create, serve and issue I/O to a ublk device. Even for admin-created devices, the ublk server daemon and the exposed block device are routinely driven by non-root contexts.\nUI:N - The attacker performs every step itself — creating the device, running the server, submitting I/O, and tearing down the io_uring ring. No action by any other user or administrator is needed.\nS:U - The corruption is of an io_uring `io_kiocb` inside the kernel, exploited from a local process; impact stays within the kernel's own security authority. No VM, IOMMU, or sandbox boundary is crossed.\nC:H - This is a use-after-free on the uring_cmd/`io_kiocb`: the freed object is re-read (`ioucmd->task_work_cb`, `req->ctx`, `req->io_task_work`) after reallocation, and the resulting controlled call/deref can be steered into an arbitrary kernel-memory disclosure primitive via the io_uring completion path.\nI:H - `__io_uring_cmd_do_in_task()` writes `task_work_cb` and `io_task_work.func` into the already-freed request and links it onto the ring's task-work list, and `io_uring_cmd_work()` then performs an indirect call through a function pointer sourced from that freed, heap-sprayable slab object — a write plus control-flow-hijack primitive leading to privilege escalation.\nA:H - Even unweaponized, the double-use of the uring_cmd causes double completion and use-after-free of the io_uring request, producing kernel oops/panic; the sibling fix for the same pairing was reported as a reproducible kernel crash."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/block/ublk_drv.c"],"versions":[{"version":"216c8f5ef0f209a3797292c487bdaa6991ab4b92","lessThan":"7e3497d7dacb5aee69dd9be842b778083cae0e75","status":"affected","versionType":"git"},{"version":"216c8f5ef0f209a3797292c487bdaa6991ab4b92","lessThan":"5491400589e7572c2d2627ed6384302f7672aa1d","status":"affected","versionType":"git"},{"version":"216c8f5ef0f209a3797292c487bdaa6991ab4b92","lessThan":"9158359015f0eda00e521e35b7bc7ebce176aebf","status":"affected","versionType":"git"},{"version":"216c8f5ef0f209a3797292c487bdaa6991ab4b92","lessThan":"8741d0737921ec1c03cf59aebf4d01400c2b461a","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/block/ublk_drv.c"],"versions":[{"version":"6.7","status":"affected"},{"version":"0","lessThan":"6.7","status":"unaffected","versionType":"semver"},{"version":"6.12.23","lessThanOrEqual":"6.12.*","status":"unaffected","versionType":"semver"},{"version":"6.13.11","lessThanOrEqual":"6.13.*","status":"unaffected","versionType":"semver"},{"version":"6.14.2","lessThanOrEqual":"6.14.*","status":"unaffected","versionType":"semver"},{"version":"6.15","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.7","versionEndExcluding":"6.12.23"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.7","versionEndExcluding":"6.13.11"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.7","versionEndExcluding":"6.14.2"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.7","versionEndExcluding":"6.15"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/7e3497d7dacb5aee69dd9be842b778083cae0e75"},{"url":"https://git.kernel.org/stable/c/5491400589e7572c2d2627ed6384302f7672aa1d"},{"url":"https://git.kernel.org/stable/c/9158359015f0eda00e521e35b7bc7ebce176aebf"},{"url":"https://git.kernel.org/stable/c/8741d0737921ec1c03cf59aebf4d01400c2b461a"}],"title":"ublk: make sure ubq->canceling is set when queue is frozen","x_generator":{"engine":"bippy-1.2.0"}},"adp":[{"problemTypes":[{"descriptions":[{"type":"CWE","cweId":"CWE-416","lang":"en","description":"CWE-416 Use After Free"}]}],"metrics":[{"cvssV3_1":{"scope":"UNCHANGED","version":"3.1","baseScore":7.8,"attackVector":"LOCAL","baseSeverity":"HIGH","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","integrityImpact":"HIGH","userInteraction":"NONE","attackComplexity":"LOW","availabilityImpact":"HIGH","privilegesRequired":"LOW","confidentialityImpact":"HIGH"}},{"other":{"type":"ssvc","content":{"timestamp":"2025-10-01T16:16:10.823275Z","id":"CVE-2025-22068","options":[{"Exploitation":"none"},{"Automatable":"no"},{"Technical Impact":"total"}],"role":"CISA Coordinator","version":"2.0.3"}}}],"title":"CISA ADP Vulnrichment","providerMetadata":{"orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","shortName":"CISA-ADP","dateUpdated":"2025-10-01T16:16:13.925Z"}}]}}