$SAFE=4,并且有足够的定时执行限制来防止eval';Ruby中的安全漏洞?

$SAFE=4,并且有足够的定时执行限制来防止eval';Ruby中的安全漏洞?,ruby,security,eval,Ruby,Security,Eval,下面是我目前在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}

下面是我目前在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
。根据我的理解,这还不足以阻止安全漏洞但是,如果我设置了最长执行时间,并在该时间到期后终止运行代码的线程,那么这是否足以进行安全的
评估

如果不是,为什么不安全?还有弱者吗?还有什么方法可以防止这些漏洞呢?

当然,设置执行时间是不安全的。你所要做的就是让执行路径变得不那么可预测

安全性并不是说“哦,如果不受信任的代码运行时间少于4s,它就不会引起麻烦”。安全性从不让不受信任的代码在严格沙盒环境之外的任何地方执行开始

你为什么在这里使用eval?你想完成什么?

编辑-我是个白痴,忽略它,我把它理解为超时,而不是级别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服务器上运行该代码,攻击者可以在您的计算机上建立用户帐户,并从中参与社会工程以恢复密码


沙箱很重要,因为它可以防止上述情况$安全本身并不是足够的,这也是你从来没有把类似于EVE()之类的东西放在一个攻击者能在一个环境中执行不可信代码的任何其他事情的原因之一。

< P>如果你认为“能够杀死BOT”作为安全漏洞,那么$Auth= 4是不够安全的,正如我们在测试时发现的那样

人们可以执行此操作,而不会出现“不安全评估”错误:

loop { Thread.start { loop{} } }
这将在3秒内启动多个线程,在执行足够多的线程后,这将创建大量线程,从而在测试时杀死bot

或者这个:

Thread.start { loop { Thread.start { loop {} } } }

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

您知道$SAFE的设置是什么吗?他并不是说“如果不受信任的代码运行时间不到4秒,任何不受信任的代码都不会造成麻烦”你能证明这是一个易受攻击的漏洞吗?@JanDvorak看到上面经典的“cat/etc/passwd”。现在更好了:-)你能建议一个足够的沙盒解决方案吗?唯一的解决方案是不使用eval。如果需要从不受信任的主机执行“命令”,请在白名单上定义一个固定的命令列表,并且仅允许特定参数,注入或反序列化攻击不会影响服务器。在代码中使用外部世界可以访问的eval是自找麻烦。保护您的系统最简单的方法可能是在一个虚拟机(一个流浪者)中运行此代码,该虚拟机刚刚拥有系统帐户,从您的网络的其余部分进行了防火墙连接,并且在它被拥有时可以重建。