1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-02 03:52:49 -05:00

Lock down the search path for Windows DLL loading.

At least on systems providing SetDefaultDllDirectories, this should
stop PuTTY from being willing to load DLLs from its containing
directory - which makes no difference when it's been properly
installed (in which case the application dir contains no DLLs anyway),
but does if it's being run from somewhere uncontrolled like a browser
downloads directory.

Preliminary testing suggests that this shouldn't break any existing
deliberate use of DLLs, including GSSAPI providers.
This commit is contained in:
Simon Tatham
2016-07-18 20:02:32 +01:00
parent f56dd17709
commit 9398d23033
7 changed files with 43 additions and 0 deletions

View File

@ -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));