UBUNTU-CVE-2026-90003: Use After Free
In the Linux kernel, the following vulnerability has been resolved: futex: Prevent rcuwait use-after-free during requeue PI On PREEMPTRT, FUTEXCMPREQUEUEPI can trigger a KASAN report (slab-out-of-bounds) in futexrequeuepicomplete() invocation of rcuwaitwakeup(). The futexq used by futexwaitrequeuepi() is allocated on the waiter's stack. An early wakeup can race with a PI requeue as follows: waiter requeue task ------ ------------ futexwaitrequeuepi() futexdowait() schedule() futexrequeue futexproxytrylockatomic() futexrequeuepiprepare() QREQUEUEPINONE -> QREQUEUEPIINPROGRESS timeout/ signal wakes waiter futexrequeuepiwakeupsync() QREQUEUEPIINPROGRESS -> QREQUEUEPIWAIT requeuepiwakefutex futexrequeuepicomplete() cmpxchg QREQUEUEPIWAIT -> QREQUEUEPILOCKED rcuwaitwaitevent() if (atomicread(&q->requeuestate) != QREQUEUEPIWAIT) break / no schedule() / / q.pistate->owner == current / futexprivatehashput() / return from syscall / rcuwaitwakeup(&q->requeuewait) / q is gone / futexrequeuepicomplete() publishes QREQUEUEPILOCKED before calling rcuwaitwakeup(). The waiter observes this state in rcuwaitwaitevent() before invoking schedule() in rcuwaitwaitevent(). Here, the waiter is free leave the syscall before requeue task can complete the wake. To address this race skip rcuwaitwakeup() in the QREQUEUEPILOCKED case. This state is only published by requeuepiwakefutex(), which saves q->task before futexrequeuepicomplete() and wakes the waiter via wakeupstate(). This wake is intended to wake the waiter from its futexdowait() sleep. If the waiter is still sleeping there, it can not get into the QREQUEUEPIWAIT state (and require this removed wake). Should the waiter be woken up from futexdowait() by other means (as in this example) and sleep in futexrequeuepiwakeupsync() then the wakeupstate() from requeuepiwakefutex() will wake it, too. Should the waiter task terminate before wakeupstate() had a chance to wake the task then the task pointer does not become invalid because the futexhashbucket::lock is held and the task pointer is RCU protected. [bigeasy: Updated comment and commit message]
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
ubuntu/linux-hwe-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42~24.04.1 - Upgrade
Upgrade
ubuntu/linux-riscv-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1~24.04.1 - Upgrade
Upgrade
ubuntu/linuxto a version that resolves this vulnerability.Fixed in 7.0.0-42.42 - Upgrade
Upgrade
ubuntu/linux-awsto a version that resolves this vulnerability.Fixed in 7.0.0-1016.17 - Upgrade
Upgrade
ubuntu/linux-gcpto a version that resolves this vulnerability.Fixed in 7.0.0-1016.18 - Upgrade
Upgrade
ubuntu/linux-ibmto a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oem-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oracleto a version that resolves this vulnerability.Fixed in 7.0.0-1015.16 - Upgrade
Upgrade
ubuntu/linux-riscvto a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1 - Compensating control
In futex_requeue_pi_complete(), skip rcuwait_wake_up() when requeue_state is Q_REQUEUE_PI_LOCKED to prevent the rcuwait use-after-free race.
Event History
Frequently Asked Questions
Which systems are exposed to this issue?
The issue affects Ubuntu systems using the listed Linux kernel packages: linux-realtime, linux-azure, linux-gcp, linux-azure-fde, linux-gke, linux-riscv, linux-gkeop, and linux. The race is specifically described on PREEMPT_RT kernels.
What is required to trigger the vulnerability?
A local attacker or local process needs low privileges and must be able to exercise FUTEX_CMP_REQUEUE_PI. Exploitation depends on racing an early waiter wakeup, such as from a timeout or signal, against priority-inheritance futex requeue processing.
What is the impact if the race occurs?
The race can cause a use-after-free when rcuwait_wake_up() accesses a futex wait structure that was allocated on a waiter’s stack and has already gone out of scope. The supplied severity vector rates confidentiality, integrity, and availability impact as high.
How can I determine whether this issue is relevant in my environment?
Check whether the host is running one of the listed Ubuntu kernel package families and whether it uses a PREEMPT_RT kernel configuration. The reported symptom is a KASAN slab-out-of-bounds report in futex_requeue_pi_complete() during rcuwait_wake_up().