「OpenSSL/Debian脆弱性/DebianのOpenSSLはどのように修正されたか」の編集履歴(バックアップ)一覧はこちら

OpenSSL/Debian脆弱性/DebianのOpenSSLはどのように修正されたか」(2008/06/20 (金) 10:58:06) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

* DebianのOpenSSLはどのように修正されたか #right() { 初版 2008年6月2日 } 今回の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つの部分を必ず実行されないようにしてしまったのだと思います。 このため、直前の乱数生成の結果が次の乱数に生かされず、 乱数は必ず同じ値となってしまっていた、、、 ということのようです。 処理の意味をわからないまま、コメントアウトしてしまっていたのは、 すこしおっかないですね。 // タグ Debian,OpenSSL,OpenSSH,脆弱性
* DebianのOpenSSLはどのように修正されたか #right() { 初版 2008年6月2日 } >&i(){Debian OpenSSL脆弱性問題のまとめは[[こちら>OpenSSL/Debian脆弱性]]を、最新のSSLブラックリストの更新履歴のまとめは[[こちら>OpenSSL/Debian脆弱性/ブラックリストのメモ]]をご覧ください。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つの部分を必ず実行されないようにしてしまったのだと思います。 このため、直前の乱数生成の結果が次の乱数に生かされず、 乱数は必ず同じ値となってしまっていた、、、 ということのようです。 処理の意味をわからないまま、コメントアウトしてしまっていたのは、 すこしおっかないですね。 // タグ Debian,OpenSSL,OpenSSH,脆弱性

表示オプション

横に並べて表示:
変化行の前後のみ表示: