Блог "Дети ОИТа"
/поиск

Механизмы защиты на уровне колец

Таблицы сокращений ## Английские сокращения | | | | |----|----|----| | Сокращение | Английское обозначение | Русское обозначение | | | | | | CPU | Central Processing Unit | Центральный процесс

Таблицы сокращений

Английские сокращения

Сокращение Английское обозначение Русское обозначение
CPU Central Processing Unit Центральный процессор
MMU Memory Management Unit Блок управления памятью
OS Operating System Операционная система
R0 Ring 0 (Kernel Mode) Кольцо 0 (режим ядра)
R1 Ring 1 Кольцо 1
R2 Ring 2 Кольцо 2
R3 Ring 3 (User Mode) Кольцо 3 (пользовательский режим)
EL Exception Level (ARM) Уровень исключений (ARM)
SVC Supervisor Call (ARM) Вызов супервизора (ARM)
IRQ Interrupt Request Запрос прерывания
FIQ Fast Interrupt Request Быстрый запрос прерывания
CPL Current Privilege Level Текущий уровень привилегий
DPL Descriptor Privilege Level Уровень привилегий дескриптора
RPL Requested Privilege Level Запрашиваемый уровень привилегий
IOPL I/O Privilege Level Уровень привилегий ввода-вывода
VMX Virtual Machine Extensions (Intel) Расширения виртуальных машин (Intel)
SVM Secure Virtual Machine (AMD) Безопасная виртуальная машина (AMD)
SGX Software Guard Extensions (Intel) Расширения для защиты ПО (Intel)
TEE Trusted Execution Environment Доверенная среда исполнения
SEV Secure Encrypted Virtualization Безопасная виртуализация с шифрованием
TrustZone ARM TrustZone Технология доверенной зоны ARM
HYP Hypervisor Mode (ARM) Режим гипервизора (ARM)
SMM System Management Mode Режим управления системой
SMEP Supervisor Mode Execution Prevention Запрет выполнения в режиме супервизора
SMAP Supervisor Mode Access Prevention Запрет доступа в режиме супервизора
NX No Execute Бит запрета исполнения
UEFI Unified Extensible Firmware Interface Унифицированный расширяемый интерфейс прошивки
ACPI Advanced Configuration and Power Interface Расширенный интерфейс конфигурации и питания

Русские сокращения

Сокращение Обозначение
КЗ Кольцо защиты
СВ Системный вызов
ПР Прерывание
ИС Исключение
ДЗ Доверенная загрузка
ВС Виртуализация
ГВ Гипервизор
ЗС Защищённая среда
ПП Прикладной процессор
БУП Блок управления памятью

Введение

Что такое кольца защиты?

Кольца защиты (protection rings) — это архитектурная концепция, реализованная в большинстве современных процессоров, которая разделяет уровни привилегий исполняемого кода. Суть заключается в том, что разные части программного обеспечения работают с разными уровнями доступа к аппаратным ресурсам (память, порты ввода-вывода, системные регистры). Это позволяет изолировать критический код (ядро ОС, гипервизор) от приложений и друг от друга, предотвращая случайные или злонамеренные нарушения работы системы.

Идея была заложена в архитектуре Multics и позже реализована в процессорах Intel x86 (начиная с 80286) и ARM. В x86 реализовано 4 кольца (0–3), хотя большинство операционных систем используют только кольцо 0 (ядро) и кольцо 3 (пользователь), иногда кольцо 1 и 2 для драйверов или виртуальных машин. В ARM используется модель уровней исключений (EL0–EL3), аналогичная по смыслу.

Цели и задачи

  • Обеспечение изоляции между компонентами системы.
  • Предотвращение выполнения запрещённых инструкций и доступа к защищённым областям памяти.
  • Обеспечение стабильности: сбой в пользовательском приложении не должен приводить к падению всей системы.
  • Реализация механизмов виртуализации и доверенных сред исполнения.

Кольца в процессорах x86

В x86 четыре кольца: Ring 0 (наивысшие привилегии), Ring 1, Ring 2, Ring 3 (наименьшие). Основные различия:

Ring 0 (Kernel Mode) — доступ ко всем инструкциям CPU, ко всей памяти, портам ввода-вывода, системным регистрам. Здесь выполняется ядро ОС, драйверы устройств (в некоторых ОС).

Ring 1 и Ring 2 — редко используются в современных ОС (например, в OS/2 для драйверов). Предназначены для менее привилегированного кода, но с большими возможностями, чем пользовательский.

Ring 3 (User Mode) — ограниченный набор инструкций, доступ к памяти только через MMU с проверкой прав, запрет на прямые операции ввода-вывода (кроме случаев, когда разрешено через IOPL). Здесь выполняются пользовательские приложения.

Переключение между кольцами происходит через:

Системные вызовы (например, syscall, int 0x80).

Прерывания и исключения.

Переключение задач (через TSS).

Уровни исключений в ARM

В ARM архитектуре (A-profile) используются уровни исключений (Exception Levels, EL):

  • EL0 — пользовательский режим (аналог Ring 3).
  • EL1 — режим ядра ОС (аналог Ring 0).
  • EL2 — режим гипервизора (для виртуализации).
  • EL3 — режим монитора безопасности (для TrustZone).

Переключение между EL происходит через исключения, прерывания или специальные инструкции (например, SVC для вызова из EL0 в EL1).

Другие архитектуры

RISC-V — поддерживает до 3 уровней привилегий (U, S, M) для пользователя, супервизора и машины.
PowerPC — имеет аналогичные механизмы с уровнями привилегий.
MIPS — использует режимы ядра, супервизора и пользователя.

Диаграмма иерархии колец (x86)

@startuml
title Кольца защиты x86
rectangle "Ring 0 (ядро, драйверы)" as R0
rectangle "Ring 1 (драйверы ОС)" as R1
rectangle "Ring 2 (драйверы, сервисы)" as R2
rectangle "Ring 3 (пользовательские приложения)" as R3
R0 -down-> R1 : "меньше привилегий"
R1 -down-> R2
R2 -down-> R3
note right of R0: Доступ ко всем инструкциям\nи ресурсам
note right of R3: Ограниченный доступ\nчерез системные вызовы
@enduml

Сегментация (x86)

В x86 используется сегментная модель памяти, где каждый сегмент имеет дескриптор с полем DPL (Descriptor Privilege Level). При доступе к сегменту сравнивается CPL (Current Privilege Level) текущей задачи с DPL сегмента. Доступ разрешён, если CPL <= DPL (численно меньше означает большие привилегии). Также существует RPL (Requested Privilege Level) для проверки при выборе селектора.

Страничная организация памяти

Современные процессоры используют страничную трансляцию адресов (paging). Каждая страница памяти имеет атрибуты: U/S (User/Supervisor), R/W (Read/Write), NX (No Execute) и другие. При обращении к памяти MMU проверяет, соответствует ли текущий уровень привилегий (CPL) правам доступа к странице. Если нет — генерируется исключение (page fault).

Специальные регистры и управляющие структуры

CR0 (x86) — управление режимами, включая защиту страниц (WP).
CR4 — включает расширения (SMEP, SMAP, PAE и др.).
MSR (Model Specific Registers) — управляют энергопотреблением, виртуализацией и другими функциями.

Инструкции, доступные только в Ring 0

LGDT, LIDT — загрузка таблиц дескрипторов.
LTR — загрузка TSS.
HALT, IN, OUT (порты ввода-вывода).
WRMSR, RDMSR (чтение/запись MSR).
INVD, WBINVD (инвалидация кэша).

Если эти инструкции выполняются из Ring >0, возникает исключение #GP (General Protection).

Механизмы переключения между кольцами

Системные вызовы: INT 0x80 (Linux), SYSENTER / SYSCALL (Intel/AMD), SVC (ARM). Они переключают CPL на 0 (или EL1) и передают управление в обработчик ядра.

Прерывания: аппаратные (IRQ) и программные (INT) — также вызывают переход в ядро.

Исключения: ошибки страниц, недопустимые инструкции, деление на ноль — также обрабатываются в ядре.

Переключение задач: через TSS (Task State Segment) в x86, но редко используется в современных ОС.

Современные расширения защиты

Виртуализация (Intel VT-x / AMD SVM)

Виртуализация добавляет новый уровень привилегий — корневой режим (root mode) для гипервизора и не-корневой (non-root) для гостевых ОС. Это позволяет гипервизору управлять выполнением гостевых систем, перехватывая критические инструкции и события.

VMX (Intel) — расширение с инструкциями VMXON, VMXOFF, VMCALL, VMLAUNCH, VMRESUME.

SVM (AMD) — аналогичные инструкции VMRUN, VMLOAD, VMSAVE.

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

Software Guard Extensions (Intel SGX)

SGX создаёт защищённые области памяти (enclaves), которые недоступны даже для ядра ОС. Код внутри анклава выполняется с особым уровнем привилегий, защищённым аппаратно. Это позволяет запускать доверенные приложения в среде, где ОС и другие компоненты не могут вмешиваться. Анклавы используют специальные инструкции: ENCLU, ENCLS, ENCLV.

ARM TrustZone

TrustZone разделяет систему на два мира: «обычный» (Normal World) и «безопасный» (Secure World). В безопасном мире выполняется доверенная ОС (TEE), которая имеет доступ к защищённым ресурсам, тогда как обычный мир изолирован. Переключение между мирами осуществляется через монитор (EL3). Это широко используется для DRM, мобильных платежей, биометрии.

AMD SEV

SEV (Secure Encrypted Virtualization) шифрует память виртуальных машин с помощью ключей, управляемых гипервизором, но недоступных даже для хоста. Это защищает данные от атак со стороны гипервизора или администратора. Включает несколько уровней: SEV, SEV-ES (защита регистров), SEV-SNP (защита целостности памяти).

Аппаратные механизмы предотвращения атак

SMEP (Supervisor Mode Execution Prevention) — запрещает выполнение кода из страниц, помеченных как пользовательские, когда CPU находится в режиме супервизора. Это предотвращает возврат в пользовательский код из ядра.

SMAP (Supervisor Mode Access Prevention) — запрещает доступ ядра к пользовательской памяти, если не используются специальные инструкции.

NX (No Execute) — запрещает исполнение кода в областях памяти, помеченных как данные.

KASLR (Kernel Address Space Layout Randomization) — хоть и программный, но использует аппаратные возможности для рандомизации адресов.

Практические аспекты в операционных системах

Linux

В Linux ядро работает в Ring 0, пользовательские процессы — в Ring 3. Переключение осуществляется через syscall (для x86<sub>64</sub> используется SYSCALL). Драйверы обычно выполняются в ядре (Ring 0), хотя существуют драйверы в пользовательском пространстве (например, через UIO). Используются механизмы SMEP/SMAP, NX для усиления защиты.

Пример: системный вызов getpid():


Просмотр системного вызова с помощью strace
strace -e getpid /bin/true

Windows

Аналогично: ядро (NT Kernel) работает в Ring 0, приложения — в Ring 3. Драйверы — в Ring 0, но есть и пользовательские драйверы. Используется Virtual Secure Mode (VSM) для защиты критических данных (например, Credential Guard) — аналог TEE.

Android

На ARM использует TrustZone для защищённых операций (например, шифрование, биометрия). Ядро Linux — EL1, приложения — EL0, гипервизор (KVM/ACRN) — EL2.

Диаграмма взаимодействия колец (Linux x86)

Программные примеры (Babel)

Пример системного вызова на ассемблере (x86<sub>64</sub>)

Следующий код демонстрирует переход из Ring 3 в Ring 0 через syscall для вывода сообщения.

section .data
msg db 'Hello, Ring 0!', 0xa
len equ $ - msg

section .text
global _start
_start:
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, msg
mov rdx, len
syscall ; переключение в Ring 0
mov rax, 60 ; sys_exit
xor rdi, rdi
syscall

Проверка текущего уровня привилегий (CPL) в C

На x86 можно прочитать селектор CS и вычислить CPL (два младших бита). Приведём пример программы, которая выводит текущее кольцо.

#include <stdio.h>

static inline int get_cpl() {
int cpl;
asm volatile ("mov %%cs, %0" : "=r"(cpl));
return cpl & 3;
}

int main() {
printf("Current CPL: %d\n", get_cpl());
return 0;
}

Ожидаемый вывод: Current CPL: 3 (пользовательский режим).

Модуль ядра Linux, выводящий CPL (всегда 0)

#include <linux/module.h>
#include <linux/kernel.h>

static int __init hello_init(void) {
printk(KERN_INFO "Hello from kernel (Ring 0)\n");
return 0;
}

static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

Уязвимости и атаки на кольцевую модель

Атаки с повышением привилегий

Использование уязвимостей в драйверах ядра для выполнения кода с привилегиями Ring 0.

Return‑oriented programming (ROP) в ядре.

Атаки на гипервизор (например, VM escape).

Meltdown и Spectre

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

Атаки на TrustZone

Исследователи нашли уязвимости в реализации TrustZone в некоторых ARM-процессорах, позволяющие перейти из нормального мира в безопасный.

Защитные меры

  • KAISER / Kernel Page Table Isolation (KPTI) для защиты от Meltdown.
  • Retpoline и другие средства для Spectre.
  • Использование SMEP/SMAP для предотвращения выполнения кода из пользовательской памяти в ядре.
  • Проверка целостности гипервизора и TEE.

Сравнение подходов в разных архитектурах

Архитектура Уровни привилегий Особенности
x86-64 (Intel/AMD) Ring 0–3 Использует сегментацию и страничную организацию; поддержка VMX/SVM, SGX
ARMv8-A EL0–EL3 Использует исключения; TrustZone на EL3; гипервизор на EL2
RISC-V U, S, M Три уровня; M (machine) для firmware; S для ядра; U для пользователя
PowerPC 0–3 или другие Поддержка гипервизора (HV) в некоторых версиях

Развитие технологий ведёт к появлению новых уровней абстракции:

  • Chiplet и изолированные ядра — аппаратные изолированные зоны для критических задач.
  • Надёжные среды выполнения (TEE) становятся всё более распространёнными.
  • Постоянное усовершенствование механизмов предотвращения атак (например, Intel CET для защиты от ROP).

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

Приложение. Полезные команды и утилиты

Команда Назначение
grep -i smep Проверка включения SMEP в ядре
lsmod Список загруженных модулей ядра (работают в Ring 0)
ps -eo pid,comm,cls Просмотр классов планирования (не связан с кольцами)
grep -E «flags.*(vmx&svm)» proc cpuinfo Проверить поддержку виртуализации