Безопасность библиотеки Dynamic-Link

Когда приложение динамически загружает библиотеку динамической компоновки без указания полного имени пути, Windows пытается найти библиотеку DLL, выполняя поиск четко определенного набора каталогов в определенном порядке, как описано в статье Порядок поиска библиотек динамической компоновки. Если злоумышленник получает контроль над одним из каталогов в пути поиска DLL, он может поместить в этот каталог вредоносную копию библиотеки DLL. Это иногда называется атакой с предварительной загрузкой DLL или двоичной плантинг атакой. Если система не найдет легальную копию библиотеки DLL до того, как будет выполнен поиск скомпрометированного каталога, он загружает вредоносную библиотеку DLL. Если приложение выполняется с правами администратора, злоумышленник может выполнить его в случае несанкционированного использования локальных привилегий.

Например, предположим, что приложение предназначено для загрузки библиотеки DLL из текущего каталога пользователя и корректно завершает работу, если библиотека DLL не найдена. Приложение вызывает LoadLibrary только с именем библиотеки DLL, что приводит к тому, что система ищет библиотеку DLL. Если включен режим поиска безопасного DLL и приложение не использует альтернативный порядок поиска, система выполняет поиск в каталогах в следующем порядке:

  1. Каталог, из которого загружено приложение.
  2. Системный каталог.
  3. 16-разрядный системный каталог.
  4. Каталог Windows.
  5. Текущий каталог.
  6. Каталоги, перечисленные в переменной среды PATH.

Продолжая пример, злоумышленник с знанием приложения получает контроль над текущим каталогом и помещает вредоносную копию библиотеки DLL в этот каталог. Когда приложение выдает вызов LoadLibrary , система выполняет поиск библиотеки DLL, находит вредоносную копию библиотеки DLL в текущем каталоге и загружает ее. Затем вредоносная копия библиотеки DLL запускается в приложении и получает права доступа пользователя.

С помощью следующих рекомендаций разработчики могут защитить свои приложения от атак с предварительной загрузкой библиотек DLL.

  • Везде, где это возможно, укажите полный путь при использовании функций LoadLibrary, LoadLibraryEx, CreateProcessили ShellExecute .

  • Используйте _ _ Флаги поиска в библиотеке Load с функцией LoadLibraryEx или используйте эти флаги вместе с функцией сетдефаултдллдиректориес , чтобы установить порядок поиска DLL для процесса, а затем используйте функции адддллдиректори или сетдллдиректори для изменения списка. Дополнительные сведения см. в статье Порядок поиска библиотек динамической компоновки.

    Windows 7, Windows server 2008 R2, Windows Vista и Windows server 2008: Эти флаги и функции доступны в системах с установленным KB2533623 .

  • В системах с установленным KB2533623 используйте _ _ Флаги поиска в библиотеке Load с функцией LoadLibraryEx или используйте эти флаги вместе с функцией сетдефаултдллдиректориес , чтобы установить порядок поиска DLL для процесса, а затем используйте функции адддллдиректори или сетдллдиректори для изменения списка. Дополнительные сведения см. в статье Порядок поиска библиотек динамической компоновки.

  • Рассмотрите возможность использования перенаправления DLL или манифеста , чтобы убедиться, что приложение использует правильную библиотеку DLL.

  • При использовании стандартного порядка поиска убедитесь, что включен режим поиска "защищенные библиотеки DLL". В этом случае текущий каталог пользователя помещается позже в порядок поиска, что повышает вероятность того, что Windows найдет законную копию библиотеки DLL перед вредоносной копией. Режим поиска в защищенных библиотеках DLL включен по умолчанию, начиная с Windows XP с пакетом обновления 2 (SP2), и управляется параметром реестра hKey _ Local _ Machine \ System \ CurrentControlSet \ Control \ Manager \ сафедллсеарчмоде . Дополнительные сведения см. в статье Порядок поиска библиотек динамической компоновки.

  • Рекомендуется удалить текущий каталог из стандартного пути поиска, вызвав сетдллдиректори с пустой строкой (""). Это необходимо сделать на раннем этапе инициализации процесса, а не до и после вызовов LoadLibrary. Имейте в виду, что сетдллдиректори влияет на весь процесс, и что несколько потоков, вызывающих сетдллдиректори с разными значениями, могут вызвать неопределенное поведение. Если приложение загружает сторонние библиотеки DLL, тщательно протестируйте их, чтобы определить любые несовместимости.

  • Не используйте функцию SearchPath для получения пути к библиотеке DLL для последующего вызова LoadLibrary , если не включен режим поиска безопасного процесса. Если режим безопасного поиска процессов не включен, функция SearchPath использует разный порядок поиска, чем LoadLibrary , и, скорее всего, сначала выполняет поиск указанной библиотеки DLL в текущем каталоге пользователя. Чтобы включить режим поиска безопасного процесса для функции SearchPath , используйте функцию сетсеарчпасмоде с базовым _ путем поиска _ , _ включив _ Сейф _ SEARCHMODE. При этом текущий каталог перемещается в конец списка поиска SearchPath в течение жизненного цикла процесса. Обратите внимание, что текущий каталог не удаляется из пути поиска, поэтому если система не найдет легальную копию библиотеки DLL до того, как она достигнет текущего каталога, приложение остается уязвимым. Как и в случае с сетдллдиректори, вызов сетсеарчпасмоде должен выполняться на раннем этапе инициализации процесса и влияет на весь процесс. Если приложение загружает сторонние библиотеки DLL, тщательно протестируйте их, чтобы определить любые несовместимости.

  • Не следует делать предположения о версии операционной системы на основе вызова LoadLibrary , выполняющего поиск библиотеки DLL. Если приложение выполняется в среде, в которой библиотека DLL является действительной, но в пути поиска находится вредоносная копия библиотеки DLL, может быть загружена вредоносная копия библиотеки DLL. Вместо этого используйте Рекомендуемые методы, описанные в статье получение системной версии.

С помощью средства "монитор процессов" можно определить, какие операции загрузки DLL могут быть уязвимыми. Средство "монитор процессов" можно скачать из https://technet.microsoft.com/sysinternals/bb896645.aspx .

В следующей процедуре описывается использование монитора обработки для проверки операций загрузки библиотек DLL в приложении.

Использование монитора процессов для проверки операций загрузки DLL в приложении

  1. Запустите монитор процесса.
  2. В мониторе процессов включите следующие фильтры:
    • Операция является CreateFile
    • Операция — Лоадимаже
    • Путь содержит. cpl
    • Путь содержит DLL-файл
    • Путь содержит. drv
    • Путь содержит. exe
    • Путь содержит. ocx
    • Путь содержит. SCR
    • Путь содержит. sys
  3. Исключите следующие фильтры:
    • Имя процесса — procmon.exe
    • Имя процесса — Procmon64.exe
    • Имя процесса — System
    • Операция начинается с IRP _ MJ_
    • Операция начинается с ФАСТИО_
    • Результат успешно выполнен
    • Путь заканчивается на pagefile.sys
  4. Попытка запуска приложения с текущим каталогом, установленным в определенном каталоге. Например, дважды щелкните файл с расширением, обработчиком файлов которого назначено ваше приложение.
  5. Проверьте выходные данные монитора обработки для путей, которые выглядят подозрительно, например, вызов текущего каталога для загрузки библиотеки DLL. Этот тип вызова может указывать на уязвимость в приложении.