$SAFE = 4 和定时执行限制是否足以防止 eval 在 Ruby 中出现安全漏洞?



这是我目前对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 {} } } }

它启动了一个线程,该线程不断生成其他线程。超时不会停止此。

最新更新