如何安全地让用户运行任意Ruby代码?

时间:2010-04-03 23:19:27

标签: ruby

我意识到这听起来有点疯狂,但我正在开发一个项目,我需要一个服务器来运行用户提供的Ruby代码并返回结果。

我希望阻止这样的事情:

system("rm -rf /")
eval("something_evil")
# etc...

我确信必须有一些合理安全的方法,因为它已经存在于tryruby.org这样的地方。非常感谢任何帮助,谢谢!

4 个答案:

答案 0 :(得分:6)

三点建议:

1)看一下Ruby taint levels。这为eval('evil_code')类型的东西等提供了一定程度的保护。

2)除非用户实际需要访问本地文件系统,否则请使用fakefs

之类的内容

3)无论你做什么follow Tronic's suggestion(设置起来都很痛苦,但有限的chroot jails是确保用户无法访问你没有明确要求的资源的唯一方法)。

答案 1 :(得分:3)

使用允许系统调用的白名单运行程序ptraced,作为用户/组nobody,具有资源限制(内存使用等),在最小的chroot中。

答案 2 :(得分:2)

“空白石板”是剥离(大部分)其方法的对象。 “洁净室”是您评估潜在不安全房间的对象。 如果您在“洁净室”中评估代码,这也是一个“空白板”,将安全级别提升到最高水平,您将获得大量保护。安全性无关紧要,因此这应该被视为安全层中的一层,而不一定是唯一的层。

This answer shows how to do it

答案 3 :(得分:0)

我遇到了同样的问题但后来遇到了eval.so并决定为它编写一个API包装器,名为Sandie。这很简单:

sandie = Sandie.new(language: 'ruby')
# => #<Sandie:0x00000002e30650>
sandie.evaluate(code: 'puts "hello world"')
# => {"stdout"=>"hello world\n", "stderr"=>"", "wallTime"=>487, "exitCode"=>0}

它还支持许多其他语言,如C#,Perl,Lua和Java。