Перейти до основного
Підтримка
Вхід
Вхід за допомогою облікового запису Microsoft
Увійдіть або створіть обліковий запис.
Вітаємо,
Виберіть інший обліковий запис.
У вас є кілька облікових записів
Виберіть обліковий запис, за допомогою якого потрібно ввійти.

Підтримка Windows Vista з пакетом оновлень 1 (SP1) завершується 12 липня 2011. Щоб продовжити отримувати оновлення системи безпеки для Windows, переконайтеся, що на комп'ютері інстальовано Windows Vista з пакетом оновлень 2 (SP2). Щоб отримати докладніші відомості, ознайомтеся з цією веб-сторінкою Microsoft: підтримка завершується в деяких версіях Windows.

Якщо програма динамічно завантажує бібліотеку динамічного компонування (DLL), не вказавши повністю кваліфікований шлях, Windows намагається знайти бібліотеку DLL, шукаючи чітко визначений набір каталогів. Якщо елемент керування перевагами зловмисника отримує один із каталогів, вони можуть примусово завантажити зловмисну копію бібліотеки DLL, а не БІБЛІОТЕКУ, яку очікували. Ці напади відомі як "DLL попереднього атак" і поширені в усіх операційних системах, які підтримують динамічно завантажувати бібліотеки спільного використання DLL. Результатом таких атак може бути те, що зловмисник може виконати код у контексті користувача, який працює в програмі. Коли програма запускається як адміністратор, це може призвести до локального підвищення привілеїв. Ми дізнаємося про оновлений інтерес до цих атак. Щоб обмежити вплив цієї проблеми на наших взаємних клієнтів, ми випускаємо цей документ спільноті розробників, щоб переконатися в тому, що вони знають про цю проблему та мають необхідні засоби для вирішення проблеми у своїх програмах.

Загальні відомості

Опис атак із передзавантаженням DLL

Атак на основі бібліотеки

Якщо програма динамічно завантажує бібліотеку DLL, не вказавши повністю кваліфікований шлях, Windows намагатиметься знайти цю DLL за допомогою лінійно-пошуку за допомогою чітко визначеного набору каталогів, відомої як "порядок пошуку DLL". Якщо Windows знаходить DLL-бібліотеку в порядку пошуку в DLL, вона завантажить цю DLL-бібліотеку. Однак, якщо Windows не знаходить DLL в будь-якому з каталогів у порядку пошуку в DLL, вона поверне збій у роботі завантаження DLL. Нижче наведено порядок пошуку в DLL для функцій Loadбібліотеката Loadlibrarex, які використовуються для динамічного завантаження DLL:

  1. Каталог, з якого завантажується Програма

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

  3. 16-розрядний системний каталог

  4. Каталог Windows

  5. Поточна робоча директорія (CWD)

  6. Каталоги, наведені в змінних середовища КОНТУРУ



Розглянемо такий сценарій:


  • Програма завантажує DLL, не вказавши повністю кваліфікований шлях, який він розраховує шукати в службі САПР програми.

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

  • Зловмисник знає цю інформацію про програму та керує ЧД.

  • Зловмисник копіює власні спеціально створені версії бібліотеки DLL в САПР. Це припускає, що зловмисник має дозвіл на це.

  • Windows шукає в каталогах в порядку пошуку DLL і знаходить DLL у службі САПР програми.

У цьому сценарії в програмі працює спеціально створений DLL-бібліотека, яка отримує привілеї поточного користувача.

Рекомендації

з запобігання цьому атаці, програми можуть видалити поточну робочу директорію (cwd) із шляху пошуку DLL, ЗАТЕЛЕФОНУВАВШИ до API SetDllDirectory за допомогою пустої рядка (""). Якщо програма залежить від завантаження DLL-бібліотеки з поточного каталогу, отримайте поточну робочу директорію та використовуйте його, щоб пройти повністю кваліфікований шлях до бібліотеки завантаження.



Крім того, ми знаємо, що деякі розробники використовують Loaбібліотека для перевірки наявності певної DLL-бібліотеки, щоб визначити, яку версію Windows запущено користувач. Ви повинні знати, що це може зробити програму вразливою. Якщо ця бібліотека справді не існує в випуску Windows, у якому програма виконується, зловмисник може ввести бібліотеку з таким самим іменем у веб-програму "ЦWD". Ми настійно рекомендуємо використовувати цю техніку. Натомість використовуйте Рекомендовані методи, описані в статті MSDN, "щоб відкрити системну версію."

Програма, яка завантажує плагіни сторонніх постачальників, і які не можуть змусити плагіни використовувати кваліфікований шлях для його Lodбібліотека має телефонувати SetDllDirectory (""), щоб видалити CWD, а потім зателефонувати SetDllDirectory ("місце інсталяції плагіна"), щоб додати каталог інсталяції плагіна до шляху пошуку DLL.

Атаки на основі шляху пошуку

Подібний напад існує, коли програма використовує API SearchPath, щоб знайти DLL-файл і динамічно завантажувати шлях, повернутий за допомогою searchpath. Нижче наведено порядок пошуку за замовчуванням для API SearchPath.

  • Каталог, з якого завантажується Програма

  • Поточна робоча директорія (CWD)

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

  • 16-розрядний системний каталог

  • Каталог Windows

  • Каталоги, наведені в змінних середовища КОНТУРУ

Ми не рекомендуємо цю модель, оскільки вона не захищена. Ми не радимо використовувати функцію SearchPath як спосіб розташування файлу DLL, якщо цільове використання результатів здійснюється в дзвінку на функцію Lodбібліотека. Це може призвести до того, що ви можете знайти неправильний файл DLL, оскільки порядок пошуку функції SearchPath відрізняється від порядку пошуку, який використовується функцією Logroбібліотека. Якщо потрібно знайти та завантажити файл DLL, Використовуйте функцію Lodбібліотека.

Створення та створення функції "Шелкпроцес"


Відмінності цих проблем можуть також існувати, коли розробники називають подібними функціями, як-от Шелдевиконаннята createprocessдля завантаження зовнішніх виконуваних файлів. Радимо розробникам бути обережними під час завантаження двійкових файлів і визначення повного кваліфікованого шляху. Ця дія має становити меншу складність, коли ви завантажите двійковий файл замість бібліотеки.

Рекомендовані кроки для розробників програмного забезпечення

Радимо розробникам виконувати такі дії:

  • Перевірка їх програм для екземплярів незахищеного завантаження бібліотеки (приклади кожної з них наведено згодом в цій статті). Нижче наведено наведені нижче дії.

    • Використання SearchPath для визначення розташування бібліотеки або компонента.

    • Для ідентифікації версії операційної системи використовується бібліотека Loз.

  • Використовуйте повністю кваліфіковані шляхи для всіх викликів, які можна знайти в бібліотеці Lopбібліотека, CreateProcess і Sheltвиконання.

  • Здійснення викликів до SetDllDirectory з пустим рядком (""), щоб видалити поточний робочий каталог зі стандартного порядку пошуку DLL за замовчуванням, де це потрібно. Зауважте, що функція SetDllDirectory впливає на весь процес. Таким чином, ви маєте виконати це один раз раніше в процесі ініціалізації, а не до і після дзвінків в бібліотеці Loз. Оскільки SetDllDirectory впливає на весь процес, кілька потоків, які називають SetDllDirectory з різним значенням, можуть призвести до невизначеної поведінки. Крім того, якщо цей процес призначено для завантаження бібліотек сторонніх постачальників, тестування буде необхідно для визначення того, чи буде процес для широкого налаштування спричинити несумісність. Відома проблема полягає в тому, що коли програма залежить від Visual Basic для програм, це може спричинити несумісне значення.

  • Використовуйте функцію Setsearchpattmode, щоб увімкнути безпечний режим пошуку для процесу. Це переміщує поточний робочий каталог до останнього розташування в списку пошук шляхів для життя цього процесу.

  • Уникайте використання функції SearchPath, щоб перевірити наявність бібліотеки DLL, не вказавши повністю кваліфікований шлях, навіть якщо ввімкнуто безпечний режим пошуку, оскільки це може призвести до атак DLL.

Вказівки з виявлення незахищеного завантаження бібліотеки

У вихідному коді нижче наведено приклади незахищеного завантаження бібліотеки:

  • У наведеному нижче прикладі коду програма шукає "schannel.dll" за допомогою найменш захищеного шляху пошуку. Якщо зловмисник може помістити schannel.dll в ЦМД, він завантажується ще до того, як програма шукає каталоги Windows для відповідної бібліотеки.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • У наведеному нижче коді програми програма намагається завантажити бібліотеку з різних розташувань застосунків і операційних систем, описаних на початку цього документа, для виклику Lozбібліотека (). Якщо у вас є ризик, що файл не присутній, програма може спробувати завантажити файл із поточного робочого каталогу. Цей сценарій дещо менше небезпечний, ніж у попередньому прикладі. Тим не менш, він як і раніше розкриває користувача програми до ризику, якщо навколишнє середовище не повністю передбачувані.

    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.aspxШлях до Shgetknowfol.

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

  • У наведеному нижче прикладі код поточний робочий каталог видаляється з шляху пошуку, перш ніж телефонувати Lodбібліотека. Це значно знижує ризик, тому що зловмисник матиме змогу керувати каталогом програм, каталогом Windows або будь-якими каталогами, вказаними в обліковому запису користувача, щоб використовувати атаку для попереднього завантаження DLL.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • У всіх системах, що інсталювали оновлення системи безпеки 963027 (описана в MS09-014), наступний код буде остаточно переміщено на веб-програму cnwd до останнього місця в порядку пошуку. Усі подальші виклики функції Setsearchpattрежим можна використовувати в цьому процесі, який спробує змінити режим пошуку не вдасться.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • У наведеному нижче прикладі код поточний робочий каталог видаляється з шляху пошуку, перш ніж телефонувати Lodбібліотека. Це значно знижує ризик, тому що зловмисник матиме змогу керувати каталогом програм, каталогом Windows або будь-якими каталогами, вказаними в обліковому запису користувача, щоб використовувати атаку для попереднього завантаження DLL.

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

Використання монітора процесів для динамічного виявлення незахищених навантажень

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

  • Щоб завантажити монітор процесів, перейдіть на таку веб-сторінку Microsoft:

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

  • Щоб почати роботу з програмою, скористайтеся CWD, встановленим для певного каталогу. Наприклад, двічі клацніть файл із розширенням, до якого призначено Обробник файлів.

  • Настроювання моніторингу процесів за допомогою таких фільтрів:



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

  • Якщо відображається вразливий шлях, відобразиться щось подібне: альтернативний текст

    виклик із віддаленим доступом до віддаленого файлу для завантаження бібліотеки 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 на функції Logroбібліотека

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 для функції Setsearchppmode

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Повідомлення блоґу про напади Ендрю роті, команди Engineering за допомогою бібліотеки DLL для попереднього завантаження

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

Додаткові ресурси

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.

Спільноти допомагають ставити запитання й відповідати на них, надавати відгуки та дізнаватися думки висококваліфікованих експертів.

Чи ця інформація була корисною?

Наскільки ви задоволені якістю мови?
Що вплинуло на ваші враження?
Натиснувши кнопку "Надіслати", ви надасте свій відгук для покращення продуктів і служб Microsoft. Ваш ІТ-адміністратор зможе збирати ці дані. Декларація про конфіденційність.

Дякуємо за відгук!

×