CVE-2024-26737

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.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc5:*:*:*:*:*:*

History

04 Apr 2025, 14:34

Type Values Removed Values Added
CPE cpe:2.3:o:linux:linux_kernel:6.8:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.8:rc3:*:*:*:*:*:*
First Time Linux linux Kernel
Linux
CWE CWE-416
References () https://git.kernel.org/stable/c/0281b919e175bb9c3128bd3872ac2903e9436e3f - () https://git.kernel.org/stable/c/0281b919e175bb9c3128bd3872ac2903e9436e3f - Patch
References () https://git.kernel.org/stable/c/5268bb02107b9eedfdcd51db75b407d10043368c - () https://git.kernel.org/stable/c/5268bb02107b9eedfdcd51db75b407d10043368c - Patch
References () https://git.kernel.org/stable/c/7d80a9e745fa5b47da3bca001f186c02485c7c33 - () https://git.kernel.org/stable/c/7d80a9e745fa5b47da3bca001f186c02485c7c33 - Patch
References () https://git.kernel.org/stable/c/8327ed12e8ebc5436bfaa1786c49988894f9c8a6 - () https://git.kernel.org/stable/c/8327ed12e8ebc5436bfaa1786c49988894f9c8a6 - Patch
References () https://git.kernel.org/stable/c/addf5e297e6cbf5341f9c07720693ca9ba0057b5 - () https://git.kernel.org/stable/c/addf5e297e6cbf5341f9c07720693ca9ba0057b5 - Patch

21 Nov 2024, 09:02

Type Values Removed Values Added
References () https://git.kernel.org/stable/c/0281b919e175bb9c3128bd3872ac2903e9436e3f - () https://git.kernel.org/stable/c/0281b919e175bb9c3128bd3872ac2903e9436e3f -
References () https://git.kernel.org/stable/c/5268bb02107b9eedfdcd51db75b407d10043368c - () https://git.kernel.org/stable/c/5268bb02107b9eedfdcd51db75b407d10043368c -
References () https://git.kernel.org/stable/c/7d80a9e745fa5b47da3bca001f186c02485c7c33 - () https://git.kernel.org/stable/c/7d80a9e745fa5b47da3bca001f186c02485c7c33 -
References () https://git.kernel.org/stable/c/8327ed12e8ebc5436bfaa1786c49988894f9c8a6 - () https://git.kernel.org/stable/c/8327ed12e8ebc5436bfaa1786c49988894f9c8a6 -
References () https://git.kernel.org/stable/c/addf5e297e6cbf5341f9c07720693ca9ba0057b5 - () https://git.kernel.org/stable/c/addf5e297e6cbf5341f9c07720693ca9ba0057b5 -

04 Nov 2024, 19:35

Type Values Removed Values Added
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 5.5
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: bpf: Corrección de ejecucións entre bpf_timer_cancel_and_free y bpf_timer_cancel La siguiente ejecución es posible entre bpf_timer_cancel_and_free y bpf_timer_cancel. Dirigirá una UAF en el temporizador->temporizador. bpf_timer_cancel(); spin_lock(); t = temporizador->tiempo; spin_unlock(); bpf_timer_cancel_and_free(); spin_lock(); t = temporizador->temporizador; temporizador->temporizador = NULL; spin_unlock(); hrtimer_cancel(&t->temporizador); klibre(t); /* UAF en t */ hrtimer_cancel(&t->timer); En bpf_timer_cancel_and_free, este parche libera el temporizador->temporizador después de un período de gracia de rcu. Esto requiere una adición de rcu_head a "struct bpf_hrtimer". Otro kfree(t) ocurre en bpf_timer_init, esto no necesita un kfree_rcu porque todavía está bajo spin_lock y otros aún no han visible el temporizador->temporizador. En bpf_timer_cancel, se agrega rcu_read_lock() porque este asistente puede usarse en un contexto de sección no crítica para rcu (por ejemplo, desde un programa bpf que se puede dormir). Se han auditado otros usos de temporizador->temporizador en helpers.c, bpf_timer_cancel() es el único lugar donde se usa temporizador->temporizador fuera de spin_lock. Otra solución considerada es marcar una bandera t-> en bpf_timer_cancel y borrarla una vez finalizado hrtimer_cancel(). En bpf_timer_cancel_and_free, está ocupado esperando a que se borre la bandera antes de kfree(t). Este parche incluye una solución sencilla y libera el temporizador->temporizador después de un período de gracia de rcu.

03 Apr 2024, 17:15

Type Values Removed Values Added
New CVE

Information

Published : 2024-04-03 17:15

Updated : 2025-04-04 14:34


NVD link : CVE-2024-26737

Mitre link : CVE-2024-26737

CVE.ORG link : CVE-2024-26737


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-416

Use After Free