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

如何在安全的沙箱中运行不受信任的Ruby代码?,ruby,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

我希望能够运行非受信任的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代码作为一种功能。解决方案不必看起来像我上面写的代码,我只是用它来说明我想要什么

现在,我可以想出三种方法:

  • 使用上面的$SAFE level构造
  • 为什么LuckyStiff有一个用于ruby的沙盒插件
  • 我可以在自己的虚拟机中运行每个功能,使用某种操作系统虚拟化软件,如vmware或Xen等

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

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

    不安全通常意味着敌意。如果你可以从敌对状态放松下来,比如说“幼稚”,并根据你的应用程序的要求,你可以在Ruby中使用沙箱。这并不是语言设计中的一流场景

    尽管如此,您可能不需要进入机器级别的分离。在单独生成的流程中使用沙箱会让我感觉非常安全,你的应用程序可以作为流程管理器来杀死任何试图挂起/烧掉的程序。现在,这比上面的简单块多了几个数量级的工作量


    但请记住并不断重复,“安全不能处理敌对行为”。

    我强烈建议只使用JRuby


    JVM从一开始就内置了一个非常强大的安全模型,JRuby piggy也支持这一点。您可以限制对文件的访问,限制代码的加载,等等。它比原生Ruby impls中的任何东西都要好得多,而且有许多站点在JRuby上运行沙盒,用户可以访问的站点正是出于这个目的。

    $SAFE
    并不能保护您免受恶意黑客的攻击

    沿着这条路走下去(请参阅),我遵循了评论者的sage建议,并嵌入了一个特定于应用程序的解释器,该解释器使我能够完全控制哪些事情可以做,哪些事情不能做(请参阅)


    事实证明,使用stickup非常简单(从下载gem到定制解释器不到一个小时)——请参见

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

    您可以在此处阅读更多信息:


    让我知道你的想法

    有人有任何参考资料来解释$SAFE的错误吗?+1,但是作为记录,JRuby目前没有完全实现
    $SAFE
    ,是吗?没有,我们没有,主要是因为检查必须在整个代码库中进行,而且几乎没有办法证明您已经涵盖了所有内容。我想根据JVM安全策略重新定义安全级别,因为那时我们没有手动检查来强制执行。