{"id":24691,"date":"2026-09-16T20:32:39","date_gmt":"2026-09-16T12:32:39","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90003"},"modified":"2026-09-16T20:32:39","modified_gmt":"2026-09-16T12:32:39","slug":"cve-2026-90003","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90003","title":{"rendered":"CVE-2026-90003 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nfutex: Prevent rcuwai"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>futex: Prevent rcuwait use-after-free during requeue PI<\/p>\n<p>On PREEMPT_RT, FUTEX_CMP_REQUEUE_PI can trigger a KASAN report<br \/>\n(slab-out-of-bounds) in futex_requeue_pi_complete() invocation of<br \/>\nrcuwait_wake_up().<\/p>\n<p>The futex_q used by futex_wait_requeue_pi() is allocated on the waiter&#8217;s<br \/>\nstack. An early wakeup can race with a PI requeue as follows:<\/p>\n<p>        waiter                          requeue task<br \/>\n        &#8212;&#8212;                          &#8212;&#8212;&#8212;&#8212;<br \/>\nfutex_wait_requeue_pi()<br \/>\n  futex_do_wait()<br \/>\n    schedule()<br \/>\n                                       futex_requeue<br \/>\n                                         futex_proxy_trylock_atomic()<br \/>\n                                           futex_requeue_pi_prepare()<br \/>\n                                            Q_REQUEUE_PI_NONE -&gt; Q_REQUEUE_PI_IN_PROGRESS<br \/>\n* timeout\/ signal wakes waiter *<br \/>\n  futex_requeue_pi_wakeup_sync()<br \/>\n   Q_REQUEUE_PI_IN_PROGRESS -&gt; Q_REQUEUE_PI_WAIT<br \/>\n                                           requeue_pi_wake_futex<br \/>\n                                             futex_requeue_pi_complete()<br \/>\n                                               cmpxchg Q_REQUEUE_PI_WAIT -&gt; Q_REQUEUE_PI_LOCKED<br \/>\n    rcuwait_wait_event()<br \/>\n      if (atomic_read(&amp;q-&gt;requeue_state) != Q_REQUEUE_PI_WAIT)<br \/>\n       break \/* no schedule() *\/<\/p>\n<p> \/* q.pi_state-&gt;owner == current *\/<br \/>\n futex_private_hash_put()<br \/>\n \/* return from syscall *\/<br \/>\n                                              rcuwait_wake_up(&amp;q-&gt;requeue_wait)<br \/>\n                                                \/* q is gone *\/<\/p>\n<p>futex_requeue_pi_complete() publishes Q_REQUEUE_PI_LOCKED before<br \/>\ncalling rcuwait_wake_up(). The waiter observes this state in<br \/>\nrcuwait_wait_event() before invoking schedule() in rcuwait_wait_event().<br \/>\nHere, the waiter is free leave the syscall before requeue task can<br \/>\ncomplete the wake.<\/p>\n<p>To address this race skip rcuwait_wake_up() in the Q_REQUEUE_PI_LOCKED<br \/>\ncase.<br \/>\nThis state is only published by requeue_pi_wake_futex(), which saves<br \/>\nq-&gt;task before futex_requeue_pi_complete() and wakes the waiter via<br \/>\nwake_up_state().<\/p>\n<p>This wake is intended to wake the waiter from its futex_do_wait() sleep.<br \/>\nIf the waiter is still sleeping there, it can not get into the<br \/>\nQ_REQUEUE_PI_WAIT state (and require this removed wake).<br \/>\nShould the waiter be woken up from futex_do_wait() by other means (as in<br \/>\nthis example) and sleep in futex_requeue_pi_wakeup_sync() then the<br \/>\nwake_up_state() from requeue_pi_wake_futex() will wake it, too.<br \/>\nShould the waiter task terminate before wake_up_state() had a chance to<br \/>\nwake the task then the task pointer does not become invalid because the<br \/>\nfutex_hash_bucket::lock is held and the task pointer is RCU protected.<\/p>\n<p>[bigeasy: Updated comment and commit message]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>futex: Prevent rcuwait use-after-free during requeue PI<\/p>\n<p>On PREEMPT_RT, FUTEX_CMP_REQUEUE_PI can trigger a KASAN report<br \/>\n(slab-out-o<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-24691","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/24691","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=24691"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=24691"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=24691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}