パスワードを忘れた? アカウント作成
268406 story
セキュリティ

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 で再コンパイルしない限り対処できないとのこと。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by T.Sawamoto (4142) on 2010年10月29日 11時27分 (#1849554)

    手持ちのアプリケーションを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さえ止めればまず問題ないのでは?

    • by espresso3389 (20549) on 2010年10月29日 13時37分 (#1849684)
      Vista以降のshell32.dllから呼び出されている分には、正真正銘の正しいdwmapi.dllが存在しますから、カレントディレクトリから偽物のdwmapi.dllがロードされるなんて事はあり得ません。つまり、Vista以降で問題が起きないのは仰るとおりです。

      一方で、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検索パスから除外することがもっとも簡単で有効な方法であると考えられます。
      親コメント
      • system32あたりに空ファイル作って
        dwmapi.dllという名前にしておけばXPでも無問題
        という風に読めたんだけど、違うかな?

        • by s4h (24325) on 2010年10月31日 6時57分 (#1850794)

          >dwmapi.dllが存在しないため、LoadLibraryは標準のDLL検索パスを捜査し続け最終的にはカレントディレクトリ
          ここらへんがちょっと違う。
          LoadLibraryのディレクトリ探索順はカレントの方が先なんだけど、レジストリに登録済みのDLLはそっちが先に読まれる。
          だからこそアーカイバDLLとかが問題になってる。
          Webなんとかの問題みたいに考えられてるけど、これも違って、普通にアーカイブ内に関連付けで脆弱appが起動するファイルとdllを置いておけば、
          exe等のバイナリじゃない単なるファイルを起動しただけで見知らぬバイナリが実効されることになる。

          #レジストリに登録って馬から落馬だよね。

          親コメント
        • > system32あたりに空ファイル作って
          > dwmapi.dllという名前にしておけばXPでも無問題
          > という風に読めたんだけど、違うかな?

          ライブラリファイルの検索&ロードは、失敗するとファイルが無かったと見なされるので、
          空っぽのファイル入れても、ロード失敗するだけなので、全く無意味ですね。

          ちゃんとPEヘッダの整合性のとれたファイル入れれば違うのかも。

          親コメント
    • by Tsann (15931) on 2010年10月29日 13時15分 (#1849663)

      dwmapi.dllがVista以降のものならXPに含まれるshell32.dllがロードするわけありませんが。
      ということでMFCソースコードを検索したらafxglobals.cppにAfxCtxLoadLibraryW(L"dwmapi.dll")ってありましたよ。

      親コメント
    • by Egtra (38265) on 2010年10月29日 12時41分 (#1849620)

      Dependency Walkerのプロファイル機能を使えば、実際にアプリケーションを実行して、読み込まれたDLLを表示してくれます。Depencency Walkerで静的に解析しただけだと表示されないということは、MFCもdwmapi.dllをLoadLibraryして使っているのだと思います。

      あるいは、該当する機能を使った場合のみリンクされるというつくりなのでしょうかね(それなら「すべてのMFCアプリ」ではないですが)。Visual Studio 2010が今手元にあればMFCのソースを確認できるのですが。

      shell32.dllからリンクしているものは、無関係だと思います。もしそうなら、もっと大騒ぎになっているはずでしょう。おそらく、Vista以前のshell32.dllはdwmapi.dllとリンクしていないと思います。

      親コメント
    • by Anonymous Coward
      <blockquote>MFCじゃなくても該当アプリはかなり(と言うか、GUI系アプリではリンクしないほうが珍しいぐらい?)ありそうな気がするんですか(^^;)</blockquote>

      dwmapi.dllってAero関係ですよね。
      (Microsoft Desktop Window Manager API)
      てことはAero有効の時に呼ばれるわけで、
      それはつまりVISTA以降にしか存在しないファイルですね。

      <blockquote># Vista以後では発生しませんし、XP以前でもWebClientさえ止めればまず問題ないのでは?</blockquote>

      この流れからするとdwmapi.dllに関しては、
      Vista以後もXP以前も問題ないってのが答えかと思います。
    • by Anonymous Coward

      こうなるとMFCではなくてWin32APIを直接使ったアプリも駄目な気がしてくるよ。
      となるとVBとかでもWin32APIを直接叩いているようなアプリも・・・・

  • by Anonymous Coward on 2010年10月29日 10時22分 (#1849500)

    XPだけですよね。VS2010でコンパイルされた実行ファイルは2k以前だと起動しないわけで。

    • 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]にまとめておくことにします。

      親コメント
      • というわけで、実際にロードされるか調べてみました。
        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のバージョンに関係あるのかもしれませんね。

        親コメント
    • by Anonymous Coward

      Windows Server 2003も忘れないで……。XPより後だけど(ぉ。

      #それだけなのでAC

      • by Anonymous Coward
        ってことは、Windows Home Serverもか。
  • by Anonymous Coward on 2010年10月29日 15時33分 (#1849790)
    DLLのサーチパスの問題はOSの設計の脆弱性であり、それをアプリケーションが個別に回避しているのであって、回避しないと脆弱だってのは変だと思う。
    まぁ、カレントよりも優先度が高い場所に、ダミーのDLLを置いておけば、カレントが読まれてしまうこともないでしょう。

    セキュリティソフト屋は、プロセスに読み込まれるDLLを管理する機能を、速やかに実装すべきでしょう。
  • by Anonymous Coward on 2011年01月11日 10時02分 (#1886100)
    どうせWinそのものがスパイウェアなんで気にしない
    気にしてたらきりがない
    むしろ気にしだしたら、連中の思う壺ってことさ
    悪いのはM$なんでリコールするか、ユーザー一人一人に罰金払うこったな
typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...