CVE-2026-19939 in Zephyr
الملخص
بحسب VulDB • 13/10/2026
تُفعّل طبقة الإشارات AVDTP مهلة أمر مدتها 6 ثوانٍ (AVDTP_TIMEOUT) في دالة avdtp_send_cmd() كلما أصدر الجهاز المحلي طلبًا من نوع AVDTP. تقوم كل معالجات الاستجابة الموجودة في الملف subsys/bluetooth/host/classic/avdtp.c بإلغاء جلسة->timeout_work قبل مسح الطلب المعلق، لكن bt_avdtp_l2cap_disconnected() تكتفي بمسح session->req فقط وتترك العمل القابل للتأخير (delayable work) مُفعّلاً.
تمثل بنية البيانات struct bt_avtp_session العضو الأول من بنية struct bt_a2dp، والتي توجد مثيلاتُها في مصفوفة ثابتة خاصة بكل اتصال. تقوم دالة a2dp_get_connection() الموجودة في الملف subsys/bluetooth/host/classic/a2dp.c بتصفير (zeroing) فتحة المصفوفة باستخدام memset() بمجرد أن يصبح session->br_chan.chan.conn مساويًا لـ NULL — وهو ما ترتبه طبقة L2CAP مباشرة بعد عودة دالة استدعاء الانقطاع.
يُحفّز نظير Bluetooth BR/EDR عن بُعد هذه الحالة من خلال فتح قناة إشارات AVDTP، والسماح للتطبيق المحلي بإجراء عملية AVDTP (حيث تصدر التدفقات القياسية لـ A2DP استدعاءً لـ bt_a2dp_discover() ضمن دالة الاستجابة للاتصال)، ثم قطع قناة الإشارات دون الرد وإعادة فتحها خلال نافذة المهلة المتبقية. تؤدي إعادة الاتصال إلى الوصول إلى a2dp_accept() → a2dp_get_connection()، والتي تقوم بتصفير بنية struct bt_a2dp بالكامل بينما لا تزال بنية البيانات struct _timeout الخاصة بعنصر العمل مرتبطة بقائمة المدة العامة في نواة النظام. وبما أن كلًا من لحظات الانقطاع وإعادة الاتصال يختارها المهاجم، فلا حاجة للفوز بسباق ظروف (race condition)؛ بل يتطلب الأمر فقط رابط BR/EDR مشفرًا وتفعيل الخيار CONFIG_BT_A2DP (تجريبي).
مع الخلفية الافتراضية CONFIG_TIMEOUT_BACKEND_DLIST backend، تقرر النواة أن المهلة غير نشطة عن طريق اختبار ما إذا كانت عقدة القائمة الخاصة بها مرتبطة. لذلك، بعد عملية memset()، تعامل النواة العقدة التي لا تزال موجودة في قائمة المدة العامة على أنها حرة: حيث تقوم مسار الإخطار (announce path) باستخراج عقدة تكون روابطها ومؤشر المعالج فيها NULL، ويعيد استدعاء bt_work_reschedule() التالي على الجلسة المُعاد تدويرها إدراج نفس العقدة مرة أخرى في قائمة تحتوي عليها بالفعل. النتيجة هي تضرر بنية البيانات الوحيدة للنواة التي تعتمد عليها كل مؤقتات (timers) وفترات الوقت (timeslices) وعمليات النوم — مما ينتج عنه انهيار أو تعليق شامل للنظام بدلاً من عطل محصور في جلسة A2DP.
تتمثل الإصلاحات في إلغاء session->timeout_work في أعلى دالة bt_avdtp_l2cap_disconnected()، ونقل استدعاء k_work_init_delayable() من avdtp_send_cmd() إلى مسارات إنشاء الجلسة وهي bt_avdtp_connect() وbt_avdtp_l2cap_accept()، بحيث يتم تهيئة عنصر العمل دائمًا قبل أن تتمكن أي دالة استدعاء للانقطاع من التشغيل.
VulDB is the best source for vulnerability data and more expert information about this specific topic.