Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1111.doc
Скачиваний:
15
Добавлен:
14.09.2019
Размер:
2.14 Mб
Скачать

Запозичення прав

В ОС Windows є цікаві можливості виконання коду з маркером, відмінним від маркера даного процесу. Це, наприклад, істотно для серверів, які повинні виступати від імені і з привілеями клієнтів. Одна з таких можливостей - запуск нового процесу з вказаним маркером за допомогою функції CreateProcessAsUser. Ця функція є аналогом функції CreateProcess, за винятком параметра hToken, який указує на маркер, що визначає контекст користувача нового процесу.

Інший спосіб виконати код із запозиченим маркером - здійснити запозичення прав (impersonation). Запозичення прав означає, що один з потоків процесу функціонує з маркером, відмінним від маркера поточного процесу. Зокрема, клієнтський потік може передати свій маркер доступу серверному потоку, щоб сервер міг отримати доступ до захищених файлів та інших об’єктів від імені клієнта. Згодом потік може повернутися в нормальний стан, тобто використовувати маркер процесу.

Windows не дозволяє серверам виступати в ролі клієнтів без їх відома. Щоб уникнути цього, клієнтський процес може обмежити рівень запозичення прав. Тому для участі в перевтіленні маркер повинен мати відповідний рівень перевтілення. Цей рівень визначається параметром маркера TokenImpersonationLevel і може бути отриманий функцією GetTokenInformation. Для процесу перевтілення важливо, щоб цей параметр мав значення не нижче за SecurityImpersonation, що означає можливість імперсонації на локальній машині. Значення SecurityDelegation дозволяє серверному процесу виступати від імені клієнта як на локальному, так і на віддаленому комп’ютері. Останнє значення має відношення до делегування, яке є природним розвитком запозичення прав, але працює тільки за наявності домена і функціонуванні активного каталогу. За замовчуванням встановлюється рівень SecurityImpersonation.

Маркер перевтілення зазвичай створюють шляхом дублювання існуючого маркера і додання йому потрібних прав доступу і рівня імперсонації. Це можна зробити за допомогою функції DuplicateTokenEx. Власне, перевтілення здійснюється за допомогою функції ImpersonateLoggedOnUser. Щоб повернутися в початковий стан, потік повинен викликати функцію RevertToSelf.

Важливо також не забувати, що коли перевтілений потік здійснює доступ до об’єкта, то решта потоків процесу, навіть не перевтілених, також має до нього доступ. Подібні ситуації вимагають ретельного аналізу, оскільки тут можуть виникати важко відстежувані помилки.

Контроль доступу. Маркер доступу. Ідентифікатор безпеки sid. Структура ідентифікатора безпеки

SID користувача (і групи) є унікальним внутрішнім ідентифікатором і структурою змінної довжини з коротким заголовком, за яким іде довге випадкове число. Це числове значення формується з ряду параметрів, причому стверджується, що ймовірність появи двох однакових SID практично дорівнює нулю. Зокрема, якщо видалити користувача в системі, а потім створити його під тим же ім’ям, то SID знов створеного користувача буде вже іншим.

Дізнатися свій ідентифікатор безпеки користувач легко може за допомогою утиліт whoami або getsid з ресурсів Windows. Наприклад, так:

> whoami /user /sid

Система зберігає ідентифікатори безпеки в бінарній формі, проте існує і текстова форма зображення SID. Текстова форма використовується для виведення поточного значення SID, а також для інтерактивного введення (наприклад, у реєстр).

У текстовій формі кожен ідентифікатор безпеки має певний формат. Спочатку знаходиться префікс S, за яким розміщується група чисел, розділених дефісами. Наприклад, SID адміністратора системи має вигляд: S-1-5-<домен>-500, а SID групи everyone, в яку входять всі користувачі, включаючи анонімних і гостей, - S-1-1-0.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]