{"id":41114,"date":"2026-10-19T00:32:12","date_gmt":"2026-10-18T16:32:12","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98642"},"modified":"2026-10-19T00:32:12","modified_gmt":"2026-10-18T16:32:12","slug":"cve-2026-98642","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98642","title":{"rendered":"CVE-2026-98642 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Fix UAF due to c"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>bpf: Fix UAF due to concurrent consumption of ttrace lists in alloc_bulk<\/p>\n<p>Syzkaller repeatedly triggered UAF splats related to nodes in<br \/>\nwaiting_for_gp_ttrace within the bpf memalloc:<\/p>\n<p>BUG: KASAN: slab-use-after-free in llist_del_first+0x85\/0x110 lib\/llist.c:61<br \/>\nRead of size 8 at addr ffff8881572cd080 by task syz.4.470\/5112<br \/>\n &#8230;<br \/>\n llist_del_first+0x85\/0x110 lib\/llist.c:61<br \/>\n alloc_bulk+0x193\/0x460 kernel\/bpf\/memalloc.c:229<br \/>\n bpf_mem_refill+0x386\/0x560 kernel\/bpf\/memalloc.c:436<\/p>\n<p>Freed by task 14:<br \/>\n &#8230;<br \/>\n __free_rcu kernel\/bpf\/memalloc.c:281 [inline]<br \/>\n __free_rcu_tasks_trace+0x48\/0xd0 kernel\/bpf\/memalloc.c:291<br \/>\n rcu_tasks_invoke_cbs+0x1ec\/0x3e0 kernel\/rcu\/tasks.h:571<br \/>\n rcu_tasks_one_gp+0x13d\/0x220 kernel\/rcu\/tasks.h:621<br \/>\n rcu_tasks_kthread+0xf3\/0x120 kernel\/rcu\/tasks.h:651<\/p>\n<p>The reason is that the UAF occurs after the RCU Tasks Trace GP expires:<br \/>\nwhen the __free_rcu() callback runs, there is no synchronization<br \/>\nprotecting llist_del_all() against concurrent alloc_bulk() operating on<br \/>\nwaiting_for_gp_ttrace, leading to the race condition below:<\/p>\n<p>CPU0                                           CPU1<br \/>\n                                               __free_rcu (RCU Tasks Trace callback)<br \/>\nalloc_bulk<br \/>\n  llist_del_first(&amp;c-&gt;waiting_for_gp_ttrace)<br \/>\n    entry = smp_load_acquire(&amp;head-&gt;first);<br \/>\n    do {<br \/>\n      if (entry == NULL)<br \/>\n        return NULL;<br \/>\n                                               free_all(llist_del_all(&amp;c-&gt;waiting_for_gp_ttrace))<br \/>\n                                                 llist_for_each_safe(pos, t, llnode)<br \/>\n                                                   free_one(pos);<br \/>\n      next = READ_ONCE(entry-&gt;next); first, &amp;entry, next));<\/p>\n<p>In addition, there is also a theoretical race condition on the<br \/>\nfree_by_rcu_ttrace list. This race requires two preconditions: an<br \/>\nin-flight Tasks Trace GP keeping c-&gt;call_rcu_ttrace_in_progress == 1,<br \/>\nand concurrent cross-CPU frees repopulating c-&gt;free_by_rcu_ttrace with<br \/>\nnew nodes. Under these conditions, the following scenario triggers UAF:<\/p>\n<p>\/\/ CPU0<br \/>\n\/\/ irq work is still busy (on PREEMPT_RT)<br \/>\nalloc_bulk()<br \/>\n  llist_del_first(&amp;c-&gt;free_by_rcu_ttrace)<br \/>\n    entry = smp_load_acquire(&amp;head-&gt;first);<br \/>\n    do {<br \/>\n      if (entry == NULL)<br \/>\n        return NULL;<\/p>\n<p>        \/\/ CPU1<br \/>\n        bpf_mem_alloc_destroy()<br \/>\n          WRITE_ONCE(c-&gt;draining, true)<br \/>\n          \/\/ wait for CPU0<br \/>\n          irq_work_sync()<\/p>\n<p>                \/\/ CPU2<br \/>\n                do_call_rcu_ttrace(tgt(CPU0))<br \/>\n                  if (c-&gt;draining) {<br \/>\n                    llist_del_all(&amp;c-&gt;free_by_rcu_ttrace)<br \/>\n                    free_all()<br \/>\n                  }<\/p>\n<p>\/\/ CPU0 continue<br \/>\n      next = READ_ONCE(entry-&gt;next); first, &amp;entry, next));<\/p>\n<p>Fix this by introducing a raw spinlock to synchronize the concurrent<br \/>\nconsumption on waiting_for_gp_ttrace and free_by_rcu_ttrace.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>bpf: Fix UAF due to concurrent consumption of ttrace lists in alloc_bulk<\/p>\n<p>Syzkaller repeatedly triggered UAF splats related to node<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-41114","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/41114","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=41114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}