Перейти к основному контенту
Поддержка
Войдите с помощью учетной записи Майкрософт
Войдите или создайте учетную запись.
Здравствуйте,
Выберите другую учетную запись.
У вас несколько учетных записей
Выберите учетную запись, с помощью которой нужно войти.

Поддержка Windows Vista Пакет обновления 1 (SP1) заканчивается 12 июля 2011 г. Чтобы и дальше получать обновления для системы безопасности Windows, убедитесь, что вы работаете в windows Vista с Пакет обновления 2 (SP2). Дополнительные сведения можно найти на этой веб-странице Майкрософт: прекращение поддержки некоторых версий Windows.

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

Аннотация

Описание атак с предварительной загрузкой DLL

Атаки на основе LoadLibrary

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

  1. Каталог, из которого было загружено приложение

  2. Системный каталог

  3. 16-битный системный каталог

  4. Каталог Windows

  5. Текущий рабочий каталог (CWD)

  6. Каталоги, перечисленные в переменной среды PATH



Рассмотрим следующий сценарий:


  • Приложение загружает DLL без указания полного пути, который предполагается найти в CWD приложения.

  • Приложение полностью готово к обработке дела, если не находит DLL.

  • Злоумышленнику известны эти сведения о приложении и он управляет CWD.

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

  • Windows выполняет поиск в каталогах в порядке поиска DLL и находит библиотеку DLL в каталоге приложения.

В этом сценарии специальная DLL запускается в приложении и получает привилегии текущего пользователя.

С рекомендацией предотвратить эту атаки приложения могут удалить текущий рабочий каталог (CWD) из пути поиска DLL, позвонив

API SetDllDirectory, используя пустую строку (""). Если приложение зависит от загрузки DLL из текущего каталога, получите текущий рабочий каталог и используйте его для использования в полном пути LoadLibrary.



Мы также знаем, что некоторые разработчики используют LoadLibrary для проверки того, присутствует ли определенная DLL, чтобы определить, какая версия Windows управляется пользователем. Следует помнить, что это может сделать приложение уязвимым. Если в выпуске Windows, в который было выполнено приложение, действительно не существует библиотеки с таким же именем, злоумышленник может ввести в "CWD" библиотеку с таким же именем. Мы настоятельно рекомендуем не использовать этот метод. Вместо этого используйте рекомендуемые методы, описанные в статье MSDN "Получение версии системы".

Приложению, которое загружает сторонние подключаемый модуль и не может принудительно использовать для своих звонков LoadLibrary путь, следует вызвать SetDllDirectory("" для удаления CWD, а затем вызвать SetDllDirectory("расположение установки подключаемого модульа"), чтобы добавить каталог установки подключаемого модульа в путь поиска DLL.

Атаки на основе SearchPath

Аналогичная атака происходит, если приложение использует API SearchPath для поиска DLL и динамической загрузки пути, возвращаемого ПоискPath. Ниже порядок поиска по умолчанию для API SearchPath:

  • Каталог, из которого было загружено приложение

  • Текущий рабочий каталог (CWD)

  • Системный каталог

  • 16-битный системный каталог

  • Каталог Windows

  • Каталоги, перечисленные в переменной среды PATH

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

ShellExecute и CreateProcess


Варианты этих проблем также могут существовать, если разработчики называют похожие функции, такие как ShellExecuteи CreateProcess,для загрузки внешних исполняемых данных. Мы рекомендуем разработчикам будьте внимательны при загрузке биналоги и указывать путь к этому проекту. Это должно стать менее сложной при загрузке двоичного файла вместо библиотеки.

Рекомендуемые действия для разработчиков программного обеспечения

Мы рекомендуем разработчикам сделать следующее:

  • Проверьте их приложения на предмет загрузки неотвевленной библиотеки (примеры этих приложений см. далее в этой статье). К ним относятся следующие:

    • С помощью SearchPath можно определить расположение библиотеки или компонента.

    • Использование LoadLibrary для определения версии операционной системы.

  • Используйте для всех звонков loadLibrary, CreateProcess и ShellExecute все пути, где это возможно.

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

  • Используйте функцию SetSearchPathMode,чтобы включить безопасный режим поиска процесса. При этом текущий рабочий каталог перемещается в последнюю часть списка поиска SearchPath на протяжении всего жизненного процесса.

  • Избегайте использования SearchPath для проверки наличия DLL без указания полного пути, даже если включен безопасный режим поиска, так как это может привести к предварительной загрузке DLL-атак.

Руководство по выявлению загрузки библиотеки, не подавлекаемой в библиотеку

В качестве источника для загрузки библиотеки можно привести следующие примеры:

  • В следующем примере кода приложение выполняет поиск по запросу "schannel.dll", используя наименее безопасный путь поиска. Если злоумышленник может разместить schannel.dll в CWD, оно будет загружаться еще до того, как приложение начнет поиск нужной библиотеки в каталоге Windows.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • В следующем примере кода приложение пытается загрузить библиотеку из различных мест приложения и операционной системы, описанных в начале этого документа для вызова LoadLibrary(). Если существует риск того, что файла нет, приложение может попытаться загрузить файл из текущего рабочего каталога. Этот сценарий немного менее опасно, чем в предыдущем примере. Однако при этом существует риск, связанный с тем, что среда не является полностью предсказуемой.

    HMODULE handle = LoadLibrary("schannel.dll");




Ниже приводится примеры более безопасной и безопасной загрузки библиотеки.

  • В следующем примере кода библиотека загружается напрямую по полному пути. Угрозы того, что злоумышленник введет вредоносный код, нет, если у него нет разрешений на записи в целевом каталоге приложения.

    HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");



    Дополнительные сведения о том, как определить системный каталог, см. в следующих ресурсах:

    GetSystemDirectory

    http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspxSHGetKnownFolderPath

    http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspx

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

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Во всех системах с установленным обновлением для системы безопасности 963027 (как описано в MS09-014)следующий код переместит веб-службу на последнее место в порядке поиска: Любые последующие вызовы к функции SetSearchPathMode внутри этого процесса, которые попытаются изменить режим поиска, будут сбой.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • В следующем примере кода текущий рабочий каталог удаляется из пути поиска перед вызовом LoadLibrary. Это значительно снижает риск, так как злоумышленнику необходимо будет управлять каталогом приложений, каталогом windows или любыми каталогами, которые указаны в пути пользователя, чтобы использовать предзагружаемую атаки DLL.

    SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT );
    HMODULE handle = LoadLibrary("schannel.dll");

Динамическое обнаружение незавершяемой загрузки с помощью монитора процесса

Корпорация Майкрософт публикует средство с именем "Монитор процесса". Это средство позволяет разработчикам и администраторам отслеживать поведение запущенного процесса. Этот монитор можно использовать для динамического определения того, может ли одно из ваших приложений быть уязвимыми для таких проблем.

  • Чтобы скачать монитор процесса, посетите следующую веб-страницу Майкрософт:

    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

  • Попробуйте запустить приложение, используя CWD-набор для определенного каталога. Например, дважды щелкните файл с расширением, обработ который назначен приложению.

  • Настройка монитора процесса с помощью следующих фильтров:



    заме желтая текст

  • Если вы попали на уязвимым путем, вы увидите примерно следующее: заме желтая текстЗвонок в удаленную папку для загрузки DLL указывает на то, что это

    уязвимая программа.

Дополнительная информация

Дополнительные сведения можно найти на следующих веб-сайтах Майкрософт: порядок поиска в библиотеке

Dynamic Link

http://msdn.microsoft.com/library/ms682586(VS.85).aspxДокументация MSDN о функции SearchPath

http://msdn.microsoft.com/library/aa365527(VS.85).aspxДокументация MSDN о функции LoadLibrary

http://msdn.microsoft.com/library/ms684175(VS.85).aspxДокументация MSDN о функции SetDllDirectory

http://msdn.microsoft.com/library/ms686203(VS.85).aspxДокументация MSDN о функции SetSearchPathMode

http://msdn.microsoft.com/library/dd266735(VS.85).aspxЗапись блога Дмитрия Ермолога (David Leblanc), инженера по безопасности Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxЗапись блога, опубликованная Команде инженеров MSRC (Andrew Roths) о предварительной загрузке DLL-атак.

http://blogs.technet.com/b/srd/archive/2009/04/14/ms09-014-addressing-the-safari-carpet-bomb-vulnerability.aspx

Дополнительные ресурсы

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?
После нажатия кнопки "Отправить" ваш отзыв будет использован для улучшения продуктов и служб Майкрософт. Эти данные будут доступны для сбора ИТ-администратору. Заявление о конфиденциальности.

Спасибо за ваш отзыв!

×