AI News HubLIVE
站内改写2 分钟阅读

AI辅助二进制修补:修复废弃路由器的DHCP漏洞

本文介绍了如何通过AI辅助分析,使用8字节的二进制补丁修复EdgeOS路由器中dhcrelay3的DHCP中继漏洞。该漏洞导致重复数据包洪泛,违反了RFC 2131。作者详细解释了DHCP中继的工作原理、漏洞的根源(中继程序未正确检查giaddr字段)、以及如何通过修改二进制跳转指令来强制检查giaddr,从而避免二次中继。补丁利用了现有函数出口,无需新增代码,并在MIPS架构上正确处理了延迟槽。

来源Hacker News AI作者: 4onthefloor124

在一家ISP网络中,一台集中的DHCP服务器每秒记录约200个重复请求数据包。问题的根源是EdgeOS的中继守护进程dhcrelay3,它会将已经中继过的数据包再次中继,这违反了RFC 2131。该网络运行超过45台EdgeOS路由器,中继路径多层嵌套,导致单个客户端请求在中心产生洪泛。作者通过一个8字节的补丁修复了问题,部署后重复请求降至零。

DHCP中继的工作原理是:没有IP地址的设备通过广播发送DHCP DISCOVER,但广播不会跨子网。中继代理在本地路由器上监听广播,将其作为普通单播数据包转发到配置的服务器,并填充giaddr字段(网关IP地址),用于指示客户端所在的子网,以便服务器分配正确地址段并回复。RFC 2131明确规定,一旦数据包被中继(即giaddr已设置),其他中继应忽略它。但EdgeOS的dhcrelay3仅当giaddr匹配自身地址时才忽略,否则会再次中继,形成循环。

该循环至少需要两个中继:第一个中继正确设置giaddr并转发,第二个中继本应直接路由该数据包,但却再次中继,发送第二份副本,且每次中继都会增加BOOTP跳数。跳数上限为16,但只限制深度而非广度,导致数据包在每跳成倍增加。EdgeOS的启动脚本将所有中继接口同时设为接收和转发角色,使得路由器可能中继自身刚发出的副本。45台路由器多层嵌套下,服务器每秒收到约200个重复请求。

dhcrelay3基于ISC DHCP(已停止维护)的开源代码,修复方法很简单:在do_relay4()函数顶部检查giaddr,如已设置则直接返回。但EdgeOS使用交叉编译的MIPS二进制文件,无法直接重新构建。因此作者直接在二进制上修改。

通过定位函数中打印“Dropping request received on %s”的日志信息,作者找到实际运行的界面标志检查指令(检查“下游”位),而非giaddr检查。该检查位于地址0xCF38:beqz v0, d224(如果未设置下游标志则跳转)。补丁将其替换为检查giaddr(已载入寄存器a2)的指令:bnez a2, cc94(如果giaddr非零则跳转到现有函数出口)。同时将延迟槽中的指令替换为恢复返回地址的lw ra,148(sp),与出口处一致。这样,已中继的数据包直接跳转到函数退出,不再二次中继。

补丁仅8字节,利用现有寄存器值和函数出口,不新增代码。MIPS的延迟槽特性被正确处理,避免崩溃。该补丁适用于Octeon(大端)和MediaTek MT7621(小端)路由器,但字节编码不同。部署后,服务器终于恢复了平静。