Pull to refresh
0

Концептуальная уязвимость в механизме загрузки DLL (MSA2269637)

Reading time 3 min
Views 17K
На прошлой неделе на Хабре уже писали о заявлении HD Moore и найденной им уязвимости, которая содержится в достаточно большом количестве приложений и работает на всех версиях MS Windows. Но все оказалось куда серьезнее, так как речь идет не просто о найденной уязвимости, а о концептуальной ошибке в дизайне механизма загрузки динамических библиотек. По этому поводу вчера Microsoft официально выпустила Security Advisory (2269637), что означает официальное признание серьезности данной уязвимости. Но давайте попробуем разобраться в сути этой проблемы, так как она ничуть не менее серьезная, нежели недавно найденная уязвимость в загрузке LNK-файлов.

Уязвимость заключается в том, что многие программы при вызове функции LoadLibrary() не проверяют корректность пути, по которому эта библиотека может быть загружена. Таким образом, они позволяют произвести подмену выполняемой библиотеки. Это связано с тем, что поиск загружаемой библиотеки осуществляется в первую очередь в директории, содержащей образ исполняемого файла, который породил процесс (подмененная библиотека выполняется с привилегиями пользователя, запустившего процесс). К примеру, Georgi Guninski предложил следующую демонстрацию (PoC) данной уязвимости:

1) Скомпилировать разработанный им код, как динамическую библиотеку
2) Переименовать получившуюся библиотеку в riched20.dll и поместить в любую директорию на ваш выбор
3) Проверить, есть ли открытые приложения из пакета MS Office. И если есть, тогда закрыть их
4) Отрыть документ MS Word при помощи двойного клика по нему из Windows Explorer в той директории, куда была помещена наша riched20.dll

По большому счету, такого рода уязвимости приложений не новое веяние, и известны они были уже давно. Например, об этой проблеме David LeBlanc писал (“DLL Preloading Attacks”) еще в 2008 году. Другое дело в том, что проблема существует до сих пор и количество приложений, уязвимых таким образом, по-прежнему очень велико. Самое страшное и поразительное то, что подмену можно осуществить не только на локально расположенную DLL, но и загрузить удаленно расположенную библиотеку. Примером для демонстрации этой возможности послужила уязвимость для iTunes, которая при открытии медиа-файлов с сетевых ресурсов могла подгружать динамические библиотеки из этого же сетевого хранилища. Для успешной эксплуатации нужно лишь сформировать SMB или WebDAV путь (к примеру, такой: \\server\movies\) к сетевому ресурсу, и чтобы при запуске файла в этой же директории располагалась динамическая библиотека, которую мы хотим выполнить. Для проведения атак подобного рода уже реализован универсальный эксплойт в составе проекта Metasploit (пример использования описан тут).

Теперь давайте поговорим о том, что с этим делать и как этого можно избежать в своих программах. Вероятнее всего, на закрытие этой уязвимости уйдёт немало времени у разработчиков, ведь уязвимость содержится в архитектуре механизма выполнения динамических библиотек. И закрыть ее, не повлияв на работоспособность уже имеющегося софта, будет не так то просто. Итак, во-первых, существует реализация функции SafeLoadLibrary() от David LeBlanc и best practices от MS:

HMODULE SafeLoadLibrary(const wchar_t* wzFileName)
{
static wchar_t wzSystem[MAX_PATH];
wchar_t wzCurDir[MAX_PATH];
HMODULE hMod = NULL;
if(wzSystem[0] == L'\0')
{
if(GetSystemDirectory(wzSystem, _countof(wzSystem)) == 0)
return NULL;
}

// Now get the actual current working directory
if(GetCurrentDirectory(_countof(wzCurDir), wzCurDir) == 0)
wzCurDir[0] = L'\0';
SetCurrentDirectory(wzSystem);
hMod = LoadLibrary(wzFileName);
SetCurrentDirectory(wzCurDir);
return hMod;
}


Так же существует утилита DLL Hijacking Audit Tool, созданная Rapid7/HDmoore, для поиска уязвимых приложений и рекомендации от MS.
Tags:
Hubs:
+38
Comments 73
Comments Comments 73

Articles

Information

Website
www.esetnod32.ru
Registered
Founded
Employees
1,001–5,000 employees
Location
Словакия