パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

VS2010 でコンパイルされた全ての単体 MFC アプリケーションに脆弱性が存在」記事へのコメント

  • 手持ちのアプリケーションを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接頭

    • 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ヘッダの整合性のとれたファイル入れれば違うのかも。

          親コメント

人生unstable -- あるハッカー

処理中...