首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NPM酷库:vm2,安全的沙箱环境

NPM酷库,每天两分钟,了解一个流行NPM库。

今天我们要了解的库是 vm2,这是一个Node.js 官方 vm 库的替代品,主要解决了安全问题。

不安全的vm

在Node.js官方标准库中有一个vm库,用来在V8虚拟机环境中编译执行JS代码。通常,我们用vm库来实现一个沙箱,在代码主程序之外执行额外的JS脚本。

有时,我们需要vm虚拟机来执行不受信任的代码,这些代码可能是由用户提交的,比如在脉冲云接口文档管理中,允许用户提交Mock.js脚本生成模拟接口数据。而Node.js标准库中的vm是不安全的,用户脚本可以轻易突破沙箱环境,获取主程序的Context!

上述代码在执行时,程序在第二行就直接退出,vm虚拟机环境中的代码逃逸,获得了主线程的 process 变量,并调用 process.exit(),造成主程序非正常退出。

vm不安全的原因

上文中的代码使用了runInNewContext函数简写,等价于如下代码:

从代码中得知,创建vm环境时,首先要初始化一个对象 sendbox,这个对象就是vm中脚本执行时的全局环境Context,vm 脚本中全局 this 指向的就是这个对象。

而vm中脚本等同于:

从上边脚本中可以看出vm不安全的原因。vm内部脚本的Context对象是在主程序中定义的,根据JS原型链原理,可以轻松获取主程序中的 Function 对象,用主程序的 Function 对象构造一个函数,那么这个函数运行时,就是在主程序闭包环境中执行的!所以,我们轻易地获取到了主程序的全局对象 process,最终控制主程序!

安全的vm2

vm2就是专门为了解决vm的安全问题而诞生的。

vm2 特性:

运行不受信任的JS脚本

沙箱的终端输出信息完全可控

沙箱内可以受限地加载modules

可以安全地向沙箱间传递callback

死循环攻击免疫

vm2 原理:

首先,vm2基于vm,使用官方的vm库构建沙箱环境。然后使用JavaScript的Proxy技术来防止沙箱脚本逃逸。

参考资料

VM2 https://github.com/patriksimek/vm2

Proxy https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180102G062TB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券