如何在安全的沙箱中运行不受信任的Ruby代码?
我希望能够运行非受信任的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
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代码作为一种功能。解决方案不必看起来像我上面写的代码,我只是用它来说明我想要什么
现在,我可以想出三种方法:
我想知道是否有人对以功能性方式运行不受信任的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安全策略重新定义安全级别,因为那时我们没有手动检查来强制执行。