vulnerabilityと呼ばれるプログラムのDLL読み込みに関する脆弱性について、前後編の2回に分けて解説します。hijackingの脆弱性に対し攻撃を受けないアプリケーションを開発するため、Microsoftが開発者向けに公開している対策方法の一部を紹介します。hijackingと呼ばれるプログラムのDLL読み込みに関する脆弱性の概要および、関連するイベントを紹介しました。vector」というエントリを追加し、より詳細な技術情報を説明しています。attacks」が提供されました。プリロード攻撃を防ぐ」も提供されています。ガイダンス文書の構成は、以下のようになっています。安全でないライブラリロードの特定に関するガイダンスライブラリをロードするコード例として、攻撃に悪用される可能性のあるコード例と安全なコード例を示しています。Monitorを使って観察する方法について簡単に説明しています。追加のリソース関連するブログ記事やMSDNの情報がリストされています。今回はこの文書に基づいて、Windowsアプリケーション開発における対策方法をご紹介します。引数はフルパスで指定せよWindowsにおいて、ライブラリを動的にロードするために用意されているAPIはLoadLibrary()です。ファイル名だけが指定されていた場合には、前編でも説明したように、あらかじめ定められているディレクトリから順番に探し出そうとします。攻撃者はその挙動を悪用して、攻撃コードを含むDLLを読み込ませようとするのでした。そのような攻撃を受けないようにするには、完全修飾パスでDLLファイルを指定することが推奨されます。アプリケーションのユーザ側としても、決まったディレクトリにあるDLLが使われると分かっていれば、管理しやすいはずです。(2)DLL探索リストからカレントディレクトリを削除せよLoadLibrary()呼び出しにおいて、カレントディレクトリを検索させないように設定する、という手段も有効です。SetDllDirectory()を呼び出すことで実現できます。ドキュメントファイルをダブルクリックすることでアプリケーションを起動するとき、カレントディレクトリはそのドキュメントファイルが置いてあるディレクトリになっています。そのため、一緒に置いてあるDLLが読み込まれてしまう危険があるのです。アプリケーションでLoadLibrary()を使っている場合には、アプリケーションの初期化処理のなかで、SetDllDirectory("")を呼び出しておきましょう。(3)DLL探索にSearchPath()は使うなWindowsでは、SearchPath()という関数を使ってドキュメントファイル(あるいはデータファイル)を探索することができます。LoadLibrary()とは別の探索ディレクトリリストを持っていることに注意が必要です。MSDN(英語)のSearchPath()の説明にも、DLLファイルの探索に使うことは推奨しないとの注意書きが記載されています。function.(http://msdn.microsoft.com/en-us/library/aa365527%28VS.85%29.aspx)SearchPath()を使ってDLLファイルを探索し、見つけたDLLファイルをLoadLibrary()で読み込む、というような組み合わせになっているコードは危険です。SearchPath()を使わない形に修正する必要があります。LoadLibrary()を使用している場合があります。この目的のためには専用の関数があるので適切なものを使うべきです。バージョンをチェックするのではなく、その機能の存在を調べる正しいAPIを使うべきである、と述べられています。XPなどこのライブラリが存在しないシステムでは、Firefoxは引き続き現在のワーキングディレクトリからライブラリを読み込もうとします。攻撃者はこの脆弱性を悪用して、HTMLファイルと悪質なdwmapi.dllのコピーをコンピュータ上の同じディレクトリにダウンロードし、そのHTMLファイルをFirefoxで開くようユーザを仕向け、その結果悪質なコードを実行させることが可能でした。攻撃者が被害者と同じネットワーク上にいた場合、UNCパスを通じて悪質なDLLを読み込ませることも可能でした。(http://www.mozilla-japan.org/security/announce/2010/mfsa2010-52.html)(5)実行可能ファイルの読み込みにも注意DLL読み込みと同様の注意が必要な場面がもう一つあります。アプリケーションから別のアプリケーションを実行する場合です。このような機能のためにCreateProcess()やShellExecute()などの関数が用意されていますが、DLL読み込みと同様の注意が必要であるとされています。オープンソースプログラムの修正事例Windows版のオープンソースソフトウェアであるVLCでは、本脆弱性の修正が以下のように行われています(VideoLAN-SA-1005)。以下にそのパッチを引用します。}パッチで追加された行(+文字ではじまる行)からも分かるように、SetDllDirectoryA()を空文字列("")を引数に与えて呼び出すことで、DLLのサーチパスからカレントディレクトリを取り除く処理を追加していることが分かります。終わりに後編では、Microsoftが提供している開発者向けガイダンスにもとづいて、Windowsアプリケーション開発で心得ておくべき事項を説明しました。hijacking攻撃の影響を受けるかどうか、チェックするところから始めてみてください。いいえその他、ご意見・ご感想などございましたら、ご記入ください。こちらはご意見・ご感想用のフォームです。各社製品については、各社へお問い合わせください。※本フォームにいただいたコメントへの返信はできません。javascriptを有効にすると、ご回答いただけます。ありがとうございました。