UNLHA32.DLL は, LZH, LZS 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 UNLHA32.DLL にはヒープオーバーフローの脆弱性が存在します。
UNLHA32.DLL は, 『統合アーカイバ』の API 仕様に準拠した, LZH, LZS 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 UNLHA32.DLL は主に圧縮・展開等を行うアーカイバーソフトウェアから呼び出される形で使用されますが, ヒープオーバーフローの脆弱性が含まれており, 任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。
UNLHA32.DLL を利用しているアプリケーションの動作状況により異なりますが, 任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。 より深刻なのは後者で, クラッシュを引き起こすことが比較的簡単に行え, さらにレジストリー情報等が利用されることで, インストールされている全ての対応アプリケーションについて, 動作状況にかかわらず等しくサービス運用妨害 (DoS) 攻撃を受ける恐れがあります。
前者については, 直接 UNLHA32.DLL を呼び出す方法は, その時点で任意コードの実行が可能となっている状況が必要であることから, 利用されることがないものと思われます。 それに対して, レジストリー情報の利用, アプリケーションが渡すパラメーターの横取り・改竄, といった手法を使用しての任意コード実行は, 利用するのが難しいものの可能であると思われます。 (未実証)
最新版 (Ver 2.62a 以降) へバージョンアップを行ってください。 [ダウンロード]
本脆弱性は, Unlha() 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 可能条件へ達することは難しいと思われますが, パラメーター数や内容を調整することで条件へ達することが可能であると推測されます。