※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

DebianのOpenSSLはどのように修正されたか


初版 2008年6月2日

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リリース) で修正された

ということになっています。

ウェブからは古いコードは取得できないようですが
http://packages.debian.org/etch/openssl
FTPからはダウンロードできるようです。
ftp://ftp.debian.org/debian/pool/main/o/openssl/
  • 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つの部分を必ず実行されないようにしてしまったのだと思います。
このため、直前の乱数生成の結果が次の乱数に生かされず、
乱数は必ず同じ値となってしまっていた、、、
ということのようです。

処理の意味をわからないまま、コメントアウトしてしまっていたのは、
すこしおっかないですね。