繁体   English   中英

如何在node.js沙箱中安全地运行用户提交的脚本?

[英]How to run user-submitted scripts securely in a node.js sandbox?

安全地在node.js中运行(可能是恶意的)用户提交的脚本有哪些选项? 即在一个阻止代码访问敏感数据和API的环境中?

vm.runInNewContext(userScript, {})是一个诱人的起点......但似乎那里存在已知问题

沙箱模块看起来很有趣,但也使用了runInNewContext() ,所以我对它有点怀疑。

您应该始终在单独的进程中运行不受信任的代码,这正是沙盒模块所做的。 一个简单的原因是vm.runInNewContext('while(true){}', {})将冻结节点。

它首先生成一个单独的进程,稍后将在stdout上将结果序列化为JSON。 无论子进程执行什么操作,父进程都会继续执行,并且可以触发超时。

然后将不受信任的代码包装在具有严格模式的闭包中(在常规JavaScript中,您可以使用arguments.callee.caller来访问作用域之外的数据)。 最后,传递一个非常有限的global对象以防止访问节点的API。 不受信任的代码只能进行基本计算,并且无法访问文件或套接字。

虽然您应该阅读沙盒的代码作为灵感,但我不建议按原样使用它:

  • 代码变老了7个月没有更新。
  • 节点中的Child Process模块​​已经提供了您需要的大多数功能,尤其是child_process.fork()
  • child_process.fork提供的IPC频道可能具有更好的性能。

为了提高安全性,您还可以考虑使用setuid-sandbox 这是Google Chrome用于阻止标签流程访问文件系统的代码。 你必须制作一个原生模块,但这个例子似乎很简单。

github上一个名为vm2的新模块,它解决了其中一些问题,特别是在Node.JS应用程序中。 也许这会帮助其他人找到它,就像我刚刚做的那样。

您可能想在Medium上查看这篇文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM