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(小端)路由器,但字節編碼不同。部署後,服務器終於恢復了平靜。

AI輔助二進制修補:修復廢棄路由器的DHCP漏洞 | AI News Hub