Содержание статьи
Одна из самых популярных атак, направленных на повышение привилегий, — это DLL Hijacking. Чтобы ее провести, атакующий помещает свою вредоносную библиотеку на пути поиска легитимной DLL. Это приводит к тому, что целевое приложение подгружает стороннюю либу и выполняет вредоносный код.
На первый взгляд такая атака кажется очень простой. Я бы даже сказал — примитивной. Тем не менее существует несколько подводных камней, которые часто упускают из вида атакующие.
Во‑первых, многие забывают сделать DLL Proxying до целевой библиотеки, что приводит к поломке всего приложения. Оно крашится, так как пытается вызвать функцию из библиотеки, в которой нужного кода нет.
Во‑вторых, иногда вызов функций вроде LoadLibrary(, CreateProcess( и CreateThread( помещают в функцию DllMain(, что приводит к дедлоку (Dead Lock) из‑за механизма Loader Lock. Loader Lock выступает в качестве критической секции (примитив синхронизации потоков процесса). Фактически выполнение потока программы блокируется до момента снятия Loader Lock.
www
Подробнее о Loader Lock — в блоге Elliot on Security: Perfect DLL Hijacking, What is Loader Lock.
В‑третьих, существуют некоторые факторы, влияющие на порядок поиска DLL. Стандартные пути поиска изображены ниже.

Это так называемый SafeDllSearchMode. Если он отключен, то после Application  функция LoadLibrary*( смотрит Current . Отключить SafeDllSearchMode можно, выставив в ноль значение по этому пути:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
Еще один фактор, влияющий на поиск, — это функция LoadLibraryEx(, вызванная со значением LOAD_WITH_ALTERED_SEARCH_PATH. В таком случае первым делом DLL ищутся по пути, указанному внутри этой функции.
Помимо прочего, существуют встроенные механизмы Windows, которые позволяют внедрить нашу библиотеку в целевой процесс. В документации Microsoft есть упоминание некоторых из них. Давай изучим их подробнее.
DLL Redirection
Для обычных исполняемых файлов
DLL Redirection — специальный механизм, позволяющий программам использовать разные версии DLL для своих задач, причем не затрагивая обычные системные библиотеки. Действие распространяется только на функции LoadLibrary*(.
Фактически, независимо от того, указан ли в ней полный путь (C:\) или короткий (dll.), функция проверит, присутствует ли в текущей директории (в которой находится приложение, вызвавшее эту функцию) файл с расширением .local. И если присутствует, то функция LoadLibrary*( в любом случае загрузит в первую очередь DLL из текущей директории приложения.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
