我希望能够运行不受信任的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种方法:
我想知道是否有人有任何建议以功能方式运行不受信任的ruby代码?你会推荐什么选择?你会怎么做?感谢。
答案 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
让我知道你的想法!