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