вторник, 9 сентября 2014 г.

DLL Hijacking

DISCLAIMER: Вся информация предоставлена исключительно в ознакомительных целях. Автор не несет ответственности за любой возможный вред, причиненный материалами данной статьи.

Продолжаем усложнять жизнь злоумышленникам. В этот раз посмотрим как написать приложение, которое не будет подвержено атаке DLL Hijacking.

Суть атаки DLL Hijacking в том, чтобы заставить наше приложение загрузить вредоносную библиотеку. Операционная система Windows имеет уязвимость в алгоритме поиска подгружаемых библиотек, что делает возможным такую атаку. При подгрузке DLL операционная система начинает искать библиотеки в следующем порядке:
  1. В папке приложения (где расположен исполняемый файл).
  2. В текущей директории.
  3. В системной директории (обычно C:\Windows\System32).
  4. В системной 16-битной директории (да, это до сих пор делается для совместимости — C:\Windows\System).
  5. В директории Windows (C:\Windows).
  6. В каталогах, которые обозначены в переменной окружения PATH.
Данных подход очевидным образом дает возможность подложить вредоносную библиотеку с таким же названием, как загружаемая, скажем из System32. Но в Microsoft о проблеме знают и в течение нескольких версий Windows придумывают способы закрыть обозначенную уязвимость. Поэтому стоит учитывать, что на этот порядок могут повлиять следующие факторы:
  1. Начиная с Windows 2000 можно создать пустой файл mycoolapp.exe.local рядом с исполняемый файлом, чтобы форсировать поиск в локальной директории.
  2. Начиная с Windows XP можно создать файл c XML манифестом mycoolapp.exe.manifest либо сохранить этот манифест в ресурсах приложения (как RT_MANIFEST). XML манифест переопределяет порядок поиска подгружаемых библиотек.
  3. Начиная с Windows XP SP2 по умолчанию включена функция SafeDllSearch (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode) и поиск в текущей директории осуществляется позже, чем обычно (после поиска в директории Windows).
  4. Если системе известна библиотека, то она сразу загружает доверенную копию библиотеки. Список известных библиотек хранится в реестре в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.
Эти факторы сильно сокращают поверхность атаки. Однако, если приложение запускается из недоверенного места (а проще сказать, не из Program Files), то злоумышленник может подложить рядом c исполняемый файлом свою вредоносную библиотеку. Таким образом можно получить доступ к запущенному процессу и конфиденциальным данным внутри него. Кстати, именно поэтому не стоит запускать никакие файлы с флешек или из сети.

Старые программы, которые не учитывают рекомендации для сертификации под Windows, используют свою директорию в Program Files для хранения данных. Т. е. пользователь имеет доступ на запись в данную директорию — это также дает возможность злоумышленнику подложить вредоносную DLL.

Найти библиотеки, которые подгружает та или иная программа несложно — можно воспользоваться средством ProcMon из пакета Sysinternals Suite. Тут можно детально посмотреть что происходит при запуске процесса и далее в процессе работы. Эта утилита будет полезна добросовестным создателям надежного ПО тем, что позволит проинспектировать поведение своего продукта. В ней хорошо видно какие DLL загружаются и по каким путям происходят попытки загрузки.

Делая выводы можно утверждать, что для создания ПО, которое сделает невозможным атаку DLL Hijacking, достаточно выполнить всего несколько шагов:
  1. Устанавливать свое приложение в Program Files и не давать обычному пользователю права на запись в директорию приложения.
  2. Предупреждать пользователя, что запуск приложения произошел из нестандартной директории. А учитывая, что пользователи не читают сообщения, то стоит рассмотреть возможно запретить запуск из недоверенных мест вовсе.
  3. Подписывать цифровой подписью свои программы и компоненты и проверять цифровую подпись загружаемых библиотек. Получить цифровую подпись несложно и стоит она не очень дорого.
  4. В дополнение стоит запустить сертификационные тесты "Windows compatible" и исправить полученные ошибки. В качестве бонуса можно получить логотип Certified.

Стоит также отметить, что подобная атака возможна не только под Windows. Скажем, в Linux существует практика ручной установки ПО в каталог HOME или /opt без особого разделения прав на каталоги с данными и исполняемыми файлами. Поэтому надо быть внимательным и с другими операционными системами. Такая же проблема существует и в OS X (операционная система предупреждает, что запускаемая программа не установлена надлежащим образом, но кто же читает эти сообщения).

Ссылки по теме:
  1. Dynamic-Link Library Search Order
  2. Dynamic-Link Library Security
  3. Советы по безопасности (Microsoft) (2269637)
  4. Example C Program: Verifying the Signature of a PE File

Комментировать в ВКонтакте