IP地址解析漏洞,Go,Rust語言net類庫受影響

本週在DEF CON大會上,由多名安全研究人員披露十進位制和八進位制混合IP地址解析漏洞,多種語言的受影響,包括Go和Rust的官方類庫net。以及Python的標準庫ipaddress。

IP地址解析漏洞,Go,Rust語言net類庫受影響

概述

Go和 Rust語言中常用的net庫,受到混合格式IP 地址驗證漏洞的影響。該漏洞源於庫中對IP地址處理時候將八進位制-十進位制)格式混合格式的八進位制的資料當作十進位制有關。

所有使用這次基礎庫的應用程式可能會受到不確定的伺服器端請求偽造(SSRF) 和遠端檔案包含(RFI) 漏洞的攻擊。

因為該基礎庫被廣使用,所以大量的Go,Rust網路應用都受到影響。

另外,Python 標準庫ipaddress也受漏洞影響。

漏洞原理

漏洞CVE編號為CVE-2021-29922(Rust庫)和 CVE-2021-29923(Golang庫),主要在其同名類庫net處理混合格式的IP地址,或者更具體地說,當十進位制IPv4 地址包含資料以0開始時。

眾所周知,IP地址可以用多種格式表示,包括十六進位制和整數,儘管最常見的IPv4地址以十進位制格式表示。

比如8。8。8。8

該地址可以用八進位制格式表示為 0010。0010。0010。0010。

我們日常最常用的一個本地IP地址(迴環地址,localhost)為127。0。0。1。假如對其第一部分IP地址新增一個0,則0127。0。0。1 會被解析為啥呢?

我們在瀏覽器中輸入這個地址。在火狐瀏覽器的位址列中輸入0127。0。0。1,瀏覽器將其自動轉化為八進位制格式 。

IP地址解析漏洞,Go,Rust語言net類庫受影響

其他瀏覽器也是如此,比如谷歌Chrome:

IP地址解析漏洞,Go,Rust語言net類庫受影響

根據IETF草案,如果字首為“0”,則 IPv4 地址的部分可以解釋為八進位制。但是,在net庫中,任何前置零的地址都被簡單地剝離和丟棄。

在Golang和Rust的net模組中將IPv4地址的八位位元組都被簡單視為十進位制。 因此,如果開發人員使用net來驗證IP地址是否屬於某個範圍(例如,根據訪問控制列表 (ACL) 解析IP列表),對於基於八進位制的IPv4地址表示,結果可能會完全錯誤。

IP地址解析漏洞,Go,Rust語言net類庫受影響

這樣可能會導致應用程式中出現不確定的伺服器端請求偽造 (SSRF)和遠端檔案包含(RFI)漏洞。

漏洞影響

由於net庫在Golang和Rust語言中均為核心庫,被大量應用所依賴,透過在Github上簡單搜尋,僅golang中依賴該庫的程式碼檔案超超過49w。

IP地址解析漏洞,Go,Rust語言net類庫受影響

而且Go和Rust不是唯一受該漏洞影響的語言,還有Python語言的ipaddress 庫 (CVE-2021-29921)、 netmask庫 (CVE-2021-28918、CVE-2021-29418) 和等類似的庫也受影響。

該系列漏洞大多都被評為有高或嚴重的嚴重性。

IP地址解析漏洞,Go,Rust語言net類庫受影響

漏洞解決

目前 Golang 的 net 模組將補丁將在Golang 1。17 版中釋出。

對於 Rust net裡,也已經有一個修復程式已經合併:

IP地址解析漏洞,Go,Rust語言net類庫受影響

請使用這些類庫的同學,關注官方漏洞釋出及時更新版本。

相關文章