### 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]

<公開:Oct.19,2006>

MHSVI#20061019-01:
UNLHA32.DLL におけるヒープオーバーフローの脆弱性

 このページは『LZH 書庫のヘッダー処理における脆弱性について』で記述されている内容を UNLHA32.DLL の脆弱性情報として再構成したものです。


概要

 UNLHA32.DLL は, LZH, LZS 形式に対応した圧縮・展開等の書庫操作を行うライブラリーです。 UNLHA32.DLL にはヒープオーバーフローの脆弱性が存在します。

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

  • UNLHA32.DLL Ver 1.98.1.4 及びそれ以前
  • 上記を利用しているアプリケーション

詳細情報

 UNLHA32.DLL は, 『統合アーカイバ』の API 仕様に準拠した, LZH, LZS 形式書庫に対して圧縮・展開といった操作を行うためのライブラリーです。 UNLHA32.DLL は主に圧縮・展開等を行うアーカイバーソフトウェアから呼び出される形で使用されますが, ヒープオーバーフローの脆弱性が含まれており, 細工された h0 及び h1 形式書庫ファイルに対して何らかの操作を行うことによって, 任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。

想定される影響

 UNLHA32.DLL を利用しているアプリケーションの動作状況により異なりますが, 当該アプリケーションを実行しているユーザーの権限で任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。

対策方法

 現行の版は対策済みですが, 古い版を使用している場合は, 対策が行われている Ver 1.98b 以降へバージョンアップを行ってください。 [ダウンロード]

回避方法

  • アプリケーション側で UNLHA32.DLL の使用有無等を行える場合は, UNLHA32.DLL を使用しない, 別の DLL や代替方法を選択する, といった設定を行うことで回避を行うことが可能です。

技術情報

 本脆弱性は, ヘッダーのレベルが 0 もしくは 1 の LZH 書庫において, 基本ヘッダーと拡張ヘッダーの合計サイズが非常に大きいメンバーを読み込んだ場合に発生します。 以下の関数にヒープオーバーフローが存在します:


LPSTR gethdr(LPINT err, BOOL bMode)
{
    ...
    LPBYTE p;
    DWORD extsize;

    ...
    switch(hpb.level) {
      case 0:
      case 1:
        ...
        while ((extsize = ConvWORD(p)) != 0) {
            if (readarc(p + 2, extsize) < extsize) {
                ...
                goto errend;
            }
            ...
            p += extsize;
        }
        ...
        break;
      ...
    }
    ...
    return hpb.pathname;
}
	  

 上記関数により, 読み込み位置に存在するメンバーのヘッダー情報を取得しますが, 適切なバウンダリチェックを伴わずにバッファーの書き込み位置を更新している (p += extsize;) ため, 基本ヘッダーと (複数の) 拡張ヘッダーの合計サイズが 8,192 バイトを超えることで, 実際に書庫からの読み込みを行う readarc() 関数内でヒープオーバーフローが発生します。

 ヘッダー用バッファーの直後には,ヘッダー読み込みの時点では使用されない 512KB のスライド辞書領域が存在するため, 実際には約 520KB を超えるまでは現象が表面化しません。

 近傍に関数・データーポインターを含んだ比較的普遍的なバッファー領域が存在していないことから, 汎用的な攻撃書庫の作成は難しいと思われますが, 対象を絞れば exploit 条件へ達すること自体は比較的簡単に行えます。 クラッシュだけで良いのであれば, より簡単に引き起こせます。

参考情報

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