如何在服务器端运行不受信任的代码?

IT技术 javascript linux node.js
2021-01-28 10:48:57

我正在尝试使用沙箱module在 linux + node.js 中运行不受信任的 javascript 代码,但它坏了,我只需要让用户编写 javascript 程序来打印一些文本。不允许使用其他 i/o,只使用普通的 javascript,没有其​​他节点module。如果真的不可能做到,那么您建议使用哪种其他语言来完成此类任务?我需要的最小功能集是一些数学、正则表达式、字符串操作和基本的 JSON 函数。脚本将运行 5 秒,然后该进程将被终止,我该如何实现?

6个回答

我在此类问题 ( vm2, jailed) 中提到的所有库都试图隔离node进程本身。那些“牢笼”不断被打破,并且高度依赖于未来对node标准库的升级,以免暴露另一个攻击媒介。

另一种方法是V8::Isolate直接使用该类。它旨在隔离 Google Chrome & 中的 JavaScript node,因此您可以期望它得到全面维护,并且比您、我或单个库维护者所能做到的更安全。这个类只能运行 "pure" JavaScript它具有完整的 ECMAScript 实现,但没有浏览器 API 或nodeAPI。
这是Cloudflare用于他们的Worker产品的内容。

deno是由node的创建者开发的新语言,默认情况下使用完全相同的东西并根据您启用的标志公开标准库的一部分,具有沙盒的野心。

在一个node环境中,您可以使用isolated-vm. 这是一个了不起的库,它v8::Isolate使用您想要独立运行的代码创建d 个子进程。

它提供了将值和函数传递给隔离并返回的方法。与大多数“监狱”库相比,这并不容易使用,但可以保证您对 JavaScript 代码进行实际沙盒处理。
由于它是“纯”JavaScript,唯一的转义是您以注入函数的形式提供的那些。
此外,它会随着每个node版本自动更新,因为它使用node自己的v8::Isolate.
主要的痛点之一是,如果您想在脚本中注入库,您可能需要使用一个包捆绑器webpack,以便将所有内容捆绑在一个可由库使用的脚本中。

我个人使用它在爬虫中运行用户提供的代码,以使用用户提供的代码从网页中提取信息,它产生了奇迹。

“这是 Cloudflare 使用的东西”……什么?你的意思是V8::Isolate在这种情况下,段落间距应该是固定的。
2021-03-31 10:48:57
已调整,但之前对我来说它读得很好。:-)
2021-04-14 10:48:57

我最近创建了一个用于对不受信任的代码进行沙箱处理的库,它似乎符合需求(在 Node.js 的情况下在受限进程中执行代码,并在网络浏览器的沙盒 iframe 内的 Worker 中执行代码):

https://github.com/asvd/jailed

有机会将给定的一组方法从主应用程序导出到沙箱中,从而提供任何自定义 API 和一组特权(该功能实际上是我决定从头开始制作库的原因)。提到的数学、正则表达式和字符串相关的东西是由 JavaScript 本身提供的,任何额外的东西都可以从外部显式导出(比如一些与主应用程序通信的函数)。

沙箱的基本思想是,您需要预定义为全局变量的变量来执行某些操作,因此如果您通过取消设置它们或用受控脚本替换它们来拒绝脚本,则无法逃脱。只要你没有忘记任何事情。

首先替换 deny require() 或用受控的东西替换它。不要忘记进程和“全局”又名“根”,困难的是不要忘记任何事情,这就是为什么依靠其他人建立沙箱是好的;-)

Docker.io是一个很棒的新手,它使用LXCCGroups来创建沙箱。

这是使用DockerGo Lang在线要点(类似于codepad.org)的一种实现

这只是为了证明可以Docker 容器中安全地运行用多种编程语言编写的不受信任的代码,包括node.js

这在2018年仍然如此吗?
2021-03-15 10:48:57
Docker 并非设计为隔离工具。它旨在简化应用程序的“打包”和分发。这并不是说这是完全不安全的(例如参见此处),而是安全性不是他们设计原则的一部分,将其表示为“沙盒工具”是完全错误的。据我所知,对不受信任的代码进行沙箱处理的标准方法是使用虚拟机,或者 - 对于支持它的解释语言(例如:pypy) - 解释器“沙箱选项”...
2021-03-16 10:48:57
感谢你的分享!我将您提到的要点捆绑到一个 Ruby gem 中:github.com/vaharoni/trusted-sandbox它允许使用 Ruby 运行不受信任的代码,但可以通过使用 ruby​​ Racer 轻松运行 JS。它允许设置磁盘配额、限制内存、CPU 共享等。
2021-04-01 10:48:57
应删除此答案以防止混淆,容器已被定义为不适合作为任何与安全相关的隔离工具。
2021-04-05 10:48:57

知道回答这个问题为时已晚,猜测以下工具可能是上述答案/评论中未提及的增值。

试图实现类似的用例。在浏览了网络资源后,https ://www.npmjs.com/package/vm2 似乎处理沙箱环境(nodejs)非常好。

它几乎满足了沙箱功能,例如限制对内置或外部module的访问、沙箱之间的数据交换等。

嘿,你能看看这个问题吗?stackoverflow.com/questions/65355966/...
2021-03-22 10:48:57