Преминаване към основното съдържание
Поддръжка
Влизане с Microsoft
Влезте или създайте акаунт.
Здравейте,
Изберете друг акаунт.
Имате няколко акаунта
Изберете акаунта, с който искате да влезете.

Поддръжката за Windows Vista Service Pack 1 (SP1) приключва на 12 юли 2011. За да продължите да получавате актуализации на защитата за Windows, се уверете, че използвате Windows Vista със Service Pack 2 (SP2). За повече информация вижте тази уеб страница на Microsoft: поддръжката се прекратява за някои версии на Windows.

Когато приложението динамично зарежда динамична библиотека за връзки (DLL), без да указва напълно квалифициран път, Windows се опитва да намери DLL чрез търсене на добре дефиниран набор от директории. Ако атакуващият печели контрола върху една от директориите, той може да принуди приложението да зареди злонамерено копие на DLL вместо DLL, което е очаквал. Тези атаки са известни като "DLL нападения за предварително зареждане" и са общи за всички операционни системи, които поддържат динамично зареждане на споделени библиотеки с DLL. Ефектът от тези атаки може да бъде, че атакуващият може да изпълни код в контекста на потребителя, който изпълнява приложението. Когато приложението се изпълнява като администратор, това може да доведе до локално увеличаване на привилегиите. Ние знаем за подновения интерес към тези атаки. За да ограничите ефекта, който този проблем има върху нашите общи клиенти, Ние освобождаваме този документ в Общността за разработчици, за да се уверим, че те знаят за този проблем и имат необходимите инструменти за справяне с проблема в техните приложения.

Обобщена информация

Описание на атаките с предварително натоварване в DLL

Атаки, базирани на зареждането

Когато дадено приложение се зарежда динамично, без да се указва напълно квалифициран път, Windows се опитва да намери този DLL, като линейно търси в добре дефиниран набор от директории, известни като ред за търсене на DLL. Ако Windows открие DLL в реда за търсене на DLL, той ще зареди този DLL. Ако обаче Windows не намери DLL файла в коя да е от директориите в реда за търсене на DLL, той ще върне неуспешно операцията за натоварване на DLL. Следва реда за търсене на DLL за функциите зарежданетои LoadLibraryEx, които се използват за динамично зареждане на DLL файлове:

  1. Директорията, от която е заредено приложението

  2. Системният указател

  3. 16-битовият системен указател

  4. Указателя на Windows

  5. Текущия работен указател (ХИБ)

  6. Указателите, които са изредени в променливата за средата PATH



Обмислете следния сценарий:


  • Приложението зарежда DLL, без да указва напълно квалифициран път, който той очаква да намери в ХИБ на приложението.

  • Приложението е напълно подготвено да обработи случая, когато не намери DLL.

  • Нападателят знае тази информация за приложението и управлява ХИБ.

  • Нападателят копира собствената си специално създадена версия на DLL в ХИБ. Това предполага, че Нападателят има разрешение да прави това.

  • Windows търси в директориите в реда за търсене на DLL и намира DLL в ХИБ на приложението.

В този случай специално изработеният DLL се изпълнява в приложението и печели привилегиите на текущия потребител.

Препоръка

за да предотвратите тази атака, приложенията могат да премахнат текущия работен указател (ХИБ) от пътя за търсене на DLL, като извикат API за SetDllDirectory с помощта на празен низ (""). Ако дадено приложение зависи от зареждането на DLL от текущия указател, моля, Получете текущия работен указател и го използвайте, за да преминете в напълно квалифициран път за зареждането.



Също така сме наясно, че някои разработчици използват зареждането, за да проверят дали определен DLL е наличен, за да се определи коя версия на Windows се изпълнява от потребителя. Трябва да знаете, че това може да направи приложението уязвимо. Ако засегнатата библиотека наистина не съществува в изданието на Windows, на което се изпълнява приложението, атакуващият може да въведе библиотека със същото име в ХИБ. Горещо ви препоръчваме да използвате тази техника. Вместо това използвайте препоръчваните техники, които са описани в статията в MSDN, "получаване на системната версия"

. Приложение, което зарежда добавки от други разработчици и което не може да принуди добавките да използват квалифициран път за своите зареждането повиквания, трябва да се обадите на SetDllDirectory (""), за да премахнете ХИБ и след това да се обадите SetDllDirectory ("местоположение за инсталиране на добавката"), за да добавите добавката за инсталиране на добавката на директорията за търсене.

Атаки, базирани на SearchPath

Подобна атака съществува, когато дадено приложение използва API на SearchPath, за да намери DLL и динамично зареждане на пътя, върнат от SearchPath. По-долу е редът на търсене по подразбиране за API на SearchPath:

  • Директорията, от която е заредено приложението

  • Текущия работен указател (ХИБ)

  • Системният указател

  • 16-битовият системен указател

  • Указателя на Windows

  • Указателите, които са изредени в променливата за средата PATH

Не препоръчваме този шаблон, тъй като не е защитен. Не препоръчваме функцията SearchPath като метод за намиране на. dll файл, ако предназначението на изхода е в разговор с функцията зареждането. Това може да доведе до намирането на грешен. dll файл, защото редът на търсене на функцията SearchPath се различава от реда на търсене, използван от функцията зареждането. Ако трябва да намерите и заредите. dll файл, използвайте функцията зареждането.

ShellExecute и CreateProcess


Вариациите на тези проблеми могат да съществуват и когато разработчиците извикват подобни функции, като например ShellExecuteи CreateProcess, за да зареждат външни изпълними файлове. Препоръчваме разработчиците да бъдат внимателни, когато зареждат двоични файлове и указват напълно квалифицирания път. Това би трябвало да представлява по-малко сложност, когато зареждате двоично вместо библиотека.

Препоръчителни стъпки за разработчиците на софтуер

Препоръчваме разработчиците да направят следното:

  • Проверете своите приложения за екземпляри на незащитени натоварвания на библиотеката (примери за всеки от тях са дадени по-нататък в тази статия). Те включват следното:

    • Използвайте SearchPath, за да идентифицирате местоположението на библиотека или компонент.

    • Употребата на зареждането за идентифициране на версията на операционната система.

  • Използвайте напълно квалифицирани пътища за всички разговори с зареждането, CreateProcess и ShellExecute, където можете да го направите.

  • Реализиране на повикванията към SetDllDirectory с празен низ (""), за да премахнете текущата работна директория от реда за търсене по подразбиране, където е необходимо. Имайте предвид, че SetDllDirectory влияе на целия процес. Следователно трябва да направите това еднократно в началото на процеса на инициализация, а не преди и след обаждания до зареждането. Тъй като SetDllDirectory засяга целия процес, множество нишки, които извикват SetDllDirectory с различни стойности, могат да причинят Недефинирано поведение. Освен това, ако процесът е предназначен за зареждане на DLL файлове на други разработчици, е необходимо да се извършат изпитвания, за да се определи дали създаването на настройка на целия процес ще доведе до несъвместимости. Известен проблем е, че когато дадено приложение зависи от Visual Basic for Applications, настройката на целия процес може да доведе до несъвместимости.

  • Използвайте функцията SetSearchPathMode, за да разрешите режима на търсене на безопасен процес за процеса. Това премества текущата работна директория до последното място в списъка за търсене на SearchPath за целия жизнен цикъл на процеса.

  • Избягвайте да използвате SearchPath, за да проверите за съществуването на DLL, без да задавате напълно квалифициран път, дори ако е активиран безопасен режим на търсене, тъй като това все още може да доведе до DLL атаки за предварително зареждане.

Ръководство за идентифициране на незащитените натоварвания на библиотеката

В изходния код по-долу са дадени примери за незащитени натоварвания на библиотека:

  • В следващия пример за код приложението търси "schannel.dll", като използва поне път за защитено търсене. Ако атакуващият може да постави schannel.dll в ХИБ, той ще се зареди още преди приложението да търси в указателя на Windows за съответната библиотека.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • В следващия пример за код приложението се опитва да зареди библиотеката от различните местоположения на приложения и операционни системи, описани в началото на този документ за зареждането () повикване. Ако има някакъв риск, че файлът не е наличен, приложението може да се опита да зареди файла от текущата работна директория. Този сценарий е малко по-опасен от предишния пример. Обаче той все още излага потребителя на приложението на риск, ако околната среда не е напълно предвидим.

    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

  • В следващия примерен код текущата работна директория е премахната от пътя за търсене, преди да се обадите на зареждането. Това значително намалява риска, тъй като атакуващият ще трябва да управлява или директорията на приложението, директорията на Windows, или всички указатели, които са зададени в пътя на потребителя, за да се използва DLL предварително заредена атака.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • На всички системи, които имат инсталирана актуализация за защита 963027 (описана в MS09-014), кодът по-долу ще бъде окончателно преместен на ХИБ до последното място в реда на търсене. Всяко по-късни обаждания към функцията SetSearchPathMode отвътре на този процес, което се опитва да промени режима на търсене, ще бъде неуспешно.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • В следващия примерен код текущата работна директория е премахната от пътя за търсене, преди да се обадите на зареждането. Това значително намалява риска, тъй като атакуващият ще трябва да управлява или директорията на приложението, директорията на Windows, или всички указатели, които са зададени в пътя на потребителя, за да се използва DLL предварително заредена атака.

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

Използване на монитор на процеси за динамично откриване на незащитени натоварвания

Microsoft публикува инструмент, който е наименуван на процеса на наблюдение. Този инструмент позволява на разработчиците и администраторите да проследяват подробно поведението на процеса на работа. Мониторът на процеса може да се използва за динамично откриване дали една от вашите приложения може да бъде уязвима за този тип проблем.

  • За да изтеглите наблюдение на процеси, посетете следната уеб страница на Microsoft:

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

  • Опитайте да стартирате вашето приложение с помощта на ХИБ, зададено в конкретен указател. Например щракнете двукратно върху файл, чието разширение е присвоено на файла.

  • Настройте монитора на процеса със следните филтри:



    алтернативен текст

  • Ако се удари уязвим път, ще видите нещо, което е подобно на следното: алтернативен текст

    повикването до отдалечения файл, за да заредите DLL, показва, че това е уязвима програма.

Повече информация

За повече информация посетете следните уеб страници на Microsoft:

ред за търсене в библиотека на динамични връзки

http://MSDN.Microsoft.com/EN-US/Library/ms682586 (VS. 85). aspxДокументация за MSDN във функцията SearchPath

http://MSDN.Microsoft.com/EN-US/Library/aa365527 (VS. 85). aspxДокументация за MSDN във функцията зареждането

http://MSDN.Microsoft.com/EN-US/Library/ms684175 (VS. 85). aspxДокументация за MSDN във функцията SetDllDirectory

http://MSDN.Microsoft.com/EN-US/Library/ms686203 (VS. 85). aspxДокументация за MSDN във функцията SetSearchPathMode

http://MSDN.Microsoft.com/EN-US/Library/dd266735 (VS. 85). aspxБлог публикация от Дейвид Ле Блан, главен инженер по сигурността с Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxБлог публикация от Андрю Рот, екипът на MSRC Engineering в DLL предварително нападения

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

Допълнителни ресурси

Нуждаете ли се от още помощ?

Искате ли още опции?

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

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?
Като натиснете „Подаване“, вашата обратна връзка ще се използва за подобряване на продуктите и услугите на Microsoft. Вашият ИТ администратор ще може да събира тези данни. Декларация за поверителност.

Благодарим ви за обратната връзка!

×