{"id":21502,"date":"2026-09-12T04:31:16","date_gmt":"2026-09-11T20:31:16","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89580"},"modified":"2026-09-12T04:31:16","modified_gmt":"2026-09-11T20:31:16","slug":"cve-2026-89580","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89580","title":{"rendered":"CVE-2026-89580 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Disable preempti"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>bpf: Disable preemption in __bpf_get_stack<\/p>\n<p>get_perf_callchain() returns a per-CPU perf_callchain_entry buffer and<br \/>\nreleases its recursion slot via put_callchain_entry() before returning,<br \/>\nso nothing keeps the entry reserved while __bpf_get_stack() consumes<br \/>\nit below.<\/p>\n<p>A preemptible BPF program (e.g. a non-sleepable raw tracepoint program<br \/>\non a PREEMPT kernel, which runs under migrate_disable() but not<br \/>\npreempt_disable()) can be scheduled out between obtaining the entry<br \/>\nand the copy. Another task scheduled on the same CPU then reuses the<br \/>\nsame per-CPU buffer and overwrites trace-&gt;nr with a larger value.<br \/>\ncopy_len is then computed from the inflated trace-&gt;nr and can exceed<br \/>\nthe caller&#8217;s buffer, causing an out-of-bounds write in the memcpy()<br \/>\nand in the build_id path.<\/p>\n<p>The rcu_read_lock() taken here alone does not prevent this. It is<br \/>\nonly taken on the may_fault path, and under CONFIG_PREEMPT_RCU it does<br \/>\nnot disable preemption; it merely keeps perf&#8217;s callchain buffer array<br \/>\nalive (freed via call_rcu()) and does nothing to stop another task<br \/>\nfrom reusing the entry.<\/p>\n<p>Disable preemption around obtaining the callchain entry and copying<br \/>\nit into the caller&#8217;s buffer, so the entry cannot be reused underneath<br \/>\nus and trace-&gt;nr stays bounded by max_depth. Build ID resolution may<br \/>\nfault and is therefore deferred until after preemption is re-enabled;<br \/>\nby then the instruction pointers have already been copied into buf,<br \/>\nso it operates only on that private copy. Note, preempt_disable() also<br \/>\nsubsumes the buffer-lifetime guarantee the rcu_read_lock() provided,<br \/>\nsince a preempt-disabled section is an RCU read-side critical section<br \/>\nfor the callchain buffers&#8217; call_rcu() reclaim.<\/p>\n<p>[ changed Fixes: commit ]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>bpf: Disable preemption in __bpf_get_stack<\/p>\n<p>get_perf_callchain() returns a per-CPU perf_callchain_entry buffer and<br \/>\nreleases its rec<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-21502","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/21502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21502"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21502"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}