Московский физико-технический институт
Опубликован: 12.12.2007 | Доступ: свободный | Студентов: 5497 / 1832 | Оценка: 4.34 / 4.14 | Длительность: 13:57:00
ISBN: 978-5-94774-827-7
Лекция 15:

Отдельные аспекты безопасности Windows

< Лекция 14 || Лекция 15: 123

Включение и отключение привилегий в маркере

Большую часть информации в маркере менять нельзя. Например, нельзя ни добавить, ни удалить привилегию. Согласно [ Рихтер ] , [ Рихтер, Кларк ] , возможность добавления привилегий в маркер представляла бы собой "глубокий подкоп под систему защиты Windows". Последнее означает, что изменение привилегий субъекта - прерогатива подсистемы локальной авторизации (LSA) и должно осуществляться централизовано только при помощи функций семейства LSA (см. "Структура системы защиты. Привилегии" ).

Таким образом, сформировать список привилегий в маркере нельзя, зато их можно отключать и включать. Для включения и отключения определенных привилегий служит функция AdjustTokenPrivileges.

Перевоплощение

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

Другой способ выполнить код с заимствованным маркером - осуществить перевоплощение (impersonation). Перевоплощение означает, что один из потоков процесса функционирует с маркером, отличным от маркера текущего процесса. В частности, клиентский поток может передать свой маркер доступа серверному потоку, чтобы сервер мог получить доступ к защищенным файлам и другим объектам от имени клиента. Впоследствии поток может вернуться в нормальное состояние, то есть использовать маркер процесса.

Windows не позволяет серверам выступать в роли клиентов без их ведома. Чтобы избежать этого, клиентский процесс может ограничить уровень имперсонации. Поэтому для участия в перевоплощении маркер должен иметь соответствующий уровень перевоплощения. Этот уровень определяется параметром маркера TokenImpersonationLevel и может быть запрошен функцией GetTokenInformation. Для процесса перевоплощения важно, чтобы этот параметр имел значение не ниже SecurityImpersonation, что означает возможность имперсонации на локальной машине. Значение SecurityDelegation позволяет серверному процессу выступать от имени клиента, как на локальном, так и на удаленном компьютере. Последнее значение имеет отношение к делегированию, которое является естественным развитием перевоплощения, но работает только при наличии домена и функционировании активного каталога. По умолчанию устанавливается уровень SecurityImpersonation.

Маркер перевоплощения обычно создают путем дублирования существующего маркера и придания ему нужных прав доступа и уровня имперсонации. Это можно сделать при помощи функции DuplicateTokenEx. Собственно перевоплощение осуществляется при помощи функции ImpersonateLoggedOnUser. Чтобы вернуться в исходное состояние, поток должен вызвать функцию RevertToSelf.

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

Прогон программы заимствования маркера доступа и получения из него нужной информации

В качестве "сложного" упражнения рекомендуется написать программу, задача которой - создать маркер доступа с нужным уровнем перевоплощения для указанной учетной записи и передать его текущему процессу. Затем для контроля нужно вывести на экран основные характеристики этого (уже ставшего текущим) маркера, например, перечень привилегий, после чего вернуть значение текущего маркера к исходному и извлечь из него привилегии еще раз.

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

В ОС Windows имеются и другие возможности настройки контекста пользователя в соответствии со сложными требованиями защиты с учетом принципа минимума привилегий. В качестве примера можно упомянуть схему контроля доступа при помощи маркеров, называемых ограниченными. Ограниченные маркеры создаются функцией CreateRestrictedToken. В этот маркер в момент его создания можно внести следующие изменения: удалить привилегии, отключить некоторые SID-идентификаторы и добавить "ограниченные" SID'ы учетных записей. Последние просто добавляют ряд новых проверок к уже существующим при организации доступа к объекту. Ограниченные маркеры удобны, когда приложение подменяет клиента при выполнении кода, способного нанести ущерб системе.

Заключение

В соответствии с политикой безопасности в системе реализованы: аутентификация пользователей, аудит и защита от повторного использования объектов. Успешная аутентификация заканчивается формированием маркера доступа, который передается всем процессам пользователя в течение сеанса работы. Для наблюдения за действиями пользователей поддерживается журнал, где можно фиксировать все события, которые могут повлиять на состояние безопасности системы. Обнуление страниц памяти перед ее выделением процессу призвано не допустить считывания информации, оставшейся от их прежнего владельца. В ОС Windows имеется защита от модификации системных файлов, которая базируется на фиксации изменений в файлах и замене искаженных системных файлов их резервной копией. Для тонкой настройки контекста пользователя в соответствии со сложными сценариями защиты поддерживается механизм перевоплощения.

< Лекция 14 || Лекция 15: 123
Ирина Оленина
Ирина Оленина
Николай Сергеев
Николай Сергеев

Здравствуйте! Интересует следующий момент. Как осуществляется контроль доступа по тому или иному адресу с точки зрения обработки процессом кода процесса. Насколько я понял, есть два способа: задание через атрибуты сегмента (чтение, запись, исполнение), либо через атрибуты PDE/PTE (чтение, запись). Но как следует из многочисленных источников, эти механизмы в ОС Windows почти не задействованы. Там ключевую роль играет менеджер памяти, задающий регионы, назначающий им атрибуты (PAGE_READWRITE, PAGE_READONLY, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_NOACCESS, PAGE_GUARD: их гораздо больше, чем можно было бы задать для сегмента памяти) и контролирующий доступ к этим регионам. Непонятно, на каком этапе может включаться в работу этот менеджер памяти? Поскольку процессор может встретить инструкцию: записать такие данные по такому адресу (даже, если этот адрес относится к региону, выделенному менеджером памяти с атрибутом, например, PAGE_READONLY) и ничего не мешает ему это выполнить. Таким образом, менеджер памяти остается в стороне не участвует в процессе...