广泛被使用的 JavaScript 沙箱中的远程执行代码 (RCE) 漏洞在 CVSS 漏洞风险等级中获得了 10 分(满分10分),允许威胁参与者执行沙盒逃生并在托管计算机上运行shell命令。
“威胁参与者可以绕过沙盒保护,在运行沙盒的主机上获得远程代码执行权限,”GitHub在2022年9月28日发布的公告中表示。
根据NPM包管理器的说法,他们把这个在vm2中的危险漏洞称之为“Sandbreak”,这是一个JavaScript沙箱,每月下载量超过1600万次。
该项目的维护人员迅速做出反应,在vm2版本3.9.11中发布了Sandbreak补丁,鉴于漏洞的严重性,建议用户尽快更新到最新版本,以缓解潜在威胁。
沙盒:历史上值得信赖
与所有沙箱一样,vm2提供了一个隔离的环境,应用程序可以在其中运行受信任的代码,这在现代应用程序中发挥了重要作用,因为开发人员或网络管理员可以使用它们来运行程序或打开文件,而不影响运行它们的应用程序、系统或平台。
软件开发人员经常使用沙盒来测试新的编程代码,沙盒是网络安全研究中的一个重要工具,它允许研究人员在不损害网络或应用程序环境其他部分的情况下测试潜在的恶意软件。
研究人员说,沙盒普遍受到信任使得Sandbreak漏洞非常关键,应该在所有沙盒用户中拉响警报。
技术分析
研究人员在对Sandbreak的调查中探索了这一点,他们在分析之前向维护vm2的团队披露的安全漏洞时发现了这一点。
该漏洞存在于 vm2 漏洞报告器中,这将允许网络攻击者滥用 Node.js中的错误机制。研究人员透露,他们可以自定义应用程序中发生的错误的调用堆栈,以逃避沙盒。
“自定义调用堆栈可以通过在全局'Error'对象下实现'prepareStacktrace'方法来实现这一点,”研究人员在帖子中解释说,“这意味着当发生错误并且访问抛出的错误对象的'stack'属性时,Node.js将调用此方法,同时为其提供错误的字符串表示形式以及一系列'CallSite'对象作为参数。
研究人员发现,由于这个问题,CallSite对象暴露的方法之一是“getThis”,它负责返回相关堆栈框架中可用的“this”对象。
这种行为可能导致沙盒转义,因为一些“CallSite”对象“在调用‘getThis’方法时可能返回在沙盒外部创建的对象”,他们写道。如果攻击者能够获得在沙盒外部创建的“CallSite”对象,他们就可以访问Node的全局对象并从那里执行任意系统命令。
绕过缓解措施
vm2的维护者意识到重写“prepareStackTrace”确实会导致沙盒转义。他们试图通过用自己的实现包装Error对象和“prepareStackTrace”方法来减少转义路径,他们说,这成功地阻止了任何人重写该方法并执行转义。
然而,研究人员发现他们可以绕过这一点,因为vm2错过了与“WeakMap”JavaScript内置类型相关的特定方法,他们说。研究人员写道:“这允许攻击者提供他们自己的‘prepareStackTrace’实现,然后触发错误,并逃离沙盒。”
研究人员知道Error对象的prepareStackTrace函数是他们需要覆盖以逃离沙箱的函数,他们甚至决定尝试用他们自己的对象覆盖全局Error对象。
这样做实现了prepareStackTrace函数,该函数允许它们逃离沙盒。他们说,经过几个简单的步骤之后,他们就可以访问当前正在执行的进程,并可以在运行沙盒的系统上执行命令。
安全使用沙盒
研究人员警告说,尽管沙盒本质上是为了在应用程序或系统中安全地运行不受信任的代码,但企业不应该假设它们没有风险。
如果在环境中不可避免地使用沙盒,建议通过将应用程序的逻辑、敏感部分与运行沙盒代码的微服务分离来降低风险。
企业也应该尽可能避免使用依赖于动态编程语言(如JavaScript)的沙盒。
研究人员在他们帖子中称:“语言的动态特性扩大了潜在攻击者的攻击面,使防御此类攻击变得更加困难。”
来源: