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:
@ -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));
|
||||
|
Reference in New Issue
Block a user