Lhaplus は多数の書庫形式に対応した圧縮・展開を行うソフトウェアです。 Lhaplus には, ヒープオーバーフローの脆弱性が存在します。
UNLHA32.DLL により作成された書庫に関する不具合報告の調査過程において, 圧縮・展開を行うソフトウェア『Lhaplus』の LZH 書庫読込処理におけるヒープオーバーフローの脆弱性が発見されました。 細工された LZH 書庫を扱おうとすることで, 任意のコードが実行される可能性があります。
Lhaplus を実行しているユーザーの権限で任意のコードを実行される可能性があります。 Lhaplus が書庫の読込を行うことで発生するため, 最悪のケースとしては, 悪意のある Web サイトやメールを開いただけで, 第三者による遠隔攻撃が成立します。
ベンダーから公開されている最新版 (Ver 1.56 以降) へバージョンアップを行ってください。
[http://www7a.biglobe.ne.jp/~schezo/]
本脆弱性は, 2006 年 7 月 31 日に Tan Chew Keong 氏により報告・公開された『Lhaplus におけるバッファーオーバーフローの脆弱性』が 1.53~1.55 にも存在し続けているもので, ヘッダーのレベルが 1 もしくは 2 の LZH 書庫において, 拡張ヘッダーのサイズが大きいメンバーを読み込んだ場合に発生します。 以下のルーチンにヒープオーバーフローが存在します:
004BA125 ; ...
004BA125 ; if (lzhHeader->byLevel == 1 || lzhHeader->byLevel == 2) {
004BA125 mov eax,dword ptr ss:[ebp-2c]
004BA128 mov al,byte ptr ds:[eax+14]
004BA12B cmp al,1
004BA12D je short lhaplus.004ba137
004BA12F cmp al,2
004BA131 jnz lhaplus.004ba238
004BA137 ; pbyBuffer = AllocMem(0x100);
004BA137 mov eax,100
004BA13C call lhaplus.00402a6c
004BA141 mov dword ptr ss:[ebp-c],eax
004BA144 ; ...
004BA14F ; while (ReadHdData(hFile, 2, &(LzhHeader->wExtHeaderSize)) != 0 &&
004BA14F ; LzhHeader->wExtHeaderSize != 0 &&
004BA152 mov eax,dword ptr ss:[ebp-2c]
004BA155 lea edx,dword ptr ds:[eax+1d]
004BA158 mov eax,dword ptr ss:[ebp-8]
004BA15B mov eax,dword ptr ds:[eax]
004BA15D mov ecx,2
004BA162 mov ebx,dword ptr ds:[eax]
004BA164 call dword ptr ds:[ebx+c]
004BA167 mov edx,dword ptr ss:[ebp-2c]
004BA16A cmp word ptr ds:[edx+1d],0
004BA16F je lhaplus.004ba21b
004BA175 test eax,eax
004BA177 je lhaplus.004ba21b
004BA17D ; ReadHdData(hFile, 1, &byExtHeaderID) != 0) {
004BA17D lea edx,dword ptr ss:[ebp-26]
004BA180 mov eax,dword ptr ss:[ebp-8]
004BA183 mov eax,dword ptr ds:[eax]
004BA185 mov ecx,1
004BA18A mov ebx,dword ptr ds:[eax]
004BA18C call dword ptr ds:[ebx+c]
004BA18F test eax,eax
004BA191 je lhaplus.004ba21b
004BA191 ; ClearMemory(pbyBuffer, 0x100);
004BA197 mov edx,100
004BA19C mov eax,dword ptr ss:[ebp-c]
004BA19F call lhaplus.00407d0c
004BA1A4 ; ReadHdData(hFile, LzhHeader->wExtHeaderSize - 3, pbyBuffer);
004BA1A4 mov eax,dword ptr ss:[ebp-2c]
004BA1A7 movzx ecx,word ptr ds:[eax+1d]
004BA1AB sub ecx,3
004BA1AE mov edx,dword ptr ss:[ebp-c]
004BA1B1 mov eax,dword ptr ss:[ebp-8]
004BA1B4 mov eax,dword ptr ds:[eax]
004BA1B6 mov ebx,dword ptr ds:[eax]
004BA1B8 call dword ptr ds:[ebx+c]
004BA1BB ; switch (byExtHeaderID) {
004BA1BB mov al,byte ptr ss:[ebp-26]
004BA1BE dec al
004BA1C0 je short lhaplus.004ba1c8
004BA1C2 dec al
004BA1C4 je short lhaplus.004ba1e9
004BA1C6 jmp short lhaplus.004ba152
004BA1C8 ; case 0x01 :
004BA1C8 ; ...
004BA1E4 ; break;
004BA1E4 jmp lhaplus.004ba152
004BA1E9 ; case 0x02 :
004BA1E9 ; ...
004BA216 ; break;
004BA216 jmp lhaplus.004ba152
004BA21B ; }
004BA21B ; }
004BA21B ; ...
004BA238 ; }
004BA238 ; ...
上記のルーチンにより拡張ヘッダーの内容を取得しますが, 適切なバウンダリチェックを伴わずに書庫からヒープ上に確保されたバッファーへの読込を行っているため, 拡張ヘッダーのサイズが 256 バイト (0x100) を超えることで, 実際に読込を行う ReadHdData() 関数内でヒープオーバーフローが発生します。 その結果, 最終的にはオブジェクトハンドラー操作ルーチン内で以下の exploit 可能条件に達します:
00408254 ; ...
00408254 mov ecx,dword ptr ds:[eax+4]
00408257 mov edx,dword ptr ds:[eax]
00408259 cmp ecx,edx
0040825B mov dword ptr ds:[ecx],edx
0040825D mov dword ptr ds:[edx+4],ecx
00408260 ; ...
ds:[eax]
はヒープオーバーフローを起こさせた拡張ヘッダーデーターの特定箇所を指しているため, ecx, edx レジスターが共に操作可能となり, 直後のストア命令 (mov dword ptr ds:[ecx],edx
) を利用して任意アドレスへの誘導が行えます。 (実証書庫を IPA へ提出。) 拡張ヘッダーのサイズや内容によって exploit 可能条件は異なってきますが, 比較的簡単に条件へ達することが可能と思われます。
この脆弱性を利用した攻撃書庫については, 現行の殆ど全てのウイルス対策ソフト等において, 検疫・削除が行われません。 (全てのソフトをチェックすることが不可能というだけで, 実質行えるものは皆無。) 特定の拡張ヘッダー ID (0x01 や 0x02) が使用された場合は, 一部のソフト (McAfee VirusScan Enterprise 等, 主に McAfee 製品。) において Exploit-LHA として検出される可能性がありますが, 確率はゼロに近いと思われます。 (当該一連ソフトが攻撃書庫にまでヘッダー CRC の一致を要求し, 一致しないものは LZH 書庫として扱わないため。)