DLL Hijacking が修正されたソフトウェアで DLL Hijacking の問題を確認する

2010年8月24日、マイクロソフトが DLL Hijacking*1に関するセキュリティ アドバイザリ (2269637)を公開しました。この問題の影響を受けると、攻撃に悪用された場合に任意の DLL を読み込まれてしまいます。この日記では、DLL Hijacking の問題を修正したソフトウェアを例にして、DLL Hijacking の再現および修正方法を確認しました。なお、例として取り上げたバージョンのソフトウェアを使用している場合、最新バージョンに更新しましょう。

Mozilla Firefox の場合

2010年9月7日に Mozilla は、DLL Hijacking の問題を修正した Firefox 3.6.9 をリリースしました。Firefox 3.6.9 が修正した問題のうち、DLL Hijacking 問題に関するものは MFSA 2010-52 で確認できます。

Firefox はプラットフォーム判別の一環として起動時に dwmapi.dll を読み込もうとしますが、Windows XP などこのライブラリが存在しないシステムでは、Firefox は引き続き現在のワーキングディレクトリからライブラリを読み込もうとします。攻撃者はこの脆弱性を悪用して、HTML ファイルと悪質な dwmapi.dll のコピーをコンピュータ上の同じディレクトリにダウンロードし、その HTML ファイルを Firefox で開くようユーザを仕向け、その結果悪質なコードを実行させることが可能でした。

http://www.mozilla-japan.org/security/announce/2010/mfsa2010-52.html
DLL Hijacking の再現

Windows XP SP3 において、ユーザ Administrator がデスクトップに保存した test.html を Firefox 3.6.8 で開きました*2。このとき、Process Monitor で dwmapi.dll を探索している様子を確認しました(下図を参照)。Dynamic-Link Library Search Order に従って、dwmapi.dll を探索しています。下図の反転部 5 行目で test.html を保存している C:\Documents and Settings\Administrator\デスクトップ が探索されていることが分かります。dwmapi.dll は Windows Vista 以降で導入されたものであり、Windows XP には存在しません(関連情報)。存在しない DLL を探索してしまうため、結果としてカレントディレクトリも探索されてしまいます。


dwmapi.dll という名前の DLL を test.html と同じくデスクトップに保存して、test.html を Firefox 3.6.8 で開くと、デスクトップの dwmapi.dll が読み込まれることになります。calc.exe を起動するだけの DLL*3 を dwmapi.dll という名前で保存していた場合、下図のような結果となります。

このときの dwmapi.dll の探索の様子を Process Monitor で確認すると、下図のようになります。下図の反転部 5 行目で Result 列が SUCCESS となっていることが分かります。その後も dwmapi.dll が探索されていますが、この理由は Process Monitor だけでは分かりませんでした。

DLL Hijacking の修正方法

DLL Hijacking を修正した Firefox 3.6.10 で先ほどの再現手順を実施すると、dwmapi.dll を探索せずに Firefox が test.html を描画しました。下図の反転部は Firefox 3.6.10 で dwmapi.dll を探索した後に実施されていた dbghelp.dll の探索処理です。このことから、dwmapi.dll を動的リンクしないことで、Firefox は DLL Hijacking の問題を修正したと考えます。

Apple QuickTime の場合

2010年9月15日に Apple は、DLL Hijacking の問題を修正した QuickTime 7.6.8 をリリースしました。QuickTime 7.6.8 が修正した問題のうち、DLL Hijacking 問題に関するものは HT4339 で確認できます。

A path searching issue exists in QuickTime Picture Viewer. If an attacker places a maliciously crafted DLL in the same directory as an image file, opening the image file with QuickTime Picture Viewer may lead to arbitrary code execution. This issue is addressed by removing the current working directory from the DLL search path. This issue does not affect Mac OS X systems. Credit to Haifei Li of Fortinet's FortiGuard Labs for reporting this issue.

About the security content of QuickTime 7.6.8(CVE-2010-1819 の Description)
DLL Hijacking の再現

Windows XP SP3 において、ユーザ Administrator がデスクトップに保存した profile.gif を右クリック->[プログラムで開く]->[PictureViewer]で開きました。このとき、Process Monitor で DLL を探索している様子を確認しました(下図を参照)。下図は、Apple Picture Viewer が CoreGraphics.dll を探索している様子です。下図の反転部 5 行目で profile.gif を保存しているデスクトップが探索されていることが分かります。CoreGraphics.dll は profile.gif のカレントディレクトリの次に探索されたディレクトリで見つかりました。QuickTime の場合、該当 DLL を保存しているディレクトリよりもカレントディレクトリが先に探索されてしまうため、DLL Hijacking の問題があったと言えます。

なお、CoreGraphics.dll 以外にも 2 つの DLL で同じような探索が行われていました。詳しくは FGA-2010-46 を参照してください。


CoreGraphics.dll という名前の DLL を profile.gif と同じくデスクトップに保存して、profile.gif を Picture Viewer で開くと、デスクトップの CoreGraphics.dll が読み込まれます。Firefox の再現時と同じ DLL を CoreGraphics.dll という名前で保存して、この動作を実行してみました。しかし、calc.exe が実行されませんでした(下図を参照)。

このときの CoreGraphics.dll の探索の様子を Process Monitor で確認すると、下図のようになります。下図の反転部 5 行目で Result 列が SUCCESS となっていることが分かります。calc.exe が実行されなかった原因は分かりませんでした。デバッガで調べればよいと思うのですが、僕の技術や時間不足から突っ込んで調べていません。

DLL Hijacking の修正方法

DLL Hijacking を修正した QuickTime 7.6.8 に同梱されている Picture Viewer で先ほどの再現手順を実施すると、カレントディレクトリを探索せずに CoreGraphics.dll が見つかりました(下図の反転部を参照)。Apple のアドバイザリに "This issue is addressed by removing the current working directory from the DLL search path" と記述がある通り、カレントディレクトリを探索対象外とするように修正したようです。

この問題が悪用されるシナリオ

この問題が悪用されるシナリオとしては、SMB や WebDAV を使ったファイル共有を使って、利用者を攻撃者が用意した Web サイト等に誘導するシナリオが想定でいますが、それよりも USB メモリに保存したファイルを開かせるシナリオが危険だと考えます。僕が USB メモリを媒介とした攻撃シナリオが危険だと考える理由は 2 つあります。

  1. 潜在的に DLL Hijacking の問題を抱えているソフトウェアが多い*4
    • 問題のあるソフトウェアがすべて修正されるとは考えにくい
  2. ユーザは通常と同じ操作*5をするだけで攻撃が成功してしまう恐れがある
    • 圧縮ファイル(問題を修正したソフトウェアの例:LhaForgeExplzhLHMelt
    • 動画・画像ファイル(問題を修正したソフトウェアの例:QuickTime
    • HTMLファイル(問題を修正したソフトウェアの例:FirefoxSafariOpera

大規模なマルウェア感染よりは、標的型攻撃(Tragetted Attack)に悪用されてしまう懸念があります。最近、USB メモリを媒介した攻撃として、LNK ファイルの脆弱性を悪用した SCADA への攻撃がありました。このような攻撃に悪用されるように感じました。

確認して思ったこと

DLL 探索順序に沿って、探索される DLL と同名のファイルを置いておけばよいため、悪用しやすい問題だと言えます。根本的に DLL Hijacking の問題を修正するには、個々のソフトウェアで DLL Hijacking の問題を修正するのではなく、Windows がカレントディレクトリで DLL 探索しないように修正すればよいと思います。だけど、カレントディレクトリを探索パスから外すことで影響を受けるソフトウェアもあるようなので、互換性を意識して Microsoft が修正しない気がします。

*1:他にも DLL Preloading、Binary Planting といった呼称があります。この日記では DLL Hijacking に統一します

*2:実際には .html を Firefox に関連付けしているため、ダブルクリックで開きました

*3:DllMain 関数にて、pwnme() 関数を呼び出し、その関数内で WinExec("calc", SW_NORMAL); を実行するだけの DLL。この Exploit をベースにしています。ソースはここにペーストしました

*4:ここ、とかここを参照してください

*5:ファイル拡張子と影響を受けるソフトウェアが関連付いていた場合を想定しています