X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinmisc.c;h=11e2ca0f7d1353b46db523ca2d66f48b8ba85ad6;hb=9398d230339d5bfaa94093af89a17abf33b5dfad;hp=f2e4f223595b4b73d642df1648223f282583d85a;hpb=009ab4a20cfd685ff20b8f922068ffa6900b92c7;p=PuTTY.git diff --git a/windows/winmisc.c b/windows/winmisc.c index f2e4f223..11e2ca0f 100644 --- a/windows/winmisc.c +++ b/windows/winmisc.c @@ -149,6 +149,38 @@ char *get_username(void) return got_username ? user : NULL; } +void dll_hijacking_protection(void) +{ + /* + * If the OS provides it, call SetDefaultDllDirectories() to + * prevent DLLs from being loaded from the directory containing + * our own binary, and instead only load from system32. + * + * This is a protection against hijacking attacks, if someone runs + * PuTTY directly from their web browser's download directory + * having previously been enticed into clicking on an unwise link + * that downloaded a malicious DLL to the same directory under one + * of various magic names that seem to be things that standard + * Windows DLLs delegate to. + * + * It shouldn't break deliberate loading of user-provided DLLs + * such as GSSAPI providers, because those are specified by their + * full pathname by the user-provided configuration. + */ + static HMODULE kernel32_module; + DECL_WINDOWS_FUNCTION(static, BOOL, SetDefaultDllDirectories, (DWORD)); + + if (!kernel32_module) { + kernel32_module = load_system32_dll("kernel32.dll"); + GET_WINDOWS_FUNCTION(kernel32_module, SetDefaultDllDirectories); + } + + if (p_SetDefaultDllDirectories) { + /* LOAD_LIBRARY_SEARCH_SYSTEM32 only */ + p_SetDefaultDllDirectories(0x800); + } +} + BOOL init_winver(void) { ZeroMemory(&osVersion, sizeof(osVersion));