LMLzh32.DLL は, LZH 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 LMLzh32.DLL にはヒープオーバーフローの脆弱性が存在します。
LMLzh32.DLL は, LHMelt に付属している, LZH 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 LMLzh32.DLL は LHMelt から呼び出される形で使用されますが, ヒープオーバーフローの脆弱性が含まれており, 細工された h0 及び h1 形式書庫ファイルに対して何らかの操作を行うことによって, 任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。
呼び出し時点での LHMelt の動作状況にもよりますが, 当該ユーザーの権限で任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。
LHMelt について, Ver 1.53 以降へバージョンアップを行ってください。 [ダウンロード]
本脆弱性は, ヘッダーのレベルが 0 もしくは 1 の LZH 書庫において, 基本ヘッダーと拡張ヘッダーの合計サイズが非常に大きいメンバーを読み込んだ場合に発生します。 以下の関数にヒープオーバーフローが存在します:
LPSTR gethdr(LPINT err, BOOL bMode)
{
...
LPBYTE p;
DWORD extsize;
...
switch(hpb.level) {
case 0:
case 1:
...
while ((extsize = ConvWORD(p)) != 0) {
if (readarc(p + 2, extsize) < extsize) {
...
goto errend;
}
...
p += extsize;
}
...
break;
...
}
...
return hpb.pathname;
}
上記関数により, 読み込み位置に存在するメンバーのヘッダー情報を取得しますが, 適切なバウンダリチェックを伴わずにバッファーの書き込み位置を更新している (p += extsize;
) ため, 基本ヘッダーと (複数の) 拡張ヘッダーの合計サイズが 8,192 バイトを超えることで, 実際に書庫からの読み込みを行う readarc() 関数内でヒープオーバーフローが発生します。
ヘッダー用バッファーの直後には,ヘッダー読み込みの時点では使用されない 512KB のスライド辞書領域が存在するため, 実際には約 520KB を超えるまでは現象が表面化しません。
近傍に関数・データーポインターを含んだ比較的普遍的なバッファー領域が存在していないことから, 汎用的な攻撃書庫の作成は難しいと思われますが, 対象を絞れば exploit 条件へ達すること自体は比較的簡単に行えます。 クラッシュだけで良いのであれば, より簡単に引き起こせます。