2008-10-03 48 views
13

我想能够运行不可信的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有一个红宝石沙盒插件
  3. 我可以在自己的虚拟机上运行每个功能,使用某种类型的os虚拟化软件,如vmware或Xen等。

我想知道是否有人有任何建议运行不可信的Ruby代码的功能方式?你会推荐什么样的选择?你会怎么做呢?谢谢。

回答

12

$ SAFE是不够的;你至少需要达到Why's freaky sandbox的水平。但是,我不知道沙箱代码是否被主动维护,或者他/他们是否曾经解决过诸如无限循环等漏洞。

不安全通常意味着敌对。如果你可以从敌对的环境中放松一下,比如说'天真',并且根据你的应用的需求,你可能会放弃在Ruby中使用沙盒。这不是语言设计中的一流场景。

尽管如此,你可能不需要去分离的机器级别。在单独产生的过程中使用沙箱,我感觉非常安全,您的应用程序可以作为流程管理器来阻止任何设置挂起/熄灭的任务。现在,这比您上面的简单模块多几个数量级的工作。

但请记住并不断重复,“外管局不能对付敌意”。

+3

有没有人有任何解释$ SAFE有问题的参考? – sheldonh 2011-12-19 15:28:52

3

我强烈建议只使用JRuby。

JVM从一开始就内置了一个非常强大的安全模型,而JRuby从中掏腰包。您可以限制对文件的访问,限制代码的加载等等。它比好于本地Ruby impls中存在的任何东西,并且有许多站点在JRuby上运行沙箱,用户可访问的站点就是为了这个目的。

+0

+1,但为了记录,JRuby目前没有完全实现`$ SAFE`,是吗? – 2012-03-20 21:57:41

3

$SAFE不能保护您免受恶意黑客可以做的一切事情。

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

它竟然是用粘贴非常容易(像不到一个小时从网上下载的宝石定制解释器) - 见https://github.com/jcoglan/stickup

1

我创建了一个名为“信任的沙箱”宝石运行Ruby代码在一个完全控制的Docker容器内。您可以禁用网络,设置磁盘配额,限制执行时间,与其他正在运行的容器平衡CPU,设置内存限制等。开销相当低。

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

让我知道你在想什么!