如何提供在线红宝石REPL?

时间:2016-09-26 02:51:50

标签: ruby security eval read-eval-print-loop irb

在像www.codewars.com这样的网站上,可以在某种沙盒中运行ruby,几乎与IRB相同。

这实际上如何运作?

如果提交的代码为eval() d,那么是什么阻止我提交system("rm -rf *")或重新定义基本功能,以便50%的时间Array.sort实际运行{{ 1}}?

1 个答案:

答案 0 :(得分:2)

最简单,最安全的解决方案是在单独的计算机上运行Ruby代码,每次运行后都会擦除并重新安装。然而,这也是一个非常重要的解决方案。

更轻量级,但(几乎)安全,将使用虚拟机或容器而不是整个单独的计算机,例如使用带有ramfs覆盖的只读文件系统,每次运行后都会卸载。 (或者只是扔掉并重新创建容器。)

您还可以将JRuby与JVM的安全功能一起使用(或使用CLI的IronRuby)。 JVM具有JVM程序的沙盒功能,毕竟,JRuby只是一个与其他任何程序一样的Java程序。

最后,您可以编写自己的Ruby实现,并考虑沙盒,或修改现有的实现。上面的三个选项相当简单,这个很难,因为大多数Ruby实现都不是为沙盒设计的。例如,TryRuby.Com以这种方式工作,并且为Ruby 1.9更新它需要花费大量时间,因为它最初基于MRI的修改版本,但MRI不支持Ruby 1.9。因此,实现必须切换到YARV,并且许多使其成为沙盒安全的修改必须从头开始重新实现。 (上面的JRuby / IronRuby选项与此类似,但是您推迟了将实现沙箱安全的工作推向其他人,例如Oracle或Microsoft。)

一个不太安全但也很简单的解决方案是在受限制的用户帐户下运行解释器。

当然,您可以结合多种方法进行纵深防御,例如,在单独的VM上的受限用户帐户下运行沙盒解释器。

的作用是在运行代码之前对代码进行静态分析。讨厌的停机问题困扰着我们。