以下は2009年1月に社内ブログに書いた記事です。この記事の後、bindにも同じ脆弱性が見つかりました。さすがにもう出尽くしたでしょうか。
2009年、OpenSSLはこの後も、0.9.8k(DoSおよびCMS脆弱性)、0.9.8l(SSLプロトコル脆弱性)と脆弱性にあわせた緊急リリースが続きました。開発版としては2009年4月1日に、唐突に1.0.0 betaがリリースされ(誰もがエイプリルフールと思ったはず)、今日までに1.0.0 beta5まで進んでいます。0.9.8系も先日0.9.8m beta1がリリースされ、久しぶりに(緊急リリースでない)開発版リリースでした。
……………………
OpenSSLのSSL client実装に問題があり、DSA署名検証に、誤って成功してしまうことがあったとのことです。OpenSSL Security Advisory [07-Jan-2009]。
影響範囲は任意のSSL serverによるDSA署名の検証を行う、OpenSSLで作られたSSL client(ECDSAも同様の影響を受けます)。ということで、Advisoryの"Who is affected?"では「接続先のSSLサーバがDSA鍵によるサーバ証明書の場合は危険、それ以外は安全」と言ってるんだけど、接続先の鍵種別を気にして利用していることはほとんどないはずで、基本SSL clientは更新必須です。
とはいえ、過去の例から言っても、OpenSSLの脆弱性についての修正は基本どこにでも導入されるべきものだし、また特段の理由がなければ導入されてるはず。問題は別のところにあります。
今回の大元の原因は、OpenSSLのSSL実装が、OpenSSLのDSA署名検証関数EVP_VerifyFinalの戻り値の処理を間違えていたこと。戻り値は0、-1、1の3値ありますが、OpenSSL内部で、その利用方法を間違えてたくらい、わかりにくい(もしくは途中で変更されたのが、周知徹底されなかった?)。
EVP_VerifyFinalは署名検証用に広く利用されているAPIで、OpenSSLに依存するプロジェクトで、広く使われています。Netcraftによれば、NTP、Sun Grid Engineにも同様の問題があるとのこと。今後脆弱性修正が続くはずで、注意しないといけません。
ちなみにOpenSSH(openssh-5.1p1)を見てみたところ、EVP_Verify*系は使っておらず、自身で解析してDSA_do_verifyしていました。DSA_do_verifyも結局は同じことで、その戻り値は適切にチェックしないといけないのですが、ちゃんと1/0/-1を使い分けてありました。さすがです。



コメント