概要
LMLzh32.DLL は, LZH 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 LMLzh32.DLL にはヒープオーバーフローの脆弱性が存在します。
影響を受けるモジュール及びシステム
- LMLzh32.DLL Ver 2.61.0.11 及びそれ以前
- 上記が付属している LHMelt Ver 1.61.0.4 及びそれ以前
詳細情報
LMLzh32.DLL は, LHMelt に付属している, LZH 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 LMLzh32.DLL は LHMelt から呼び出される形で使用されますが, ヒープオーバーフローの脆弱性が含まれており, 任意のコードを実行されたりクラッシュを引き起こされる可能性があります。
想定される影響
呼び出し時点での LHMelt の動作状況にもよりますが, 任意のコードを実行されたり, クラッシュを引き起こされたりする可能性があります。
前者については, 直接 LMLzh32.DLL を呼び出す方法は, その時点で任意コードの実行が可能となっている状況が必要であることから, 利用されることがないものと思われます。 それに対して, レジストリー情報の利用, LHMelt が渡すパラメーターの横取り・改竄, といった手法を使用しての任意コード実行は, 利用するのが難しいものの可能であると思われます。 (未実証)
後者については, クラッシュを引き起こすことが比較的簡単に行えることと, UNLHA32.DLL のサブセットとなっていることから, レジストリー情報等を利用することで, LHMelt の動作状況にかかわらずクラッシュを引き起こされる恐れがあります。 LHMelt 専用となっていることから, 他のソフトウェアから使われている可能性は, まずないものと思われます。
対策方法
LHMelt について, 最新版 (Ver 1.61b 以降) へバージョンアップを行ってください。 [ダウンロード]
技術情報
本脆弱性は, LMLzh() API 等へ多数のパラメーターを含むコマンドライン文字列が渡された場合に発生します。 以下の関数にヒープオーバーフローが存在します:
static int setarg(LPCWSTR cpCommandBuffer, LPCWSTR cpCommandBuffer2, WCHAR ***lparg)
{
...
LPVOID p;
int argc, iSize;
WCHAR **arglst;
...
arglst = malloc(sizeof(LPWSTR) * MY_PARCOUNT);
argc = 0;
...
while (p != NULL) {
...
arglst[argc] = malloc(iSize * sizeof(WCHAR));
...
argc++;
}
...
return argc;
}
上記関数により, API へ渡されたコマンドライン文字列が各パラメーターへ分割されますが, 適切なバウンダリチェックを伴わずに argc がインクリメントされているため, パラメーター数が既定の MY_PARCOUNT を超えることでヒープオーバーフローが発生します。
近傍に関数・データーポインターを含んだ比較的普遍的なバッファー領域が存在していないことと, 実際に書き込まれる (arglst[argc]
へ代入される。) 値を直接操作できないことから, exploit 可能条件へ達することは難しいと思われますが, パラメーター数や内容を調整することで条件へ達することが可能であると推測されます。