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

时间:2008-10-03 23:26:42

标签: 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代码作为一种功能。解决方案不必看起来像我上面写的代码,我只是用它来说明我想要的。

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

  1. 使用上面的$ SAFE级别构造。
  2. whytheluckystiff有一个ruby的沙盒插件
  3. 我可以使用某种os虚拟化软件(如vmware或Xen等)在自己的虚拟机中运行每个功能。
  4. 我想知道是否有人有任何建议以功能方式运行不受信任的ruby代码?你会推荐什么选择?你会怎么做?感谢。

4 个答案:

答案 0 :(得分:12)

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

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

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

但请记住并不断重复,“国家外汇管理局不能处理敌意”。

答案 1 :(得分:3)

我强烈建议您使用JRuby。

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

答案 2 :(得分:3)

$SAFE并不能保护您免受恶意黑客所做的一切攻击。

沿着这条路走下去(见Ruby: creating a sandboxed eval?),我遵循了评论者的圣训建议并嵌入了一个特定于应用程序的解释器,让我完全控制了可以做什么和不能做什么(见Ruby: looking for ruby-embeddable interpreter or scripting language })。

使用粘贴效果非常简单(比如将宝石下载到自定义解释器不到一个小时) - 请参阅https://github.com/jcoglan/stickup

答案 3 :(得分:1)

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

您可以在此处详细了解: https://github.com/vaharoni/trusted-sandbox

让我知道你的想法!