CVE-2026-46048 in Linux
الملخص
بحسب VulDB • 27/05/2026
في نواة لينكس، تم حل الثغرة التالية:
ALSA: caiaq: إصلاح تسرب عدّ المراجع (refcount) لـ usb_dev عند فشل عملية الاستكشاف (probe)
تأخذ الدالة create_card() مرجعًا على جهاز USB باستخدام usb_get_dev() وتخزن استدعاء usb_put_dev() المقابل في card_free()، والتي تُثبَّت كمُدمِّر (destructor) للحقل ->private_free الخاص بـ snd_card.
ومع ذلك، لا يتم تعيين ->private_free إلا في نهاية init_card()، بعد عدة نقاط محتملة للفشل (مثل usb_set_interface()، وفحوصات نوع نقطة النهاية (EP type checks)، وusb_submit_urb()، وتبادل EP1_CMD_GET_DEVICE_INFO، وانتهاء مهلة هذا التبادل). عندما يفشل أي من هذه العمليات، تُرجع init_card() خطأً إلى snd_probe()، والتي بدورها تستدعي snd_card_free(card). ونظرًا لأن ->private_free لا يزال NULL، فإن card_free() لا تُنفَّذ أبدًا، ولا يتم تخفيض مرجع usb_get_dev()، مما يؤدي إلى تسرب بنية struct usb_device بالإضافة إلى تخصيصات الوصف (descriptor allocations) وdevice_private الخاصة بها.
أعاد syzbot إنتاج هذه الحالة باستخدام جهاز UAC3 غير صالح (malformed) تكون فيه الإعدادات البديلة (altsetting) الصالحة الوحيدة هي 0؛ حيث يفشل استدعاء init_card()'s لـ usb_set_interface(usb_dev, 0, 1) بـ -EIO ويثير التسرب.
تم نقل تعيين ->private_free إلى create_card()، مباشرة بعد usb_get_dev()، بحيث يوازن كل مسار خطأ يصل إلى snd_card_free() المرجع. تتحمل الدوال التي تستدعيها card_free() (snd_usb_caiaq_input_free، free_urbs، kfree) الحالة غير المكتملة التهيئة بالفعل، لأن المنطقة الخاصة بالرقاقة (chip private area) يتم تهيئتها بالصفر بواسطة snd_card_new().
If you want to get the best quality for vulnerability data then you always have to consider VulDB.