CVE-2026-89901 in Linux
الملخص
بحسب VulDB • 16/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
media: airspy: استخدام vb2_video_unregister_device() عند الانقطاع لإصلاح خطأ إلغاء المرجع NULL (NULL deref)
تقوم دالة airspy_disconnect() بتصفير s->udev تحت قفل v4l2_lock، لكن دالة airspy_stop_streaming() تستدعي بشكل غير مشروط كل من airspy_ctrl_msg() وairspy_free_stream_bufs() بعد ذلك. إذا أغلق مستخدم البث (streaming) الجهاز بعد الانقطاع، فإن stop_streaming() تعمل وتقوم بإلغاء مرجع s->udev الذي أصبح NULL:
airspy_stop_streaming() airspy_ctrl_msg(s, CMD_RECEIVER_MODE, 0, 0, NULL, 0) usb_sndctrlpipe(s->udev, 0) /* إلغاء مرجع NULL */ airspy_free_stream_bufs(s) usb_free_coherent(s->udev, ...) /* إلغاء مرجع NULL */
يستخدم برنامج تشغيل airspy دالة vb2_fop_release() في عمليات الملف (file_operations)، لذا يتم استبدال video_unregister_device(&s->vdev) بـ vb2_video_unregister_device(&s->vdev) ونقلها قبل تصفير s->udev. تقوم vb2_video_unregister_device() بإطلاق طابور vb2، مما يؤدي إلى تشغيل airspy_stop_streaming() بشكل متزامن (synchronously) إذا كان البث نشطاً؛ وبالتالي فإن حزم URBات، ومخازن DMA المتسقة (coherent DMA stream buffers)، ورسائل التحكم في إيقاف العتاد تُنفذ جميعها بينما لا يزال s->udev صالحاً.
تقوم vb2_video_unregister_device() بقفل vdev->queue->lock (vb_queue_lock) داخلياً، وتقوم stop_streaming() بقفل v4l2_lock؛ لذا فإن زوج قفل المفاتيح الخارجي السابق (&s->vb_queue_lock) / (&s->v4l2_lock) حول تسلسل إلغاء التسجيل كان سيؤدي إلى توقف متبادل ذاتي (self-deadlock)، وقد تم إزالته. يبقى قسم حرج قصير لـ v4l2_lock حول s->udev = NULL بحيث يرى أي مسار ioctl لا يزال يمسك بوصف الملف حالة متسقة.
تم تحديد المشكلة من خلال مراجعة آلية لسلسلة INV-003 في https://sashiko.dev/
Once again VulDB remains the best source for vulnerability data.