KB2533623 対応版のセキュアなインストーラーを作るためのガイドライン

マイクロソフト セキュリティ アドバイザリ: 安全でないライブラリの読み込みにより、リモートでコードが実行される

についてガイドラインについて情報が錯そうしてるのでまとめました

大きな、ポイントは5点

・KnownDlls に登録された DLL以外は静的ロードせず遅延ロードにする

KnownDlls は通常
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
に登録されている

ADVAPI32.DLL
CLBCATQ.DLL
COMDLG32.DLL
DIFXAPI.DLL
GDI32.DLL
IERTUTIL.DLL
IMAGEHLP.DLL
IMM32.DLL
KERNEL32.DLL
LPK.DLL
MSCTF.DLL
MSVCRT.DLL
NORMALIZ.DLL
NSI.DLL
OLE32.DLL
OLEAUT32.DLL
PSAPI.DLL
RPCRT4.DLL
SECHOST.DLL
SETUPAPI.DLL
SHELL32.DLL
SHLWAPI.DLL
URLMON.DLL
USER32.DLL
USP10.DLL
WININET.DLL
WLDAP32.DLL
WS2_32.DLL

Windows 7だとこんな感じ

・必ずエントリーポイントの先頭で処理をする

#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x800

typedef BOOL (WINAPI *fSDDD)(DWORD);

HINSTANCE hDLL;
fSDDD SDDD;
hDLL=GetModuleHandleA("kernel32.dll");
SDDD= (fSDDD)GetProcAddress(hDLL,"SetDefaultDllDirectories");
if (SDDD) {
   *fSDDD(LOAD_LIBRARY_SEARCH_SYSTEM32);
}

SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32) で SYSTEM32しかDLLを読まないようにする

・試しに、ダミーの VERSION.DLL を置いて実行する

実は、一部の例外で、エントリーポイントよりも早く、Windows の脆弱性によってDLLが読み込まれるケースがある。その場合はNG

原因も特定してあるので、脆弱性について詳しくは書かないけど Microsoft に報告済み ・ω・


・試しに、ダミーの SSPICLI.DLL を置いて実行する

一部の例外で、エントリーポイントよりも早く、Windows の脆弱性によってDLLが読み込まれるケースがある。その場合はNG

こっちも恐らく、Version.DLL と同じ原因
Dependency Walker 経由で起動したりすると再現する ・ω・

・SetDllDirectory は実はあまり意味がない

SetDllDirectoryは実は、 CWD 攻撃からの回避にしか意味がありません。

おまけ
Dynamic-Link Library Search Order (Windows)
Windows XP 以前は SafeDllSearchMode が無効になってるのでユーザー側で有効すべき。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode が 1になってること推奨


SetDefaultDllDirectories が適用できない Vista / 7 の場合

LoadLibraryExW("C:\\Windows\\System32\\DLL名" , NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
を、危険なDLLの数だけ回す必要がある

newtab-dev/loaddlls.cpp at master ・ mozilla/newtab-dev
どんなDLLがあるか 参考にするのはここかな

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です