EOL路由照样打穿:NetgearWGR614v9UART+BitdefenderBoxSPI降级RCE"

admin 2026-11-01 01:20:44 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

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 官网还能下到固件,所以他们直接下载,而不是从片上硬抽。流程大致是:

  1. 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 用。利用链关键端点:

  1. /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 参数上是经典字符串拼接,没有过滤 ;、引号、管道、括号等;新固件才加了过滤。于是:

  1. 未认证降级到带洞的旧固件
  2. 打 md5 命令注入
  3. 把自己的 SSH 公钥写进 authorized_keys
  4. 持久 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 安全资料在星球里,扫码进「车联网攻防日记」。

EOL路由照样打穿:NetgearWGR614v9UART+BitdefenderBoxSPI降级RCE" 网络安全文章

EOL路由照样打穿:NetgearWGR614v9UART+BitdefenderBoxSPI降级RCE"

本文记录TrailofBits团队在DistrictConJunkyard比赛中攻破两款EOL家庭网络设备的研究。NetgearWGR614v9通过UART获取访问,利用UPnP认证绕过与缓冲区溢出实现远程root;BitdefenderBoxV1通过SPI提取固件,利用未认证降级与命令注入实现持久化控制。文章强调EOL设备因厂商停止更新而更易受攻击,建议用户关注设备支持周期并加强固件安全防护。
每周分享分享-282" 网络安全文章

每周分享分享-282"

本文分享一篇关于多无人机MEC系统调度优化的论文,提出基于混合动作多智能体深度强化学习(HA-MADRL)的协同卸载框架,联合优化无人机轨迹、算力分配与任务迁移,以最小化任务时延。通过Gumbel-Softmax实现离散迁移动作可微建模,采用集中训练分布式执行架构。实验表明该方法收敛快、时延低,能提升边缘算力利用率。
评论:0   参与:  0