Введение
Слой защиты в компьютерных системах
В информатике иерархические домены защиты, часто называемые кольцами защиты, являются механизмами для защиты данных и функциональности от сбоев (повышая устойчивость к ошибкам) и злонамеренных действий (обеспечивая компьютерную безопасность). Компьютерные операционные системы предоставляют различные уровни доступа к ресурсам. Кольцо защиты – это один из двух или более иерархических уровней или слоев привилегий в архитектуре компьютерной системы. Как правило, это аппаратное обеспечение, реализованное в некоторых архитектурах процессоров, которые предоставляют различные режимы работы процессора на уровне аппаратного обеспечения или микрокода. Кольца организованы в иерархию от наиболее привилегированных (наиболее доверенных, обычно с номером ноль) до наименее привилегированных (наименее доверенных, обычно с самым высоким номером кольца). В большинстве операционных систем кольцо 0 является уровнем с наибольшими привилегиями и взаимодействует непосредственно с физическим оборудованием, таким как определенные функции процессора (например, регистры управления) и контроллеры ввода-вывода. С ростом популярности виртуализации многие процессоры добавили еще один уровень (концептуально кольцо 1) для гипервизора. Предусмотрены специальные механизмы, позволяющие внешнему кольцу получать доступ к ресурсам внутреннего кольца предопределенным образом, а не допускать произвольное использование. Правильная организация доступа между кольцами может повысить безопасность, предотвращая неправомерное использование ресурсов, предназначенных для программ в другом кольце. Например, шпионское ПО, работающее как пользовательская программа в кольце 3, должно быть предотвращено от включения веб-камеры без уведомления пользователя, поскольку доступ к аппаратному обеспечению должен быть функцией кольца 1, зарезервированной для драйверов устройств. Программы, такие как веб-браузеры, работающие в кольцах с более высоким номером, должны запрашивать доступ к сети – ресурсу, ограниченному кольцом с более низким номером.
Режим гипервизора
Недавние процессоры Intel и AMD предоставляют x86 инструкции виртуализации, позволяющие гипервизору управлять доступом к аппаратному обеспечению уровня Ring 0. Несмотря на взаимную несовместимость, Intel VT-x (кодовое имя "Vanderpool") и AMD-V (кодовое имя "Pacifica") создают новый уровень "Ring -1", чтобы гостевая операционная система могла выполнять операции уровня Ring 0 непосредственно, не затрагивая другие гостевые системы или хост-ОС. Для облегчения виртуализации VT-x и SVM добавляют новый уровень привилегий ниже уровня Ring 0. Обе технологии добавляют девять новых инструкций машинного кода, которые работают только на уровне "Ring -1" и предназначены для использования гипервизором.
Уровень привилегий
Уровень привилегий в наборе инструкций x86 контролирует доступ программы, выполняемой на процессоре, к ресурсам, таким как области памяти, порты ввода-вывода и специальные инструкции. Существует 4 уровня привилегий, от 0 – самого высокого, до 3 – самого низкого. Большинство современных операционных систем используют уровень 0 для ядра/исполнительного модуля, а уровень 3 – для прикладных программ. Любой ресурс, доступный на уровне n, также доступен на уровнях от 0 до n, поэтому уровни привилегий называют кольцами. Если процесс с меньшими привилегиями пытается получить доступ к ресурсу, защищенному процессом с более высокими привилегиями, операционной системе сообщается об исключении общей защиты. Использовать все четыре уровня привилегий не обязательно. Современные операционные системы с широким распространением, включая Microsoft Windows, macOS, Linux, iOS и Android, в основном используют механизм страничной организации памяти с одним битом для определения уровня привилегий как супервизора или пользователя (U/S бит). Windows NT использует двух уровневую систему. Программы, работающие в реальном режиме 8086, выполняются на уровне 0 (самый высокий уровень привилегий), в то время как виртуальный режим 8086 выполняет все программы на уровне 3. Потенциальные будущие области применения нескольких уровней привилегий, поддерживаемых семейством x86 ISA, включают контейнеризацию и виртуальные машины. Ядро хост-операционной системы может использовать инструкции с полным доступом к привилегиям (режим ядра), в то время как приложения, работающие в гостевой ОС в виртуальной машине или контейнере, могут использовать самый низкий уровень привилегий в пользовательском режиме. Виртуальная машина и ядро гостевой ОС могут сами использовать промежуточный уровень привилегий инструкций для вызова и виртуализации операций режима ядра, таких как системные вызовы, с точки зрения гостевой операционной системы.
МОЛ
Флаг IOPL (I/O Privilege level) — это флаг, присутствующий во всех x86 процессорах, совместимых с IA 32. Он занимает биты 12 и 13 в регистре FLAGS. В защищенном и длинном режимах он указывает уровень привилегий ввода/вывода текущей программы или задачи. Для доступа к портам ввода/вывода уровень привилегий текущей задачи или программы (CPL) (CPL0, CPL1, CPL2, CPL3) должен быть меньше или равен IOPL. Изменить IOPL можно с помощью инструкций POPF(D) и IRET(D) только при текущем уровне привилегий Ring 0. Наряду с IOPL, разрешения на порты ввода/вывода, хранящиеся в TSS, также влияют на возможность задачи доступа к порту ввода/вывода.
Разное
В системах x86 аппаратная виртуализация x86 (VT-x и SVM) именуется "уровень -1", режим управления системой – "уровень -2", а Intel Management Engine и AMD Platform Security Processor иногда именуются "уровень -3".
Использование аппаратных функций
Многие архитектуры аппаратного обеспечения CPU предоставляют гораздо большую гибкость, чем используют операционные системы, на которых они обычно работают. Правильное использование сложных режимов процессора требует тесного взаимодействия между операционной системой и CPU, что приводит к привязке ОС к архитектуре процессора. Если ОС и CPU разработаны специально друг для друга, это не является проблемой (хотя некоторые аппаратные возможности могут остаться нереализованными), но когда ОС предназначена для совместимости с несколькими различными архитектурами CPU, значительная часть функций режимов процессора может игнорироваться ОС. Например, Windows использует только два уровня (кольцо 0 и кольцо 3) из-за того, что некоторые ранее поддерживаемые аппаратные архитектуры (такие как PowerPC или MIPS) реализовывали только два уровня привилегий. Multics была операционной системой, разработанной специально для специализированной архитектуры CPU (которая, в свою очередь, была разработана специально для Multics), и она в полной мере использовала доступные режимы процессора. Однако это было исключением из правил. Сегодня такая высокая степень взаимодействия между ОС и аппаратным обеспечением часто не является экономически оправданной, несмотря на потенциальные преимущества для безопасности и стабильности. В конечном счете, назначение различных режимов работы CPU – обеспечить аппаратную защиту системной среды от случайного или намеренного повреждения программным обеспечением (и, как следствие, от нарушений системной безопасности). Только "доверенным" частям системного программного обеспечения разрешено выполняться в неограниченной среде режима ядра, и то, в типичных конструкциях, только при абсолютной необходимости. Все остальное программное обеспечение выполняется в одном или нескольких пользовательских режимах. Если процессор генерирует ошибку или исключение в пользовательском режиме, в большинстве случаев стабильность системы не нарушается; если же процессор генерирует ошибку или исключение в режиме ядра, большинство операционных систем останавливают систему с невосстановимой ошибкой. При наличии иерархии режимов (кольцевой безопасности) ошибки и исключения на одном уровне привилегий могут дестабилизировать только уровни с более высоким номером. Таким образом, ошибка в кольце 0 (режиме ядра с наивысшими привилегиями) приведет к сбою всей системы, а ошибка в кольце 2 повлияет только на кольца 3 и выше, и, в худшем случае, на само кольцо 2. Переходы между режимами находятся в ведении выполняемого потока при переходе с уровня высоких привилегий к уровню низких привилегий (например, из режима ядра в пользовательские режимы), но переходы с более низких уровней привилегий на более высокие могут осуществляться только через безопасные, аппаратно контролируемые "ворота", которые активируются при выполнении специальных инструкций или при получении внешних прерываний. Микроядерные операционные системы стремятся минимизировать объем кода, выполняемого в привилегированном режиме, ради безопасности и элегантности, но в конечном итоге жертвуют производительностью.