EOL 路由照样打穿:Netgear WGR614v9 UART + Bitdefender Box SPI 降级 RCE
黑卷的IoT攻防日记
2026年9月14日 11:09
美国
去阅读
EOL 路由照样打穿:Netgear WGR614v9 UART + Bitdefender Box SPI 降级 RCE
图 1:DistrictCon 奖杯
Trail of Bits 的 Alan Cao、Will Tan 在 DistrictCon 首届 Junkyard 比赛里,把两台已经停产的家庭网络设备打穿,拿了「最具创新利用手法」亚军。核心结论很直接:厂商一停更,洞就冻在固件里——EOL 硬件对攻击者反而更友好。
两台目标都是当年挺常见的「护家」设备:
- Netgear WGR614v9
(美国 Netgear)
* Bitdefender Box V1
(罗马尼亚 Bitdefender 的家用安全网关)
断更多年之后,他们都能在局域网侧打出远程 root。完整分析与 exploit 在 Trail of Bits exploits 仓库;下面按硬件接触 → 固件 → 利用链把公开 writeup 串起来。
设备分析与固件提取
Netgear WGR614v9
拆机后先认调试口、存储芯片和 SoC。Netgear 官网还能下到固件,所以他们直接下载,而不是从片上硬抽。流程大致是:
binwalk
/ unblob 递归拆固件
2. 端口扫描看对外服务
3. 接上板子上的 UART 串口(丝印 JP1),进串口看进程、LAN 侧服务、CPU / 内核版本、缓解措施
一开始盯过 httpd,后来主攻 upnpd。
Bitdefender Box V1
也能找到串口,但 shell 被锁死。硬件侧他们认到 Winbond W25Q128FV SPI NOR,用 SOP8 夹具 + XGecu T48 把固件抠出来。想跟更新机制要「最新包」时,更新服务器已经挂了;后来发现固件打在配套 App 的 APK 里,就从 APK 镜像站把版本捞全。没有设备 shell 时,用 QEMU user mode 本地跑 httpd 做动态测。
打 Netgear:UART 摸底 + UPnP 三条链
WGR614v9 是 MIPS32。接到板载 UART(JP1)后,启动过程里就能拿到低层系统访问——这对确认运行中的 upnpd、缓解措施是否开启非常关键。
图 2:Netgear WGR614v9 主板(含调试相关区域)
UPnP 用 SOAP(XML 命令)管路由功能,解析复杂、权限又高,天然适合当入口。最终利用链里至少有:
- SOAP 处理路径上的认证绕过(可重置密码)
- BSS / 栈上的多处缓冲区溢出
- 再配合命令注入 / ROP,打到远程 root
公开仓库代号 CLOUDY WRENCH:
https://github.com/trailofbits/exploits/tree/main/junkyard-2025-cloudy-wrench
链 1:bashsledding(CVE-2024-53902 / CVE-2024-53903 / CVE-2022-27643)
a. 未认证改密:LanConfig/SetConfigPassword
upnpd 实现了一套 AppGenie / Smart Network 风格的自定义 SOAPAction。其中相对冷门的 LanConfig/SetConfigPassword,可以在未认证情况下重置固件管理密码。
反汇编里能看到类似调用链:
main
upnp_main
upnp_parse_request
soap_method_check
sa_method_check
sa_processResponse
sa_parseRcvCmd
sa_configRouter
走 /soap/server_sa 会进 sa_method_check。多数 SOAPAction 有 Session UUID 检查,但这条改密路径仍能被滥用,从而进入后续更容易触发内存破坏的代码路径。
b–c. BSS / 栈溢出 + 「bashsledding」
改密之后,把已知的 BSS 溢出(n-day)枢轴成更稳的栈溢出拿 RCE。bashsledding 的有趣点在于:找到两个能调到 system 的 ROP gadget 后,他们把 shell 命令通过路由的域名拦截功能喷进 NVRAM(会映射进各进程地址空间)。命令前面垫大量空格——对 bash 来说空格是无害语法,相当于指令滑板(nopsled)的「shell 版」。落地地址不准也没关系,解释器滑过空格就能执行真正命令。
演示视频:bashsledding
链 2:break_block_bof
同样先用 SetConfigPassword 绕过认证,再打 DeviceConfig/GetInfo SOAP 解析里的定长栈溢出。
视频:break\_block\_bof
链 3:bigfish_littlepond
把「有限的内存破坏」枢轴成更强的命令注入:BSS 溢出改掉相邻的「shell 命令字符串指针」。upnpd 里能摸到 bpa_monitor 字符串,而 bpa_monitor / bpaloginConnect 又存在基于 NVRAM 的命令注入。指针改去拉起 bpa_monitor,再补一次带注入 payload 的请求,就能完整代码执行。
视频:bigfish\_littlepond
比赛现场演示时,前两条链会把路由切到 PPPoE 并重启 upnpd,方便起 telnetd;bigfish_littlepond 则需要切回 DHCP,并用 TFTP 下放 MIPSLE bind shell(仓库 SETUP.md 有逐步说明)。
打 Bitdefender Box:SPI 抽固件 + 未认证降级
Bitdefender Box v1 本身是「安全网关」定位,2021 年 7 月停服。设备会插进网络路径、改 DHCP、把流量导到自己的代理做扫描——但更新链路却暴露了完全未认证的固件更新面。
图 3:Bitdefender Box v1 拆机(RF 屏蔽罩已拆除)
公开仓库代号 BEACON PRISM:
https://github.com/trailofbits/exploits/tree/main/junkyard-2025-beacon-prism
固件里是 OpenWrt uhttpd + 一套 Lua HTTP 接口,给配套手机 App 用。利用链关键端点:
/update_auth_token
:副作用会清掉妨碍刷机的配置点文件
2. /upload_backup_firmware
:上传 Base64 固件
3. /decode_image
:解码并做基本结构检查
4. /check_image_and_trigger_recovery
:md5 参数可注入
/update_auth_token 相关逻辑大意如下(公开 writeup):
require \"opt.bitdefender.www.lua.common\"
if \"-\" == arg[1] or \"-\" == arg[2] or \"-\" == arg[3] then
os_execute(\"rm -f /opt/bitdefender/config/.*\")
end
刷写前会做 RSA 签名校验(proteus 包一层 OpenSSL rsa_public_decrypt,用设备上的 box_firmware_pk.pem 验 MD5)。所以不能随便塞私货镜像——但 Bitdefender 把旧固件打进过历史 APK。他们在 VirusTotal 找到很老的 APK 1.3.12.869,从中取出带合法签名的固件 1.3.11.490。
和新版本 diff 后发现:旧固件在 md5 参数上是经典字符串拼接,没有过滤 ;、引号、管道、括号等;新固件才加了过滤。于是:
- 未认证降级到带洞的旧固件
- 打
md5命令注入 - 把自己的 SSH 公钥写进
authorized_keys - 持久 root
签名校验相关伪流程:
printf $1 | base64 -d > /tmp/firmware.md5.sign
proteus box_firmware_pk.pem /tmp/firmware.md5.sign $uploaded_md5
...
mtd -r write /tmp/image.bin firmware
启示很硬:只做「校验和 + 签名」不够,没有版本防降级和更新鉴权,签名防不了 downgrade。
演示视频:Bitdefender exploit
枢轴细节:BSS 溢进 ClientIP,再打栈上的 %ra
bashsledding 并不是简单复用 CVE-2022-27643 那套「改堆上邻接对象来重置密码」的手法——因为前面已经能未认证改密了。他们改用 <NewDeviceId> 字段把数据溢进 BSS,特别是盖掉全局 ClientIP:
NewDeviceID[...]
ClientIP[...]
cmd_data[...]
ParentalControl/Authenticate 在校验用户名密码通过后,会大致执行:
sprintf(&str, \"%s %lu\", &ClientIP, sys_uptime());
把结果写到栈缓冲再落盘 /tmp/opendns_auth.tbl。ClientIP 已被 BSS 溢出污染时,这次 sprintf 就变成定长栈溢出,可以腐化返回地址 %ra,接到 ROP / system。
break_block_bof(CVE-2024-53903 / CVE-2024-53904)则是:改密后登录 httpd Web,用已认证的 keyword.cgi 布置拦截域名/关键字,再打 DeviceConfig/GetInfo 响应模板里 block_site_name 相关的栈溢出。
Bitdefender:旧固件缺的那一层过滤
新固件给字符串参数加了类似:
function valid_string(input)
if (input:match(\"[;'.|()`]+\")) then
return false
end
return true
end
& 也会在 HTTP 解析阶段被当成参数分隔符清掉。旧版 1.3.11.490 没有这层,md5 参数可以直接拼进 shell。公开资料里这条命令注入没有单独 CVE,却能靠「未认证降级」把洞冻回来——这才是整条链的攻击面核心。
比赛之外:EOL 设备为什么还危险
- 买智能设备前先看厂商支持周期;EOL 了就当高风险资产管
- UPnP / 私有 SOAP 实现问题并不只出现在这一台 Netgear
- 「安全网关」也会在更新链上翻车——降级防护经常缺席
- Junkyard 这类比赛比 Pwn2Own 门槛低,很适合练硬件 / 固件实战
选靶建议(原文总结):
- 必须已停服,且便宜到能买备机(拆坏、变砖、版本不一致都很常见)
- 优先「看起来有洞、又不需要几个月纯 RE」的目标
- UART 不是必须,但极大加速分析
- 固件来源:官网下载,或 SPI / eMMC 抽取(SPI 通常更好上手)
- 下手前查固件包、已有研究、FCC 内构图
参考
- 原文:https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/
- Netgear(CLOUDY WRENCH):https://github.com/trailofbits/exploits/tree/main/junkyard-2025-cloudy-wrench
- Bitdefender(BEACON PRISM):https://github.com/trailofbits/exploits/tree/main/junkyard-2025-beacon-prism
- 作者:Alan Cao(@ex0dus-0x)、William Tan(@Ninja3047)
免责声明:
本人所有文章均为技术分享,均用于防御为目的的记录,请勿用于其他用途,否则后果自负。
更多 IoT / 车联网 / 机器人 / AI 安全资料在星球里,扫码进「车联网攻防日记」。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论