CVE-2024-26737

Source
https://cve.org/CVERecord?id=CVE-2024-26737
Import Source
https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2024-26737.json
JSON Data
https://api.test.osv.dev/v1/vulns/CVE-2024-26737
Downstream
Related
Published
2024-04-03T17:00:23.414Z
Modified
2026-05-28T03:53:45.638769530Z
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
{
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2024/26xxx/CVE-2024-26737.json",
    "cna_assigner": "Linux"
}
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/osv-test-cve-osv-conversion/osv-output/CVE-2024-26737.json"

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
5.15.0
Fixed
5.15.150
Type
ECOSYSTEM
Events
Introduced
5.16.0
Fixed
6.1.80
Type
ECOSYSTEM
Events
Introduced
6.2.0
Fixed
6.6.19
Type
ECOSYSTEM
Events
Introduced
6.7.0
Fixed
6.7.7

Database specific

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