### Micco's Home Page ### Welcome to Micco's page!!
Sorry, but this web page is written in Japanese.
<English>
■ 更新情報
■ このWebページについて
■ お知らせ
■ ダウンロード
■ DLL のインストール方法
■ SFX の設定例
■ いろいろ
対応ブラウザー
[Internet Explorer] [Firefox] [Opera] [Sleipnir] [Safari] [Google Chrome]
連絡先:Micco
[e-mail]
[→『脆弱性情報一覧』] [→Home]

<公開:Nov.23,2007>

MHRVI#20071122:
Lhaplus の LZH 書庫読込におけるヒープオーバーフローの脆弱性について


IPA 報告日

Oct.13,2007

JVN 一般向け公開日

Nov.22,2007

対象ソフトウェア

Lhaplus for Windows

ベンダーサイト

概要

 Lhaplus は多数の書庫形式に対応した圧縮・展開を行うソフトウェアです。 Lhaplus には, ヒープオーバーフローの脆弱性が存在します。

影響を受けるモジュール及びシステム

  • Lhaplus 1.55 及びそれ以前

詳細情報

 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 書庫として扱わないため。)

参考情報

[→Page top] [→『脆弱性情報一覧』] [→Home]