DEF CON 21:IP地址驗(yàn)證漏洞影響Go和Rust語言
net庫爆混合格式的IP地址驗(yàn)證漏洞,影響Go和Rust語言。
"net"庫是Go和Rust語言中常用的庫函數(shù)。近日,Cheng Xu等研究人員在DEF CON大會(huì)介紹了Go和Rust語言中的net模塊安全漏洞。漏洞CVE編號(hào)分別為CVE-2021-29922 (Rust)和CVE-2021-29923 (Golang),漏洞產(chǎn)生的原因是net處理混合格式的IP地址方式上存在問題,即當(dāng)數(shù)字IPv4地址中以0開頭時(shí)會(huì)觸發(fā)漏洞。該漏洞影響Go和Rust語言。依賴net庫的應(yīng)用可能會(huì)受到服務(wù)器端請(qǐng)求偽造(SSRF)和遠(yuǎn)程文件包含(RFI)攻擊。
研究人員在GitHub上搜索關(guān)鍵字"import net",發(fā)現(xiàn)依賴該net庫的GO語言程序就有超過400萬個(gè)。
IP地址可以以多種形式來表示,其中包括十六進(jìn)制數(shù)和整數(shù),不過一般我們看到的IPv4地址都是整數(shù)格式的,比如104.20.59.209。如果標(biāo)稱八進(jìn)制就是0150.0024.0073.0321。

Chrome自動(dòng)補(bǔ)全0開頭的IP地址
在net庫中,所有IP地址開頭的0都會(huì)被移除和丟棄。根據(jù)IETF的原始說明,如果IPv4地址的前綴有0,那么可以理解為是八進(jìn)制。但是Go和rust語言的net模塊都忽略了這一點(diǎn),并將其作為十進(jìn)制數(shù)來處理。
因此,如果開發(fā)者使用net庫來驗(yàn)證IP地址是否屬于某個(gè)特定的范圍,比如訪問控制列表ACL中的IP列表,結(jié)果可能就會(huì)出現(xiàn)錯(cuò)誤。

Rust net模塊將混合格式的IP地址以十進(jìn)制處理的PoC代碼
這一錯(cuò)誤處理可能會(huì)引發(fā)應(yīng)用中服務(wù)器端請(qǐng)求偽造(SSRF)和遠(yuǎn)程文件包含(RFI)攻擊。
受影響的應(yīng)用和語言
Go和Rust并不是唯二受該漏洞影響的語言。該混合格式IP地址驗(yàn)證漏洞之前就影響了Python的ipaddress庫(CVE-2021-29921)、netmask實(shí)現(xiàn)(CVE-2021-28918、CVE-2021-29418)和其他庫函數(shù)。
目前,golang的net模塊已經(jīng)在v 1.17版本中發(fā)布了該漏洞的安全補(bǔ)丁。Rust也在v 1.53.0版本中包含了該漏洞的安全補(bǔ)丁。

Rust語言補(bǔ)丁
本文翻譯自:https://www.bleepingcomputer.com/news/security/go-rust-net-library-affected-by-critical-ip-address-validation-vulnerability/如若轉(zhuǎn)載,請(qǐng)注明原文地址。