UNLHA32.DLL は, LZH, LZS 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 UNLHA32.DLL には CVE-2006-4335 と同様なリターンアドレス改竄の脆弱性が存在します。
UNLHA32.DLL は, 『統合アーカイバ』の API 仕様に準拠した, LZH, LZS 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 UNLHA32.DLL は主に圧縮・展開等を行うアーカイバーソフトウェアから呼び出される形で使用されますが, リターンアドレス改竄の脆弱性が含まれており, 細工された書庫ファイルの展開 (を伴う処理) を行うことで, 任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。
UNLHA32.DLL を利用しているアプリケーションの動作状況により異なりますが, 当該アプリケーションを実行しているユーザーの権限で任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。
最新版 (Ver 2.52b 以降) へバージョンアップを行ってください。 [ダウンロード]
本脆弱性は, 巧妙に細工された LZH 書庫を展開 (内部的に展開処理を含む操作全般。) することで発生します。 以下の関数にリターンアドレス改竄の脆弱性が存在します:
void make_table(short nchar, char bitlen[],
short tablebits, WORD table[])
{
WORD count[17]; /* コード長ごとの出現個数 */
...
UINT i, k, len, ch, jutbits, avail, nextcode, mask;
...
/* 出現回数を数える */
for (i = 0; i < (UINT)nchar; i++) {
count[bitlen[i]]++;
}
...
}
上記関数により,ハフマン法で使用する符号表を作成しますが, 適切なバウンダリチェックを伴わずにコード長の出現回数の数え上げを行っているため, 16 ビットを超える符号が存在することで配列領域に対してのバッファーオーバーフローが発生します。 配列はローカル変数としてスタック上に確保されており, ほぼ直後の領域には当該関数から復帰するためのリターンアドレスが格納されていることから, そのリターンアドレスの改竄が可能となります。
リターンアドレスを有意に改竄するためには, 各コード長の出現頻度が結果として (たとえば DWORD の) 意味のある数値となるようなエンコードデーターの作成が必要となるため, exploit 条件へ達するのは難しいものと思われます。 クラッシュのみで良いのであれば容易に行えます。