{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2024-39508","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2024-06-25T14:23:23.753Z","datePublished":"2024-07-12T12:20:39.607Z","dateUpdated":"2026-08-05T11:33:51.352Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-08-05T11:33:51.352Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nio_uring/io-wq: Use set_bit() and test_bit() at worker->flags\n\nUtilize set_bit() and test_bit() on worker->flags within io_uring/io-wq\nto address potential data races.\n\nThe structure io_worker->flags may be accessed through various data\npaths, leading to concurrency issues. When KCSAN is enabled, it reveals\ndata races occurring in io_worker_handle_work and\nio_wq_activate_free_worker functions.\n\n\t BUG: KCSAN: data-race in io_worker_handle_work / io_wq_activate_free_worker\n\t write to 0xffff8885c4246404 of 4 bytes by task 49071 on cpu 28:\n\t io_worker_handle_work (io_uring/io-wq.c:434 io_uring/io-wq.c:569)\n\t io_wq_worker (io_uring/io-wq.c:?)\n<snip>\n\n\t read to 0xffff8885c4246404 of 4 bytes by task 49024 on cpu 5:\n\t io_wq_activate_free_worker (io_uring/io-wq.c:? io_uring/io-wq.c:285)\n\t io_wq_enqueue (io_uring/io-wq.c:947)\n\t io_queue_iowq (io_uring/io_uring.c:524)\n\t io_req_task_submit (io_uring/io_uring.c:1511)\n\t io_handle_tw_list (io_uring/io_uring.c:1198)\n<snip>\n\nLine numbers against commit 18daea77cca6 (\"Merge tag 'for-linus' of\ngit://git.kernel.org/pub/scm/virt/kvm/kvm\").\n\nThese races involve writes and reads to the same memory location by\ndifferent tasks running on different CPUs. To mitigate this, refactor\nthe code to use atomic operations such as set_bit(), test_bit(), and\nclear_bit() instead of basic \"and\" and \"or\" operations. This ensures\nthread-safe manipulation of worker flags.\n\nAlso, move `create_index` to avoid holes in the structure."}],"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 race is reached only through local io_uring syscalls (`io_uring_setup(2)`/`io_uring_enter(2)`) on a ring the attacker owns, via `io_queue_iowq()` → `io_wq_enqueue()` → `io_wq_activate_free_worker()`. No network or adjacent-network data path touches `io_uring/io-wq.c`.\nAC:L - The attacker controls both sides of the race: it creates the io-wq workers, forces async punting with `IOSQE_ASYNC`, and submits from multiple threads so that `io_wq_activate_free_worker()` walks `wq->free_list` on one CPU while a worker executes the non-atomic `worker->flags &= ~IO_WORKER_F_FREE` in `__io_worker_busy()` on another. The window can be hit repeatedly at no cost, exactly as KCSAN observed under ordinary load.\nPR:L - Only an unprivileged local account is required — `io_uring_setup()` performs no capability check and `sysctl_io_uring_disabled` defaults to 0, permitting io_uring for all users; io-wq worker threads are created on demand for that user's own ring.\nUI:N - The attacking task performs every step itself — creating the ring, spawning submitter threads, and queueing async work — with no action required from any other user or administrator.\nS:U - The raced state and all its consequences live in the kernel's own io-wq bookkeeping for the calling task's ring; no VM, hypervisor, IOMMU, or sandbox boundary is crossed.\nC:H - The raced field is the sole guard on `wq->free_list` membership — `io_worker_exit()` unlinks `worker->nulls_node` only `if (worker->flags & IO_WORKER_F_FREE)` before `kfree_rcu(worker, rcu)` — so an indeterminate value leaves a freed `io_worker` linked and read by `io_wq_activate_free_worker()` from other tasks, which after slab reuse discloses attacker-observable kernel heap contents through `worker->wq` and `worker->task`.\nI:H - The same stale-flag path lets other tasks operate on a freed `io_worker`: `io_worker_get()` performs `refcount_inc_not_zero` into a reallocated slab object and `wake_up_process(worker->task)` dereferences a sprayable pointer into the scheduler, yielding a write and control-flow primitive.\nA:H - A wrong `IO_WORKER_F_BOUND` read makes `io_wq_activate_free_worker()` wake a worker from the other accounting class and return true, so `io_wq_enqueue()` skips `io_wq_create_worker()` and the queued work is left with no worker to run it — an indefinite hang of the io_uring request plus `acct->nr_running` imbalance, triggerable at will by an unprivileged user."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["io_uring/io-wq.c"],"versions":[{"version":"2b188cc1bb857a9d4701ae59aa7768b5124e262e","lessThan":"ab702c3483db9046bab9f40306f1a28b22dbbdc0","status":"affected","versionType":"git"},{"version":"2b188cc1bb857a9d4701ae59aa7768b5124e262e","lessThan":"1cbb0affb15470a9621267fe0a8568007553a4bf","status":"affected","versionType":"git"},{"version":"2b188cc1bb857a9d4701ae59aa7768b5124e262e","lessThan":"8a565304927fbd28c9f028c492b5c1714002cbab","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/io-wq.c"],"versions":[{"version":"5.1","status":"affected"},{"version":"0","lessThan":"5.1","status":"unaffected","versionType":"semver"},{"version":"6.6.35","lessThanOrEqual":"6.6.*","status":"unaffected","versionType":"semver"},{"version":"6.9.6","lessThanOrEqual":"6.9.*","status":"unaffected","versionType":"semver"},{"version":"6.10","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.1","versionEndExcluding":"6.6.35"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.1","versionEndExcluding":"6.9.6"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.1","versionEndExcluding":"6.10"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/ab702c3483db9046bab9f40306f1a28b22dbbdc0"},{"url":"https://git.kernel.org/stable/c/1cbb0affb15470a9621267fe0a8568007553a4bf"},{"url":"https://git.kernel.org/stable/c/8a565304927fbd28c9f028c492b5c1714002cbab"}],"title":"io_uring/io-wq: Use set_bit() and test_bit() at worker->flags","x_generator":{"engine":"bippy-1.2.0"}},"adp":[{"providerMetadata":{"orgId":"af854a3a-2127-422b-91ae-364da2661108","shortName":"CVE","dateUpdated":"2024-08-02T04:26:15.901Z"},"title":"CVE Program Container","references":[{"url":"https://git.kernel.org/stable/c/ab702c3483db9046bab9f40306f1a28b22dbbdc0","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/1cbb0affb15470a9621267fe0a8568007553a4bf","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/8a565304927fbd28c9f028c492b5c1714002cbab","tags":["x_transferred"]}]},{"metrics":[{"other":{"type":"ssvc","content":{"id":"CVE-2024-39508","role":"CISA Coordinator","options":[{"Exploitation":"none"},{"Automatable":"no"},{"Technical Impact":"partial"}],"version":"2.0.3","timestamp":"2024-09-10T17:06:48.077960Z"}}}],"title":"CISA ADP Vulnrichment","providerMetadata":{"orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","shortName":"CISA-ADP","dateUpdated":"2024-09-11T17:32:47.742Z"}}]}}