CVE-2024-27005CWE-362CWE-667

CVE-2024-27005

High · published May 1, 2024

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

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

interconnect: Don't access req_list while it's being manipulated

The icc_lock mutex was split into separate icc_lock and icc_bw_lock

mutexes in [1] to avoid lockdep splats. However, this didn't adequately

protect access to icc_node::req_list.

The icc_set_bw() function will eventually iterate over req_list while

only holding icc_bw_lock, but req_list can be modified while only

holding icc_lock. This causes races between icc_set_bw(), of_icc_get(),

and icc_put().

Example A:

CPU0 CPU1

---- ----

icc_set_bw(path_a)

mutex_lock(&icc_bw_lock);

icc_put(path_b)

mutex_lock(&icc_lock);

aggregate_requests()

hlist_for_each_entry(r, ...

hlist_del(...

<r = invalid pointer>

Example B:

CPU0 CPU1

---- ----

icc_set_bw(path_a)

mutex_lock(&icc_bw_lock);

path_b = of_icc_get()

of_icc_get_by_index()

mutex_lock(&icc_lock);

path_find()

path_init()

aggregate_requests()

hlist_for_each_entry(r, ...

hlist_add_head(...

<r = invalid pointer>

Fix this by ensuring icc_bw_lock is always held before manipulating

icc_node::req_list. The additional places icc_bw_lock is held don't

perform any memory allocations, so we should still be safe from the

original lockdep splats that motivated the separate locks.

[1] commit af42269c3523 ("interconnect: Fix locking for runpm vs reclaim")

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.00181 · 7.3th percentile
Weaknesses
CWE-362 · Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition'); CWE-667 · Improper Locking
Published
2024-05-01T10:15Z
Affected products (8)
ProductVersionsFixed in
linux/linux_kernel≥ 5.15.133, < 5.165.16
linux/linux_kernel≥ 6.1.55, < 6.26.2
linux/linux_kernel≥ 6.5.5, < 6.6.296.6.29
linux/linux_kernel≥ 6.7, < 6.8.86.8.8
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (11)
EPSS history
Timeline
  • 01 MAY 05:28Z
    interconnect: Don't access req_list while it's being manipulated
    cvelistv5