### 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.10,2007>

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


概要

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

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

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

詳細情報

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

想定される影響

 UNLHA32.DLL を利用しているアプリケーションの動作状況により異なりますが, 任意のコードを実行されたり, サービス運用妨害 (DoS) 攻撃を受ける可能性があります。 より深刻なのは後者で, クラッシュを引き起こすことが比較的簡単に行え, さらにレジストリー情報等が利用されることで, インストールされている全ての対応アプリケーションについて, 動作状況にかかわらず等しくサービス運用妨害 (DoS) 攻撃を受ける恐れがあります。

 前者については, 直接 UNLHA32.DLL を呼び出す方法は, その時点で任意コードの実行が可能となっている状況が必要であることから, 利用されることがないものと思われます。 それに対して, レジストリー情報の利用, アプリケーションが渡すパラメーターの横取り・改竄, といった手法を使用しての任意コード実行は, 利用するのが難しいものの可能であると思われます。 (未実証)

対策方法

 最新版 (Ver 2.62a 以降) へバージョンアップを行ってください。 [ダウンロード]

回避方法

  • アプリケーション側で UNLHA32.DLL の使用有無等を行える場合は, UNLHA32.DLL を使用しない, 別の DLL や代替方法を選択する, といった設定を行うことで回避を行うことが可能です。
  • 旧版の UNLHA32.DLL がバンドルされているアプリケーションを利用していて, かつ当該アプリケーションの更新等を行えない場合は, UNLHA32.DLL が利用するレジストリー項目 (InitOption 及び CauseOption。) について値を変更できないようアクセス権を設定することで, 影響を緩和できる可能性があります。

技術情報

 本脆弱性は, 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 可能条件へ達することは難しいと思われますが, パラメーター数や内容を調整することで条件へ達することが可能であると推測されます。

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