オープンソースプログラムの修正事例
Windows版のオープンソースソフトウェアであるVLCでは、本脆弱性の修正が以下のように行われています(VideoLAN-SA-1005)。以下にそのパッチを引用します。
diff --git a/bin/winvlc.c b/bin/winvlc.c index 2d09cba..ac9b97c 100644 (file) --- a/bin/winvlc.c +++ b/bin/winvlc.c @@ -131,12 +131,19 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, if(h_Kernel32) { BOOL (WINAPI * mySetProcessDEPPolicy)( DWORD dwFlags); + BOOL (WINAPI * mySetDllDirectoryA)(const char* lpPathName); # define PROCESS_DEP_ENABLE 1 mySetProcessDEPPolicy = (BOOL WINAPI (*)(DWORD)) GetProcAddress(h_Kernel32, "SetProcessDEPPolicy"); if(mySetProcessDEPPolicy) mySetProcessDEPPolicy(PROCESS_DEP_ENABLE); + + /* Do NOT load any library from cwd. */ + mySetDllDirectoryA = (BOOL WINAPI (*)(const char*)) GetProcAddress(h_Kernel32, "SetDllDirectoryA"); + if(mySetDllDirectoryA) + mySetDllDirectoryA(""); + FreeLibrary(h_Kernel32); }
パッチで追加された行(+文字ではじまる行)からも分かるように、SetDllDirectoryA()を空文字列("")を引数に与えて呼び出すことで、DLLのサーチパスからカレントディレクトリを取り除く処理を追加していることが分かります。
終わりに
後編では、Microsoftが提供している開発者向けガイダンスにもとづいて、Windowsアプリケーション開発で心得ておくべき事項を説明しました。
皆さんも、まずは自分が書いたコードがDLL hijacking攻撃の影響を受けるかどうか、チェックするところから始めてみてください。
参考情報
- マイクロソフト セキュリティ アドバイザリ(2269637) 安全でないライブラリのロードにより、リモートでコードが実行される
- More information about the DLL Preloading remote attack vector
- Secure loading of libraries to prevent DLL preloading attacks(docxファイル)
- ライブラリを安全にロードして DLL のプリロード攻撃を防ぐ(docxファイル/上記の日本語訳)
- Mozilla Foundation セキュリティアドバイザリ 2010-52 Windows XP における DLL 読み込み脆弱性
- VideoLAN Project VideoLAN-SA-1005: DLL preloading vulnerability