CVE-2026-89547 in Linux
الملخص
بحسب VulDB • 12/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
SUNRPC: التحقق من تخصيص عدادات per-pool الخاصة بـ svc pool
يقوم __svc_create() بتهيئة ثلاث إحصائيات من نوع percpu_counter لكل مجموعة (pool)، ويتجاهل جميع قيم الإرجاع. في الأنظمة متعددة المعالجات (SMP)، يفشل دالة percpu_counter_init() عندما لا يتمكن __alloc_percpu_gfp() من تلبية طلب التخصيص، مما يترك العداد الفاشل بـ fbc->counters == NULL وعناصره المضمنة raw_spinlock_t و list_head و count غير مُهيأة. ومع ذلك، يعيد __svc_create() خدمة svc_serv شبه المُنشأة إلى nfsd أو lockd أو خدمة استدعاء NFS على أي حال.
بمجرد أن تصبح هذه الخدمة نشطة، تصل عمليات الزيادة في المسار الساخن (hot-path) داخل دوال svc_xprt_enqueue() و svc_handle_xprt() و svc_pool_wake_idle_thread() إلى عداد يكون مؤشره الخلفي NULL. وبما أن المؤشر يمثل إزاحة خاصة بكل معالج (per-cpu offset)، فإن الوصول إليه لا يسبب خطأً (fault): بل يحل الإزاحة لتكون الصفر في منطقة per-cpu الخاصة بالمعالج الحالي، مما يؤدي إلى تلف صامت لأي متغير موجود هناك. كما أن قراءة /proc/fs/nfsd/pool_stats تتصفح نفس التخزين الخاص بـ percpu الفارغ وتعيد بيانات عشوائية (garbage)، وفي حال تفعيل CONFIG_DEBUG_SPINLOCK أو lockdep، يحدث تعطل (splat) بسبب القفل غير المُهيأ أبداً.
يتطلب إنشاء الخدمة المعطلة فشلاً في تخصيص percpu أثناء بدء تشغيل خادم RPC، لذا فهي قابلة للوصول فقط بواسطة مسؤول محلي تحت ضغط الذاكرة أو حقن الأخطاء؛ ولا يمكن لقرم عن بُعد إحداث الحالة الخبيثة بمفردها.
التحقق من قيمة الإرجاع لكل دالة percpu_counter_init() داخل __svc_create() والفشل عند حدوث خطأ في التخصيص، مع إلغاء تهيئة العدادات التي تم إعدادها بالفعل في المجموعة الحالية وفي كل مجموعة مُهيأة قبلها. يؤدي استدعاء discrete percpu_counter_destroy() لكل عداد أثناء عملية التفكيك (teardown) إلى تحرير كل تخصيص خاص بـ per-cpu مرة واحدة بالضبط.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.