このページでは, 8 月末に「Bugzilla Bug 204676: CVE-2006-4334 gzip multiple issues (CVE-2006-4335, CVE-2006-4336, CVE-2006-4337, CVE-2006-4338)」で報告のあった gzip の Lzh 展開コードにおける脆弱性の, UNLHA32.DLL, UNARJ32.DLL, LHMelt (LMLzh32.dll) への影響と対応状況について記述しています。 詳細については各ソフトのドキュメント等を参照してください。 (2006/09/25 現在, 修正版は公開されていません。)
●LHA, ARJ 関連ソフトへの影響について
上記の脆弱性についてですが, 「gzipだけじゃない脆弱性」で奥村氏により指摘されているとおり, 残念ながら LHA の展開に対応したプログラムは大多数が該当するものと思われ, 拙作の UNLHA32.DLL や LHMelt (LMLzh32.dll) はもちろんのこと, 別のページで話題としている 7-Zip や WinRAR, それに Windows XP の「Microsoft 圧縮 (LZH 形式) フォルダー」さえも例外ではないのかもしれません。 (7-Zip 辺りは随分注意深くコードが書かれているのですが, 該当する部分が残ってしまっているようです。)
また, この問題は LHA 関連プログラムだけに限った話ではなく, LHA のコードが一部流用されていることから, 少なくとも ARJ 関連プログラムにも影響が及んでいます。 拙作の UNARJ32.DLL もそうですが, ARJ 展開コードの技術資料となっている UNARJ.EXE のソースを参考にしたソフトは, 多くが今回の脆弱性に該当するものと思われます。
ちなみに, Lzh 展開コードについては注意深く書かれていた 7-Zip も, Arj 展開部分については UNARJ.EXE のソースを, ほぼ, そのまま流用していることから, 盛大に, ほぼ全ての箇所が該当してしまっています。(^^;; 恐らく, Lzh 展開コードについては精査され Zip 展開コードとの共用化が進んでいるのに対して, Arj 展開コードについては, 殆ど精査されていないのが, その理由と思われます。
(Sep.30,2006:追記)
少し実験してみたのですが, 一番影響の大きいのは CVE-2006-4337 のようです。 この脆弱性はバッファーオーバーフローの類なので, バッファーの形態によって事情が大きく異なります。 まず, gzip (Linux 版) もそうですが, バッファーがグローバル変数で確保されていると, 一般保護エラーの確率は相当下がります。 これに対して, バッファーが (malloc() でも何でも構わないのですが) ヒープで確保されていると, わりと簡単に一般保護エラーを発生させることができてしまいます。 ええ, もう涙の出るほど簡単に…。(泣)
ヒープの場合, (セット時間の判らない) 時限爆弾的な発生となりますので, ソフトの版によっても発生率が大きく変わってしまいます。 大抵落ちてしまうもの, 新版は大丈夫でも旧版では落ちてしまうもの, 反対に新版で落ちてしまうもの…。 従って, ある版で大丈夫でも, 次の版が大丈夫とは限りません。
CVE-2006-4335 でも落ちてしまうものが見受けられました。 残念ながら, 拙作のソフトではありませんでしたので, CVE-2006-4335 の本来の脆弱性であるリターンアドレス書き換えが発生したのか, 他のローカル変数書き換えにより CVE-2006-4337 が発生したのかは判りませんでした。
●UNLHA32.DLL
(Sep.30,2006) 修正版をβ公開しました。
(Oct.14,2006) 正式版を公開しました。
●UNARJ32.DLL
(Sep.30,2006) 修正版をβ公開しました。
(Oct.14,2006) 正式版を公開しました。
●LHMelt (LMLzh32.dll)
(Sep.30,2006) 修正版をβ公開しました。
(Oct.14,2006) 正式版を公開しました。
●gzip の修正コードについて
(Sep.26,2006:追記)
「Bugzilla Bug 204676: CVE-2006-4334 gzip multiple issues (CVE-2006-4335, CVE-2006-4336, CVE-2006-4337, CVE-2006-4338)」で示されている修正コードについてですが, 十分に精査・テストされたものではないらしく, この修正を適用すると, 実際には多くのファイルが展開できなくなってしまいます。
LHA 関連コードの修正用に参考としたい方もあるかと思いますので,さらに修正したものを置いておきます。 (unlzh.c)
一部気になった部分について日本語でコメントを入れてありますので, gzip-1.3.5 の修正に使用したり差分を作成する場合には, 日本語のコメント行を削除してから使用してください。
(Sep.29,2006:追記)
奥村氏によると先のパッチを (パッチ制作者に) 修正してもらえるとのことです。 が, せっかくなので, このまま置いておきます。