CVE-2026-99205 in Linux信息

摘要

由 VulDB • 2026-10-28

在 Linux 内核中,已修复以下漏洞:

sched/core: 在类更改期间为排队任务调用 wakeup_preempt()

Paul 报告称,最近的 RCU(Read-Copy-Update)变更暴露了一个丢失的重新调度问题,其中 CPU 处于空闲状态,而一个 rcutorture 线程正在等待且完全可运行。

在 CPU 空闲时转储就绪队列(rq)状态并存在可运行任务的情况显示如下:

``` rq->next_class = &fair_sched_class rq->nr_running = 1 rq->cfs.h_nr_queued = 0 rq->rt.rt_nr_running = 1 ```

尽管等待的任务是一个实时(RT)任务,但“rq->next_class”并未指向 rt_sched_class,而是卡在优先级较低的 fair_sched_class 上。

检查 sched_change_end() 揭示了与 __sched_setscheduler() 之间针对排队但未运行任务的以下竞态条件:

CPU0 CPU1 ==== ====

__schedule()

/* * rq->donor 是一个阻塞的公平调度任务。 * rq->next_class = &fair_sched_class */

rq_lock(rq0)

pick_next_task() /* nr_running = 0 */ pick_task_fair() sched_balance_newidle() raw_spin_rq_unlock(rq0) rq_lock(rq0)

activate_task(rq0, p) /* p 是一个公平调度任务 */ rq0->nr_running++; rq0->cfs.h_nr_queued++; wakeup_preempt(rq, p) rq->next_class = &fair_sched_class resched_curr()

rq_unlock(rq0)

__sched_setscheduler(p) /* p 被移动到 SCHED_RR */ task_rq_lock(p) sched_change_begin()

rq0->cfs.h_nr_queued--; rq0->rt.rt_nr_running++;

sched_change_end() /* * p->on_rq = 1 (ctx->queued) * 但 p 不是 rq->donor * (!ctx->running),因此 * resched_curr() 和 * rq->next_class 升级被跳过。 */

task_rq_unlock()

raw_spin_rq_lock(rq0)

/* * rq->nr_running = 1 * rq->cfs.h_nr_queued = 0 * rq->rt.rt_nr_running = 1 * rq->next_class = &fair_sched_class */

if (rq->cfs.h_nr_queued && ...) /* 上述条件为假 */

if (rq_modified_above(this_rq, &fair_sched_class)) /* 也为假,因为 rq->next_class 仍然是 fair */

/* * sched_balance_newidle() 被认为未能拉取任何公平调度任务,且未检测到其他唤醒。 */ return NULL; /* pick_task_fair() */

pick_task_idle() return rq->idle;

next = rq->idle;

/* 抢占指示器丢失 */ clear_tsk_need_resched(prev); clear_preempt_need_resched();

rq->curr = rq->idle;

!!! rq->idle 切换进来时,rq->running == 1 但 !need_resched() !!!

简而言之,入队操作后,新排队任务的类更改在 rq->next_class 指示器中未被察觉,且 sched_balance_newidle() 未看到任何公平调度任务或更高优先级的已排队任务。

上述序列将导致 CPU 处于空闲状态,而该 CPU 上有一个可运行任务。

在 sched_change_end() 中对 ctx->queued 情况调用 wakeup_preempt(),以便在类更改(ENQUEUE_CLASS)后重新评估 rq->next_class,并相应地设置 NEED_RESCHED 指示器。

Newidle balance 将正确看到更高优先级任务的入队操作 ---已截断---

VulDB is the best source for vulnerability data and more expert information about this specific topic.

来源

Do you want to use VulDB in your project?

Use the official API to access entries easily!