DLL Hijacking(Binary Planting) が修正されたソフトウェアで DLL Hijacking の問題を確認する 〜EXE編〜

この日記では、2010年9月25日の日記を書いたときには確認できていなかった DLL 以外での DLL Hijacking*1 について書いています。DLL 以外での DLL Hijacking の問題とは、ACROS Security が Blog にて指摘しているものです。この ACROS Security Blog が紹介している Apple Safari 5.0.1 を例にして、DLL 以外での DLL Hijacking の再現および修正方法について確認した結果をまとめます。5.0.2 より古いバージョンの Apple Safari を使用している場合、最新バージョンにアップデートしましょう。

なお、今回は DLL 以外での DLL Hijacking の問題であるため、以後 DLL Hijacking を Binary Planting と呼称します。

Apple Safari の場合

2010年9月7日に Apple は、Binary Planting の問題を修正した Safari 5.0.2 をリリースしました。Safari 5.0.2 が修正した問題のうち、Binary Planting に関するものは HT4333CVE-2010-1805 です。

A search path issue exists in Safari. When displaying the location of a downloaded file, Safari launches Windows Explorer without specifying a full path to the executable. Launching Safari by opening a file in a specific directory will include that directory in the search path. Attempting to reveal the location of a downloaded file may execute an application contained in that directory, which may lead to arbitrary code execution. This issue is addressed by using an explicit search path when launching Windows Explorer. This issue does not affect Mac OS X systems. Credit to Simon Raner of ACROS Security for reporting this issue.

About the security content of Safari 5.0.2 and Safari 4.1.2(CVE-2010-1805 の Description)
Binary Planting の再現箇所

先ほど引用した Apple のリリースノート HT4333 によると、Safari がダウンロードしたファイルの保存先フォルダを開く際に、Explorer を起動しているようです。まず、この Binary Planting の再現箇所を確認します。

Windows XP SP3 において、ユーザ Administrator で Apple Safari 5.0.1 を起動します。このとき、Process Monitor もあわせて起動しておきます。適当な Web サイトからファイルをダウンロードします。この日記では自身のはてなプロフィールの HTML ファイルをダウンロードしました(下図を参照)。


HTML ファイルのダウンロードが完了すると、ダウンロードウインドウが起動します。このダウンロードウインドウでダウンロードしたファイル(この日記では about.html)を選択し、右クリックメニュー「親フォルダを表示」を実行します(下図を参照)。


「親フォルダを表示」を実行すると、ダウンロードファイルを保存したフォルダが Explorer で表示されました(下図を参照)。


このときの Process Monitor の結果をみてみると、Operation「Process Create」にて、Safari.exe が C:\WINDOWS\explorer.exe 起動していることが分かります(下図を参照)。


また、この Operation「Process Create」が実行されたときのスタック(Stack)の様子を確認してみます。TechNet Blogs の Process Monitor の Tips「Tip 4. スタックを確認する方法」の設定を施したうえで、Operation「Process Create」の行を選択し、右クリックメニュー「Stack」を実行します。「Stack」を実行すると、下図のウインドウが開きます。この画像の反転部から Safari.dll が ShellExecuteW 関数を呼び出したことが分かります。


ShellExecuteW 関数は ACROS Security が Blog にて Binary Planting の可能性を指摘していた関数の一つです。Apple Safari の場合、この Explorer が起動する箇所に Binary Planting の問題がありそうです。

Binary Planting の再現

Safari のダウンロードファイルを保存する C:\Documents and Settings\Administrator\My Documents*2 に C:\WINDOWS\system32\calc.exe(電卓)をコピーし、ファイル名を explorer.exe にリネームします。このあと、「Binary Planting の再現箇所」と同じ手順を実施してみました。しかし、C:\WINDOWS\explorer.exe が起動するだけであり、explorer.exe にリネームした電卓は起動しませんでした。

色々と試行錯誤したところ、Binary Planting を再現するためには、ファイルを保存する際に [リンク先のファイルをダウンロード] ではなく、[リンク先のファイルを別名でダウンロード] を実行する必要があるようです。以下、Safari 5.0.1 における Binary Planting の再現手順をまとめます。

「Binary Planting の再現箇所」と同様に Safari 5.0.1 で自身のはてなプロフィールの HTML ファイルをダウンロードします。「Binary Planting の再現箇所」の手順と異なるのは、ファイルをダウンロードする際に [リンク先のファイルを別名でダウンロード] を実行した点です(下図を参照)。なお、ダウンロードする際にファイル保存先およびファイル名の入力が求められますが、これは初期値のまま変更していません。


HTML ファイルのダウンロードが完了すると、ダウンロードウインドウが起動します。このダウンロードウインドウでダウンロードしたファイル(この日記では about.html)を選択し、右クリックメニュー「親フォルダを表示」を実行します。これは「Binary Planting の再現箇所」と同じ手順です。このとき Explorer ではなく、explorer.exe という名前の電卓が起動してしまいました(下図を参照)。


電卓が起動したときの Process Monitor を確認すると、Safari.exe が C:\Documents and Settings\Administrator\My Documents\explorer.exe を起動していることが分かります(下図を参照)。

Safari 5.0.1 における ShellExecuteW 関数の呼び出し

デバッガ WinDbg を使って、Safari 5.0.1 が ShellExecuteW 関数を呼び出す際に、どのような引数を与えているかを調べてみました。結論としては、Safari 5.0.1 では、Explorer を起動する際に以下のように ShellExecuteW 関数を実行しているようです。explorer相対パスで指定しているようですなお、ShellExecuteW 関数の引数は WinDbg で確認した結果をそのまま当てはめています。実際には 0 が NULL であったり、第 4 引数のダブルクォート「"」はエスケープされていると考えます。

ShellExecuteW(0, "open", "explorer", "/n,/select,"C:\Documents and Settings\Administrator\My Documents\about.html"", 0, 1)


これより、WinDbg による確認手順をまとめています。興味がある人だけどうぞ。なお、WinDbg での確認手順は自分できちんと説明できていないと思っていますので、間違い等があれば指摘いただけると嬉しいです。

WinDbg を起動したら、まずデバッガのシンボルパス([File]メニューの [Symbol File Path...])*3を設定します。そのあと、[File] メニューの [Open Executable...] を実行し、Safari.exe を選択します。以下、WinDbg の入出力の一部となります。なお、// 以降から行末までは僕のコメントです。

// 一度「g」コマンドを実行し、Safari.exe を実行状態にする
[ASL ASL] ===================
[ASL ASL]  Safari.exe begins
[ASL ASL] ===================
[com.apple.console Safari.exe] [WARNING] No pool to handle autorelease of http
[com.apple.console Safari.exe] [WARNING] Compatibility::Utils::printStack() is not available on Windows
[com.apple.console Safari.exe] [WARNING] No pool to handle autorelease of http
[com.apple.console Safari.exe] [WARNING] Compatibility::Utils::printStack() is not available on Windows
[com.apple.console Safari.exe] [WARNING] No pool to handle autorelease of http://images.apple.com/jp/main/rss/hotnews/hotnews.rss
[com.apple.console Safari.exe] [WARNING] Compatibility::Utils::printStack() is not available on Windows
ModLoad: 087e0000 08836000   C:\Program Files\Safari\Search.dll

// ここで Safari.exe が起動する
// [Debug] メニューの [Break] にて一度デバック状態にする
(f24.8e8): Break instruction exception - code 80000003 (first chance)
eax=7ffdf000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c94120e esp=081dffcc ebp=081dfff4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
7c94120e cc              int     3
// 「x」コマンドで、Shell32.dll の ShellExecuteW 関数の
// メモリアドレスを確認する
0:018> x shell32!ShellExecuteW
7d6a5e68 SHELL32!ShellExecuteW = <no type information>
// 「bp」コマンドで、ShellExecuteW 関数のメモリアドレスに
// ブレイクポイントを設定する
0:018> bp 7d6a5e68
// 「bl」コマンドで、ブレイクポイントが設定できていることを
// 確認する
0:018> bl
 0 e 7d6a5e68     0001 (0001)  0:**** SHELL32!ShellExecuteW
// 「g」コマンドで、Safari.exe を実行状態にする
0:018> g

// ここで、「Binary Planting の再現」の手順を実施する
// すると、右クリックメニュー「親フォルダを表示」を実施した
// ところで、ブレイクポイントに達し、デバッグ状態となる

// 「kv」コマンドで、Safari.exe のスタックを確認する
// ShellExecuteW 関数のスタック上での基準アドレス(EBP)と
// 第1から第3引数が分かる。ただし、ShellExecuteW 関数の
// 引数は 6 つあるため、これだけではすべての引数が分からない
0:000> kv
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\Safari\Safari.dll - 
ChildEBP RetAddr  Args to Child              
0012f844 00c390fd 00000000 00fb1264 00fbbfa4 SHELL32!ShellExecuteW (FPO: [Non-Fpo])
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f878 77d092e3 00c7b6c7 7f37fb00 77d0929a Safari!safariDLLMain+0x8c88d
0012f8d8 00c5a3ec 0009026c 00000111 000051ed USER32!SendMessageW+0x7f (FPO: [Non-Fpo])
0012f920 77cf8734 00000000 00000111 000051ed Safari!safariDLLMain+0xadb7c
00000000 00000000 00000000 00000000 00000000 USER32!InternalCallWinProc+0x28
// 「dc」コマンドで、ShellExecuteW 関数のスタック上での
// 基準アドレス(EBP) 以降を出力する。0012f84c(1行目の3列目)
// から 6 つが ShellExecuteW 関数の引数となる
0:000> dc 0012f844
0012f844  7c809806 00c390fd 00000000 00fb1264  ...|........d...
0012f854  00fbbfa4 7f04458c 00000000 00000001  .....E..........
0012f864  7c809806 7f37fbd0 7f37fbdc 00000000  ...|..7...7.....
0012f874  7f37fbdc 7f04458c 77d092e3 00c7b6c7  ..7..E.....w....
0012f884  7f37fb00 77d0929a 7fea1b40 0012f8d8  ..7....w@.......
0012f894  7fc18600 0012f8d8 7f37fbdc 7f37fbdc  ..........7...7.
0012f8a4  00c7d1a6 7fc18600 7fb85c30 7fc18600  ........0\......
0012f8b4  7fc187a0 00000001 7fc18600 00c7a730  ............0...
// 「du」コマンドで、00fb1264 のメモリアドレスから
// Unicode 文字列を得る。これが第2引数となる
0:000> du 00fb1264
00fb1264  "open"
// 「du」コマンドで、00fbbfa4 のメモリアドレスから
// Unicode 文字列を得る。これが第3引数となる
0:000> du 00fbbfa4
00fbbfa4  "explorer"
// 「du」コマンドで、7f04458c のメモリアドレスから
// Unicode 文字列を得る。これが第4引数となる
0:000> du 7f04458c
7f04458c  "/n,/select,"C:\Documents and Set"
7f0445cc  "tings\Administrator\My Documents"
7f04460c  "\about.html""

以上の WinDbg の結果から、Safari 5.0.1 では ShellExecuteW 関数を呼び出す際に、以下の引数を与えていることが分かりました。

引数 引数名
1 hwnd 0
2 lpOperation "open"
3 lpFile "explorer"
4 lpParameters "/n,/select,"C:\Documents and Settings\Administrator\My Documents\about.html""
5 lpDirectory 0
6 nShowCmd 1
Binary Planting の修正方法

Binary Planting を修正した Safari 5.0.2 で、「Binary Planting の再現」の手順を実施しても、電卓は起動せずに Explorer が起動しました。Safari 5.0.1 と同じように、Safari 5.0.2 の ShellExecuteW 関数の引数を WinDbg で確認したところ、以下のようになりました。Apple のアドバイザリに "This issue is addressed by using an explicit search path when launching Windows Explorer" と記述がある通り、第 3 引数を "explorer" という相対パス指定から、"C:\WINDOWS\explorer.exe" という絶対パス指定に変更することで、修正したようです

ShellExecuteW(0, "open", "C:\WINDOWS\explorer.exe", "/n,/select,"C:\Documents and Settings\Administrator\My Documents\about.html"", 0, 1)

確認して思ったこと

この日記で確認した Apple Safari 5.0.1 の Binary Planting は悪用される危険性は低いと思います。その理由は、Safari のダウンロードフォルダに explorer.exe という名前のファイルを保存させる必要があり、かつ Safari のダウンロードウインドウから特定の操作を利用者に実行させる必要があるためです。DLL 以外での Binary Planting でも容易に悪用できてしまう場合(特定のファイルを開かさるだけ等)、DLL 以外での Binary Planting も悪用される恐れがあると考えます。

参考情報

*1:他にも DLL Preloading、Binary Planting といった呼称があります。

*2:ユーザ Administrator で Safari 5.0.1 を初期設定で使用した場合です。Safari の [設定]メニューの [一般] - [ダウンロードしたファイルの保存先] の設定に依存します。

*3:2010年3月6日の日記 1) と同じ手順です。