Кольца защиты
Ко́льца защи́ты (англ. protection rings, также англ. hierarchical protection domains) — это механизмы в компьютерных системах, предназначенные для защиты данных и функциональности от сбоев (путём повышения отказоустойчивости) и злонамеренного поведения (путём обеспечения компьютерной безопасности)[1][2].
В архитектуре операционной системы кольца защиты — это одна из двух или более иерархических ступеней или уровней привилегий. Обычно такие уровни реализуются аппаратно некоторыми центральными процессорами, которые предоставляют различные режимы процессора на уровне аппаратуры или микрокода. Кольца располагаются иерархически: от самого привилегированного (обычно нумеруется как 0) до наименее привилегированного (с наибольшим номером кольца). В большинстве операционных систем кольцо 0 обладает наибольшими привилегиями и взаимодействует непосредственно с физическим оборудованием — такими функциями процессора, как регистры управления, и контроллерами ввода-вывода.
Для доступа внешнего кольца к ресурсам внутреннего предусмотрены специальные механизмы, запрещающие произвольное использование. Грамотная организация доступа между кольцами способствует безопасности, не позволяя программам одного кольца злоупотреблять ресурсами, предназначенными для других уровней привилегий. Например, шпионское ПО, работающее как пользовательская программа на кольце 3, должно быть лишено возможности включать веб-камеру без ведома пользователя, поскольку доступ к аппаратуре должен разрешаться только на уровне драйверов устройств (кольцо 1). Программы, такие как браузеры, работающие в кольцах с более высокими номерами, должны запрашивать доступ к сети — ресурсу, ограниченному для более низких колец.
В отменённой архитектуре Intel англ. X86S, анонсированной в 2024 году, были предусмотрены только кольцо 0 и кольцо 3; кольца 1 и 2 предполагалось убрать, так как современные операционные системы не используют их[3][4].
История
В 1980-е годы концепция колец защиты, унаследованная от операционной системы Multics, получила аппаратную реализацию в массовых микропроцессорах и стала фундаментальным элементом архитектуры многозадачных операционных систем.
Ключевым событием стало появление в 1982 году 16-битного процессора Intel 80286, в котором впервые в семействе x86 был реализован защищённый режим (англ. protected mode)[5]. Этот режим ввёл четырёхуровневую систему привилегий (кольца от 0 до 3)[6]:
- Кольцо 0 (англ. Ring 0) — самый привилегированный уровень, предназначенный для ядра операционной системы с полным доступом к ресурсам компьютера[7].
- Кольца 1 и 2 (англ. Rings 1, 2) — промежуточные уровни для системных служб и драйверов устройств[8].
- Кольцо 3 (англ. Ring 3) — наименее привилегированный уровень для пользовательских приложений[8].
Аппаратный механизм не позволял коду из менее привилегированного кольца напрямую обращаться к данным или выполнять инструкции, зарезервированные для более привилегированного кольца[6]. Передача управления «внутрь» (например, от приложения к ядру) осуществлялась через строго контролируемые точки входа, называемые «шлюзами» (англ. gates)[8]. Это создало основу для защиты операционной системы от сбоев в прикладных программах и для изоляции программ друг от друга[6].
В 1985 году Intel 80386, первый 32-битный процессор в линейке, усовершенствовал механизмы защиты[9]. Ключевым нововведением стала страничная организация памяти (англ. paging), которая работала совместно с сегментацией и кольцами защиты, позволяя реализовывать более гибкие и эффективные схемы виртуальной памяти[10].
Несмотря на наличие четырёх аппаратных колец, большинство операционных систем того времени не использовали эту модель полностью. Системы семейства UNIX, а впоследствии и Linux, приняли упрощённую двухуровневую модель: ядро работало в кольце 0, а все пользовательские процессы — в кольце 3[7]. Это было обусловлено стремлением к кросс-платформенной совместимости (многие другие архитектуры имели только два уровня привилегий) и соображениями производительности[11]. Заметным исключением стала OS/2, которая использовала трёхуровневую модель: кольцо 0 для ядра, кольцо 2 для привилегированных служб с доступом к вводу-выводу и кольцо 3 для приложений[12]. Концепция многоуровневой защиты также применялась в компьютерах VAX от Digital Equipment Corporation под управлением ОС VMS, где было четыре режима привилегий (Kernel, Executive, Supervisor, User), что подтверждает её статус как общей черты передовых систем той эпохи[13].
Реализации
Большинство современных операционных систем используют только два кольца защиты, даже если аппаратная архитектура, такая как x86, поддерживает больше режимов. Как правило, ядро работает на самом привилегированном уровне (кольцо 0), а пользовательские приложения — на наименее привилегированном (кольцо 3). Промежуточные кольца 1 и 2 остаются незадействованными. Такое решение упрощает архитектуру ОС и обеспечивает её переносимость на платформы, которые аппаратно поддерживают только два уровня привилегий[14].
- Windows: Современные версии, включая Windows 10, Windows 11 и Windows Server 2022, продолжают использовать двухуровневую модель: кольцо 0 для режима ядра (англ. Kernel Mode) и кольцо 3 для пользовательского режима (англ. User Mode)[12]. Однако с появлением технологии безопасности на основе виртуализации (англ. Virtualization-Based Security, VBS) была добавлена дополнительная ступень изоляции. VBS использует гипервизор Hyper-V для создания защищённой среды, которая функционирует на более привилегированном уровне, чем ядро ОС. Этот уровень условно называют «кольцом -1» или уровнем доверия виртуализации (англ. Virtualization Trust Level, VTL)[15]. В такой конфигурации гипервизор работает на уровне VTL0, а ядро основной ОС — на менее привилегированном уровне VTL1. Это позволяет реализовать такие функции, как Целостность памяти (англ. HVCI) и Credential Guard[15].
- Linux: Ядро Linux на архитектуре x86-64 также придерживается модели с двумя уровнями: кольцо 0 для ядра и драйверов, и кольцо 3 для всех пользовательских процессов[16]. Это обусловлено соображениями производительности и переносимости[17]. Как и в Windows, технологии виртуализации (например, KVM) создают более привилегированный «кольцо -1» для работы гипервизора. Кроме того, для усиления защиты в ядре Linux (начиная с версии 5.4) был введён режим «lockdown», который, будучи активированным, ограничивает даже права суперпользователя (root) на изменение кода работающего ядра, предотвращая атаки на самом высоком уровне ОС[18].
- macOS: Архитектура защиты в macOS зависит от аппаратной платформы. На компьютерах Mac с процессорами Intel используется та же двухуровневая модель, что и в Linux/Windows: ядро XNU работает в кольце 0, а приложения — в кольце 3[19]. На компьютерах с Apple silicon (архитектура ARM64) концепция колец заменена уровнями исключений (англ. Exception Levels, EL)[20]:
- EL0**: Пользовательский режим (приложения).
- EL1**: Режим ядра (ядро XNU).
- EL2**: Режим гипервизора.
- EL3**: Режим безопасного монитора (англ. Secure Monitor) — самый привилегированный уровень, отвечающий за безопасную загрузку и изоляцию.
Помимо этого, безопасность macOS в значительной степени опирается на программно-аппаратные комплексы, такие как System Integrity Protection (SIP) и Secure Enclave[21].
- OS/2: В отличие от большинства систем, OS/2 частично применяла три кольца: 0 для ядра и драйверов, 2 для привилегированных программ (имеющих доступ к портам ввода-вывода) и 3 для непривилегированных пользовательских приложений[22].
- Xen: Является активно развивающимся гипервизором 1-го типа, работающим непосредственно на аппаратном обеспечении («голое железо») в кольце 0[23]. Его архитектура предусматривает привилегированную управляющую виртуальную машину (англ. Domain 0, Dom0), которая отвечает за администрирование системы, в то время как гостевые ОС (англ. Domain U, DomU) работают в изолированных, непривилегированных окружениях. Такая модель используется в облачных платформах, корпоративной виртуализации и системах с повышенными требованиями к безопасности, таких как Qubes OS[24].
- NGSCB (англ. Palladium): Эта инициатива Microsoft начала 2000-х годов по созданию доверенной вычислительной среды не была реализована в первоначальном виде и считается устаревшей[25]. Однако её ключевые идеи — использование аппаратной поддержки для изоляции критически важных процессов — получили развитие в современной технологии Virtualization-Based Security (VBS)[15].
- Multics: В этой новаторской операционной системе, предшественнице Unix, была реализована концепция восьми иерархических колец. На раннем этапе (мэйнфрейм GE 645) переключение между кольцами частично эмулировалось программно[26], но уже в преемнике, Honeywell 6180, восемь колец были реализованы аппаратно[27].
- OpenVMS: В этой системе используются четыре режима привилегий: ядро, исполнительный, супервизорский и пользовательский (в порядке убывания привилегий).
Режимы
В информатике супервизорский режим — это аппаратный флаг, который может быть изменён программой, работающей в системном программном обеспечении. Системные задачи могут выполнять код с этим флагом, в то время как обычные пользовательские приложения — не могут. Этот режим позволяет выполнять привилегированные команды (например, изменение регистров, отключение прерываний). Идея двух режимов основана на принципе: «с ростом полномочий растёт и зона ответственности» — программа в супервизорском режиме считается надёжной, поскольку её сбой может привести к краху всей системы.
Супервизорский режим — это «режим выполнения на некоторых процессорах, разрешающий выполнение всех инструкций, включая привилегированные. Также может давать доступ к отдельному адресному пространству, аппаратуре управления памятью и периферии. Обычно в этом режиме работает операционная система»[28].
В монолитных ядрах ОС работает в супервизорском режиме, приложения — в пользовательском. В других типах ОС (напр. exokernel, микроядро) такой связи может не быть.
Примеры:
- Linux, macOS и Windows реализуют разделение на супервизорский и пользовательский режимы. Для специальных функций пользовательский код вызывает системный вызов, в результате чего управление передаётся привилегированному коду ядра, который выполняет задачу и возвращает управление пользователю. Дополнительный код может подключаться к ядру с помощью загружаемых модулей ядра с необходимыми правами.
- DOS (до загрузки драйверов памяти типа EMM386) и многие встроенные ОС работают всегда только в супервизорском режиме, поэтому драйверы могут писаться как простые пользовательские программы.
Большинство процессоров имеют не менее двух режимов. На x86 предусмотрены четыре режима, соответствующие четырём кольцам. Программы, исполняемые в кольце 0, обладают полными возможностями, а программам кольца 3 позволено сбойно завершаться без последствий для остальной системы. Кольца 1 и 2 почти не используются, но могут быть настроены для промежуточных уровней доступа.
В большинстве существующих систем переключение из пользовательского режима в режим ядра связано со значительной потерей производительности: например, выполнение запроса getpid занимает 1000—1500 циклов, из которых собственно переключение — только ~100 (70 — в ядро, 40 — обратно), остальное — накладные расходы ядра[29][30]. В L3-microkernel общие затраты удалось снизить примерно до 150 циклов[29].
В современных операционных системах для минимизации накладных расходов на переключение режимов были разработаны асинхронные интерфейсы, позволяющие обрабатывать операции ввода-вывода пакетами. В ядре Linux (начиная с версии 5.1) был представлен механизм io_uring, который использует две кольцевые буферные структуры в разделяемой памяти для отправки и получения результатов множества операций с помощью минимального количества системных вызовов[31]. Этот подход, работающий по модели завершения (proactor), значительно превосходит по производительности старые API, такие как epoll, и позволяет сократить количество переключений контекста[32]. В Microsoft Windows, где исторически использовалась эффективная модель портов завершения ввода-вывода (IOCP), был также внедрён аналогичный API IoRing[33]. Таким образом, фокус сместился с оптимизации одного системного вызова на амортизацию затрат за счёт пакетной обработки.
Морис Уилкс отмечал[34]:
Постепенно стало ясно, что иерархическая система колец плохо соотносится с требованиями системного программиста и мало чем превосходит простую модель с двумя режимами. Хотя кольца удобно реализуются аппаратно, иных преимуществ отмечено не было. Тем не менее, идея мелкозернистой защиты сохраняла привлекательность даже после того, как оказалось, что кольца не решают всех задач… Это направление оказалось тупиковым…
Для повышения производительности и детерминированности некоторые системы размещают логические функции, которые в иных условиях считались бы приложениями, в пространстве ядра (например, средства контроля доступа, файерволы, мониторы ОС). Эта концепция сохраняет актуальность в нишевых областях, требующих минимальных задержек. Например, СУБД eXtremeDB Kernel Mode (KM) продолжает развиваться и применяется в системах реального времени, сетевом оборудовании, IoT и финансовых приложениях, где устранение переключений режимов критически важно для производительности[35][36]. Последующие версии получили поддержку MVCC, распределённой обработки запросов, а также API для языков Go и Python[37][38].
Иногда функции, напротив, перемещаются из уровня ядра во внешний уровень — например, в ядре Linux некоторые обращения (например, функция gettimeofday) реализуются посредством vDSO, чтобы избежать системного вызова и смены кольца, что дешевле по ресурсам.
Современные процессоры Intel и AMD поддерживают аппаратную виртуализацию x86, позволяя гипервизору контролировать доступ к аппаратным функциям кольца 0. Intel VT-x и AMD-V, несмотря на несовместимость, позволяют гостевым ОС использовать привилегии кольца 0, не влияя на другие гости или хост.
До появления аппаратной виртуализации гостевые ОС работали на кольце 1; попытки выполнить команды более высокого уровня вызывали прерывание, обработку которого осуществляло программное обеспечение (Trap & Emulate). С поддержкой VT-x/AMD-V гипервизор работает в режиме «VMX Root», обладая наивысшей привилегией, а гости — в «VMX Non-Root» (кольцо 0 в госте, но без аппаратных привилегий). Переходы между режимами определяются структурой управления виртуальной машиной[39].
Уровни привилегий
Уровень привилегий в архитектуре x86 определяет доступ к ресурсам процессора (области памяти, порты ввода-вывода, специальные инструкции). Существует 4 уровня (от 0 — максимальный доступ, до 3 — минимальный). Современные ОС используют уровень 0 для ядра и уровень 3 для пользовательских программ. Любые ресурсы, доступные на уровне n, доступны также уровням 0..n (кольцевая иерархия). Попытка менее привилегированного процесса получить доступ к более защищённому вызывает исключение.
Не обязательно использовать все четыре уровня: большинство современных ОС (Windows, macOS, Linux, iOS, Android) используют только «ядро/пользователь» (бит Supervisor/User). Windows NT реализует двухуровневую модель[40]. В режиме реального времени 8086 программы выполняются с максимальным уровнем (0), а в виртуальном — с минимальным (3)[41].
Возможные сценарии расширенного использования колец — контейнеризация, виртуализация. Хост-ОС может использовать привилегированный режим ядра, а гость и пользовательские приложения — режимы с более низкой привилегией. Гостевая ОС и её приложения могут использовать промежуточные уровни для реализации системных вызовов и виртуализации[42].
IOPL (англ. I/O Privilege level) — флаг, присутствующий во всех IA-32-совместимых процессорах x86. Размещён в битах 12 и 13 регистра FLAGS. В защищённом и длинном режиме указывает уровень доступа к портам ввода-вывода для выполняемой программы или задачи. Текущий уровень (CPL0…CPL3) должен быть не выше IOPL для доступа к портам.
Флаг IOPL изменяется командами POPF(D) и IRET(D) только из кольца 0.
Кроме IOPL права доступа определяются также картой портов ввода-вывода в TSS.
В дополнение к основной иерархии колец, в современных архитектурах x86 существуют специализированные режимы и сопроцессоры, работающие на уровнях с более высокими привилегиями, чем ядро операционной системы и гипервизор. Эту концепцию условно описывают как «отрицательные кольца защиты»[43].
- Кольцо −1 (Гипервизорный режим): Уровень, на котором работает гипервизор, управляющий гостевыми операционными системами. Этот режим подробно описан в соответствующем разделе.
- Кольцо −2 (System Management Mode): System Management Mode (SMM) — это специальный режим работы основного процессора, в котором приостанавливается выполнение всего остального кода, включая ОС и гипервизор[44]. Он активируется через системное управляющее прерывание (SMI) и предназначен для выполнения низкоуровневых задач, таких как управление питанием и инициализация оборудования. Код SMM выполняется в изолированной области памяти (SMRAM), недоступной для операционной системы[45]. Из-за высочайших привилегий SMM является потенциальным вектором атаки, поэтому современные платформы включают технологии изоляции, такие как SMM Supervisor (AMD) и Intel System Resource Defense (ISRD), для ограничения его полномочий[46].
- Кольцо −3 (Подсистемы управления платформой): Наиболее привилегированный уровень, на котором работают автономные микропроцессоры, интегрированные в чипсет или центральный процессор, но функционирующие независимо от него[47].
- Intel Management Engine (ME) — это подсистема, представляющая собой отдельный микропроцессор (начиная с ME 11, используется ядро Intel Quark и ОС MINIX 3)[43]. Она имеет полный доступ к оперативной памяти, сетевому интерфейсу и периферии, продолжая работать, даже когда компьютер выключен (при наличии питания). Закрытый исходный код и широкие полномочия ME вызывают опасения у исследователей безопасности, а в его прошивке периодически обнаруживаются уязвимости[48].
- AMD Platform Security Processor (PSP), также известный как AMD Secure Technology, — аналог от AMD, представляющий собой встроенный ARM-сопроцессор с технологией TrustZone[43]. Он ориентирован на задачи безопасности: безопасную загрузку, управление ключами шифрования и целостность прошивки. Код PSP также является проприетарным[49]. Несмотря на предположительно меньшую поверхность атаки, в нём также обнаруживаются уязвимости, которые AMD устраняет с помощью обновлений AGESA[50][51].
Использование аппаратных возможностей
Многие аппаратные архитектуры процессоров предоставляют больше возможностей по разграничению прав, чем реально используют обычные операционные системы. Для их эффективного применения требуется тесное взаимодействие между аппаратной частью и ОС, что может ограничивать портируемость системы и её архитектурную гибкость. В прошлом некоторые аппаратные платформы (например, PowerPC, MIPS) реализовывали только два уровня привилегий, что объясняет наличие в Windows двухуровневой модели.
Multics была разработана для конкретной архитектуры, что позволило максимально использовать аппаратные различные режимы. Однако это скорее исключение: столь тесная интеграция аппаратуры и ОС редко оказывается экономически оправданной для массовых ОС, несмотря на потенциальные выгоды в области безопасности и отказоустойчивости.
Главная задача режимов — предотвращение случайной или злонамеренной порчи критической среды системой, обеспечивая аппаратную изоляцию. Только «доверенные» компоненты ОС получают полный доступ — и лишь когда это действительно необходимо; всё остальное ПО работает в пользовательском режиме. В случаях с иерархией колец ошибка в кольце 0 приведёт к сбою всей системы, а сбой в кольце 2 может затронуть только сам уровень 2 и вышестоящие (кольца с большими номерами).
Переходы между режимами разрешены только для перехода из привилегированного в менее привилегированный режим инициируемым потоком, а из менее привилегированного — только через контролируемые аппаратно «ворота» (специнструкции или внешние прерывания).
Микроядра пытаются минимизировать объём кода с полными привилегиями в интересах безопасности и надёжности, нередко жертвуя при этом производительностью.
Примечания
Литература
- Intel 80386 Programmer’s Reference
- David T. Rogers (июнь 2003). A framework for dynamic subversion (PDF) (MSc) [англ.]. Naval Postgraduate School. HDL:10945/919. Проверьте дату в
|date=(справка на английском) - William J. Caelli. Relearning "Trusted Systems" in an Age of NIIP: Lessons from the Past for the Future. (англ.) (PDF) (2002). Архивировано 20 апреля 2015 года.
- Haruna R. Isa; William R. Shockley; Cynthia E. Irvine (май 1999). “A Multi-threading Architecture for Multilevel Secure Transaction Processing” (PDF). Proceedings of the 1999 IEEE Symposium on Security and Privacy [англ.]. Oakland, CA. pp. 166—179. HDL:10945/7198. Проверьте дату в
|date=(справка на английском) - Ivan Kelly. Porting MINIX to Xen (англ.) (8 мая 2006). Архивировано 27 августа 2006 года.
- Xen and the Art of Virtualization (англ.) (2003).
- NGSCB: A Trusted Open System (англ.). Архивировано 4 марта 2005 года.
- A Hardware Architecture for Implementing Protection Rings (англ.) (1972).
- Intel Architecture Software Developer's Manual Volume 3: System Programming (Order Number 243192) (англ.). Архивировано 19 февраля 2009 года.
- Tzi-cker Chiueh; Ganesh Venkitachalam; Prashant Pradhan (декабрь 1999). “Integrating segmentation and paging protection for safe, efficient and transparent software extensions”. Proceedings of the seventeenth ACM symposium on Operating systems principles [англ.]. Section 3: Protection hardware features in Intel X86 architecture; subsection 3.1 Protection checks. DOI:10.1145/319151.319161. ISBN 1581131402. S2CID 9456119. Проверьте дату в
|date=(справка на английском) - Exploiting Segmentation Mechanism for Protecting Against Malicious Mobile Code (англ.) (17 мая 2000). Дата обращения: 2 апреля 2018. Архивировано 10 августа 2017 года.
- Boebert, William Earl; R. Kain (1985). A Practical Alternative to Hierarchical Integrity Policies. 8th National Computer Security Conference [англ.].
- Gorine, Andrei; Krivolapov, Alexander (май 2008). “Kernel Mode Databases: A DBMS technology for high-performance applications”. Dr. Dobb's Journal [англ.]. Проверьте дату в
|date=(справка на английском)


