UNLHA32.DLL は, LZH, LZS 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 UNLHA32.DLL にはバッファーオーバーフローの脆弱性が存在します。
UNLHA32.DLL は, 『統合アーカイバ』の API 仕様に準拠した, LZH, LZS 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 UNLHA32.DLL は主に圧縮・展開等を行うアーカイバーソフトウェアから呼び出される形で使用されますが, バッファーオーバーフローの脆弱性が含まれており, 細工されたレスポンスファイルを読み込むことで, 任意のコードを実行される可能性があります。
当該アプリケーションを実行しているユーザーの権限で任意のコードを実行される可能性があります。
最新版 (Ver 1.96e 以降) へバージョンアップを行ってください。 [ダウンロード]
本脆弱性は, 細工されたレスポンスファイルを読み込むことで発生します。 以下の関数にバッファーオーバーフローの脆弱性が存在します:
static char *readresword(HANDLE file)
{
char *p;
int c, bQuote;
...
do {
if (c == '\"') {
bQuote = !bQuote;
} else {
*p++ = (char)c;
}
c = Mygetc(file);
} while ((!bQuote && c > ' ') ||
(bQuote && c >= ' '));
...
}
上記関数により, レスポンスファイルから 1 行分のコマンド文字列を読み込みますが, 適切なバウンダリチェックを伴わずに読込を行っているため, 1 行が確保されたバッファー (1024 バイト) を超える長さとなることで, バッファーオーバーフローが発生します。 バッファーはグローバル変数としてデーターセグメント領域に存在しますが, 後方には複数の関数ポインターが存在するため, そのポインターを改竄することで, 任意コードの実行が可能となります。
当該バッファーと攻撃対象となる関数ポインターの間には他の変数等の領域が存在しますが, 位置関係が一定しているため, 情報の辻褄を合わせることは難しくありません。 従って, exploit 条件へ達するのは比較的簡単と思われます。