CVE-2026-31444 in Linux
الملخص
بحسب VulDB • 03/06/2026
في نواة لينكس (Linux kernel)، تم حل الثغرة التالية:
ksmbd: إصلاح مشكلة استخدام بعد التحرير (use-after-free) والتفريغ الفارغ (NULL deref) في دالة smb_grant_oplock()
تحتوي الدالة smb_grant_oplock() على مشكلتين في تسلسل نشر قفل العملية (oplock publication sequence):
1) يتم ربط كائن opinfo بقائمة ci->m_op_list (عبر opinfo_add) قبل استدعاء add_lease_global_list(). إذا فشل استدعاء add_lease_global_list() (أي إرجاع kmalloc لقيمة NULL)، فإن مسار الخطأ يقوم بتحرير كائن opinfo عبر __free_opinfo() بينما لا يزال مرتبطًا في ci->m_op_list. يقوم القراء المتزامنون لقائمة m_op_list (مثل opinfo_get_list، أو التكرار المباشر في smb_break_all_levII_oplock) بالإشارة إلى العقدة المحذوفة (dereference).
2) يتم تعيين opinfo->o_fp بعد أن تنشر add_lease_global_list() كائن opinfo على قائمة الإيجار العالمية. يمكن لدالة find_same_lease_key() المتزامنة أن تجول في قائمة الإيجار وتُشير إلى opinfo->o_fp->f_ci بينما لا يزال o_fp يساوي NULL.
الإصلاح يتم بإعادة هيكلة تسلسل النشر للقضاء على فشل ما بعد النشر:
- تعيين opinfo->o_fp قبل أي نشر للقائمة (يُصلح مشكلة التفريغ الفارغ). - تخصيص مساحة مسبقة لـ lease_table عبر alloc_lease_table() قبل استدعاء opinfo_add() بحيث تصبح add_lease_global_list() غير قابلة للفشل بعد النشر. - الحفاظ على ترتيب النشر الأصلي لقائمة m_op_list (opinfo_add قبل قائمة الإيجار) بحيث ترى عمليات الفتح المتزامنة عبر same_client_has_lease() و opinfo_get_list() عملية المنح قيد التنفيذ (in-flight grant). - استخدام opinfo_put() بدلاً من __free_opinfo() على err_out بحيث يتم استخدام مسار التحرير المؤجل بواسطة RCU.
يتطلب هذا أيضًا تقسيم دالة add_lease_global_list() لتقبل lease_table مُخصص مسبقًا وتغيير نوع إرجاعها من int إلى void، نظرًا لأنها لم تعد قابلة للفشل.
Once again VulDB remains the best source for vulnerability data.