每周下载超 300 万次的 NPM 包被爆存在严重漏洞!

本周,开发人员 Tim Perry 披露了一个关于 pac-resolver 的严重漏洞,当一些本地用户在发出 HTTP 请求时,黑客可通过该漏洞肆意运行用户在 Node.js 进程中的任意代码。

此次漏洞与 PAC 文件有关

在此之前,pac-resolver 包的每周下载量超过了 300 万次,这个漏洞扩张到了依赖于开源的Node.js 应用程序。Pac-resolver 自诩为一个模块,它接受 JavaScript 代理配置文件,并为应用生成一个函数来映射特定的域以使用代理。

据 Tim Perry 透露,他是在为 HTTP 工具包添加代理支持时发现这一漏洞的,当他在审核 pac-resolver 代码时却遇到了安全问题。随后这个漏洞被追踪为 CVE-2021-23406,与模块处理代理自动配置 (PAC) 文件的方式有关。

PAC 文件由指定代理配置的 JavaScript 代码组成,它决定了哪些网络请求应该通过代理,哪些应该直接发出。例如,在 PAC 文件中,网络管理员可以明确指定一个网络代理,然后所有流量都应通过该代理进行路由,访问这个列表里面的域名的时候不通过代理服务器:

function FindProxyForURL(url, host) {
// Send all *.example requests directly with no proxy:
if (dnsDomainIs(host, '.example.com')) {
return 'DIRECT';
}
// Send every other request via this proxy:
return 'PROXY proxy.example.com:8080';
}

在上面的例子中,“example.com”的网络请求将绕过代理,而其余的流量则会按照指示通过代理服务器。

讲到这里,我们就不得不提到 PAC 标准。它最初于 1996 年作为 Netscape Navigator 2.0 的一部分被推出, 直到今天仍然被广泛使用。例如,Web Proxy Auto-Discovery Protocol (WAPD) 使用 DNS 或 DHCP 服务来定位网络上的 PAC 文件,并将代理配置导入到应用程序中。然而,随着代理配置变得越来越高,PAC 文件中的 JavaScript 代码也随之变得越来越复杂,并且被理想化地设计为在虚拟化环境 (VM) 中运行。

只需几行代码就可以绕过 VM,导致 RCE(remote code execution,即远程代码执行) 

例如,一个名为 Pac-Proxy-Agent 的相关 NPM 包 ,它由同一作者制作,每周下载量超过 200 万次,并且为 Node.js 应用程序提供 PAC 文件支持。Pac-Proxy-Agent 通过获取 PAC 文件的 URL 检索文件,然后充当 Node.js HTTP 代理来处理应用程序的传出请求。但是 Pac-Proxy-Agent 无法正确沙箱 PAC 文件,因为它使用了易受攻击的 pac-resolver 模块,该模块进一步依赖 “degenerator” 来构建 PAC 功能。

Degenerator 是同一作者的另一个包,它使用 Node.js 的 “VM” 模块将任意代码转换为沙箱函数。由于 Node.js 的文档中明确说明,“ vm 模块不是一种安全机制,不要用它来运行不受信任的代码” ,因此,当使用 pac-resolver、Pac-Proxy-Agent 和 proxy-agent 等包时,degenerator 的输出则会带来一定的安全风险。

Perry 在另一个博客中声称,“这是一个非常容易犯的错误,它的文本很小(坦率地说,它应该只能算是页面上的标题)”, Perry 进一步解释说:“这造成了一个大问题,虽然 VM 确实试图在一个独立的上下文中创建一个隔离的环境,但有很多简单的方法可以访问原始环境,并且能够完全摆脱沙箱……允许‘沙箱’中的代码在你的系统上做任何它想做的事情。”

在这个基础上,Perry 利用代码演示了攻击者如何突破虚拟机:

“这就是突破 VM 模块沙箱所需的全部内容,如果你能让一个易受攻击的目标使用这个 PAC 文件作为他们的代理配置,那么你就可以在他们的机器上运行任意代码,”Perry 解释道。

该漏洞严重影响那些使用 pac-resolver 5.0.0 之前版本的人,甚至在他们的 Node.js 应用程序中传递,并且在以下任意一种情况下,远程攻击者都可以配置恶意 PAC URL 并在使用代理配置发出 HTTP 请求时在计算机上运行任意代码。

  • 使用 PAC 文件进行代理配置
  • 在启用 WPAD 的系统上读取和使用 Node.js 中的操作系统代理配置
  • 使用不受信任来源的代理配置( env、配置文件、远程配置端点、命令行参数)

在 5.0.0 版本中对 pac-resolver 的修复只是简单地将 degenerator 版本升级到 3.0.1,核心修复程序则采用了degenerator 本身,并通过 vm2 模块实现了更强大的沙箱机制,以“防止不受信任的代码的权限升级”。

最后,Perry 建议受这个漏洞影响的开发人员应尽快升级到 pac-resolver 5.0.0 或更高版本以修复其应用程序中的这种漏洞。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值