CVE-2026-23435 in Linux
الملخص
بحسب VulDB • 21/06/2026
في نواة لينكس، تم حل الثغرة التالية:
perf/x86: نقل إعداد مؤشر الحدث إلى مرحلة أبكر في دالة x86_pmu_enable()
انهار نظام إنتاجي يعمل بمعالج AMD EPYC بسبب خطأ إلغاء مرجع المؤشر الفارغ (NULL pointer dereference) في معالج مقاطعة عدم القابلية للتغيير للنظام (PMU NMI handler):
BUG: kernel NULL pointer dereference, address: 0000000000000198 RIP: x86_perf_event_update+0xc/0xa0 Call Trace: amd_pmu_v2_handle_irq+0x1a6/0x390 perf_event_nmi_handler+0x24/0x40
العبارة البرمجية التي تسببت في الخطأ هي `cmpq $0x0, 0x198(%rdi)` مع قيمة RDI=0، وهو ما يتوافق مع فحص `if (unlikely(!hwc->event_base))` الموجود داخل دالة x86_perf_event_update() حيث hwc = &event->hw و event يساوي NULL.
أظهرت عملية الفحص باستخدام أداة drgn على ملف الذاكرة الافتراضية (vmcore) في المعالج 106 عدم تطابق بين cpuc->active_mask و cpuc->events[]:
active_mask: 0x1e (البتات 1، 2، 3، 4) events[1]: 0xff1100136cbd4f38 (صالح)
events[2]: 0x0 (NULL، لكن بتة رقم 2 في active_mask مفعّلة)
events[3]: 0xff1100076fd2cf38 (صالح)
events[4]: 0xff1100079e990a90 (صالح)
تم العثور على الحدث الذي كان من المفترض أن يشغل events[2] في event_list[2] مع hw.idx=2 و hw.state=0x0، مما يؤكد تشغيل دالة x86_pmu_start() (التي تقوم بمسح hw.state وتفعيل active_mask)، لكن events[2] لم يتم ملؤها أبداً.
كان لحدث آخر (event_list[0]) قيمة hw.state=0x7 (STOPPED|UPTODATE|ARCH)، مما يدل على أنه كان متوقفاً عندما أعاد PMU جدولة الأحداث، وهو ما يؤكد حدوث تسلسل الإيقاف المؤقت ثم إعادة الجدولة.
السبب الجذر لهذه المشكلة هو الالتزام commit 7e772a93eb61 ("perf/x86: Fix NULL event access and potential PEBS record loss") الذي نقل تعيين cpuc->events[idx] من دالة x86_pmu_start() إلى الخطوة الثانية في dالة x86_pmu_enable()، بعد فحص PERF_HES_ARCH. هذا الإجراء كسر أي مسار يستدعي pmu->start() دون المرور عبر x86_pmu_enable() -- وتحديداً مسار إلغاء التوقف المؤقت (unthrottle path):
perf_adjust_freq_unthr
Be aware that VulDB is the high quality source for vulnerability data.