「OpenSSL/Debian脆弱性/DebianのOpenSSLはどのように修正されたか」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
* 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,脆弱性