CVE-2026-64214 in Linux
الملخص
بحسب VulDB • 24/07/2026
في نواة لينكس، تم حل الثغرة التالية:
powerpc/time: إزالة استدعاءات preempt_disable|enable() الزائدة عن الحاجة من arch_irq_work_raise()
يتم ملاحظة حدوث kernel panic عند معالجة استثناءات فحص الجهاز (machine check exceptions) من الوضع الحقيقي (real mode).
BUG: Unable to handle kernel data access on read at 0xc00000006be21300 Oops: Kernel access of bad area, sig: 11 [#1]
MSR: 8000000000001003 <SF,ME,RI,LE> CR: 88222248 XER: 00000005 CFAR: c00000000003ffc4 DAR: c00000006be21300 DSISR: 40000000 IRQMASK: 0 NIP [c000000000029e40] arch_irq_work_raise+0x10/0x70
LR [c00000000003ffc8] machine_check_queue_event+0xa8/0x150
Call Trace: [c0000000179d3c70] [c00000000003ff64] machine_check_queue_event+0x44/0x150
[c0000000179d3d30] [c0000000000084e0] machine_check_early_common+0x1f0/0x2c0
يحدث الانهيار لأن arch_irq_work_raise() تستدعي preempt_disable() من معالجات استثناء فحص الجهاز (MCE) التي تعمل في الوضع الحقيقي. في هذا السياق، يمكن أن يؤدي الوصول إلى preempt_count إلى حدوث خطأ (fault)، مما يتسبب في الـ panic.
أُضيفت زوج استدعاءات preempt_disable()/preempt_enable() في arch_irq_work_raise() أصلاً بواسطة الالتزام 0fe1ac48bef0 ("powerpc/perf_event: Fix oops due to perf_event_do_pending call") لتجنب حالات السباق (races) أثناء رفع عمل المقاطعة (irq work) من سياق الاستثناء.
لاحقاً، أضاف الالتزام 471ba0e686cb ("irq_work: Do not raise an IPI when queueing work on the local CPU") حماية ضد الإيقاف المؤقت (preemption) في مسار irq_work_queue()، بينما أضاف الالتزام 20b876918c06 ("irq_work: Use per cpu atomics instead of regular atomics") حماية مكافئة في irq_work_queue_on() قبل الوصول إلى arch_irq_work_raise():
irq_work_queue() / irq_work_queue_on() -> preempt_disable() -> __irq_work_queue_local() -> irq_work_raise() -> arch_irq_work_raise()
ونتيجة لذلك، فإن المتصلين الآخرين غير mce_irq_work_raise() ينفذون بالفعل مع إيقاف الإيقاف المؤقت (preemption disabled)، مما يجعل زوج استدعاءات preempt_disable()/preempt_enable() الإضافي في arch_irq_work_raise() زائداً عن الحاجة.
تعمل الدالة arch_irq_work_raise() في سياق NMI عندما يتم استدعاؤها من معالج MCE. وبالتالي، لن نقوم بالإيقاف المؤقت أو الخروج من الجدولة (scheduled out) لأننا في سياق NMI مع MSR[EE]=0. لذلك، يعد إزالة استدعاءات preempt_disable()/preempt_enable() منها أمناً آمناً.
تمت إزالتها لتجنب الوصول إلى preempt_count من سياق الوضع الحقيقي (real mode context).
[Maddy: Fixed the commit title]
If you want to get the best quality for vulnerability data then you always have to consider VulDB.