LMLzh32.DLL は, LZH, LZS 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 LMLzh32.DLL には CVE-2006-4338 と同様な無限ループの脆弱性が存在します。
LMLzh32.DLL は, LHMelt に付属している, LZH 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 LMLzh32.DLL は LHMelt から呼び出される形で使用されますが, 無限ループの脆弱性が含まれており, 細工された書庫ファイルの展開 (を伴う処理) を行うことで, 無限ループによる操作不能状態に陥る可能性があります。
呼び出し時点での LHMelt の動作状況にもよりますが, 無限ループによる操作不能状態に陥る可能性があります。
LHMelt について, 最新版 (Ver 1.52c 以降) へバージョンアップを行ってください。 [ダウンロード]
本脆弱性は, 巧妙に細工された LZH 書庫を展開 (内部的に展開処理を含む操作全般。) することで発生します。 以下の関数に無限ループの脆弱性が存在します:
void read_c_len(void)
{
short i, c, n;
n = getbits(CBIT);
if (n == 0) {
...
} else {
WORD mask;
i = 0;
do {
mask = 1U << (8 - 1);
c = g_Decode_HufSHuf_pwPosTable[bitbuf >> (16 - 8)];
while (c >= NT) {
if (bitbuf & mask) {
c = g_DeEncode_HufSHuf_pwRight[c];
} else {
c = g_DeEncode_HufSHuf_pwLeft[c];
}
mask >>= 1;
}
...
} while (i < n);
...
}
}
上記関数により, ハフマン法で使用するコード長の符号表を読み込みますが, 不十分な終了条件 (c >= NT
) によるループが形成されているため, 非常に偏った枝を構成している (連続して c == g_DeEncode_HufSHuf_pwLeft[c]
となるような) 符号が読み込まれることで, 無限ループに陥ります。