VS2010 でコンパイルされた全ての単体 MFC アプリケーションに脆弱性が存在 19
ストーリー by reo
範囲が広そうな 部門より
範囲が広そうな 部門より
ある Anonymous Coward 曰く、
いささか旧聞に属するが、Visual Studio 2010 でコンパイルされた全ての単体 MFC アプリケーションが、Windows XP 以前の PC 上での実行において脆弱性を持っているとのこと (ACROS Security Blog の記事)。
この脆弱性は以前話題になったDLL ハイジャックの問題から来るもの (ロードしてしまう DLL は dwmapi.dll)。問題は VS 2010 の MFC ライブラリにあり、Microsoft は Visual C++ 再頒布パッケージへのパッチを提供するとのことだが、MFC ライブラリと静的リンクしているアプリケーションは修正された VS 2010 で再コンパイルしない限り対処できないとのこと。
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を直接叩いているようなアプリも・・・・
XP以前っていうけど (スコア:0)
XPだけですよね。VS2010でコンパイルされた実行ファイルは2k以前だと起動しないわけで。
Re:XP以前っていうけど (スコア:1)
2000で普通は起動しないけど、動くように [livedoor.jp]はできますね(あくまでも例外)。
後、Windows 2000 はサポート切れですが、Windows 2000 Embedded は5年間出荷されるので、組み込み分野でまだ使われていくことでしょう。
ちょっと調べてみたら、
Adobe Flash Player や Visual Studio 2008のMFCにも
hDll=LoadLibraryW("dwmapi.dll");
if(hDll){
GetProcAddress(hDll,"DwmIsCompositionEnabled");
//略
}
って処理ならあるようです。
詳しくは後でブログ [livedoor.jp]にまとめておくことにします。
Re:XP以前っていうけど (スコア:1)
というわけで、実際にロードされるか調べてみました。
VS2010でコンパイルされたすべてのMFCアプリに脆弱性ってのは過小報告? [livedoor.jp]
先ほどの、Flash Player については、コードが存在するものの、Windows 2000では関数がコールされず、大丈夫でした。(XPでは呼ばれる可能性がありますが)
Visual Studio 2010に限らず、2008や 2005プロジェクトにもdwmapi.dllを動的に読み込むプログラムがかなりありました。
例としては、Safari 5や Lunascape 6.3 を Windows 2000で起動した所、ダミーで用意したdwmapi.dllが組み込まれてしまいました。
逆に、Core Temp の様にVS2010プロジェクトで内部にdwmapi.dllの動的ロードモジュールが組み込まれているのにロードされないものも存在したので、使ってるSDKのバージョンに関係あるのかもしれませんね。
Re: (スコア:0)
Windows Server 2003も忘れないで……。XPより後だけど(ぉ。
#それだけなのでAC
Re: (スコア:0)
そもそも (スコア:0)
まぁ、カレントよりも優先度が高い場所に、ダミーのDLLを置いておけば、カレントが読まれてしまうこともないでしょう。
セキュリティソフト屋は、プロセスに読み込まれるDLLを管理する機能を、速やかに実装すべきでしょう。
どうせWinそのものが (スコア:0)
気にしてたらきりがない
むしろ気にしだしたら、連中の思う壺ってことさ
悪いのはM$なんでリコールするか、ユーザー一人一人に罰金払うこったな