Кольца защиты (Операционные Системы)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:36, 24 августа 2017.

Кольца защиты — архитектура информационной безопасности и функциональной отказоустойчивости, реализующая аппаратное разделение системного и пользовательского уровней привилегий. Структуру привилегий можно изобразить в виде нескольких концентрических кругов. В этом случае системный режим (режим супервизора или нулевое кольцо, так называемое «кольцо 0»), обеспечивающий максимальный доступ к ресурсам, является внутренним кругом, тогда как режим пользователя с ограниченным доступом — внешним

Уровни привилегий программ

Рис. 1 Кольца привилегий архитектуры x86 в защищённом режиме

Как распределить привилегии программ в операционной системе? Можно использовать, например, такое распределение: (см. Рис. 1)

  • Кольцо 0 - ядро операционной системы, системные драйверы
  • Кольцо 1 - программы обслуживания аппаратуры, драйверы, программы, работающие с портами ввода/вывода компьютера
  • Кольцо 2 - системы управления базами данных, расширения операционной системы
  • Кольцо 3 - прикладные программы, запускаемые пользователем

Уровни привилегий также часто называют кольцами защиты, которые изображаются в виде вложенных окружностей. Наиболее привилегированный уровень соответствует окружности с наибольшей степенью вложенности. Большинство современных ядер для архитектуры x86 используют всего два уровня привилегий — 0 и 3.

Выполнение порядка 15 инструкции (а всего их нескольких десятков) возможно только в кольце 0. Другие инструкции имеют ограничения, связанные с допустимыми операндами. Если бы не существовало этих ограничений, то невозможно бы было обеспечить функционирование механизмов защиты, т.к. упомянутые инструкции могут их обойти или привести к другим негативным последствиям. Инструкции, на которые существуют ограничения, могут использоватся только в коде ядра. Попытка их выполнения за пределами нулевого кольца, приведет к исключению #GP (general-protection exception). Точно такое же исключение происходит, например, когда программа пытается обратиться к невалидным адресам памяти. Аналогичным образом, в зависимости от уровня привилегий осуществляется ограничение доступа к памяти и портам ввода / вывода.

Реализация

Рис. 2 Защита в x86 на уровне сегментов

Поддержка нескольких колец защиты была одной из революционных концепций, включённых в операционную систему Multics, предшественника сегодняшних UNIX-подобных операционных систем. Однако, большинство UNIX-систем используют только 2 кольца, даже если аппаратные средства поддерживают больше режимов центрального процессора. Многие современные архитектуры центральных процессоров (включая популярную архитектуру x86) включают некоторые формы защиты. Но несмотря на это, операционная система Windows NT, также как и UNIX, полностью не используют эти возможности.

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

Защита кольца может сочетаться с режимами процессора (режим master/kernel/privileged против режима slave/user/unprivileged) в некоторых системах. Операционные системы, выполняющиеся на аппаратном обеспечении, поддерживающем такие режимы, могут использовать оба способа защиты или только один из них. (см. Рис. 2) Эффективное использование архитектуры колец защиты требует тесного взаимодействия между аппаратными средствами и операционной системой. Операционные системы, разрабатывающиеся так, чтобы они работали на большом количестве платформ, могут иметь различную реализацию механизма колец на каждой платформе. Часто модель безопасности упрощают до двух уровней доступа: уровня «ядра» и уровня «пользователя», даже если аппаратные средства обеспечивают большую степень детализации уровней выполнения.

Режим супервизора

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

Известно одно исключение из данного правила: у некоторых современных процессоров может присутствовать ещё более привилегированный режим гипервизора, как правило, используемый с целью виртуализации, то есть обеспечения параллельной работы сразу нескольких операционных систем на одном процессоре. В этом случае настройки, сделанные из режима гипервизора, могут вносить некоторые ограничения на прямой доступ к системным ресурсам и периферии из режима супервизора с целью предоставить гипервизору возможность арбитража и разграничения доступа к системным ресурсам и периферии незаметно для работающих параллельно операционных систем.

Гипервизор

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

Гипервизор также может (и обязан) предоставлять работающим под его управлением на одном хост-компьютере ОС средства связи и взаимодействия между собой (например, через обмен файлами или сетевые соединения) так, как если бы эти ОС выполнялись на разных физических компьютерах.

Гипервизор сам по себе в некотором роде является минимальной операционной системой (микроядром или наноядром). Он предоставляет запущенным под его управлением операционным системам сервис виртуальной машины, виртуализируя или эмулируя реальное (физическое) аппаратное обеспечение конкретной машины. И управляет этими виртуальными машинами, выделением и освобождением ресурсов для них. Гипервизор позволяет независимое «включение», перезагрузку, «выключение» любой из виртуальных машин с той или иной ОС. При этом операционная система, работающая в виртуальной машине под управлением гипервизора, может, но не обязана «знать», что она выполняется в виртуальной машине, а не на реальном аппаратном обеспечении.

Операционные системы на x86

Рис. 3 Кольца защиты в современных ОС. Рис. 3

Популярные операционные системы для x86 (включая DOS (с EMM386.EXE -Speichermanager), Linux и Windows , ) используют только два из четырех возможных CPU-колец. В Ring 0, ядро и все драйверы устройств выполняются в то время как прикладное программное обеспечение в непривилегированная кольцо 3 работ. Таким образом, остается Переносимость операционной системы также обеспечивает на процессорных архитектур , которые можно выделить только два кольца. OS / 2 , однако, использовали кольцо 2 для графических драйверов. [1] специально адаптированную версию диспетчера памяти EMM386 из комплекта разработки для DOS защищенный режим работы служб (для Novell DOS 7, OpenDOS 7.01 DR-DOS 7.02 и выше) позволяет DPMS на кольце 1 вместо работы на кольце 0, способствуя тем самым устранению неполадок программного обеспечения , которое использует DPMS.

Все более используемые решения виртуализации также используют кольцо 1. В этом случае ядро операционной системы от кольца 0 сдвинутой в кольце 1, гипервизор находится Тогда , как верхний слой , в кольце 0 и управляет одним или более работает в ядре Ring 1 операционной системы. Тем не менее, это также может Руткиты быть использована для инъекции вредоносного кода , чтобы быть незаметно пользователем на кольце 0 (смотри также виртуальные машины на базе Rootkit ).

Для того, чтобы упростить использование гипервизоров, выполнять новые процессоры от Intel и AMD нового "Кольцо -1", так что ядро ​​операционной системы в кольце 0 остается пока гипервизор, как верхний слой, в кольце -1 проживает. Он управляет одним или более ядра операционной системы в кольце 0-й

Тип сегментов

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

Сегмент кода может быть закрыт для чтения установкой бита R в байте доступа. Такие сегменты можно только выполнять, но нельзя читать. В сегмент кода нельзя записывать какие-либо данные. В регистр CS можно загружать только такие селекторы, которые относятся к сегментам кода.

Сегменты данных могут быть закрыты для записи установкой бита W в байте доступа. Сегменту данных нельзя передать управление, загрузив его селектор в регистр CS.

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

Границы сегментов

Программы реального режима работают всегда с сегментами размером 64 килобайта. Если программа состоит из нескольких сегментов, то некоторые сегменты могут перекрываться. Существует потенциальная опасность, что в результате программной ошибки (например, выхода индекса массива за допустимые пределы) произойдёт запись в другой сегмент.

Процессор i80286 позволяет создавать сегменты любого размера в пределах 64 килобайт (процессоры i80386 и i80486 могут работать с сегментами размером 4 гигабайта). Кроме того, он следит за тем, чтобы при адресации памяти не происходил выход за границы сегмента.

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

Интерпретация поля предела зависит от состояния бита D поля доступа. Для сегментов стеков необходимо устанавливать поле D равным 1. В этом случае попытка записи в переполненный стек вызовет прерывание программы. В ответ на это прерывание операционная система может, например, выделить дополнительную память для стека.

В реальном режиме переполнение стека никак не контролируется и может привести к разрушению самой программы или операционной системы.

Источники

  • Blue pill/red pill - the matrix has windows longhorn (рус.). InsidePro Software.
  • Ousterhout, J. K. 1990. Why aren't operating systems getting faster as fast as hardware? In Usenix Summer Conference, Anaheim, CA, pp. 247-256.