LMLzh32.DLL は, LZH, LZS 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 LMLzh32.DLL には CVE-2006-4337 と同様のヒープオーバーフローの脆弱性が存在します。
LMLzh32.DLL は, LHMelt に付属している, LZH 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 LMLzh32.DLL は LHMelt から呼び出される形で使用されますが, ヒープオーバーフローの脆弱性が含まれており, 細工された書庫ファイルの展開 (を伴う処理) を行うことで, 任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。
呼び出し時点での LHMelt の動作状況にもよりますが, 当該アプリケーションを実行しているユーザーの権限で任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。
LHMelt について, 最新版 (Ver 1.52c 以降) へバージョンアップを行ってください。 [ダウンロード]
本脆弱性は, 巧妙に細工された LZH 書庫を展開 (内部的に展開処理を含む操作全般。) することで発生します。 以下の関数にヒープオーバーフローの脆弱性が存在します:
void make_table(short nchar, char bitlen[],
short tablebits, WORD table[])
{
...
WORD weight[17]; /* 0x10000ul >> bitlen */
WORD start[18]; /* その bitlen の最初のコード(左詰め) */
WORD *p;
UINT i, k, len, ch, jutbits, avail, nextcode, mask;
...
for (ch = 0; ch < (UINT)nchar; ch++) {
...
nextcode = start[len] + weight[len];
if (len <= (UINT)tablebits) {
/* table に納まるコード */
for (i = start[len]; i < nextcode; i++) {
table[i] = (WORD)ch;
}
} else {
...
}
...
}
}
上記関数により,ハフマン法で使用する符号表を作成しますが, 適切なバウンダリチェックを伴わずに符号表への書き込みを行っているため, 想定した長さ (tablebits) を超える符号が存在することでヒープオーバーフローが発生します。
位置不定の有意な関数ポインターに届くような長さの符号が作成されるエンコードデーターが必要となることと, 実際に書き込まれる値が固定データー (ch) であることから, exploit 条件へ達するのは難しいものと思われます。 クラッシュだけで良いのであれば容易に行えます。