这是我目前对Ruby中安全eval
的实现:
$mthread = Thread.new {}
class SafeEval
def self.safeEval code
$killed = false
$mthread = Thread.new {
$SAFE = 4
result = begin
eval code
rescue Exception => e
"Error in eval: #{e}"
end
Thread.current[:evalResult] = result
}
Thread.new {
sleep 3
if $mthread.alive?
$killed = true
Thread.kill $mthread
end
}.join
$mthread.join
$killed ? 'Error in eval: Maximum execution time reached' : String($mthread[:evalResult])
end
end
它使用$SAFE = 4
。从我的理解以及我阅读的这篇文章中,这还不足以阻止安全漏洞。但是,如果我设置了最大执行时间,并在时间到期后杀死运行代码的线程,那么对于安全的eval
?
如果不是,为什么不安全?还有漏洞吗?是否有任何方法可以防止这些漏洞?
安全性并不是要说"哦,如果不到4s的运行,则没有不信任的代码会造成麻烦。安全首先不让不受信任的代码在严格的沙盒环境之外执行任何地方。
您为什么在此处使用评估?你想达到什么目的?
编辑 - 我是个白痴,忽略,我读到这是一个超时,而不是一个级别。:p也就是说,这在我当地的机器上非常有效:
$mthread = Thread.new {}
class SafeEval
def self.safeEval code
$killed = false
$mthread = Thread.new {
$SAFE = 4
result = begin
eval code
rescue Exception => e
"Error in eval: #{e}"
end
Thread.current[:evalResult] = result
}
Thread.new {
sleep 3
if $mthread.alive?
$killed = true
Thread.kill $mthread
end
}.join
$mthread.join
$killed ? 'Error in eval: Maximum execution time reached' : String($mthread[:evalResult])
end
end
SafeEval.safeEval("`cat /etc/passwd > /Users/usr/development/source/tests/test.txt`")
在具有邮件客户端或其他连接到远程服务器的方法的Web服务器上运行该代码,并且攻击者可以在计算机上建立用户帐户,然后从那里进行社交工程以恢复密码。
沙箱很重要,因为它可以防止类似上述内容。$ Safe本身还不够由攻击者。
如果您考虑'能够杀死bot'作为安全漏洞,则$ safe = 4不够安全,正如我们在测试时发现的那样。
人们可以执行此操作,而不会获得"不安全评估"错误:
loop { Thread.start { loop{} } }
这在3秒内启动了许多线程,在足够的执行后,这将创建很多线程,并在测试时杀死了机器人。
或以下:
Thread.start { loop { Thread.start { loop {} } } }
它启动了一个线程,该线程不断生成其他线程。超时不会停止此。