流行的npm库网络掩码具有严重的网络漏洞。
数十万个应用程序经常使用netmask来解析IPv4地址和CIDR块或进行比较。
该组件每周的下载量超过300万,截至目前,在其生命周期内的总下载量超过2.38亿。此外,大约 278,000个GitHub存储库依赖netmask。
库中存在的错误意味着解析IP地址的前导零时,由于未正确进行验证,网络掩码会看到不同的IP。
前导零会更改IP地址
今天,安全研究人员 Victor Viale,Sick Codes,Nick Sahler, Kelly Kaoudis和 John Jackson 公开了流行的网络掩码库中的一个缺陷 。
漏洞跟踪为CVE-2021-28918,涉及网络掩码如何处理混合格式IP地址,或更具体地说,当十进制IPv4地址包含前导0时。
IP地址可以用多种格式表示,包括十六进制和整数,尽管最常见的IPv4地址以十进制格式表示。
例如,BleepingComputer的IPv4地址以十进制格式表示为104.20.59.209,但是可以以八进制格式表示为0150.0024.0073.0321。
假设您获得的IP地址为十进制格式127.0.0.1,该地址被广泛理解为本地回送地址或本地主机。
如果要给它加上0前缀,那么应用程序是否仍应将0127.0.0.1解析为127.0.0.1或其他?
在您的网络浏览器中尝试一下。在BleepingComputer进行的测试中,浏览器在Chrome的地址栏中输入0127.0.0.1/,将其视为八进制 格式的IP 。
实际上,按Enter或Return键后,IP会更改为十进制等效值87.0.0.1,这就是大多数应用程序应该如何处理此类模棱两可的IP地址的方式。

特别值得注意的是,127.0.0.1不是公共IP地址,而是环回地址,但是,其模棱两可的表示将其更改为公共IP地址,从而导致另一台主机。
但是,对于npm库网络掩码,任何前导零都将被简单地剥离和丢弃。
根据IETF的原始规范,如果前缀为“ 0”,则IPv4地址的某些部分可以解释为八进制。
Sahler和Viale告诉BleepingComputer:“但是netmask忽略了这一点。它将始终将部分视为十进制,这意味着如果您尝试验证IP属于某个范围,则对于基于八进制的IPv4地址表示将是错误的。”在电子邮件采访中。
SSRF和阻止列表绕过远程文件包含
乍看之下,此漏洞似乎没什么大不了,但如果攻击者能够影响应用程序解析的IP地址输入,则该漏洞可能会引起各种漏洞,从服务器端请求伪造(SSRF)绕过到远程文件包含(RFI)。
研究人员与BleepingComputer分享了各种示例,以证明它们都是相同的。
“有人在运行节点服务器来清理入站请求或查询参数,该入站请求或查询参数可能是用于进一步连接的URI,正在获取资源,诸如此类。”
“攻击者使用较早的0前缀JavaScript表示形式,以基数为8的部分或全部八位字节来制作IP。”
Kaoudis告诉BleepingComputer:“例如,这对于SSRF很有用,它可以通过传递0177.0.0.01来强制服务器连接到127.0.0.1。177以8为底数(以127十进制表示),” Kaoudis告诉BleepingComputer。
Viale还补充说:“一个很好的例子是公开网络钩子并通过网络掩码检查验证用户URL的系统容易受到SSRF的攻击。”
鉴于如果网络掩码将所有IPv4部分(八位字节)转换为十进制格式的方式,但被攻击者评估为公开,则攻击者可以设计一个看起来对私有IP掩码专用的IP地址,也可以利用此错误进行远程文件包含(RFI)。其他组件,Kaoudis向BleepingComputer解释。
在2018年,流行的软件项目 curl还被发现具有相同的缺陷,它将八进制IPv4地址解析为十进制:
在BleepingComputer进行的测试中,运行“ curl -v 0177.0.0.1”具有 卷曲连接到177.0.0.1,而不是回送地址127.0.0.1。
.jpg)
来源:Twitter
当时,一名道德黑客Grégoire也阐明了如何利用此漏洞绕过基于IP的访问控制列表(ACL)。
道德黑客NicolasGrégoire说: “我经常使用这些转换来绕过反SSRF黑名单。”
各种网络基础结构和安全产品(例如 Web应用程序防火墙)都依赖于网络掩码来过滤出阻止列表和允许列表中的IP。
这还意味着,如果不加以检查,则可能会导致此类缺陷,从而导致外围安全控制措施严重失误。
以前,Sick Codes, Jackson和Sahler已经在private-ip 软件包中发现了类似的缺陷 ,事实证明,即使在今天,它们也使用netmask作为依赖项。
杰克逊说,最终,网络掩码中的这一新发现问题使成千上万的项目容易受到SSRF绕过的攻击。
“ Netmask每周有数百万的下载量,因此影响很大。这是一个巨大的软件供应链漏洞。”
杰克逊对BleepingComputer表示:“回想起来,我们的私有IP CVE的严重性达到了9.8,每周只有约175,000次下载。”
研究人员的主要担心是,许多使用netmask进行IP解析的项目可能会误以为它们受到SSRF的保护。
固定版本在npm上发布
在研究人员对该漏洞进行了负责任的报告之后,netmask开发人员向GitHub推出了一系列针对该漏洞的修复程序[1、2、3],并通过测试案例验证了是否为0的IPv4八位字节被视为八进制数而不是十二进制数。
CVE-2021-28918的修复程序已在npm下载的netmask版本2.0.0 中发布 。
当被问及此漏洞的严重性时,开发人员告诉BleepingComputer,这取决于人们如何定义“严重”。
“取决于您如何定义关键以及如何使用此库。这不是缓冲区溢出或远程执行类的错误。”
“如果它基于使用此库的IP访问,则我无法对您的应用程序进行DoS,但会削弱您的ACL。”
Poitrey告诉BleepingComputer:“我还没有想到可以利用它的情况,因为大多数时候ACL都是基于从IP堆栈中学习到的IP,而这些ACL永远不会使用易受攻击的格式,” Poitrey告诉BleepingComputer。
鼓励netmask npm库的用户升级到固定版本2.0.0。
尽管BleepingComputer尚未收到表明Perl组件Net :: Netmask是否 也遭受此漏洞影响的信息,但建议使用Perl版本的开发人员在将其作为输入传递给Netmask之前,确保其应用程序对IP地址进行清理和规范化。
*编译:Domino
*来自:bleepingcomputer