Posted by nahi on 27 Jun 2013
Translated by hsbt
Ruby の SSL クライアントに信頼された証明書を用いて認証されたサーバーになりすまして 中間者攻撃を可能とする脆弱性が報告されました。
この脆弱性は CVE-2013-4073 として CVE に登録されています。
脆弱性の概要
Rubyの SSL クライアントはホストネームが一意であることをチェックする機構を持っていますが、 その機構は null バイト文字が含まれている証明書のホストネームを適切に処理することができません。
脆弱性の詳細
Ruby の SSL クライアントは OpenSSL::SSL.verify_certificate_identity
に RFC2818 の
サーバー一意性チェックを実装していますが、 null バイト文字を含んだ X509 の subjectAltName 内の
ホストネームを適切に処理出来ません。
lib/openssl/ssl.rb
の実装では OpenSSL::X509::Extension#value
を
subjectAltName の識別子を取得するために使用しています。Extension#value
は
OpenSSL の X509V3_EXT_print()
と subjectAltName の dNSName という値に依存し、
null バイト文字を安全に処理できない sprintf()
を使用します。
結果として、Extension#value
は subjectAltName として ‘www.ruby-lang.org\0.example.com’ が
与えられた際に ‘www.ruby-lang.org’ を返し、OpenSSL::SSL.verify_certificate_identity
は
‘www.ruby-lang.org’ を誤った識別子として認証してしまいます。
subjectAltName に null バイト文字を持ったサーバー証明書を認証局や SSL クライアントが許可してしまう時、 リモートの攻撃者は ‘www.ruby-lang.org\0.example.com’ を ‘www.ruby-lang.org’ として信頼させ、 同時に Ruby の SSL クライアントと SSL サーバー間の中間者攻撃を可能とします。
影響するバージョン
- ruby 1.8.7 patchlevel 374 より前の全ての ruby 1.8 系列
- ruby 1.9.3 patchlevel 448 より前の全ての ruby 1.9 系列
- ruby 2.0.0 patchlevel 247 より前の全ての ruby 2.0 系列
- trunk のリビジョン 41671 より前の全ての ruby 開発バージョン
回避策
脆弱性を修正した Ruby 2.0.0-p247, 1.9.3-p448 もしくは 1.8.7-p374 へのアップグレードを行ってください。
クレジット
この脆弱性は William (B.J.) Snow Orvis 氏によって発見され、iSEC Partners の David Thiel 氏 によって security@ruby-lang.org に報告されました。
更新履歴
- 2013-06-27 20:00:00(JST) 初版