CVE-2018-16395: OpenSSL::X509::Name の同一性判定が機能していない脆弱性について

Ruby の標準添付ライブラリ openssl では OpenSSL::X509::Name クラスによって X.509 証明書で用いられる形式の名前データを扱うことができます。 ところが、このクラスのインスタンス同士を比較した場合、データの内容によっては、本来一致とみなされるべきではないものが一致しているとみなされてしまうという脆弱性が発見されました。 この脆弱性は、CVE-2018-16395 として登録されています。

詳細

OpenSSL::X509::Name クラスでは、インスタンス内に、CN や C といった X.509 証明書内で用いられる形式の名前データの各要素を保持しています。 インスタンス同士の比較の際には、同じキーを持つ要素の値同士の比較が行われ、同じキーセットを保持し、かつ、全ての要素の値が一致した場合にのみ、インスタンス同士が一致していることになります。 ところが、要素の値の判定時に、レシーバ側(左辺)の要素の値に対して引数側(右辺)の要素の値が前方一致している場合にも、要素の値同士の比較が一致とみなされるという不具合が存在していました。 このため、意図的にそのように作成された X.509 証明書を既存のものと比較した場合、誤って一致していると判定されてしまう可能性があります。

この問題の影響を受けるバージョンの Ruby のユーザーは、速やかに問題の修正されたバージョンに更新するか、または、Ruby 2.4 系列以降であれば下記の回避策を適用してください。

影響を受けるバージョン

  • Ruby 2.3.7 以前の全ての Ruby 2.3 系列
  • Ruby 2.4.4 以前の全ての Ruby 2.4 系列
  • Ruby 2.5.1 以前の全ての Ruby 2.5 系列
  • Ruby 2.6.0-preview2 以前の全ての Ruby 2.6 プレビュー
  • revision 65139 より前の開発版

回避策

Ruby 2.4 以降の系列を使用している場合は、openssl gem バージョン 2.1.2 以降をインストールすることによっても、この脆弱性を修正した openssl 拡張ライブラリを使用することができます。

gem install openssl -v ">= 2.1.2"

なお、Ruby 2.3 系列においては、openssl gem をインストールしても、Ruby 本体に添付されている版の openssl 拡張ライブラリが使用されてしまうため、この脆弱性を解決することができません。 Ruby 本体ごと更新を行ってください。

クレジット

この脆弱性情報は、Tyler Eckstein 氏によって報告されました。

更新履歴

  • 2018-10-17 23:00:00 (JST) 初版
  • 2018-10-19 09:00:00 (JST) 開発版の修正revisionについて追記