HIGH Introduced in 6.19
sched CoreSched Race
CVE-2026-89521
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:H
KernelScan AI7.0HIGH
01Description
In the Linux kernel, the following vulnerability has been resolved: sched/core: Handle pick_task() releasing the rq lock Core scheduling's pick_next_task() breaks when a ->pick_task() implementation can release the rq lock. The selection state derived on entry is only valid while the lock is held continuously. Once a pick can drop the lock, an interleaving selection can invalidate all of it: the single-CPU fast path can commit an uncookied pick although the core went cookied during the release, and forceidle committed by the interleaving selection skews the restarted pass's accounting. Fix it by restarting the whole selection when a pick returns RETRY_TASK after releasing the lock: a single restart point above the state derivation replaces the per-loop restart labels, so a retry picks up state committed by interleaving selections and accounts and resets forceidle like a fresh selection would. need_sync and fi_before latch across retries. Clock validity can't be re-derived - there is no program-ordered way to tell whether the own and core rq clocks are still updated after the lock was released, as other lockers' pin cycles may or may not have invalidated them. When restarting, clear core_clock_updated so that the sibling loop re-updates the core rq, and update the own rq clock if invalidated.
02KernelScan AI Analysis
Risk summary
A race condition in the Linux kernel's core scheduling subsystem allows a local attacker to exploit a window where the runqueue lock is released during task selection, leading to inconsistent scheduling state. This can result in incorrect task picks, corrupted accounting, or isolation boundary bypass if an uncookied task is committed when the core became cookied.
Vulnerability analysis
The scheduler's core-isolation task selection assumes a protecting lock stays held for the entire operation, but a lower-level task-selection step can drop it. When that happens, a concurrent selection on another hardware thread can overwrite the state that was already read, allowing the system to commit an unsafe isolation choice and throw off idle-time bookkeeping. The fix forces the selection to start over from the top whenever a task pick indicates it had to release the lock, so every retry works with freshly read state and valid timing data instead of stale values. Any local process can trigger this because the scheduler runs constantly on every processor and the race depends only on execution timing, not on any special capability.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 7.2 | 6.19 | 7.2.4 | 88ed5a66467c |
| mainline | 6.19 | 7.3 | c10b216a072f |