Hitach Incident Response Team

 2010年8月24日に、マイクロソフトからセキュリティアドバイザリー(2269637)「安全でないライブラリーのロードにより、リモートでコードが実行される」が公開されました。以下で、どのような問題なのかを概観します。

 この問題は、「バイナリーの植え付け(Binary Planting)問題」「DLLのプリロード(DLL Preloading)問題」「DLLの乗っ取り(DLL Hijacking)問題」と呼ばれています。アプリケーションがDLL(ダイナミックリンクライブラリー)ファイルを読み込む際に問題が発生し得るぜい弱性で、DLLファイルが格納されているディレクトリーを検索する順序に起因したものです。既に100近くのアプリケーションに対して問題の存在が指摘されています。ただし、この指摘は今回が初めてではなく、2000年にInternet Explorerのぜい弱性発見で著名なゲオルギ・グニンスキー(Georgi Guninski)氏がマイクロソフトのOffice製品で今回と同様な問題が発生すると報告しています。マイクロソフトでは、2001年11月のWindows XP、2003年7月のWindows 2000 SP4以降、ディレクトリー検索順序を変更するSafeDllSearchMode機能の導入、2010年8月には、ユーザーがディレクトリー検索順序を変更制御できるようにするCWDIllegalInDllSearch機能の導入などの対策を進めてきています(図1)。

図1●安全でないライブラリーのロードの対応経緯(2269637)

DLLファイルが格納されているディレクトリーを検索する順序

 DLLファイルが格納されているディレクトリーを検索する順序は、SafeDllSearchMode機能の設定有無で異なります。ここでは、SafeDllSearchMode機能が有効となっているWindows XP SP3上のアドレス帳(wab.exe)と、アドレス帳が参照するDLLファイル(wab32res.dll)を例にとって説明します。

 通常、Windows XP SP3上のwab.exeは、次に示すディレクトリー順序でwab32res.dllを検索します。wab32res.dllは、7. C:\Program Files\Common Files\Systemに格納されているため、1~6の検索作業ではDLLファイルを見つけられないという状況が発生することになります。ここに、DLLのプリロード(DLL Preloading)問題が発生する要因があります。

  1. exeファイルのあるディレクトリー(C:\Program Files\Outlook Express)
  2. 32bitシステムディレクトリー(C:\WINDOWS\system32)
  3. 16bitシステムディレクトリー(C:\WINDOWS\system)
  4. Windowsディレクトリ―C:\WINDOWS)
  5. カレントディレクトリー
  6. 環境変数PATH
  7. C:\Program Files\Common Files\System

 攻撃者が、1~6 のディレクトリーに、偽DLLファイル(wab32res.dll)を置くことができた場合、wab.exeは、本来読み込むべきではない偽DLLファイルを先に読み込んでしまうことになります。結果として、利用者がアドレス帳を開いたときに、攻撃者は偽DLLファイルとして用意した任意のコードを実行できることになります。特に、WebDAVおよびリモートのネットワーク共有を利用する場合、USBメモリーなどの外部媒体を利用する場合には、攻撃者は、カレントディレクトリーを悪用しやすくなるため、攻撃可能条件が揃う可能性が高くなります。

プロセスモニターを利用したDLLファイル検索順序の確認

 マイクロソフトからシステムの動作モニターツールとして提供されているプロセスモニターを利用して、Windows XP SP3上のwab.exeがwab32res.dllファイルを検索する様子をみていきましょう。ここで示す事例は、カレントディレクトリー(C:\現在の作業ディレクトリー)に置いたsample.wabファイルをダブルクリックしたときのwab32res.dllを検索する流れを追いかけています。

■事例1:何も手を加えない場合
 事例1では何も手を加えていないデフォルト状態を想定しています。web.exeは、C:\Program Files\Common Files\System\wab32res.dllを参照することになります(写真1 )。(5)はカレントディレクトリー、(7~8)は環境変数PATHで設定されたディレクトリーです。wab.exeは(9)でwab32res.dllにたどり着いています。

写真1●事例1:何も手を加えない場合(cpe:/o:microsoft:windows_xp::sp3)

■事例2:カレントディレクトリーにwab32res.dllを置いた場合
 事例2では攻撃者によってカレントディレクトリー(C:\現在の作業ディレクトリー)に偽DLLファイル(wab32res.dll)を置かれてしまったことを想定します(写真2 )。(5)はカレントディレクトリーで、wab.exeは(5)でwab32res.dllにたどり着いたことが分かります。(7~9)でdllファイルを読み込んでいます。もし、カレントディレクトリーに偽DLLファイル(wab32res.dll)をおかれてしまったときには、攻撃者の意図する目的が達成されてしまうであろうことは容易に類推できます。

写真2●事例2:カレントディレクトリーにwab32res.dllを置いた場合

■事例3:exeファイルのあるディレクトリーにwab32res.dllを置いた場合
 事例3では検索順序の先頭にあるexeファイルのあるディレクトリにwab32res.dllを置くことで、攻撃者につけいる隙を与えない状態を作り出しています(写真3 )。wab.exeは(0)でwab32res.dllにたどり着き、(3~5)でdllファイルを読み込んでいます。もし、カレントディレクトリーに偽DLLファイル(wab32res.dll)をおかれてしまったとしても、攻撃者の攻撃を阻止できるのではと期待を持つことができます。答えは事例4で紹介します。

写真3●事例3:exeファイルのあるディレクトリーにwab32res.dllを置いた場合