OpenSSL クライアントにおけるホスト名検証バイパス脆弱性 (CVE-2013-4073)

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) 初版