Debian OpenSSL問題のまとめ


初版:2008年5月24日
改訂:2008年6月3日


はじめに


2008年5月13日にDebian系のOS上で動作するOpenSSL、OpenSSHなどで、
RSAやDSA暗号の鍵が予測される可能性があるという脆弱性が報告されました(1)(2)

Debian系のOSのOpenSSLは乱数のタネとしてプロセスIDに基づく数を
使用しており非常に限定された種類の鍵しか生成されないため、
プロセスID総当りで相手の鍵と同じ秘密鍵を生成することができ、
秘密鍵の複製を誰もが持つことができてしまいます。

以下のようなケースでは、鍵のチェックツールで
脆弱な鍵を使っていないか、通信先がそのような鍵を使っていないか
確認した方がいいと思います。

  • Debian系でSSHログインをするための鍵を生成した
  • Debian系でSSLサーバー・クライアント、S/MIME証明書を生成した
  • Debian系でOpenVPNの鍵を生成した
  • OSにかかわらずWindowsであろうが、SolarisであろうがSSHやSSLクライアント認証、OpenVPNなどのサーバーを運営している場合、その通信相手の鍵が特定のDebian系で作られたものでないか?

最後のサーバー側については、相手がDebianを使っているかどうかなど判断できないので、サーバーがDebianであるかは関係なしに全てのSSH、OpenVPNサーバーの利用者は認証されたクライアント鍵のリストに脆弱な鍵が含まれていないか確認した方がよいと思います。

SSLクライアント認証の場合には、可能ならばSSLサーバー管理者が全てのクライアント証明書を持っている場合には、不正な証明書と鍵による認証を受理してしまわないようにチェックをしたほうが良いでしょう。

この脆弱性問題の根が深いと思うのは、単にソフトウェアのセキュリティ
アップデートをかければ問題解決というわけにはいかず、
過去に生成してしまったSSHの鍵やX.509証明書の鍵を入れ替えない限り
問題が解決しないことにあります。

鍵が脆弱かどうかの確認方法


本メモ執筆時点(2008.05.30)では「最新」のdowkdでチェックすることをオススメします。openssl-blacklist-0.1や0.3.1に付属のopenssl-vulnkeyは使い物になりません。
openssh-blacklist-0.1によるチェックも、対象となる鍵の種類が限定的なのでオススメしません。

問題あるパッケージかどうかの確認方法


以下のコマンドにより確認します。

% dpkg -s openssl | egrep Version
Version: 0.9.8c-4 

% dpkg -s libssl0.9.8 | egrep Version
Version: 0.9.8c-4 

ディストリビューションにより修正された版が異なります。
ここに記載されていないものについては、
他で調べてみてください。

ディストリビューション 構築直後 脆弱な版 修正版
Debian 5.0 lenny (2008Q3) 0.9.8g-9以前 0.9.8g-10?
0.9.8g-10.1?
0.9.8g-10+lenny1
Debian Live lenny (2008.04.28) 0.9.8g-8 0.9.8g-9以前
Debian 4.0 etsh (2008.04.08) 0.9.8c-4 0.9.8c-4etch1以前 0.9.8c-4etch3
Debian 3.1 sarge (2005.06.06) 不明 脆弱性無し
Ubuntu 8.04 LTS 0.9.8g-4ubuntu3 0.9.8g-4ubuntu3以前 0.9.8g-4ubuntu3.1
Xubuntu 8.04 (Hardy Helon) 0.9.8g-4ubuntu3 0.9.8g-4ubuntu3以前 0.9.8g-4ubuntu3.1
Kubuntu 8.04 (Hardy Helon) 0.9.8g-4ubuntu3 0.9.8g-4ubuntu3以前 0.9.8g-4ubuntu3.1
Knoppix 5.1.1 (2007.01.05) 0.9.8c-4 0.9.8c-4 不明

dowkd: Debian/OpenSSL Weak Key Detector


dowkdは鍵をチェックするPerlスクリプトで
脆弱性の発覚した初期版(2008.05.15頃)は
OpenSSHおよびOpenVPNの鍵しかチェックできませんでしたが
2008.05.30時点の版ではPEM型式のX.509証明書やPINの無い
PKCS#8 PEM型式の秘密鍵もチェックすることができます。
また、対応しているブラックリストもOpenSSL/OpenSSH/OpenVPN、RSA/DSA、
1024/2048/4096と一番多いのではないかと思います。

以下のURLでダウンロードできます。
http://repo.or.cz/w/dowkd.git
「master」のマークのついた行で「snapshot」をクリックすると
tar.gzアーカイブがダウンロードできます。
解凍し、makeを実行しdowkdスクリプトを生成してください。

openssl-blacklist-0.1 の openssl-vulnkeyはなぜ駄目か


openssl-blacklist-0.1 パッケージに含まれている
openssl-vulnkeyというPythonスクリプトが含まれていますが
脆弱性チェックの対象が
「PINで保護されていないPKCS#8 PEM型式の秘密鍵」
のみとなっています。
PINで保護されないPEM型式の秘密鍵をファイルとして
持っているケースは殆どなく、また、この方法では
相手の証明書が脆弱な鍵を使っているかどうかは
わかりません。

また、ハッシュの一致確認で"Modulus=XXXXXX..."という余計な部分を
含んだもののハッシュで比較しているので脆弱だと一致することはありません。
パッケージに含まれる脆弱なPKCS#8秘密鍵の例 examples/bad_rsa.key を対象に
チェックしてみても、脆弱だと判定できません。

この件に関しては、作者のJamie Strandbogeさんに問い合わせていますが、
回答はありません。(2008.05.30現在)

ちなみに前述の dowkd を使えば正しく脆弱であると判定できます。

% dowkd file bad_rsa.key
bad_rsa.key:1: weak key (OpenSSL/RSA/1024)
summary: keys found: 1, weak keys: 1

openssl-blacklist-0.3.1のopenssl-vulnkeyではどうか


2008年5月31日にopenssl-blacklist-0.3.1があって
鍵検証Pythonスクリプト openssl-vulnkey も更新されているようなので
見てみました。0.1と比較して公開鍵証明書もチェックできるようです。

で、サンプルにあるものを再度チェックしてみたところ、

openssl-vulnkey examples/bad_rsa.key
Not blacklisted: ... 中略 ... examples/bad_rsa.key

相変わらず "Modulus=..."をハッシュ対象にしているので、
脆弱性検証ができないままです。

今となっては役に立たない自作のツール(--;


脆弱性報告があった当時(2008.05.15)頃、OpenSSHやOpenVPNの鍵は
チェックできても、X.509公開鍵証明書やその秘密鍵をチェックする
ツールが世に無いことを憂いて作ったX.509公開鍵証明書、
PKCS#8 秘密鍵からSSH2公開鍵を生成するJavaプログラムです。
これを使えば公開鍵証明書もSSHの鍵チェックツールでチェックできます。
(実際に、昔持っていた自分のDebian環境のApacheのサーバー証明書の鍵は
脆弱であることがわかりました。)

今となってはdowkdを使えばいいので、無用の長物ですが、
学習目的で参考いただければ幸いです。


生成される鍵の「場合の数」


今回の問題を含むDebian系OSではプロセスID(1~32767)を元に鍵が作られます。
  • 同じCPUアーキテクチャ
  • 同じ鍵アルゴリズム
  • 同じ鍵長
  • $HOME/.rndファイルの有無(ファイル内容には無関係)かファイルサイズゼロ
では32767通り(もしくは.rndの有無かゼロに配慮するなら32767×3)の鍵しか生成されません。
ブラックリストを見ればおわかりの通り
カテゴリ毎に32767個のリストになっています。

  • 疑問1: 64bit OSの場合でもプロセスID 1~32767しかブラックリストに載っていませんが、これでいいのかな?プロセスID空間もっと広いんじゃないのかな?(2008.06.02)

リンク集



しかし、最初「DSA 1571-1」というのを見て「DSA鍵しか影響なくRSAはOKなんだ~~~」と
勘違いしていたら「Debian Security Announce」の事だったと気づいたのは
私だけでしょうか、、、、、

最終更新:2008年06月11日 12:21