CVE-2024-26737CWE-416

CVE-2024-26737

High · published April 3, 2024

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

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

bpf: Fix racing between bpf_timer_cancel_and_free and bpf_timer_cancel

The following race is possible between bpf_timer_cancel_and_free

and bpf_timer_cancel. It will lead a UAF on the timer->timer.

bpf_timer_cancel();

spin_lock();

t = timer->time;

spin_unlock();

bpf_timer_cancel_and_free();

spin_lock();

t = timer->timer;

timer->timer = NULL;

spin_unlock();

hrtimer_cancel(&t->timer);

kfree(t);

/* UAF on t */

hrtimer_cancel(&t->timer);

In bpf_timer_cancel_and_free, this patch frees the timer->timer

after a rcu grace period. This requires a rcu_head addition

to the "struct bpf_hrtimer". Another kfree(t) happens in bpf_timer_init,

this does not need a kfree_rcu because it is still under the

spin_lock and timer->timer has not been visible by others yet.

In bpf_timer_cancel, rcu_read_lock() is added because this helper

can be used in a non rcu critical section context (e.g. from

a sleepable bpf prog). Other timer->timer usages in helpers.c

have been audited, bpf_timer_cancel() is the only place where

timer->timer is used outside of the spin_lock.

Another solution considered is to mark a t->flag in bpf_timer_cancel

and clear it after hrtimer_cancel() is done. In bpf_timer_cancel_and_free,

it busy waits for the flag to be cleared before kfree(t). This patch

goes with a straight forward solution and frees timer->timer after

a rcu grace period.

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.00253 · 15.9th percentile
Weakness
CWE-416 · Use After Free
Published
2024-04-03T21:15Z
Affected products (9)
ProductVersionsFixed in
linux/linux_kernel≥ 5.15, < 5.15.1505.15.150
linux/linux_kernel≥ 5.16, < 6.1.806.1.80
linux/linux_kernel≥ 6.2, < 6.6.196.6.19
linux/linux_kernel≥ 6.7, < 6.7.76.7.7
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (10)
EPSS history
Timeline
  • 03 APR 17:00Z
    bpf: Fix racing between bpf_timer_cancel_and_free and bpf_timer_cancel
    cvelistv5