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

问题描述:

我意识到这听起来有点疯狂,但我正在为一个项目工作,我需要一个服务器来运行用户提供的Ruby代码并返回结果。如何安全地让用户运行任意的Ruby代码?

我期待,以防止这样的事情:

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

我敢肯定,必须有一些合理的安全做到这一点的方式,因为它已经在像tryruby.org的地方存在。任何帮助非常感谢,谢谢!

三点建议:

1)看看红宝石taint levels。这提供了一定程度的打击,eval('evil_code')类的东西保护等

2)除非用户的实际需要访问本地文件系统,使用类似fakefs

3)不管你做什么其他follow Tronic's suggestion(可是一个痛苦的设置,但有限的chroot*是确保用户无法访问你不明确希望他们访问的资源的唯一方法。)

以最少chroot的资源限制(内存使用情况等)作为用户/组nobody,以允许的syscalls白名单运行程序。

“空白石板”是剥离了其大部分方法的对象。 “洁净室”是您评估潜在不安全房间的对象。 如果您在“洁净室”中评估代码,该代码也是“空白石板”,将安全级别调高至最高,您将为自己提供很大的保护。没有什么安全是可以肯定的,所以这应该被视为你的安全层,不一定只是层。

This answer shows how to do it

我有同样的问题,但随后遇到了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。