CVE-2024-26737

Source
https://cve.org/CVERecord?id=CVE-2024-26737
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2024-26737.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2024-26737
Downstream
Related
Published
2024-04-03T17:00:23.414Z
Modified
2026-03-23T05:09:55.791212782Z
Severity
  • 5.5 (Medium) CVSS_V3 - CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H CVSS Calculator
Summary
bpf: Fix racing between bpf_timer_cancel_and_free and bpf_timer_cancel
Details

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();

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

Another solution considered is to mark a t->flag in bpftimercancel and clear it after hrtimercancel() is done. In bpftimercanceland_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.

Database specific
{
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2024/26xxx/CVE-2024-26737.json"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
b00628b1c7d595ae5b544e059c27b1f5828314b4
Fixed
5268bb02107b9eedfdcd51db75b407d10043368c
Fixed
addf5e297e6cbf5341f9c07720693ca9ba0057b5
Fixed
8327ed12e8ebc5436bfaa1786c49988894f9c8a6
Fixed
7d80a9e745fa5b47da3bca001f186c02485c7c33
Fixed
0281b919e175bb9c3128bd3872ac2903e9436e3f

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2024-26737.json"