我正在尝试使用沙箱module在 linux + node.js 中运行不受信任的 javascript 代码,但它坏了,我只需要让用户编写 javascript 程序来打印一些文本。不允许使用其他 i/o,只使用普通的 javascript,没有其他节点module。如果真的不可能做到,那么您建议使用哪种其他语言来完成此类任务?我需要的最小功能集是一些数学、正则表达式、字符串操作和基本的 JSON 函数。脚本将运行 5 秒,然后该进程将被终止,我该如何实现?
如何在服务器端运行不受信任的代码?
我在此类问题 ( vm2
, jailed
) 中提到的所有库都试图隔离node
进程本身。那些“牢笼”不断被打破,并且高度依赖于未来对node
标准库的升级,以免暴露另一个攻击媒介。
另一种方法是V8::Isolate
直接使用该类。它旨在隔离 Google Chrome & 中的 JavaScript node
,因此您可以期望它得到全面维护,并且比您、我或单个库维护者所能做到的更安全。这个类只能运行 "pure" JavaScript
。它具有完整的 ECMAScript 实现,但没有浏览器 API 或node
API。
这是Cloudflare
用于他们的Worker产品的内容。
deno
是由node
的创建者开发的新语言,默认情况下使用完全相同的东西并根据您启用的标志公开标准库的一部分,具有沙盒的野心。
在一个node
环境中,您可以使用isolated-vm
. 这是一个了不起的库,它v8::Isolate
使用您想要独立运行的代码创建d 个子进程。
它提供了将值和函数传递给隔离并返回的方法。与大多数“监狱”库相比,这并不容易使用,但可以保证您对 JavaScript 代码进行实际沙盒处理。
由于它是“纯”JavaScript,唯一的转义是您以注入函数的形式提供的那些。
此外,它会随着每个node
版本自动更新,因为它使用node
自己的v8::Isolate
.
主要的痛点之一是,如果您想在脚本中注入库,您可能需要使用一个包捆绑器webpack
,以便将所有内容捆绑在一个可由库使用的脚本中。
我个人使用它在爬虫中运行用户提供的代码,以使用用户提供的代码从网页中提取信息,它产生了奇迹。
我最近创建了一个用于对不受信任的代码进行沙箱处理的库,它似乎符合需求(在 Node.js 的情况下在受限进程中执行代码,并在网络浏览器的沙盒 iframe 内的 Worker 中执行代码):
https://github.com/asvd/jailed
有机会将给定的一组方法从主应用程序导出到沙箱中,从而提供任何自定义 API 和一组特权(该功能实际上是我决定从头开始制作库的原因)。提到的数学、正则表达式和字符串相关的东西是由 JavaScript 本身提供的,任何额外的东西都可以从外部显式导出(比如一些与主应用程序通信的函数)。
沙箱的基本思想是,您需要预定义为全局变量的变量来执行某些操作,因此如果您通过取消设置它们或用受控脚本替换它们来拒绝脚本,则无法逃脱。只要你没有忘记任何事情。
首先替换 deny require() 或用受控的东西替换它。不要忘记进程和“全局”又名“根”,困难的是不要忘记任何事情,这就是为什么依靠其他人建立沙箱是好的;-)
Docker.io是一个很棒的新手,它使用LXC和CGroups来创建沙箱。
这是使用Docker和Go Lang的在线要点(类似于codepad.org)的一种实现
这只是为了证明可以在Docker 容器中安全地运行用多种编程语言编写的不受信任的代码,包括node.js
知道回答这个问题为时已晚,猜测以下工具可能是上述答案/评论中未提及的增值。
试图实现类似的用例。在浏览了网络资源后,https ://www.npmjs.com/package/vm2 似乎处理沙箱环境(nodejs)非常好。
它几乎满足了沙箱功能,例如限制对内置或外部module的访问、沙箱之间的数据交换等。