如何在安全的沙箱中运行不受信任的Ruby代码?

我希望能够运行不受信任的ruby代码。 我希望能够将变量传递给它可能使用的所述不受信任的代码。 我也希望代码将结果返回给我。 这是我正在思考的一个概念性例子

input = "sweet" output = nil Thread.start { $SAFE = 4 #... untrusted code goes here, it uses the input variable(s) #to calculate some result that it places in the output variable } #parse the output variable as a string. 

只是为了澄清,我基本上使用不受信任的代码作为函数。 我想提供一些输入,然后允许它写入输出。 这就是我真正想要的,我不在乎它是如何完成的,我只是希望能够使用不受信任的Ruby代码作为一种function。 解决方案不必看起来像我上面写的代码,我只是用它来说明我想要的东西。

现在,我现在可以想到3种方法:

  1. 使用上面的$ SAFE级别构造。
  2. whytheluckystiff有一个用于ruby的Sandbox插件
  3. 我可以使用某种os虚拟化软件(如vmware或Xen等)在自己的虚拟机中运行每个function。

我想知道是否有人有任何建议以function方式运行不受信任的ruby代码? 你会推荐什么选择? 你会怎么做? 谢谢。

$ SAFE是不够的; 你需要至少达到为什么是怪异的沙盒。 但是,我不知道沙箱代码是否得到了积极维护,或者他/他们是否解决了诸如无限循环等漏洞。

不安全通常意味着敌意。 如果你可以放松地对待,比如’天真’,并根据你的应用程序的要求,你可能会在Ruby中使用沙盒。 它并不是语言设计中的第一类场景。

尽管如此,您可能不需要进入机器级别的分离。 在单独生成的进程中使用沙盒时我会感觉非常安全,您的应用程序可以充当进程管理器来杀死任何设置为挂起/火焰的任务。 现在,这比上面的简单块多了几个数量级。

但请记住并不断重复,“安全无法应对敌意”。

我强烈建议使用JRuby。

JVM从一开始就内置了一个非常强大的安全模型,JRuby背负着这个模型。 您可以限制对文件的访问,限制代码加载等等。 它远远优于本机Ruby impls中存在的任何东西,并且有许多站点在JRuby上运行沙盒,用户可访问的站点,正是出于此目的。

$SAFE不会保护您免受恶意黑客所做的一切。

沿着这条路走下去(参见Ruby:创建一个沙箱评估? ),我遵循了评论者的sage建议,并嵌入了一个特定于应用程序的解释器,让我完全控制了可以做什么和不能做什么(参见Ruby:寻找ruby – 嵌入式解释器或脚本语言 )。

事实certificate使用粘贴非常容易(比如将gem下载到定制的解释器不到一个小时) – 请参阅https://github.com/jcoglan/stickup

我创建了一个名为“trusted-sandbox”的gem,它在完全受控的Docker容器中运行Ruby代码。 您可以禁用网络,设置磁盘配额,限制执行时间,平衡CPU与其他正在运行的容器,设置内存限制等。而且开销很低。

你可以在这里阅读更多相关信息: https : //github.com/vaharoni/trusted-sandbox

让我知道你的想法!