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

Alf*_*oVR 22 javascript linux node.js

我试图在linux + node.js中使用沙盒模块运行不受信任的javascript代码,但它已经坏了,我只需要让用户编写打印出一些文本的javascript程序.不允许其他i/o,只使用普通的javascript,没有其​​他节点模块.如果不是真的可以这样做,你建议用什么其他语言来完成这项任务?我需要的最小特征集是一些数学,正则表达式,字符串操作和基本的JSON函数.脚本将运行让我们说5秒钟顶部,然后该过程将被杀死,我怎么能实现这一点?

Jer*_*ska 9

我在此类问题 ( 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,以便将所有内容捆绑在一个可由库使用的单个脚本中。

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


asv*_*svd 8

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

https://github.com/asvd/jailed

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


axk*_*ibe 3

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

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