OpenWrt 默认的 DHCPv6、DHCPv4 与路由通告守护进程 odhcpd 存在一处栈缓冲区溢出,编号 CVE-2026-53921,CVSS 3.1 评分 9.8,CVSS v2 直接给到 10.0。漏洞于 10 月 23 日随 NVD 收录公开,修复版本为 25.12,GitHub 上已出现两份公开 PoC。
事件概述
odhcpd 是 OpenWrt 上默认启用的地址分配与路由通告服务,家用路由器、企业 AP、旁路由和大量基于 OpenWrt 的固件都会带上它。问题出在 DHCPv6 IA(Identity Association)响应的序列化过程:当单个 DHCPv6 REQUEST 携带足够多的 IA 选项、把回复空间几乎占满时,处理函数会越过一个固定 512 字节的栈缓冲区 pdbuf 边界继续写入。GHSA-7fwx-hhrg-3496 同时确认,同一调用链上存在两个相互独立的溢出点。
技术细节
触发条件是”一个未认证的 UDP 包”。攻击者不需要任何凭据,只要在 odhcpd 监听的链路上发出一个精心构造的 DHCPv6 请求,把 IA_NA 或 IA_PD 选项堆到接近回复上限,溢出即可发生。更麻烦的是运行权限与运行环境:odhcpd 在 OpenWrt 上以 root 身份运行,而嵌入式目标普遍没有栈保护、没有 ASLR。
同一批还牵出两个相关问题:
- CVE-2026-53920:解析 IA_NA / IA_PD 选项时,若选项体长度小于 dhcpv6_ia_hdr 结构,代码仍把选项头强转为完整结构并读取 iaid,越界读到相邻栈内存;泄漏字节会通过回复中的 IAID 反射回去。ARM 验证中 data_buf[8192:8196] 直接吐出了栈保护值。修复版本为 25.12.3
- CVE-2026-55606:DHCPv6 自环检测把网络字节序的 DUID 长度直接当作 memcmp() 的长度参数,小端主机上会让 memcmp 从 128 字节缓冲区读出 2560 字节。CVSS 6.5,截至公开时无可用补丁
影响评估
9.8 的分数来自 AV:N/AC:L/PR:N/UI:N,也就是网络可达、无需认证、无需交互。实际暴露面取决于 odhcpd 监听的位置:负责下发地址的路由器与 AP 天然面向整个二层广播域,任何接入同一网络的终端都能发包;把 DHCPv6 服务端端口暴露到公网的场景,风险还要再上一档。
修复建议
- 升级 OpenWrt 至 25.12 或更高;若要一并覆盖栈信息泄露问题,需到 25.12.3 及以上。基于 OpenWrt 的第三方固件应等厂商同步补丁,不要假设版本号相近就已修复
- 不需要 DHCPv6 服务端的场景,直接关闭 odhcpd 的 DHCPv6 服务,并限制 UDP 547 端口的可达范围
- 把路由管理面、SSH 与 LuCI 从公网撤下,避免设备被当作跳板
- 检测思路:在交换侧抓 DHCPv6 报文,关注单包内 IA_NA / IA_PD 选项数量异常多、接近回复长度上限的请求,以及来自非授权 MAC 的 DHCPv6 REQUEST 洪峰
# 确认本机 OpenWrt 版本与 odhcpd 状态
cat /etc/openwrt_release | grep DISTRIB_RELEASE
/etc/init.d/odhcpd status
uci show dhcp.odhcpd
对运营商和园区网来说,这类”局域网邻接即可打穿 root 服务”的漏洞,真正的成本不在打补丁,而在那些没人记得固件版本、也没人负责升级的接入设备。