mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-11 08:08:06 -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:
parent
f56dd17709
commit
9398d23033
@ -347,6 +347,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
HRESULT hr;
|
||||
int guess_width, guess_height;
|
||||
|
||||
dll_hijacking_protection();
|
||||
|
||||
hinst = inst;
|
||||
hwnd = NULL;
|
||||
flags = FLAG_VERBOSE | FLAG_INTERACTIVE;
|
||||
|
@ -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));
|
||||
|
@ -1519,6 +1519,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
char **argv;
|
||||
int ret;
|
||||
|
||||
dll_hijacking_protection();
|
||||
|
||||
InitCommonControls();
|
||||
hinst = inst;
|
||||
hwnd = NULL;
|
||||
|
@ -1072,6 +1072,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
||||
int argc, i;
|
||||
char **argv, **argstart;
|
||||
|
||||
dll_hijacking_protection();
|
||||
|
||||
hinst = inst;
|
||||
hwnd = NULL;
|
||||
|
||||
|
@ -312,6 +312,8 @@ int main(int argc, char **argv)
|
||||
int just_test_share_exists = FALSE;
|
||||
unsigned long now, next, then;
|
||||
|
||||
dll_hijacking_protection();
|
||||
|
||||
sklist = NULL;
|
||||
skcount = sksize = 0;
|
||||
/*
|
||||
|
@ -773,6 +773,8 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
int ret;
|
||||
|
||||
dll_hijacking_protection();
|
||||
|
||||
ret = psftp_main(argc, argv);
|
||||
|
||||
return ret;
|
||||
|
@ -478,6 +478,7 @@ void show_help(HWND hwnd);
|
||||
* Exports from winmisc.c.
|
||||
*/
|
||||
extern OSVERSIONINFO osVersion;
|
||||
void dll_hijacking_protection(void);
|
||||
BOOL init_winver(void);
|
||||
HMODULE load_system32_dll(const char *libname);
|
||||
const char *win_strerror(int error);
|
||||
|
Loading…
x
Reference in New Issue
Block a user