CVE-2024-26737: bpf: Fix racing between bpf_timer_cancel_and_free and bpf_timer_cancel
In the Linux kernel, the following vulnerability has been resolved:
bpf: Fix racing between bpftimercancelandfree and bpftimercancel
The following race is possible between bpftimercancelandfree and bpftimercancel. It will lead a UAF on the timer->timer.
bpftimercancel(); spinlock(); t = timer->time; spinunlock();
bpftimercancelandfree(); spinlock(); t = timer->timer; timer->timer = NULL; spinunlock(); hrtimercancel(&t->timer); kfree(t);
/ UAF on t / hrtimercancel(&t->timer);
In bpftimercancelandfree, this patch frees the timer->timer after a rcu grace period. This requires a rcuhead addition to the "struct bpfhrtimer". Another kfree(t) happens in bpftimerinit, this does not need a kfreercu because it is still under the spinlock and timer->timer has not been visible by others yet.
In bpftimercancel, rcureadlock() 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, bpftimercancel() is the only place where timer->timer is used outside of the spinlock.
Another solution considered is to mark a t->flag in bpftimercancel and clear it after hrtimercancel() is done. In bpftimercancelandfree, 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.
Other sources
In the Linux kernel, the following vulnerability has been resolved:
bpf: Fix racing between bpftimercancelandfree and bpftimercancel
The Linux kernel CVE team has assigned CVE-2024-26737 to this issue.
Upstream advisory: https://lore.kernel.org/linux-cve-announce/2024040359-CVE-2024-26737-a9c3@gregkh/T
— Red Hat
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
debian/linuxto a version that resolves this vulnerability.Fixed in 5.10.223-1Fixed in 5.10.234-1Fixed in 6.1.129-1Fixed in 6.1.133-1Fixed in 6.12.21-1Fixed in 6.12.22-1 - Upgrade
Upgrade
redhat/kernelto a version that resolves this vulnerability.Fixed in 5.15.150 - Upgrade
Upgrade
redhat/kernelto a version that resolves this vulnerability.Fixed in 6.1.80 - Upgrade
Upgrade
redhat/kernelto a version that resolves this vulnerability.Fixed in 6.6.19 - Upgrade
Upgrade
redhat/kernelto a version that resolves this vulnerability.Fixed in 6.7.7 - Upgrade
Upgrade
redhat/kernelto a version that resolves this vulnerability.Fixed in 6.8
Event History
Frequently Asked Questions
What is the severity of CVE-2024-26737?
CVE-2024-26737 is classified as a moderately severe vulnerability due to potential data corruption risks.
How do I fix CVE-2024-26737?
To fix CVE-2024-26737, update to the latest kernel versions mentioned in the advisory: 5.15.150, 6.1.80, 6.6.19, 6.7.7, 6.8, or apply the relevant patches from Red Hat or Debian.
Which kernel versions are affected by CVE-2024-26737?
CVE-2024-26737 affects multiple kernel versions, notably those prior to 5.15.150, 6.1.80, and 6.6.19.
What type of vulnerability is CVE-2024-26737?
CVE-2024-26737 is a use-after-free vulnerability related to BPF timers in the Linux kernel.
Who is impacted by CVE-2024-26737?
Users of affected Linux kernel versions, especially those using Red Hat or Debian distributions, are impacted by CVE-2024-26737.