如何创建沙盒RSpec环境?

Ale*_*lan 5 ruby rspec jruby sandbox

本质上,我想创建一个程序来运行一些不受信任的代码来定义一些方法或类,然后对它运行一个不受信任的rspec规范.

我已经研究了一下沙盒Ruby,这个来自rubyconf的视频特别有用.在查看了几个解决方案之后,看起来最有用的两个解决方案是rubycop,它基本上对代码进行静态分析,以及jruby沙箱(均在上面的视频中介绍).我的直觉告诉我,犹豫不决的沙箱可能更安全,但我可能错了.

这是我想要做的完全不安全的例子:

code = <<-RUBY
class Person
  def hey
    "hey!"
  end
end
RUBY

spec = <<-RUBY
describe Person do
  let(:person) { Person.new }

  it "says hey" do
    person.hey.should == "hey!"
  end
end
RUBY

# code and spec will be from user input (unsafe)

eval code
require 'rspec/autorun'
eval spec
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但代码显然需要沙箱.在一些天才提交之前system("rm -rf /*"),fork while fork或者同样危险的事情将是几分钟.

我用jruby沙箱做了各种尝试......

sand = Sandbox::Safe.new
sand.eval("require 'rspec/autorun'")
sand.activate! # lock it down
sand.eval code
puts sand.eval spec
Run Code Online (Sandbox Code Playgroud)

该代码抛出此异常:

Sandbox::SandboxException: NoMethodError: undefined method `require' for #<RSpec::Core::Configuration:0x7c3cfaab>
Run Code Online (Sandbox Code Playgroud)

这是因为RSpec在沙箱被锁定后尝试需要一些东西.

所以,我尝试强制RSpec在沙箱被锁定之前通过调用空来要求东西describe:

sand = Sandbox::Safe.new
sand.eval("require 'rspec/autorun'")
sand.eval("describe("") { }")
sand.activate! # lock it down
sand.eval code
sand.eval spec
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

Sandbox::SandboxException: NameError: uninitialized constant RSpec
Run Code Online (Sandbox Code Playgroud)

这基本上意味着RSpec沙盒中不存在.这是奇怪的,考虑sand.eval("require 'rspec/autorun'")返回true,并且前面的示例实际工作(RSpec的自动加载器开始运行).

这可能是宝石和这个特殊沙箱的问题.沙箱对象实际上支持一个#require基本上绑定的方法,Kernel.require因此无法加载gem.

它开始看起来像使用这个沙箱可能不太可能与rspec.主要问题是尝试将其实际加载到沙箱中.我甚至试过这样的事情:

require 'rspec'
sand.ref(RSpec) # open access to local rspec
Run Code Online (Sandbox Code Playgroud)

但它没有任何一个.

所以,我的问题是双重的:

  • 有没有人对如何使用jruby沙箱有任何好主意?
  • 如果没有,rubycop有多安全?显然,codechool使用它,所以它必须经过相当好的测试......能够使用ruby 1.9而不是jruby会很好.

Ena*_*ane 0

看起来沙盒环境没有加载捆绑包/宝石集。如果您使用的是 gemset 或其他东西,RVM 可能会出现问题。

一旦沙盒化,人们可能会尝试再次加载捆绑包。

我会看看 ruby​​ 污染模式

$SAFE   The security level
0 --> No checks are performed on externally supplied (tainted) data. (default)
1 --> Potentially dangerous operations using tainted data are forbidden.
2 --> Potentially dangerous operations on processes and files are forbidden.
3 --> All newly created objects are considered tainted.
4 --> Modification of global data is forbidden.
Run Code Online (Sandbox Code Playgroud)