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

<公開:May.15,2017 最終更新:May.25,2017>

MHSVI#20170515-03:
UNARJ32.DLL における任意の DLL 読み込みに関する脆弱性


概要

 UNARJ32.DLL は, ARJ 形式に対応した展開等の書庫操作を行うライブラリーです。 UNARJ32.DLL には DLL を読み込む際の検索パスに問題があり, 同一ディレクトリーに存在する特定の DLL を読み込んでしまう脆弱性 (CWE-427) が存在します。

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

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

詳細情報

 UNARJ32.DLL は, 『統合アーカイバ』の API 仕様に準拠した, ARJ 形式書庫に対して展開などの操作を行うためのライブラリーです。 UNARJ32.DLL は主に圧縮・展開を行うアーカイバーソフトウェアから呼び出される形で使用されますが, 同一ディレクトリーに存在する特定の DLL を読み込んでしまう脆弱性が含まれており, 任意のコードを実行されたり, クラッシュを引き起こされる可能性があります。

想定される影響

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

対策方法

 2017 年 5 月 15 日現在対策方法は存在しません。
 修正版の公開を予定していますが, UNLHA32.DLL 同様呼び出し側プログラムに影響を与えることが予想されることから, UNLHA32.DLL の状況を考慮した上で公開時期を決定する予定です。

回避方法

  • UNARJ32.DLL を利用するアプリケーションについて "C:\Program Files" 配下などの保護されたディレクトリーにインストールした上で, UNARJ32.DLL をアプリケーションと同じディレクトリーかシステムディレクトリーにインストールする (配布ファイルによりインストールを行った場合は, システムディレクトリーにインストールされます。) ことで, 回避を行うことが可能です。 アプリケーション側, UNARJ32.DLL 側双方の条件が満たされないと回避は行えません。
    なお, この対策で行えるのは正確には「問題の軽減」ですが, これは市販ソフトなども同様で, その状況を問題視するのであれば, 市販ソフトや Windows のアクセサリーを含む大多数のプログラムが該当することになります。
  • アプリケーション側で UNARJ32.DLL の使用有無等を行える場合は, UNARJ32.DLL を使用しない, 別の DLL や代替方法を選択する, といった設定を行うことで回避を行うことが可能です。

技術情報

 Windows においては, ほぼ全てのプログラムが "KERNEL32.DLL" や "USER32.DLL" といったシステムライブラリーに実装されている Win32 API を使用しています。 DLL の利用については, 「存在するか判らない DLL」「必ずしも必要としない DLL」であれば, LoadLibrary() API を使用して DLL のロードを行った上で使用したい API の呼び出し先を GetProcAddress() で得る…といった手順を踏むことになります。

一方, 「Win32 API を使用するために KERNEL32.DLL や USER32.DLL をロード」といった, 「必ず使用する DLL」「システムファイルとして Windows に必ず含まれている DLL」を利用する際には, 例えば USER32.DLL であれば USER32.LIB といった, それぞれの DLL に対応したインポートライブラリーを使用することにより, DLL のロードや呼び出し先の取得といった手順を Windows に任せる…という手法が一般的に採用されます。 インポートライブラリーを使用した場合, プログラムの実行ファイル内に「当該プログラムが使用する DLL と (例えば Win32 API などの) 呼び出す機能」が一覧されたインポートテーブル…つまり, 外部参照の一覧表が作成されます。

 インポートテーブルが含まれるプログラムを起動すると, 実際に当該プログラムへ制御が渡る前の段階で, Windows のシステムライブラリーである NTDLL.DLL に存在するイメージローダーが, インポートテーブル上にある外部参照の情報を読み込んで, 必要な DLL のロードと機能の呼び出し先の取得を行います。 読み込んだ DLL がインポートテーブルをもっていれば同様の手順を再帰的に行います。 これらの作業は, 全ての外部参照が解決されるまで繰り返されます。

この際, Windows は定められた優先順位に従って複数のディレクトリーを検索して DLL を読み込みます。 例えば Safe DLL search mode が有効の場合は次のようになります:

  1. UNARJ32.DLL を呼び出したプログラムの置かれているディレクトリー
  2. ウインドウズ・システムディレクトリー
  3. 16 ビット用システムディレクトリー
  4. ウインドウズディレクトリー
  5. カレントディレクトリー
  6. 環境変数 PATH で指定された各ディレクトリー

この時に, プログラムの置かれているディレクトリーが最も優先順位の高い検索対象となっているため, システム DLL と同じ名前の細工された攻撃用 DLL をプログラムと同じディレクトリーへ置くことで, 優先的に攻撃用 DLL を読み込ませることが可能となります。

DLL の読み込み時には必ず初期化が行われることから, 初期化ルーチンにおいてプログラムの実行に使用したアカウントがもつ権限の範囲で任意のコードを実行することが可能となります。 初期化ルーチンを利用できることから, 細工された攻撃用 DLL がシステム DLL の仕様を満たしている必要はありません。

補足情報

 今回の脆弱性は, MHSVI#20100824:「LHMelt における安全でないライブラリーのロードによりリモートでコードが実行される脆弱性」と同じ脆弱性ではありますが, 置かれている状況は大きく異なります。 今回「安全でないライブラリーのロード」を行っているのは Windows システムの一部である NTDLL.DLL (上のイメージローダー) であり, しかもそれは「ユーザーが起動しようとしたプログラム (=UNARJ32.DLL を呼び出すプログラム) 若しくは UNARJ32.DLL へ制御が渡る前」に行われています。 つまり, UNARJ32.DLL 側には通常の方法では対処のしようがないことになります。

この点は市販ソフトや巷に溢れている Windows プログラムも同じで, 言ってしまえば「ほぼ全てのプログラム」が該当してしまうことになります。 「市販ソフトなど一般的なアプリケーションでは, 書き込みに管理者権限を必要とする "C:\Program Files" ディレクトリー配下へインストールされるケースが多く, その分安全性が若干高まっている」に過ぎません。 反対に, インストーラーやツール, 自己解凍書庫といったプログラムは「置き場所 (実行場所) を選ばず使われることから, 脆弱性として問題になっている」といえます。

更新履歴

  • 脆弱性情報の公開 [May.15,2017]
  • 参考情報に JVN の情報 (JVNTA#91240916) を追加 [May.25,2017]

参考情報

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