アカウント名:
パスワード:
手持ちのアプリケーションをDependency Walkerで確認してみましたが、Visual Studio 6.0及びVisual Studio 2005で作成したスタティックリンク系MFCアプリケーションも、dwmapi.dllを間接的にロードしているように見えます。(実際にロードされるかは未確認)
そもそも、VS2010のMFCもdwmapi.dllを直接ロードしているわけではなく、ダイナミックリンクしているshell32.dllから間接的に呼ばれているわけで……。これ、下手をするとshell32.dllを呼び出すアプリは全滅じゃないですかね?ちなみに、shell32.dllはその名の通りシェル関連のDLLで、SHGetMallocのようなSH接頭辞付きAPIとか、ドラッグ&ドロップ関連とかが含まれます。MFCじゃなくても該当アプリはかなり(と言うか、GUI系アプリではリンクしないほうが珍しいぐらい?)ありそうな気がするんですか(^^;)
# どうも、このDLLハイジャック問題は影響度が少々誇張されているように思います。# Vista以後では発生しませんし、XP以前でもWebClientさえ止めればまず問題ないのでは?
system32あたりに空ファイル作ってdwmapi.dllという名前にしておけばXPでも無問題という風に読めたんだけど、違うかな?
>dwmapi.dllが存在しないため、LoadLibraryは標準のDLL検索パスを捜査し続け最終的にはカレントディレクトリここらへんがちょっと違う。LoadLibraryのディレクトリ探索順はカレントの方が先なんだけど、レジストリに登録済みのDLLはそっちが先に読まれる。だからこそアーカイバDLLとかが問題になってる。Webなんとかの問題みたいに考えられてるけど、これも違って、普通にアーカイブ内に関連付けで脆弱appが起動するファイルとdllを置いておけば、exe等のバイナリじゃない単なるファイルを起動しただけで見知らぬバイナリが実効されることになる。
#レジストリに登録って馬から落馬だよね。
DLL Hijacking全般の話と、この件のみの話がごっちゃになってる。
この件は古いOSの問題なんだから古いOSの話しないと意味ないでしょうに。>dwmapi.dllの存在するプラットフォーム(Vista以降)でそんな危険な探索順のものは存在しません存在するなら問題ないんだって。
> system32あたりに空ファイル作って> dwmapi.dllという名前にしておけばXPでも無問題> という風に読めたんだけど、違うかな?
ライブラリファイルの検索&ロードは、失敗するとファイルが無かったと見なされるので、空っぽのファイル入れても、ロード失敗するだけなので、全く無意味ですね。
ちゃんとPEヘッダの整合性のとれたファイル入れれば違うのかも。
dwmapi.dllがVista以降のものならXPに含まれるshell32.dllがロードするわけありませんが。ということでMFCソースコードを検索したらafxglobals.cppにAfxCtxLoadLibraryW(L"dwmapi.dll")ってありましたよ。
あ、ほんとだ。おっしゃるとおりですね(^^;)あくまでVS 2010+MFCのみの問題ということになりますか。と言う事で、私の#1849554のコメントは不正確だったようです。失礼しました。
Dependency Walkerのプロファイル機能を使えば、実際にアプリケーションを実行して、読み込まれたDLLを表示してくれます。Depencency Walkerで静的に解析しただけだと表示されないということは、MFCもdwmapi.dllをLoadLibraryして使っているのだと思います。
あるいは、該当する機能を使った場合のみリンクされるというつくりなのでしょうかね(それなら「すべてのMFCアプリ」ではないですが)。Visual Studio 2010が今手元にあればMFCのソースを確認できるのですが。
shell32.dllからリンクしているものは、無関係だと思います。もしそうなら、もっと大騒ぎになっているはずでしょう。おそらく、Vista以前のshell32.dllはdwmapi.dllとリンクしていないと思います。
こうなるとMFCではなくてWin32APIを直接使ったアプリも駄目な気がしてくるよ。となるとVBとかでもWin32APIを直接叩いているようなアプリも・・・・
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
Stableって古いって意味だっけ? -- Debian初級
VS 2010+MFCだけの問題? (スコア:1, 興味深い)
手持ちのアプリケーションをDependency Walkerで確認してみましたが、Visual Studio 6.0及びVisual Studio 2005で作成したスタティックリンク系MFCアプリケーションも、dwmapi.dllを間接的にロードしているように見えます。
(実際にロードされるかは未確認)
そもそも、VS2010のMFCもdwmapi.dllを直接ロードしているわけではなく、ダイナミックリンクしているshell32.dllから間接的に呼ばれているわけで……。
これ、下手をするとshell32.dllを呼び出すアプリは全滅じゃないですかね?
ちなみに、shell32.dllはその名の通りシェル関連のDLLで、SHGetMallocのようなSH接頭辞付きAPIとか、ドラッグ&ドロップ関連とかが含まれます。
MFCじゃなくても該当アプリはかなり(と言うか、GUI系アプリではリンクしないほうが珍しいぐらい?)ありそうな気がするんですか(^^;)
# どうも、このDLLハイジャック問題は影響度が少々誇張されているように思います。
# Vista以後では発生しませんし、XP以前でもWebClientさえ止めればまず問題ないのでは?
Re:VS 2010+MFCだけの問題? (スコア:5, 参考になる)
一方で、MFCは、どのプラットフォーム上においてもLoadLibrary("dwmapi.dll")を実行してしまいます。これは、Vista以降では、正しいdwmapi.dllをロードしますが、XP上では、dwmapi.dllが存在しないため、LoadLibraryは標準のDLL検索パスを捜査し続け、最終的にはカレントディレクトリも捜査してしまうため、カレントディレクトリに偽物のdwmapi.dllがあれば、誤ってそれを読み込んでしまう(実行してしまうこと)になります。
つまり、XPではこの攻撃は有効です。
対策としては、<a href="http://support.microsoft.com/kb/2389418/ja">DLL プリロード攻撃を防止するためのライブラリの安全な読み込み</a>にあるように、SetDllDirectory("")によって、カレントディレクトリをDLLのDLL検索パスから除外することがもっとも簡単で有効な方法であると考えられます。
あてずっぽうだけど (スコア:0)
system32あたりに空ファイル作って
dwmapi.dllという名前にしておけばXPでも無問題
という風に読めたんだけど、違うかな?
Re:あてずっぽうだけど (スコア:1)
>dwmapi.dllが存在しないため、LoadLibraryは標準のDLL検索パスを捜査し続け最終的にはカレントディレクトリ
ここらへんがちょっと違う。
LoadLibraryのディレクトリ探索順はカレントの方が先なんだけど、レジストリに登録済みのDLLはそっちが先に読まれる。
だからこそアーカイバDLLとかが問題になってる。
Webなんとかの問題みたいに考えられてるけど、これも違って、普通にアーカイブ内に関連付けで脆弱appが起動するファイルとdllを置いておけば、
exe等のバイナリじゃない単なるファイルを起動しただけで見知らぬバイナリが実効されることになる。
#レジストリに登録って馬から落馬だよね。
Re:あてずっぽうだけど (スコア:1)
DLL Hijacking全般の話と、この件のみの話がごっちゃになってる。
この件は古いOSの問題なんだから古いOSの話しないと意味ないでしょうに。
>dwmapi.dllの存在するプラットフォーム(Vista以降)でそんな危険な探索順のものは存在しません
存在するなら問題ないんだって。
Re:あてずっぽうだけど (スコア:1)
> system32あたりに空ファイル作って
> dwmapi.dllという名前にしておけばXPでも無問題
> という風に読めたんだけど、違うかな?
ライブラリファイルの検索&ロードは、失敗するとファイルが無かったと見なされるので、
空っぽのファイル入れても、ロード失敗するだけなので、全く無意味ですね。
ちゃんとPEヘッダの整合性のとれたファイル入れれば違うのかも。
Re:VS 2010+MFCだけの問題? (スコア:2, 参考になる)
dwmapi.dllがVista以降のものならXPに含まれるshell32.dllがロードするわけありませんが。
ということでMFCソースコードを検索したらafxglobals.cppにAfxCtxLoadLibraryW(L"dwmapi.dll")ってありましたよ。
Re:VS 2010+MFCだけの問題? (スコア:1)
あ、ほんとだ。おっしゃるとおりですね(^^;)
あくまでVS 2010+MFCのみの問題ということになりますか。
と言う事で、私の#1849554のコメントは不正確だったようです。失礼しました。
Re:VS 2010+MFCだけの問題? (スコア:1)
Dependency Walkerのプロファイル機能を使えば、実際にアプリケーションを実行して、読み込まれたDLLを表示してくれます。Depencency Walkerで静的に解析しただけだと表示されないということは、MFCもdwmapi.dllをLoadLibraryして使っているのだと思います。
あるいは、該当する機能を使った場合のみリンクされるというつくりなのでしょうかね(それなら「すべてのMFCアプリ」ではないですが)。Visual Studio 2010が今手元にあればMFCのソースを確認できるのですが。
shell32.dllからリンクしているものは、無関係だと思います。もしそうなら、もっと大騒ぎになっているはずでしょう。おそらく、Vista以前のshell32.dllはdwmapi.dllとリンクしていないと思います。
Re: (スコア:0)
dwmapi.dllってAero関係ですよね。
(Microsoft Desktop Window Manager API)
てことはAero有効の時に呼ばれるわけで、
それはつまりVISTA以降にしか存在しないファイルですね。
<blockquote># Vista以後では発生しませんし、XP以前でもWebClientさえ止めればまず問題ないのでは?</blockquote>
この流れからするとdwmapi.dllに関しては、
Vista以後もXP以前も問題ないってのが答えかと思います。
Re: (スコア:0)
こうなるとMFCではなくてWin32APIを直接使ったアプリも駄目な気がしてくるよ。
となるとVBとかでもWin32APIを直接叩いているようなアプリも・・・・