Внутренняя организация и безопасность процессов в операционных системах Windows

ВНУТРЕННЯЯ ОРГАНИЗАЦИЯ И БЕЗОПАСНОСТЬ ПРОЦЕССОВ В ОПЕРАЦИОННЫХ СИСТЕМАХ WINDOWS

О.П. Соловей, А.В. Будник

Белорусский государственный университет информатики и радиоэлектроники, г. Минск, Беларусь

Как известно, в архитектуре процессора Intel x86 определено четыре уровня привилегий, или колец (rings), предназначенных для защиты кода и данных системы от случайной или умышленной перезаписи с помощью кода, имеющего меньший уровень привилегий. Код может исполняться на одном из четырех уровней (колец) защиты. Наиболее

привилегированным является нулевое кольцо,

наименее привилегированным - третье. Windows использует всего два уровня привилегий: нулевой (или кольцо 0) для режима ядра и уровень привилегий 3 (или кольцо 3) для пользовательского режима. Это связано

с тем, что на некоторых из ранее поддерживавшихся аппаратных платформ (например, Compaq Alpha и Silicon Graphics MIPS) реализовано лишь два уровня привилегий [2].

В нулевом кольце доступны привилегированные команды, порты ввода-вывода и вся память. В других кольцах могут быть установлены другие правила: запрет некоторых команд, запрет ввода-вывода и т. д. Между уровнями защиты можно переключаться только через специальные шлюзы, определенные в системных таблицах процессора (GDT, LDT, IDT). Доступ к памяти в защищенном режиме происходит только через селекторы, находящиеся в этих таблицах, а у каждого селектора есть уровень привилегий, необходимый для его использования. Подобная система позволяет изолировать код, выполняющийся на непривилегированных уровнях защиты, и полностью контролировать его исполнение с

помощью кода нулевого кольца.

Любой Windows-процесс имеет свою выделенную изолированную область памяти. Код операционной системы и драйверы устройств, работающие в режиме ядра, делят единое виртуальное адресное пространство. Каждая страница в виртуальной памяти помечается тэгом, определяющим, в каком режиме должен работать процессор для чтения и / или записи данной страницы [1]. Страницы в системном пространстве доступны лишь

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

Для описания процессов в системе используется структура EPROCESS. Данная структура имеет отличия для различных версий Windows. Совокупность процессов в операционной системе представляется двунаправленным кольцом. Следует обратить внимание на реализацию связей в этом кольце. Структура ActiveProcessLinks типа LIST_ENTRY является элементом кольца и содержит указатели FLink и Blink. Указатели ActiveProcessLinks указывают не на начало структуры EPROCESS, а на элементы списка, поэтому для получения указателя на следующую / предыдущую структуру EPROCESS необходимо от текущего указателя отнять смещение ActiveProcessLinks в структуре EPROCESS.

В таблице 1 представлены смещения ActiveProcessLinks и UniqueProcessId современных ОС.

Таблица 1

Некоторые значения смещений в структуре EPROCESS

Offsets Windows 2000 Windows XP Windows Server 2003 SP2 R2 Windows Vista Windows Server 2008 SP1

UniqueProcessId 0x09C 0x084 0x094 0x09C 0x09C

ActiveProcessLinks 0x0A0 0x088 0x098 0x0A0 0x0A0

Windows не предусматривает защиту системной памяти от компонентов, работающих в режиме ядра.

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

в этом режиме, были тщательно продуманы и протестированы.

Исходя из вышеизложенного, следует, что для сокрытия процесса необходимо получить указатель на его внутреннюю структуру ActiveProcessLinks и перенаправить указатели Flink и Blink в обход интересуемого процесса (рис. 1). В результате при перечислении процессов системой данный процесс отображен не будет. Необходимо отметить, что планировщик Windows не нуждается в информации о процессах, он всего лишь распределяет процессорное время между всеми существующими потоками независимо от их принадлежности какому-либо процессу.

EPROCESS EPROCESS EPROCESS

5* Blink ActiveProcessLinks Blink ActiveProcessLinks Blink ActiveProcessLinks < 1

Рис. 1. Реализация связей в списке процессов

Таким образом, современные

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

безопасности системы от такого рода уязвимости может служить установка хука (функции-ловушки) на функцию загрузки драйвера, которая будет уведомлять пользователя о ее вызове.

Литература

1. Рихтер Дж. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows. СПб., 2001.

2. Руссинович М., Соломон Д. Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000. СПб., 2008.