安全沙箱并执行用户提交的JavaScript?

Cor*_*oss 42 javascript eval sandbox sanitize node.js

我希望能够让用户提交任意JavaScript代码,然后将其发送到Node.JS服务器并安全执行,然后将输出发送回多个客户端(作为JSON).eval我想到了这个功能,但我知道这有多个安全问题(用户提交的代码可以访问Node的File API等).我见过一些项目,如Microsoft Web Sandbox和Google Caja,它们允许执行清理标记和脚本(用于在网站上嵌入第三方广告),但似乎这些是客户端工具,我不确定它们是否可以在Node中安全使用.

有没有一种标准的方法来沙盒并在Node中执行不受信任的JavaScript,从而获得输出.尝试做这个服务器端是错误的吗?

编辑:用户能够利用JavaScript的全部功能并不重要,事实上,最好能够选择将哪些API提供给用户代码.

编辑:我将继续使用我发现的内容进行更新.这个Sandcastle模块(bcoe/sandcastle)似乎旨在实现我的想法.不确定它有多安全,但由于我不是太重要,我想如果尝试的话.如果我能成功地做到这一点,我会添加自己的答案.

ton*_*ton 10

您可以在nodejs中使用vm.runInContext('js code',context)中的沙箱支持,api文档中的示例:

https://nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_options

const util = require('util');
const vm = require('vm');

const sandbox = { globalVar: 1 };
vm.createContext(sandbox);

for (var i = 0; i < 10; ++i) {
    vm.runInContext('globalVar *= 2;', sandbox);
}
console.log(util.inspect(sandbox));

// { globalVar: 1024 }
Run Code Online (Sandbox Code Playgroud)

警告:正如"s4y"所指出的那样,它似乎是一种瑕疵.请看评论.

  • 这似乎不安全,例如:`vm.runInNewContext('this.constructor.constructor("return process")().exit()');`(来自vm2自述文件:https:// github. COM/patriksimek/VM2). (3认同)

Hir*_*awa 6

一种替代方法是使用http://github.com/patriksimek/vm2

$ npm install vm2
Run Code Online (Sandbox Code Playgroud)

然后:

const {VM} = require('vm2');
const vm = new VM();

vm.run(`1 + 1`);  // => 2
Run Code Online (Sandbox Code Playgroud)

如其他答案的评论中所述。

我不知道它有多安全,但它至少声称它安全地运行不受信任的代码(在它的自述文件中)。就此处其他答案中建议的解决方案而言,我找不到任何明显的安全问题。


Gin*_*den 5

此答案已过时,因为 gf3 不提供防止沙箱破坏的保护

http://gf3.github.io/sandbox/ -它使用require('child_process')的不是require('vm')

  • 对于未来的观众,目前 gf3 是可利用的,可以被破解。 (7认同)
  • 警告!gf3/sandbox 1年没更新了,还有一个open issue可以破解沙箱:https://github.com/gf3/sandbox/issues/29 (3认同)
  • 不要误导,gf3/sandbox 使用子进程和vm 模块,检查代码。所有沙盒解决方案都是如此。 (2认同)

asv*_*svd 5

在 Node.js 下,你可以创建一个沙盒子进程,但你也需要用 附加代码"use strict";,否则有可能用 破坏沙盒arguments.callee.caller

不确定为什么需要将其发送到服务器,因为代码也可能在沙盒网络工作者中执行。

还可以看看我的Jailed库,它简化了刚才提到的 Node.js 和 web 浏览器的所有内容,另外还提供了将一组函数导出到沙箱中的机会。

  • 这时候Jailed断了:https://github.com/asvd/jailed/issues/33 (4认同)
  • 替代方案:https://github.com/patriksimek/vm2 似乎是安全的,但看到日志潜在的突破,我会小心。 (3认同)