CVE-2024-26737 Affecting bpftool package, versions <0:7.3.0-427.28.1.el9_4


Severity

Recommended
medium

Based on Oracle Linux security rating.

Threat Intelligence

EPSS
0.05% (18th percentile)

Do your applications use this vulnerable package?

In a few clicks we can analyze your entire application and see what components are vulnerable in your application, and suggest you quick fixes.

Test your applications
  • Snyk IDSNYK-ORACLE9-BPFTOOL-7577851
  • published2 Aug 2024
  • disclosed3 Apr 2024

Introduced: 3 Apr 2024

CVE-2024-26737  (opens in a new tab)

How to fix?

Upgrade Oracle:9 bpftool to version 0:7.3.0-427.28.1.el9_4 or higher.
This issue was patched in ELSA-2024-4928.

NVD Description

Note: Versions mentioned in the description apply only to the upstream bpftool package and not the bpftool package as distributed by Oracle. See How to fix? for Oracle:9 relevant fixed versions and status.

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-&gt;timer;
                    timer-&gt;timer = NULL;
                    spin_unlock();
                    hrtimer_cancel(&amp;t-&gt;timer);
                    kfree(t);

/* UAF on t */ hrtimer_cancel(&amp;t-&gt;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.

CVSS Scores

version 3.1