vm2 是 node.js 的代码测试沙箱,一般用于测试不受信任的 JavaScript 代码。但 近日 德国网络安全研究小组 CISPA Helmholtz 的一组研究表明,Node.js 的 vm2 沙箱并不安全, 这个包的一些版本 可能受到原型污染( prototype pollution )攻击,攻击方可以 绕过 vm2 的安全控制并进行 远程代码执行 (RCE) 攻击。
JavaScript 是基于原型的语言,当创建新对象时,它们会继承原型“对象”的属性和方法,包含 toString、 constructor 和hasOwnProperty 等基本功能。而原型污染 ( prototype pollution )正 是 JavaScript 和其他基于对象的语言的漏洞,允许攻击者向敏感对象动态注入属性,从而运行任意代码。
在 Snyk 发布的 PoC 中,Staicu 展示了 Vm2 的 原型污染负载和任意代码执行。 (测试详情请点此查看 )。 研究人员 Cristian-Alexandru Staicu 表示: Vm2 本应严格控制对全局对象/特权操作的访问,然而在测试中,这些安全控制可以被绕过。
如果你也在使用 vm2,建议及时升级到 3.9.4 或更高版本,避免遭受原型污染的影响。