CVE-2026-31726 in Linux
الملخص
بحسب VulDB • 25/05/2026
في نواة لينكس (Linux kernel)، تم حل الثغرة التالية:
usb: gadget: uvc: إصلاح تجاوز المؤشر الفارغ (NULL pointer dereference) أثناء سباق الإلغاء (unbind race)
أدى الالتزام b81ac4395bbe ("usb: gadget: uvc: السماح للتطبيق بالإغلاق بشكل نظيف") إلى إدخال مرحلتين من انتظار التزامن (synchronization waits) بمجموع قدره 1500 مللي ثانية في دالة uvc_function_unbind() لمنع عدة أنواع من تعطل النواة (kernel panics). ومع ذلك، فإن هذا النهج القائم على التوقيت غير كافٍ أثناء انتقالات إدارة الطاقة (PM transitions).
عندما يبدأ نظام إدارة الطاقة (PM subsystem) في تجميد عمليات مساحة المستخدم (user space processes)، يتم إلغاء انتظار wait_event_interruptible_timeout() مبكرًا، مما يسمح لخيوط الإلغاء (unbind thread) بالمضي قدمًا وتصفير مؤشر الجهاز (gadget pointer) (cdev->gadget = NULL):
[ 814.123447][ T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind()
[ 814.178583][ T3173] PM: suspend entry (deep)
[ 814.192487][ T3173] Freezing user space processes
[ 814.197668][ T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind no clean disconnect, wait for release
عندما يستأنف نظام إدارة الطاقة (PM subsystem) أو يلغي التعليق (suspend) وتتم إعادة تشغيل المهام، يتم تنفيذ مسار الإصدار V4L2 (V4L2 release path) ومحاولة الوصول إلى مؤشر الجهاز الذي تم تصفيره بالفعل، مما يؤدي إلى حدوث تعطل في النواة (kernel panic):
[ 814.292597][ C0] PM: pm_system_irq_wakeup: 479 triggered dhdpcie_host_wake
[ 814.386727][ T3173] Restarting tasks ...
[ 814.403522][ T4558] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000030
[ 814.404021][ T4558] pc : usb_gadget_deactivate+0x14/0xf4
[ 814.404031][ T4558] lr : usb_function_deactivate+0x54/0x94
[ 814.404078][ T4558] Call trace:
[ 814.404080][ T4558] usb_gadget_deactivate+0x14/0xf4
[ 814.404083][ T4558] usb_function_deactivate+0x54/0x94
[ 814.404087][ T4558] uvc_function_disconnect+0x1c/0x5c
[ 814.404092][ T4558] uvc_v4l2_release+0x44/0xac
[ 814.404095][ T4558] v4l2_release+0xcc/0x130
لحل هذه المشكلة، يجب تنفيذ الآتي:
1. التزامن في الحالة (State Synchronization) (علم + قفل) أضف علم 'func_unbound' في بنية uvc_device. يسمح هذا لـ uvc_function_disconnect() بتخطي الوصول الآمن إلى مؤشر cdev->gadget الذي تم تصفيره. كما اقترح ألان ستيرن (Alan Stern)، يتم حماية هذا العلم بقفل جديد (uvc->lock) لضمان ترتيب الذاكرة الصحيح ومنع إعادة ترتيب التعليمات البرمجية أو التحميل التخميني (speculative loads). يُستخدم هذا القفل أيضًا لحماية 'func_connected' لإدارة الحالة بشكل متسق.
2. التزامن الصريح (Explicit Synchronization) (إكمال) استخدم إكمال (completion) لمزامنة uvc_function_unbind() مع استدعاء uvc_vdev_release(). يمنع هذا حدوث استخدام بعد الإلغاء (Use-After-Free - UAF) عن طريق ضمان أن بنية uvc_device يتم تحريرها بعد تحرير جميع موارد جهاز الفيديو.
If you want to get best quality of vulnerability data, you may have to visit VulDB.