net库爆混合格式的IP地址验证漏洞,影响Go和Rust语言。
"net"库是Go和Rust语言中常用的库函数。近日,Cheng Xu等研究人员在DEF CON大会介绍了Go和Rust语言中的net模块安全漏洞。漏洞CVE编号分别为CVE-2021-29922 (Rust)和CVE-2021-29923 (Golang),漏洞产生的原因是net处理混合格式的IP地址方式上存在问题,即当数字IPv4地址中以0开头时会触发漏洞。该漏洞影响Go和Rust语言。依赖net库的应用可能会受到服务器端请求伪造(SSRF)和远程文件包含(RFI)攻击。
研究人员在GitHub上搜索关键字"import net",发现依赖该net库的GO语言程序就有超过400万个。
IP地址可以以多种形式来表示,其中包括十六进制数和整数,不过一般我们看到的IPv4地址都是整数格式的,比如104.20.59.209。如果标称八进制就是0150.0024.0073.0321。
Chrome自动补全0开头的IP地址
在net库中,所有IP地址开头的0都会被移除和丢弃。根据IETF的原始说明,如果IPv4地址的前缀有0,那么可以理解为是八进制。但是Go和rust语言的net模块都忽略了这一点,并将其作为十进制数来处理。
因此,如果开发者使用net库来验证IP地址是否属于某个特定的范围,比如访问控制列表ACL中的IP列表,结果可能就会出现错误。
Rust net模块将混合格式的IP地址以十进制处理的PoC代码
这一错误处理可能会引发应用中服务器端请求伪造(SSRF)和远程文件包含(RFI)攻击。
受影响的应用和语言
Go和Rust并不是唯二受该漏洞影响的语言。该混合格式IP地址验证漏洞之前就影响了Python的ipaddress库(CVE-2021-29921)、netmask实现(CVE-2021-28918、CVE-2021-29418)和其他库函数。
目前,golang的net模块已经在v 1.17版本中发布了该漏洞的安全补丁。Rust也在v 1.53.0版本中包含了该漏洞的安全补丁。(文章来源:嘶吼专业版)