当前位置: 首页 > 科技观察

混基IP地址解析漏洞,Go、Rust语言net类库受影响

时间:2023-03-21 16:37:33 科技观察

在本周的DEFCON大会上,多位安全研究人员披露了十进制和八进制混合IP地址解析漏洞,多语言受到影响,包括net,Go和Rust的官方类库。和Python的标准库ipaddress。受混合格式IP地址验证漏洞影响的Go和Rust语言中常用网络库的概述。该漏洞源于库在处理IP地址时将八进制-十进制混合格式的八进制数据视为十进制。使用此基础库的所有应用程序都可能容易受到不确定的服务器端请求伪造(SSRF)和远程文件包含(RFI)漏洞的攻击。由于基础库被广泛使用,大量的Go和Rustweb应用受到影响。此外,Python标准库ipaddress也受此漏洞影响。漏洞原理该漏洞的CVE编号为CVE-2021-29922(Rust库)和CVE-2021-29923(Golang库)。包含数据从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,浏览器会自动将其转换为八进制格式。其他浏览器也是如此,例如GoogleChrome:根据IETF草案,如果前缀为“0”,则IPv4地址的部分可以解释为八进制。然而,在网络库中,任何带有前导零的地址都被简单地剥离和丢弃。Golang和Rust的net模块都将IPv4地址的八位字节简单地视为十进制。因此,如果开发人员使用net来验证IP地址是否属于某个范围(例如,根据访问控制列表(ACL)解析IP列表),则结果对于基于八进制的表示可能是完全错误的的IPv4地址。这可能会导致应用程序中存在未定义的服务器端请求伪造(SSRF)和远程文件包含(RFI)漏洞。漏洞影响由于net库在Golang和Rust语言中都是核心库,因此被大量应用所依赖。在Github上简单搜索了一下,仅golang中依赖这个库的代码文件就超过了49w。而且,Go和Rust并不是唯一受此漏洞影响的语言,Python的ipaddress库(CVE-2021-29921)、netmask库(CVE-2021-28918、CVE-2021-29418)等类似库也在也受到了影响。影响。本系列中的大多数漏洞都被评为高严重性或严重性。漏洞解决目前Golang的net模块将在Golang1.17版本进行补丁。对于Rustnet,也有合并的修复:请使用这些库,请关注官方漏洞发布并及时更新版本。