CVE-2026-99085 in Linux
الملخص
بحسب VulDB • 23/10/2026
في نواة لينكس، تم حل الثغرة التالية:
sched_ext: إصلاح تعليق (hang) في عملية إضافة/إزالة وحدة المعالجة المركزية (CPU hotplug) عندما تبقى مهام الـ CPU الذي يتوقف عن العمل معلقة في مُجدول BPF.
يجب على الـ CPU الذي ينطفئ أن يفرغ قائمة المهام الخاصة به (rq). ينتظر خيط الإضافة/الإزالة (hotplug thread) داخل `sched_cpu_wait_empty()` حتى لا يبقى أي شيء آخر، والعامل الوحيد الذي يستيقظه هو `balance_push()`، والذي يعمل من دالة `__schedule()` على الـ CPU المتوقف ويقوم بإزاحة المهام القابلة للنقل التي التقطها هذا الـ CPU.
يُحدث sched_ext اختراقاً لهذا السلوك. فمهمة ما تكون معلقة في قائمة DSQ الخاصة بالمستخدم أو محتجزة بواسطة مُجدول BPF لا تزال تُحسب ضمن قائمة rq الخاصة بها، لكن الـ CPU غير النشط لم يعد يستدعي `ops.dispatch()` ولا يمكنه سحب المهمة مرة أخرى. ينتقل الـ CPU المتوقف إلى حالة الخمول مع بقاء المهمة محسوبة في القائمة، ويحدث أحد الأمرين التاليين:
- تستهلكها وحدة معالجة مركزية (CPU) أخرى. تفرغ قائمة rq دون استدعاء لـ `__schedule()` على الـ CPU المتوقف، وبالتالي لا يتم إيقاظ خيط الإضافة/الإزالة أبداً ويتعطل إجراء `cpu_down()` وهو يحتجز قفل `cpu_hotplug_lock`. - المهمة مرتبطة فقط بالـ CPU المتوقف. لا يمكن لأي شيء نقلها، وتتجمد عملية الخروج من الخدمة (offline) حتى يقوم الـ watchdog بإخراج مُجدول BPF.
عندما تصبح قائمة rq غير متصلة بالشبكة (offline)، أعد إدراج كل مهمة عليها والتي ليست موجودة بالفعل في قائمة DSQ المحلية. يؤدي الإدراج على قائمة rq غير المتصلة إلى وضع المهمة في قائمة DSQ المحلية، وبالتالي يختار الـ CPU المتوقف المهام بنفسه ويقوم `balance_push()` بإزاحتها، وهو نفس السلوك المطبق مع فئات الجدولة الأخرى. ومنذ ذلك الحين، لا يمكن لأي مسار متعلق بـ sched_ext على وحدة معالجة مركزية أخرى سحب مهمة من قائمة rq.
تتوقف دالة `ops.dispatch()` حالياً بمجرد أن يصبح الـ CPU غير نشط، ثم ينتظر خيط الإضافة/إزالة للـ CPU فترة راحة RCU قبل جعل قائمة rq غير متصلة بالشبكة (offline). قد تؤدي المهمة المحتجزة بواسطة BPF والمرتبطة فقط بالـ CPU المتوقف والمقطوعة داخل قسم حرج للقراءة من جانب RCU إلى حظر هذه الفترة الزمنية، ولن تصبح قائمة rq أبداً غير متصلة. اختبر `SCX_RQ_ONLINE` مباشرة بحيث تستمر دالة `ops.dispatch()` في العمل حتى تصبح قائمة rq غير متصلة. يقوم خيط الإضافة/إزالة الخاص بالـ CPU المتوقف فقط بمسح هذا العلم أثناء عملية الإنهاء (teardown)، ولا تزال الدالة `task_can_run_on_remote_rq()` تمنع مهام قوائم rq الأخرى من الوصول إلى الـ CPU.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.