DebianのOpenSSLはどのように修正されたか
Debian OpenSSL脆弱性問題のまとめはこちらを、最新のSSLブラックリストの更新履歴のまとめはこちらをご覧ください。m(_ _)m
今回のDebian OpenSSL問題に関して例えば、
Debian etsh ディストリビューションの場合
opensslのバージョンでいえば
- openssl-0.9.8c-4etch1 (2007.10.02リリース) は修正前
- openssl-0.9.8c-4etch3 (2008.05.14リリース) で修正された
ということになっています。
- openssl_0.9.8c.orig.tar.gz
- openssl_0.9.8c-4etch1.diff.gz
- openssl_0.9.8c-4etch3.diff.gz
4etch1, 4etch3 のソースは共にオリジナルに対するパッチの
形で提供されています。
4etch1, 4etch3 の差分をとり、
どこに問題があり、どのように修正されたかを
見てみることにしました。
4etch1から4etch3で更新されたファイル一覧は以下の通りになります。
ファイル |
備考 |
crypto/bn/bn_mont.c |
4etch2のMontgomery multiplicationの修正 |
crypto/rand/md_rand.c |
MessageDigestを利用した乱数生成器?これですね |
debian/changelog |
変更履歴 |
debian/libssl0.9.8.postinst |
バージョン比較文字列の変更のみ |
include/openssl/dtls1.h |
4etch2のDTLSの修正か? |
include/openssl/ssl.h |
4etch2のDTLSの修正か? |
ssl/d1_both.c |
4etch2のDTLSの修正か? |
ssl/dtls1.h |
4etch2のDTLSの修正か? |
ssl/ssl.h |
4etch2のDTLSの修正か? |
ssl/ssl_err.c |
4etch2のDTLSの修正か? |
結局、問題のありそうなのは crypto/rand/md_rand.c のみのようです。
こちらがオリジナルの0.9.8cのコード
static void ssleay_rand_add(const void *buf, int num, double add)
... 中略 ...
MD_Update(&m,buf,j); // 274行目あたり
こちらが0.9.8c-4etch1のコード
static void ssleay_rand_add(const void *buf, int num, double add)
... 中略 ...
/*
* Don't add uninitialised data.
MD_Update(&m,buf,j); // 274行目あたり
*/
そしてこちらが0.9.8c-4etch3のコード
static void ssleay_rand_add(const void *buf, int num, double add)
... 中略 ...
MD_Update(&m,buf,j); // 274行目あたり
結局、オリジナルのコードでは問題が起きてなかったものを
「初期化されていないから」という理由でコメントアウトしてしまい、
プロセスIDのみに依存し、乱数とはならなくなってしまい、
4etch3では、元に戻したということのようで、
オリジナルのOpenSSL-0.9.8cには問題がなく0.9.8c-1から0.9.8c-4etch1まで
にあったDebian固有の問題であったことがわかります。
これと類似処理の除外は
#ifndef PURIFY
#if 0 /* Don't add uninitialised data. */
MD_Update(&m,buf,j); /* purify complains */ // 470行目あたり
#endif
#endif
にもあって、必ず MD_Updateが実行されないようになっています。
ご存知の方もおられると思いますが、Purifyとは有名な
「ソースコードのメモリリーク発見ソフト」です。
メモリ初期化エラーが出たため、Debianでは
2つの部分を必ず実行されないようにしてしまったのだと思います。
このため、直前の乱数生成の結果が次の乱数に生かされず、
乱数は必ず同じ値となってしまっていた、、、
ということのようです。
処理の意味をわからないまま、コメントアウトしてしまっていたのは、
すこしおっかないですね。
最終更新:2008年06月20日 10:58