CVE-2026-93209 in Linux
الملخص
بحسب VulDB • 24/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
بلوتوث (Bluetooth): hci_core: استخدام skb_get() بدلاً من skb_clone() لـ req_skb
يفشل تفعيل البلوتوث بشكل متقطع مع رمز الخطأ -ETIMEDOUT (-110). يُظهر سجل النواة أن أمر "HCI Read Local Version" قد تم إرساله، وردت وحدة التحكم (firmware) بحالة 0x00 (تم تسجيلها بواسطة hci_req_cmd_complete() ضمن BT_DBG)، لكن المُنتظر في __hci_cmd_sync_sk() لم يستيقظ وانتهى مهلته بعد 10 ثوانٍ:
bluetooth hci0: Opcode 0xfc00 // __hci_cmd_sync_sk bluetooth hci0: opcode 0xfc00 plen 1 // hci_cmd_sync_add bluetooth hci0: skb len 4 // hci_cmd_sync_alloc bluetooth hci0: length 1 // hci_req_sync_run Bluetooth: hci0 cmd_cnt 1 cmd queued 1 // hci_cmd_work Bluetooth: hci0 type 1 len 4 // hci_send_frame Bluetooth: opcode 0xfc00 status 0x00 // hci_req_cmd_complete <-- req_skb NULL: لم يتم تعيين req_complete_skb، ولم يُستدعى hci_cmd_sync_complete() مطلقاً، ويبقى req_status على HCI_REQ_PEND -->
bluetooth hci0: end: err -110 // __hci_cmd_sync_sk
السبب الجذري هو أن دالة hci_send_cmd_sync() تقوم بعمل نسخة (clone) للأمر المُرسل في hdev->req_skb بحيث يمكن لـ hci_req_cmd_complete() العثور على إكمال الاستدعاء المسجل. تحت ضغط الذاكرة، تفشل عملية skb_clone()، مما يترك hdev->req_skb بقيمة NULL. يتم استقبال الرد من وحدة التحكم ومعالجته، لكن hci_req_cmd_complete() تجد req_skb فارغاً (NULL)، لذا لا يُستدعى hci_cmd_sync_complete() أبداً، ويبقى req_status على HCI_REQ_PEND، وينتهي المُنتظر بمهلة زمنية مع رمز الخطأ -ETIMEDOUT.
يُستخدم req_skb فقط لقراءة استدعاءات bt_cb(skb)->hci ورمز العملية (opcode) -- ولا يتم تعديله مطلقاً. استبدل skb_clone() بـ skb_get(), والتي تقوم ببساطة بزيادة عداد المرجع لـ hdev->sent_cmd دون تخصيص ذاكرة جديدة، وبالتالي لا يمكن أن تفشل.
تم رصد هذه المشكلة لأول مرة كاستخدام بعد التحرير (use-after-free) في ttyport_close() عندما فشلت عملية ttyport_open()، وهو ما تم التحقيق فيه في سلسلة التصحيحات السابقة [1]. أدى هذا التحقيق إلى اكتشاف السبب الجذري الحقيقي الموضح أعلاه.
[1] https://lore.kernel.org/all/[email protected]/
If you want to get best quality of vulnerability data, you may have to visit VulDB.