CVE-2024-39508CWE-362

CVE-2024-39508

High · published July 12, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
12.3
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

io_uring/io-wq: Use set_bit() and test_bit() at worker->flags

Utilize set_bit() and test_bit() on worker->flags within io_uring/io-wq

to address potential data races.

The structure io_worker->flags may be accessed through various data

paths, leading to concurrency issues. When KCSAN is enabled, it reveals

data races occurring in io_worker_handle_work and

io_wq_activate_free_worker functions.

BUG: KCSAN: data-race in io_worker_handle_work / io_wq_activate_free_worker

write to 0xffff8885c4246404 of 4 bytes by task 49071 on cpu 28:

io_worker_handle_work (io_uring/io-wq.c:434 io_uring/io-wq.c:569)

io_wq_worker (io_uring/io-wq.c:?)

<snip>

read to 0xffff8885c4246404 of 4 bytes by task 49024 on cpu 5:

io_wq_activate_free_worker (io_uring/io-wq.c:? io_uring/io-wq.c:285)

io_wq_enqueue (io_uring/io-wq.c:947)

io_queue_iowq (io_uring/io_uring.c:524)

io_req_task_submit (io_uring/io_uring.c:1511)

io_handle_tw_list (io_uring/io_uring.c:1198)

<snip>

Line numbers against commit 18daea77cca6 ("Merge tag 'for-linus' of

git://git.kernel.org/pub/scm/virt/kvm/kvm").

These races involve writes and reads to the same memory location by

different tasks running on different CPUs. To mitigate this, refactor

the code to use atomic operations such as set_bit(), test_bit(), and

clear_bit() instead of basic "and" and "or" operations. This ensures

thread-safe manipulation of worker flags.

Also, move `create_index` to avoid holes in the structure.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00224 · 12.3th percentile
Weakness
CWE-362 · Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
Published
2024-07-12T17:15Z
Affected products (2)
ProductVersionsFixed in
linux/linux_kernel≥ 5.1, < 6.6.356.6.35
linux/linux_kernel≥ 6.7, < 6.9.66.9.6
References (6)
EPSS history
Timeline
  • 12 JUL 12:20Z
    io_uring/io-wq: Use set_bit() and test_bit() at worker->flags
    cvelistv5