Продолжаем усложнять жизнь злоумышленникам. В этот раз посмотрим как написать приложение, которое не будет подвержено атаке DLL Hijacking.
Суть атаки DLL Hijacking в том, чтобы заставить наше приложение загрузить вредоносную библиотеку. Операционная система Windows имеет уязвимость в алгоритме поиска подгружаемых библиотек, что делает возможным такую атаку. При подгрузке DLL операционная система начинает искать библиотеки в следующем порядке:
- В папке приложения (где расположен исполняемый файл).
- В текущей директории.
- В системной директории (обычно C:\Windows\System32).
- В системной 16-битной директории (да, это до сих пор делается для совместимости — C:\Windows\System).
- В директории Windows (C:\Windows).
- В каталогах, которые обозначены в переменной окружения PATH.
- Начиная с Windows 2000 можно создать пустой файл mycoolapp.exe.local рядом с исполняемый файлом, чтобы форсировать поиск в локальной директории.
- Начиная с Windows XP можно создать файл c XML манифестом mycoolapp.exe.manifest либо сохранить этот манифест в ресурсах приложения (как RT_MANIFEST). XML манифест переопределяет порядок поиска подгружаемых библиотек.
- Начиная с Windows XP SP2 по умолчанию включена функция SafeDllSearch (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode) и поиск в текущей директории осуществляется позже, чем обычно (после поиска в директории Windows).
- Если системе известна библиотека, то она сразу загружает доверенную копию библиотеки. Список известных библиотек хранится в реестре в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.
Старые программы, которые не учитывают рекомендации для сертификации под Windows, используют свою директорию в Program Files для хранения данных. Т. е. пользователь имеет доступ на запись в данную директорию — это также дает возможность злоумышленнику подложить вредоносную DLL.
Найти библиотеки, которые подгружает та или иная программа несложно — можно воспользоваться средством ProcMon из пакета Sysinternals Suite. Тут можно детально посмотреть что происходит при запуске процесса и далее в процессе работы. Эта утилита будет полезна добросовестным создателям надежного ПО тем, что позволит проинспектировать поведение своего продукта. В ней хорошо видно какие DLL загружаются и по каким путям происходят попытки загрузки.
Делая выводы можно утверждать, что для создания ПО, которое сделает невозможным атаку DLL Hijacking, достаточно выполнить всего несколько шагов:
- Устанавливать свое приложение в Program Files и не давать обычному пользователю права на запись в директорию приложения.
- Предупреждать пользователя, что запуск приложения произошел из нестандартной директории. А учитывая, что пользователи не читают сообщения, то стоит рассмотреть возможно запретить запуск из недоверенных мест вовсе.
- Подписывать цифровой подписью свои программы и компоненты и проверять цифровую подпись загружаемых библиотек. Получить цифровую подпись несложно и стоит она не очень дорого.
- В дополнение стоит запустить сертификационные тесты "Windows compatible" и исправить полученные ошибки. В качестве бонуса можно получить логотип Certified.
Стоит также отметить, что подобная атака возможна не только под Windows. Скажем, в Linux существует практика ручной установки ПО в каталог HOME или /opt без особого разделения прав на каталоги с данными и исполняемыми файлами. Поэтому надо быть внимательным и с другими операционными системами. Такая же проблема существует и в OS X (операционная система предупреждает, что запускаемая программа не установлена надлежащим образом, но кто же читает эти сообщения).
Ссылки по теме: