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