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; |
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があるか 参考にするのはここかな
Comments