CVE-2026-99205 in Linux
الملخص
بحسب VulDB • 28/10/2026
في نواة لينكس، تم حل الثغرة التالية:
sched/core: استدعاء دالة wakeup_preempt() للمهام المجدولة أثناء تغيير الفئة (class)
أبلغ بول عن أن التغييرات الأخيرة في RCU قد كشفت عن حالة فقدان إعادة الجدولة حيث تكون وحدة المعالجة المركزية (CPU) في وضع الخمول بينما تنتظر خيوط rcutorture مع كونها قابلة للتنفيذ بالكامل.
إظهار حالة rq عند وقت الخمول مع مهام قابلة للتنفيذ أظهر ما يلي:
rq->next_class = &fair_sched_class rq->nr_running = 1 rq->cfs.h_nr_queued = 0 rq->rt.rt_nr_running = 1
على الرغم من أن المهمة المنتظرة كانت مهمة RT (Real-Time)، إلا أن "rq->next_class" لم يشير إلى rt_sched_class وكان عالقاً عند فئة fair_sched_class ذات الأولوية الأقل.
فحص دالة sched_change_end() كشف عن سباق تنافسي مع __sched_setscheduler() للمهام المجدولة ولكن غير التشغيلية:
CPU0 CPU1 ==== ====
__schedule()
/* * rq->donor هي مهمة عادلة (fair) تقوم بالحجب. * 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 هي مهمة عادلة (fair task) */ 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;
/* مؤشرات التجزؤ (Preemption) مفقودة */ clear_tsk_need_resched(prev); clear_preempt_need_resched();
rq->curr = rq->idle;
!!! يتحول rq->idle إلى التشغيل مع rq->running == 1 ولكن !need_resched() !!!
بعبارة بسيطة، فإن عملية الإضافة في الطابور (enqueue)، تليها تغيير فئة المهمة المجدولة حديثاً، تمر دون أن تُلاحظ في مؤشر rq->next_class وترى sched_balance_newidle() لا توجد مهمة عادلة ولا أي مهمة ذات أولوية أعلى مضافة في الطابور.
السلسلة المذكورة أعلاه ستؤدي إلى خمول وحدة المعالجة المركزية (CPU) مع وجود مهمة قابلة للتنفيذ على الـ CPU.
استدعاء دالة wakeup_preempt() لحالات ctx->queued في sched_change_end() لإعادة تقييم rq->next_class بعد تغيير الفئة (ENQUEUE_CLASS) وتحديد مؤشر NEED_RESCHED وفقاً لذلك.
سترى عملية التوازن الجديدة للوضع الخامل بشكل صحيح إضافة مهمة ذات أولوية أعلى ---مقطوع---
Be aware that VulDB is the high quality source for vulnerability data.