Защитное кольцо

редактировать
Уровень защиты в компьютерных системах

Кольца привилегий для x86, доступные в защищенном режиме

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

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

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

Содержание

  • 1 Реализации
  • 2 Режима
    • 2.1 Режим супервизора
    • 2.2 Режим гипервизора
  • 3 Уровень привилегий
    • 3.1 IOPL
  • 4 Использование аппаратных функций
  • 5 См. также
  • 6 Ссылки
  • 7 Дополнительная литература

Реализации

Множественные кольца защиты были одной из самых революционных концепций, представленных операционной системой Multics, предшественницей высоконадежной сегодняшнее семейство операционных систем Unix. У мэйнфрейма GE 645 был некоторый аппаратный контроль доступа, но этого было недостаточно для обеспечения полной аппаратной поддержки колец, поэтому Multics поддерживала их, улавливая переходы между кольцами в программном обеспечении; его преемник, Honeywell 6180, реализовал их аппаратно с поддержкой восьми колец. Однако в большинстве систем общего назначения используется только два кольца, даже если оборудование, на котором они работают, обеспечивает больше режимов ЦП, чем это. Например, Windows 7 и Windows Server 2008 (и их предшественники) используют только два кольца, причем кольцо 0 соответствует режиму ядра, а кольцо 3 - пользовательскому режиму, поскольку более ранние версии Windows работала на процессорах, которые поддерживали только два уровня защиты.

Многие современные архитектуры ЦП (включая популярную архитектуру Intel x86 ) включают некоторую форму кольцевой защиты, хотя Операционная система Windows NT, как и Unix, не полностью использует эту функцию. OS / 2 в какой-то степени использовала три кольца: кольцо 0 для кода ядра и драйверов устройств, кольцо 2 для привилегированного кода (пользовательские программы с разрешениями доступа к вводу-выводу) и кольцо 3 для непривилегированного кода ( почти все пользовательские программы). В DOS ядро, драйверы и приложения обычно запускаются в кольце 3 (однако, это исключительно в случае, когда используются драйверы защищенного режима и / или расширители DOS; в качестве ОС реального режима используется система работает без защиты), тогда как 386 менеджеров памяти, таких как EMM386, работают в кольце 0. В дополнение к этому, DR-DOS 'EMM386 3.xx может дополнительно запускать некоторые модули (например, DPMS ) вместо этого на кольце 1. OpenVMS использует четыре режима, которые называются (в порядке уменьшения привилегий): Kernel, Executive, Supervisor и User.

Возобновление интереса к этой структуре дизайна произошло с распространением программного обеспечения Xen VMM, продолжающееся обсуждение на монолитном vs. микроядра (особенно в группах новостей Usenet и веб-форумах ), структура дизайна Microsoft Ring-1 в рамках инициативы NGSCB, и гипервизоры, встроенные в прошивку, например, Intel VT-x (ранее Vanderpool).

В исходной системе Multics было восемь колец, но во многих современных системах их меньше. Аппаратное обеспечение всегда осведомлено о текущем кольце исполняемой инструкции thread с помощью специального машинного регистра. В некоторых системах области виртуальной памяти вместо этого назначаются номера звонков в оборудовании. Одним из примеров является Data General Eclipse MV / 8000, в котором верхние три бита программного счетчика (ПК) служат кольцевым регистром. Таким образом, код, выполняемый с виртуальным ПК, установленным, например, на 0xE200000, автоматически будет в кольце 7, а вызов подпрограммы в другом разделе памяти автоматически вызовет передачу звонка.

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

Архитектура ARM v7 реализует три уровня привилегий: приложение, операционная система и гипервизор. Необычно, что уровень 0 (PL0) является наименее привилегированным уровнем, а уровень 2 (PL2) - наиболее привилегированным уровнем (гипервизор).

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

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

Режимы

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

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

Режим супервизора - это «режим выполнения на некоторых процессорах, который позволяет выполнять все инструкции, включая привилегированные инструкции. Он также может предоставлять доступ к другому адресному пространству, оборудованию управления памятью и другим периферийным устройствам. Это режим, в котором обычно работает операционная система. "

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

Некоторые примеры из мира ПК:

  • Linux, macOS и Windows - три операционные системы, которые используют режим супервизора / пользователя. Для выполнения специализированных функций код пользовательского режима должен выполнить системный вызов в режиме супервизора или даже в пространство ядра, где доверенный код операционной системы выполнит необходимую задачу и вернет выполнение обратно в пользовательское пространство. Дополнительный код может быть добавлен в пространство ядра с помощью загружаемых модулей ядра, но только пользователем с необходимыми разрешениями, поскольку этот код не подлежит контролю доступа и ограничениям безопасности пользовательского режима.
  • DOS (до тех пор, пока не загружен менеджер памяти 386, такой как EMM386 ), а также другие простые операционные системы и многие встроенные устройства постоянно работают в режиме супервизора, что означает, что драйверы могут быть написаны непосредственно как пользовательские программы.

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

В большинстве существующих систем переключение из пользовательского режима в режим ядра связано с высокой производительностью. По базовому запросу getpid было измерено, что на большинстве машин оно будет стоить 1000–1500 циклов. Из них только около 100 предназначены для фактического переключения (70 с пользователя на пространство ядра и 40 обратно), остальное - «накладные расходы ядра». В микроядре L3 минимизация этих накладных расходов снизила общую стоимость примерно до 150 циклов.

Морис Уилкс написал:

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

Чтобы добиться производительности и детерминизма, некоторые системы помещают в режим ядра функции, которые, скорее всего, будут рассматриваться как логика приложения, а не как драйверы устройств; приложения безопасности (контроль доступа, брандмауэры и т. д.) и мониторы операционной системы приведены в качестве примеров. По крайней мере, одна встроенная система управления базами данных, eXtremeDB Kernel Mode, была разработана специально для развертывания в режиме ядра, чтобы обеспечить локальную базу данных для функций приложений на основе ядра и устранить переключатели контекста, что в противном случае могло бы произойти, когда функции ядра взаимодействуют с системой базы данных, работающей в пользовательском режиме.

Функции также иногда перемещаются по кольцам в другом направлении. Ядро Linux, например, внедряет раздел vDSO в процессы, который содержит функции, которые обычно требуют системного вызова, т. Е. Кольцевого перехода. Но вместо выполнения системного вызова эти функции используют статические данные, предоставляемые ядром, что предотвращает необходимость кольцевого перехода, который является более легким, чем системный вызов. Таким образом может быть предоставлена ​​функция gettimeofday.

Режим гипервизора

Последние процессоры от Intel и AMD предлагают инструкции виртуализации x86 для гипервизора для управления доступом к оборудованию Ring 0. Хотя они несовместимы, оба Intel VT-x (кодовое название «Vanderpool») и AMD-V (кодовое имя «Pacifica») создают новое «кольцо -1», так что гостевая операционная система может запускать операции Ring 0 изначально, не затрагивая других гостей или ОС хоста.

Чтобы помочь виртуализации, VT и Pacifica вставляют новый уровень привилегий ниже Ring 0. Оба добавляют девять новых инструкций машинного кода, которые работают только на «Ring -1», предназначенные для использования гипервизором.

Уровень привилегий

A уровень привилегий в наборе команд 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

Флаг IOPL (уровень привилегий ввода-вывода ) - это флаг, обнаруженный на всех IA-32-совместимых x86 ЦП. Он занимает биты 12 и 13 в регистре FLAGS. В защищенном режиме и длинном режиме он показывает уровень привилегий ввода-вывода текущей программы или задачи. Текущий уровень привилегий (CPL) (CPL0, CPL1, CPL2, CPL3) задачи или программы должен быть меньше или равен IOPL, чтобы задача или программа могла получить доступ к портам ввода-вывода.

IOPL можно изменить с помощью POPF (D)и IRET (D), только если текущий уровень привилегий - Ring 0.

Помимо IOPL, I Разрешения порта ввода-вывода в TSS также участвуют в определении способности задачи получить доступ к порту ввода-вывода.

Использование аппаратных функций

Многие архитектуры аппаратного обеспечения ЦП обеспечивают гораздо большую гибкость, чем используется операционными системами, которые они обычно запускают. Правильное использование сложных режимов ЦП требует очень тесного взаимодействия между операционной системой и ЦП и, таким образом, имеет тенденцию связывать ОС с архитектурой ЦП. Когда ОС и ЦП специально разработаны друг для друга, это не проблема (хотя некоторые аппаратные функции могут остаться неиспользованными), но когда ОС спроектирована так, чтобы быть совместимой с несколькими разными архитектурами ЦП, большая часть ОС может игнорировать функции режима ЦП. Например, причина, по которой Windows использует только два уровня (кольцо 0 и кольцо 3), заключается в том, что некоторые аппаратные архитектуры, которые поддерживались в прошлом (например, PowerPC или MIPS ), реализовали только два Уровни привилегий.

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

В конечном итоге, цель различных режимов работы ЦП - обеспечить аппаратную защиту от случайного или преднамеренного повреждения системной среды (и соответствующих нарушений безопасности системы) программным обеспечением. Только «доверенные» части системного программного обеспечения могут выполняться в неограниченной среде режима ядра, а затем, в парадигматических проектах, только в случае крайней необходимости. Все остальное программное обеспечение работает в одном или нескольких пользовательских режимах. Если процессор генерирует ошибку или исключительную ситуацию в пользовательском режиме, в большинстве случаев это не влияет на стабильность системы; если процессор генерирует сбой или исключительную ситуацию в режиме ядра, большинство операционных систем останавливают систему с неисправимой ошибкой. Когда существует иерархия режимов (безопасность на основе кольца), сбои и исключения на одном уровне привилегий могут дестабилизировать только уровни привилегий с более высокими номерами. Таким образом, сбой в кольце 0 (режим ядра с наивысшими привилегиями) приведет к сбою всей системы, но сбой в кольце 2 затронет только кольца 3 и выше и само кольцо 2, самое большее.

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

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

См. Также

Ссылки

  • Справочник программиста Intel 80386

Дополнительная литература

Последняя правка сделана 2021-06-02 08:32:39
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте