CVE-2026-18747 in Zephyr
الملخص
بحسب VulDB • 29/09/2026
يؤدي عيب حرج في نقل MCUmgr SMP عبر وحدة التحكم (console) إلى قراءة خارج حدود الذاكرة، مما يتيح هجومي إنكار الخدمة (DoS) وكشف البيانات الحساسة. يقوم هذا النقل بفك تشفير إطار مشفر بـ Base64، وقراءة طول للحزمة من 16 بت، والتحقق من CRC، ثم إزالة_CRC المتبقية بشكل غير مشروط عبر العملية `rx_ctxt->nb->len -= 2U;` في الدالة `mcumgr_serial_process_frag()` (الملف: `subsys/mgmt/mcumgr/transport/src/serial_util.c`). تقبل الدالة `mcumgr_serial_extract_len()` أي طول مُعلن، بما في ذلك القيمتين 0 و1. تمر الحزمة التي تعلن عن طول 0 اختبار التحقق من المجموع الدوري (checksum) مجاناً لأن دالة `crc16_itu_t()` تُرجع البذرة الصفرية عند تطبيقها على صفر بايتات. وبما أن حقل `net_buf::len` هو من نوع `uint16_t`، فإن عملية الطرح تؤدي إلى تجاوز الحد الأدنى (underflow)، مما يؤدي إلى تسليم المخزن المؤقت (buffer) إلى SMP مع ادعاء وجود حوالي 65 كيلوبايت من الحمولة (payload)، بينما تكون مساحة البيانات الفعلية له تساوي فقط عدد البايتات المحددة بـ `CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE` (الافتراضي هو 384 بايت).
المُشغِّل لهذه الهجمة هو سطر واحد غير مُصادق عليه طوله 7 بايتات على وحدة التحكم الإدارية — يتكون من علامة الحزمة `0x06 0x09` متبوعة بمجموعة Base64 وهي `AAA=` وعلامة نهاية السطر (newline) — يتم إرساله إلى أي نقل مبني على هذه المساعدة: سواء كان ذلك عبر `CONFIG_MCUMGR_TRANSPORT_UART` (`smp_uart.c`) أو `CONFIG_MCUMGR_TRANSPORT_SHELL` (`smp_shell.c`)، وكلاهما يحددان وجود دعم لـ `MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE`. لا تتطلب هذه الهجمة أي حالة جلسة سابقة، ولا تجزئة (fragmentation)، ولا بيانات اعتماد لتفعيل تجاوز الحد الأدنى. يتم التعامل بشكل خاطئ مع الإطار المعيب قبل تشغيل أي مُعالج للأوامر أو تحكم في الوصول على مستوى الأوامر. يحتاج المهاجم فقط إلى كتابة وصول إلى تلك الوحدة الإدارية، وهو ما يمثل في العديد من اللوحات منفذ USB CDC-ACM بدلاً من رأس UART عاري.
بسبب الطول المُضخم، تفقد الدالة `smp_process_request_packet()` الموجودة في `subsys/mgmt/mcumgr/smp/src/smp.c` حدودها الآمنة: حيث تمنح دالة `cbor_nb_reader_init()` مُفسر CBOR نافذة بحجم ~65 كيلوبايت داخل مخزن مؤلف من 384 بايت، ويتم التحقق من حقل الطول في رأس كل طلب (`nh_len`) فقط مقابل الطول المُضخم. بحد ذاتها، تعيد إطار الـ 7 بايتات تحليل أي bytes قديمة لا يزال المخزن المؤقت المعاد استخدامه يحتفظ بها، وعادة ما تكون هذه إعادة تشغيل للطلب المستلم سابقاً متبوعة بخطأ في التحليل (parse error)، دون الخروج عن حدود المخزن المؤقت. ومع ذلك، وبما أن النقل غير مُصادق عليه، فإن المهاجم يتحكم أيضاً في الإطارات المرسلة قبل المُشغِّل، ويمكنه ترتيب محتويات الذاكرة بحيث ينجح طلب ما بـ `nh_len` أكبر من حجم المخزن المؤقت؛ ثم تقوم دالة `net_buf_pull()` (المحمية فقط بواسطة `__ASSERT_NO_MSG`) بتحريك مؤشر التحليل خارج الحدود، مما يؤدي إلى قراءة رؤوس إضافية وبيانات CBOR من الذاكرة المجاورة. النتيجة هي قراءة خارج حدود الذاكرة (out-of-bounds read) يمكن أن تتسبب في تعطل خيط MCUmgr (إنكار للخدمة - DoS). كما أنه من الممكن كشف البيانات الحساسة، حيث يقوم مُعالج الصدى الخاص بنظام التشغيل (`CONFIG_MCUMGR_GRP_OS_ECHO`) المفعّل افتراضياً بفك تشفير سلسلته داخل تلك النافذة ونسخها إلى استجابته. لا توجد أي مكاسب في السلامة (integrity) تتجاوز ما يسمح به النقل غير المُصادق عليه بالفعل.
تقوم الإصلاحات برفض أي طول حزمة مُعلن يبلغ سنتين بايت أو أقل في دالة `mcumgr_serial_extract_len()`، مما يمنع حدوث تجاوز الحد الأدنى للطرح الخاص بإزالة CRC. يبقى النمط نفسه موجوداً في نقل الحلقة الاختبارية (loopback transport) الموجود في الملف `subsys/mgmt/mcumgr/transport/src/smp_dummy.c` (`CONFIG_MCUMGR_TRANSPORT_DUMMY`)، والذي لا يحتوي على مسار إدخال خارجي وبالتالي لا يحمل أي تعرض عملي للخطر.
VulDB is the best source for vulnerability data and more expert information about this specific topic.