|
Проверка целостности
кода
Вредоносное программное
обеспечение, реализованное в виде драйвера устройства режима ядра,
включая программы захвата прав администратора, работает с
использованием того же уровня привилегий, что и ядро, и поэтому его
выявление и удаление является наиболее сложной задачей. Такие
программы могут изменять поведение ядра и других драйверов таким
образом, что становятся практически неуловимыми. Компонент Windows
Vista, обеспечивающий целостность кода режима ядра, известный также
под названием подписывания кода режима ядра (KMCS), допускает
загрузку драйверов устройств только в том случае, если они
опубликованы и снабжены цифровой подписью разработчиков, проверенных
одним из нескольких центров сертификации (CA). По умолчанию
компонент KMCS обязательно присутствует в 64-разрядных версиях
Windows Vista.
Поскольку центры сертификации
берут плату за свои услуги и выполняют основные проверки
происхождения кода, такие как проверка подлинности предприятия,
довольно сложно создать анонимное вредоносное программное
обеспечение, работающее в режиме ядра в 64-разрядной версии Windows
Vista. Более того, вредоносная программа, которой удается пройти
процедуру проверки, может, в принципе, оставить следы, ведущие к ее
автору, в случае ее обнаружения в поврежденной системе. У компонента
KMCS есть дополнительные применения, такие как предоставление
информации группе Майкрософт, занимающейся интерактивным анализом
сбоя, в случае возникновения подозрения о том, что драйвер содержит
ошибку, вызывающую сбои пользовательских систем и разблокирование
мультимедийного содержимого высокой четкости. Эти применения будут
кратко описаны.
В компоненте KMCS
используются технологии шифрования с открытым ключом, применявшиеся
более десяти лет в операционной системе Windows и требующие, чтобы в
коде режима ядра содержалась цифровая подпись, созданная одним из
доверенных центров сертификации. Если издатель передает драйвер в
лабораторию Майкрософт, проверяющую качество оборудования Windows
(WHQL), и драйвер проходит проверку надежности, тогда Майкрософт
выступает в качестве центра сертификации, подписывающего код.
Большинство издателей получают подписи с помощью WHQL, но если в
драйвере нет тестовой программы WHQL, издатель не хочет проходить
проверку WHQL или драйвер является драйвером этапа первоначальной
загрузки, загружающимся на начальном этапе запуска системы, издатели
могут подписывать код самостоятельно. Для этого им требуется сначала
получить сертификат подписывания кода от одного из центров
сертификации, которые Майкрософт признает доверенными для подписания
кода режима ядра. После этого автор выполняет цифровое хэширование
кода, подписывает хэш, шифруя его с помощью закрытого ключа, и
предоставляет сертификат и зашифрованный хэш вместе с кодом.
Когда драйвер пытается
загрузиться, Windows расшифровывает хэш, предоставленный вместе с
кодом, с помощью открытого ключа, хранящегося в сертификате, затем
проверяет хэш на совпадение с хэшем, входящим в код. Подлинность
сертификата проверяется этим же способом, но с использованием
открытого ключа, предоставляемого вместе с Windows.
Windows выполняет также
проверку соответствующих цепочек сертификатов вплоть до одной из
служб выдачи корневых сертификатов, встроенных в загрузчик Windows и
ядро операционной системы. Попытки загрузить неподписанный
64-разрядный драйвер невозможны в рабочей системе, поскольку в
отличие от диспетчера Plug and Play, отображающего диалоговое окно с
предупреждением, когда ему передается команда загрузить драйвер, не
имеющий подписи, подтверждающей, что драйвер проходил проверку WQHL,
64-разрядная версия Windows Vista, каждый раз, когда она блокирует
загрузку неподписанного драйвера, безмолвно записывает событие в
журнал событий приложения проверки целостности кода, аналогичное
показанному на рис. 5. 32-разрядная
версия Windows Vista также проверяет подписи драйверов, но допускает
загрузку неподписанных драйверов. Их блокирование привело бы к
нарушению модернизированных систем Windows XP, которым требуются
драйверы, которые были загружены в Windows XP, а также допускает
поддержку оборудования, для которого существуют только драйверы
Windows XP. Однако при выполнении загрузки неподписанного драйвера
32-разрядная версия Windows Vista также записывает события в журнал
событий целостности кода.
Рис.
5 События попытки загрузки
неподписанного драйвера
Поскольку подписывание кода
обычно используется для пометки кода в качестве версии, прошедшей
тщательную официальную проверку, издатели, как правило, не стремятся
подписывать тестовый код. Поэтому в Windows Vista включен режим
тестового подписывания, который можно включать и отключать с помощью
инструмента Bcdedit (описан в моей статье в мартовском выпуске
TechNet Magazine за 2007 г.) и в рамках которого
выполняется загрузка драйверов режима ядра, имеющих цифровую
подпись, сделанную тестовым сертификатом, созданным собственным
центром сертификации компании. Этот режим предназначен для
использования программистами во время разработки кода. Когда
операционная система Windows находится в этом режиме, на рабочем
столе отображаются маркеры, подобные показанным на рис. 6.
Рис. 6 Режим тестового подписывания в операционной системе
Windows Vista
Защищенные процессы
Мультимедийное содержимое
следующего поколения, такое как HD-DVD, BluRay и другие форматы,
имеющие лицензию AACS (Advanced Access Content System), получат
широкое распространение в течение ближайших нескольких лет. В
Windows Vista используется ряд технологий под общим названием
Protected Media Path (PMP), которые требуются стандартом AACS для
воспроизведения такого содержимого. К технологиям PMP относятся PUMA
(Protected User-Mode Audio) и PVP (Protected Video Path), совместное
использование которых обеспечивает для аудио и видео драйверов, а
также для приложений медиа-проигрывателей, механизмы,
предотвращающие запись содержимого в формате высокой четкости
несанкционированными программами или аппаратурой.
PUMA и PVP определяют
интерфейсы и специальную поддержку для аудио и видео проигрывателей,
драйверов устройств и оборудования, но PMP, кроме этого,
основывается на общем механизме ядра, реализованном в Windows Vista,
называемом защищенным процессом. В основе защищенных процессов лежит
стандартная конструкция Windows, инкапсулирующая выполняющийся
исполняемый образ, его библиотеки DLL, контекст безопасности
(учетная запись, в рамках которой работает процесс, и ее привилегии
безопасности) и потоки, выполняющие код в рамках процесса, но
запрещающие определенные типы доступа.
Стандартные процессы
реализуют модель управления доступом, обеспечивающую полный доступ
владельцу процесса и учетным записям администраторов с привилегиями
программ отладки. Полный доступ позволяет пользователю просматривать
и изменять адресное пространство процесса, включая код и данные,
внесенные в процесс. Пользователям разрешается также передавать в
процесс потоки. Эти типы доступа противоречат требованиям PMP,
поскольку они допускают получение несанкционированным кодом доступа
к содержимому высокой четкости и ключам управления правами (DRM),
хранящимся в процессе, воспроизводящем содержимое.
Защищенные процессы разрешают
доступ к ограниченному набору интерфейсов управления информацией и
процессами, включая запрос имени образа процесса и запрос завершения
или приостановки процесса. Но ядро предоставляет диагностическую
информацию о защищенных процессах посредством общих функций запросов
о процессах, которые возвращают данные, относящиеся ко всем
процессам в системе, и поэтому не требуют непосредственного доступа
к процессу. Получение доступа, который может привести к
компрометации носителя, разрешено только другим защищенным
процессам.
Более того, для
предотвращения повреждений извне весь исполняемый код, загруженный в
защищенный процесс, включая его исполняемый образ и библиотеки DLL,
должен быть подписан либо корпорацией Майкрософт (WHQL) с
использованием флага защищенной среды (PE), либо, если это
аудиокодек, он должен быть подписан разработчиком с использованием
сертификата подписывания DRM, полученным от Майкрософт. Поскольку
код режима ядра может получить полный доступ к любому процессу,
включая защищенные, а 32-разрядная версия Windows допускает загрузку
неподписанного кода режима ядра, ядро предоставляет интерфейс API
для защищенных процессов. Этот интерфейс предназначен для выдачи
запроса о «чистоте» среды режима ядра и использования результата для
разблокирования высококачественного содержимого только в том случае,
если среди загружаемого кода нет неподписанного.
Идентификация защищенных
процессов
Не существует
интерфейсов API, предназначенных специально для идентификации
защищенных процессов, но имеется возможность выполнить косвенную
идентификацию, основываясь на имеющейся ограниченной информации об
этих процессах и невозможности выполнять их отладку даже при
использовании учетной записи с административными правами. Процесс
изоляции графа аудиоустройств (%Systemroot%\System32\Audiodg.exe)
используется для воспроизведения дисков DVD, закодированных с
помощью CSS, и в окне диспетчера задач его можно идентифицировать
как защищенный процесс, поскольку диспетчер задач не в состоянии
получить его командную строку, виртуализацию и состояние
предотвращения выполнения данных, даже если он запускается с правами
администратора.
Просмотр защищенного
процесса audiodg с помощью диспетчера задач
Рандомизация загрузки адресного
пространства
Несмотря на такие меры, как
предотвращение выполнения данных и усовершенствованная проверка
ошибок компилятора, создатели вредоносного программного обеспечения
продолжают находить уязвимости переполнения буфера, позволяющие им
заражать процессы, ориентированные на работу в сети, такие как
обозреватель Internet Explorer®, службы
Windows и приложения сторонних разработчиков, с целью получения
опорного пункта в системе. После удачного заражения процесса,
однако, им необходимо использовать интерфейсы API Windows для
выполнения своей конечной цели — чтения данных пользователя или
обеспечения своего постоянного присутствия посредством изменения
параметров пользовательской или системной настройки.
Подключение приложения к
точкам входа интерфейса API, экспортированным посредством библиотек
DLL, обычно обрабатывается загрузчиком операционной системы, но при
таких типах инфицирования вредоносному программному обеспечению не
удается получить преимущества служб загрузчика. Это не мешало
вредоносным программам в предыдущих версиях Windows, потому что для
любого конкретного выпуска операционной системы Windows системные
исполнимые образы и библиотеки DLL всегда загружаются в одном и том
же месте, что позволяет вредоносным программам исходить из
предположения, что интерфейсы API имеют фиксированные адреса
размещения.
Компонент рандомизации
загрузки адресного пространства (ASLR) в операционной системе
Windows Vista лишает вредоносные программы возможности выяснить
местоположение интерфейсов API. Это достигается за счет того, что
при каждой загрузке системы системные библиотеки DLL и исполняемые
модули загружаются в новом месте. На раннем этапе процедуры
первоначальной загрузки диспетчер памяти выбирает случайное смещение
для загрузки образа DLL из одного из 256 адресов (выровненных на
64 кБ), имеющихся в области размером 16 МБ в верхней части
адресного пространства пользовательского режима. Когда библиотеки
DLL, в заголовке образа которых присутствует новый флаг
динамического размещения, загружаются в процесс, диспетчер памяти
размещает их в памяти начиная с адреса смещения загрузки образа и
продолжает по направлению к меньшим адресам.
Исполняемые образы, в которых
установлен данный флаг, проходят аналогичную процедуру загрузки в
случайную точку, выровненную на 64 КБ, в области размером
16 МБ от базового адреса загрузки, хранящегося в заголовке их
образа. Кроме того, если данная библиотека DLL или исполняемый образ
снова загружается после того, как был выгружен всеми использовавшими
его процессами, диспетчер памяти снова выбирает для загрузки
случайное местоположение. На рис. 7
показан пример компоновки адресного пространства для 32-разрядной
системы Windows Vista, включая области, из которых ASLR выбирает
смещение для загрузки образа и адрес загрузки исполняемого
образа.
Рис.
7 Влияние механизма ASLR на адреса
загрузки исполняемых образов и библиотек DLL
Только образы, имеющие флаг
динамического размещения, к которым относятся все библиотеки DLL
операционной системы Windows Vista и исполняемые образы, можно
размещать в новых местах, потому что перемещение устаревших образов
может привести к нарушению внутренних допущений о месте загрузки
образов, сделанных разработчиками. В пакете обновления Visual
Studio® 2005 SP1 добавлена поддержка для
установки этого флага, чтобы сторонние разработчики могли
воспользоваться преимуществами механизма ASLR в полной мере.
Назначение адресов загрузки
библиотек DLL, выбираемых случайным образом из 256 местоположений,
не лишает вредоносные программы возможности угадывать правильное
местоположение интерфейса API, но оно резко снижает скорость
распространения сетевого червя и препятствует надежной работе
вредоносной программы, получающей только один шанс в инфицированной
системе. Кроме того, у стратегии ASLR по изменению местоположения
есть дополнительное преимущество, заключающееся в том, что адресные
пространства используются более эффективно, чем в предыдущих версиях
Windows — создаются обширные участки свободной памяти для
распределения памяти смежными областями, уменьшается число таблиц
страниц, выделяемых диспетчером памяти для отслеживания компоновки
адресного пространства, и минимизируются несовпадения в буфере
TLB.
Повышение
безопасности служб
Службы Windows являются
идеальными целями для атак со стороны вредоносного программного
обеспечения. Многие из них для расширения функциональных
возможностей предлагают доступ в сеть, тем самым увеличивая
уязвимость при удаленном доступе к системе. Большая часть служб
выполняется с более высоким уровнем привилегий, чем у стандартных
учетных записей пользователей, что дает шанс повысить уровень
привилегий в локальной системе, если они будут затронуты вредоносным
программным обеспечением. По этой причине в Windows расширялись
изменения, сделанные в пакете обновления Windows XP SP2 и
направленные на снижение назначаемого службам уровня привилегий и
доступа до уровня, необходимого для выполнения их ролей. Например, в
пакете обновления 2 для Windows XP введены учетные записи локальной
службы и сетевой службы, содержащие только подмножество тех
привилегий, которые были доступны учетной записи локальной системы,
в рамках которой эти службы выполнялись ранее. Это сводит к минимуму
права доступа, получаемые злоумышленником, использующим службу.
ASLR в действии
Влияние, оказываемое
ASLR, легко оценить путем сравнения адресов загрузки библиотеки DLL
для процесса в двух разных сеансах загрузки с помощью такого
средства, как Process Explorer от
Sysinternals (обозреватель процессов). На этих двух снимках
экрана, сделанных в двух разных сеансах, сначала библиотека
Ntdll.dll загружалась в проводник по адресу 0x77A30000, а затем по
адресу 0x77750000.
Отличающиеся базовые
адреса для библиотеки ntdll.dll
Отличающиеся базовые
адреса для библиотеки ntdll.dll
В моей предыдущей статье было
описано, как службы выполняются в их собственных сеансах
изолированно от учетных записей пользователей, но в Windows Vista
расширено также применение принципа наименьшего уровня привилегий
путем дальнейшего уменьшения уровня привилегий и доступа к файлам,
разделам реестра и портам брандмауэра, назначаемого большинству
служб. В Windows Vista определена новая учетная запись группы,
названная идентификатором безопасности службы (SID), уникальная для
каждой службы. Служба может устанавливать разрешения на своих
ресурсах, чтобы доступ к ним имелся только для идентификатора SID их
службы, предотвращая, в случае компрометации службы, получение
доступа другими службами, работающими в рамках этой же учетной
записи. Идентификатор SID службы можно просмотреть, воспользовавшись
командой sc showsid с указанием имени службы, как показано на рис. 8.
Рис.
8 Просмотр идентификатора SID
службы
Идентификаторы SID служб
защищают доступ к ресурсам, принадлежащим конкретной службе, но по
умолчанию у служб имеется еще доступ ко всем объектам, к которым
имеет доступ учетная запись пользователя, в рамках которой они
работают. Например, служба, работающая в рамках учетной записи
локальной службы, может не иметь доступа к ресурсам, созданным
другой службой, работающей в качестве локальной службы в другом
процессе, защищающем свои объекты с помощью разрешений, ссылающихся
на идентификатор SID службы. Однако она по-прежнему может читать и
записывать любые объекты, для доступа к которым имеет разрешения
локальная служба (и любые группы, к которым принадлежит локальная
служба, такие как группа «Служба»).
Поэтому в Windows Vista
введен новый ограниченный тип службы, названный службой с
ограничениями на запись, который разрешает службе доступ для записи
только к объектам, доступным ее идентификатору SID, группе «Все» и
идентификатору SID, назначенному сеансу работы. Для реализации этого
подхода в системе используются ограниченные идентификаторы
SID — тип SID, введенный ранее в Windows 2000. Если процесс,
открывающий объект, является службой с ограничениями на запись,
алгоритм проверки доступа изменяется таким образом, чтобы SID,
который не был назначен процессу ни в ограниченной форме, ни в форме
без ограничений, не мог использоваться для предоставления процессу
доступа к объекту для записи. Следующая команда дает возможность
выяснить, есть ли у службы ограничения:
sc qsidtype [service]
Еще одно изменение помогает
службе предотвратить получение доступа к создаваемым ею объектам
другими службами, выполняющимися в рамках этой же учетной записи. В
предыдущих версиях Windows создатель объекта являлся также его
владельцем, а у владельцев имеется возможность читать и изменять
разрешения своих объектов, предоставляя им полный доступ к своим
собственным объектам. В Windows Vista введен новый идентификатор SID
прав владельца, который, если он представлен в разрешениях объекта,
может ограничивать доступ владельца к его собственному объекту,
вплоть до отмены права устанавливать и запрашивать разрешения.
Следующее усовершенствование
модели безопасности служб в операционной системе Windows Vista
позволяет разработчику службы при регистрации службы в системе точно
указать, какие привилегии безопасности необходимы службе для работы.
Например, если службе необходимо создавать события аудита, в список
включается привилегия «Аудит».
Когда диспетчер управления
службами запускает процесс, работающий с одной или несколькими
службами Windows, он создает маркер безопасности (объект ядра,
формирующий список, в который входят учетная запись пользователя
процесса, членство в группах и привилегии безопасности) для
процесса, содержащего только привилегии, необходимые службам данного
процесса. Если служба указывает привилегию, которая недоступна
учетной записи, в рамках которой она работает, то служба не сможет
запуститься. Если, например, ни одной из служб, работающих в рамках
процесса с учетной записью локальной службы, не требуется привилегия
программ отладки, диспетчер управления службами снимает эту
привилегию с маркера безопасности процесса. Соответственно, если
процесс службы скомпрометирован, вредоносный код не может
воспользоваться преимуществами привилегий, которые не были явным
образом запрошены службами, работающими в рамках процесса. Команда
sc qprivs служит для формирования отчета о привилегиях, запрошенных
службой.
Заключение
На этом завершается состоящий
из трех частей обзор изменений, внесенных в ядро операционной
системы Windows Vista. Некоторые компоненты и усовершенствования не
были рассмотрены или упомянуты, например, новый рабочий пул потоков
для разработчиков приложений, новые механизмы синхронизации, такие
как общие блокировки средств чтения и записи, разметка потоков
служб, поддержка интерактивной проверки диска NTFS и изменение
объема том, а также новый механизм IPC ядра, названный ALPC. Для
получения дополнительных сведений об этих и других компонентах см.
следующее издание Windows Internals (Внутренняя структура
Windows), публикация которого запланирована до конца
2007 г.
Просмотр службы с
ограничениями на запись
Только один процесс размещения служб в
Windows Vista размещает службы с ограничениями. Его можно
идентифицировать с помощью инструмента для просмотра процессов,
такого как обозреватель процессов, имеющего интерфейс командной
строки:
svchost -k LocalServiceNoNetwork
К службам, настроенным для работы в
рамках этого процесса, относятся служба базовой фильтрации, служба
политики диагностики, брандмауэр Windows, журналы и оповещения
производительности и Windows Media® Center
Service Starter.
На этом экране показан текстовый формат
идентификатора SID службы базовой фильтрации, NT SERVICE\BFE,
представленный один раз с флагом Restricted, и еще раз без него,
поэтому у процесса есть доступ к ресурсам, доступ к которым имеется
в рамках этой учетной записи. Однако у него не обязательно имеется
доступ к другим объектам, доступным, как правило, для учетной записи
локальной службы. Например, поскольку учетная запись NT
AUTHORITY\SERVICE не представлена в маркере процесса с флагом
ограничений, процесс не может изменять объекты, предоставляющие
доступ для записи только этой учетной записи, но не другим учетным
записям в маркере, имеющим флаг ограничений.
Службы, выполняющиеся в этом процессе,
также ограничивают свои привилегии, поскольку привилегии,
перечисленные в нижней части диалогового окна свойств, являются
подмножеством тех, которые доступны учетной записи локальной
службы.
Флаги SID для
службы
|
|