Rust和Go语言的网络库中存在可绕过IP地址验证的漏洞

Rust 和 Go 语言的标准库中已发现与地址解析函数中八进制 IP 地址错误处理相关的漏洞。 这些漏洞使得绕过对应用程序中有效地址的检查成为可能,例如,在执行 SSRF(服务器端请求伪造)攻击时组织对环回接口地址 (127.xxx) 或内联网子网的访问。 这些漏洞延续了之前在节点网络掩码(JavaScript、CVE-2021-28918、CVE-2021-29418)、private-ip(JavaScript、CVE-2020-28360)、ipaddress(Python、CVE- 2021-29921 )、Data::Validate::IP(Perl、CVE-2021-29662)和 Net::Netmask(Perl、CVE-2021-29424)。

根据规范,以零开头的 IP 地址字符串值应解释为八进制数,但许多库没有考虑到这一点,只是丢弃零,将该值视为十进制数。 例如,八进制的数字 0177 等于十进制的 127。 攻击者可以通过指定值“0177.0.0.1”来请求资源,该值以十进制表示对应于“127.0.0.1”。 如果使用有问题的库,应用程序不会检测到地址0177.0.0.1在子网127.0.0.1/8中,但实际上,在发送请求时,它可以访问地址“0177.0.0.1”,该地址是网络功能将作为 127.0.0.1 进行处理。 类似地,您可以通过指定“012.0.0.1”(相当于“10.0.0.1”)之类的值来欺骗内网地址访问的检查。

在 Rust 中,标准库“std::net”受到问题 (CVE-2021-29922) 的影响。 该库的IP地址解析器在地址中的值之前丢弃了零,但前提是指定的数字不超过三位,例如“0177.0.0.1”将被视为无效值,并且结果不正确将响应 010.8.8.8 和 127.0.026.1 返回。 在解析用户指定的地址时使用 std::net::IpAddr 的应用程序可能容易受到 SSRF(服务器端请求伪造)、RFI(远程文件包含)和 LFI(本地文件包含)攻击。 该漏洞已在 Rust 1.53.0 分支中修复。

Rust和Go语言的网络库中存在可绕过IP地址验证的漏洞

在 Go 中,标准库“net”受到影响 (CVE-2021-29923)。 net.ParseCIDR 内置函数会跳过八进制数字之前的前导零,而不是处理它们。 例如,攻击者可以传递值 00000177.0.0.1,当在 net.ParseCIDR(00000177.0.0.1/24) 函数中检查时,该值将被解析为 177.0.0.1/24,而不是 127.0.0.1/24。 这个问题也体现在 Kubernetes 平台上。 该漏洞已在 Go 版本 1.16.3 和 beta 1.17 中修复。

Rust和Go语言的网络库中存在可绕过IP地址验证的漏洞


来源: opennet.ru

添加评论