Эта статья включает в себя список общих ссылок , но он остается в значительной степени непроверенным, поскольку в нем недостаточно соответствующих встроенных ссылок . ( февраль 2015 г. ) |
В компьютерных науках иерархические домены защиты [ 1 ] [2] , часто называемые кольцами защиты , представляют собой механизмы защиты данных и функций от сбоев (путем повышения отказоустойчивости ) и вредоносного поведения (путем обеспечения компьютерной безопасности ).
Компьютерные операционные системы обеспечивают различные уровни доступа к ресурсам. Ограждение кольцо является одним из двух или более иерархических уровней или слоев из привилегии в пределах архитектуры компьютерной системы . Это , как правило , аппаратная реализации некоторых процессорных архитектур , которые обеспечивают различные режимы процессора на аппаратном или микрокод уровне. Кольца располагаются в иерархии от наиболее привилегированных (наиболее доверенные, обычно с нулевым номером) до наименее привилегированных (наименее доверенные, обычно с наибольшим номером кольца). В большинстве операционных систем кольцо 0 представляет собой уровень с наибольшим количеством привилегий и самым непосредственным образом взаимодействует с физическим оборудованием, таким как ЦП и память.
Предусмотрены специальные шлюзы вызовов между кольцами, позволяющие внешнему кольцу получать доступ к ресурсам внутреннего кольца предопределенным образом, в отличие от произвольного использования. Правильное ограничение доступа между кольцами может повысить безопасность, не позволяя программам из одного кольца или уровня привилегий злоупотреблять ресурсами, предназначенными для программ из другого. Например, шпионское ПО , работающее как пользовательская программа в кольце 3, не должно включать веб-камеру без уведомления пользователя, поскольку доступ к оборудованию должен быть функцией кольца 1, зарезервированной для драйверов устройств . Такие программы, как веб-браузеры, работающие в кольцах с более высокими номерами, должны запрашивать доступ к сети, ресурсу, ограниченному кольцом с более низкими номерами.
Множественные кольца защиты были одной из самых революционных концепций, представленных в операционной системе Multics , высокозащищенной предшественнице современного семейства операционных систем Unix . У мейнфрейма GE 645 был некоторый аппаратный контроль доступа, но этого было недостаточно для полной аппаратной поддержки колец, поэтому Multics поддерживала их, перехватывая переходы колец в программном обеспечении; [3] его преемник, Honeywell 6180 , реализовал их аппаратно с поддержкой восьми колец. [4] Однако большинство систем общего назначения используют только два кольца, даже если аппаратное обеспечение, на котором они работают, обеспечивает больше режимов ЦП.чем это. Например, Windows 7 и Windows Server 2008 (и их предшественники) используют только два кольца, с кольцом 0 , соответствующий режим ядра и кольца 3 в пользовательском режиме , [5] , потому что более ранние версии Windows , работали на процессорах , которые поддерживают только два уровня защиты . [6]
Многие современные архитектуры ЦП (включая популярную архитектуру Intel x86 ) включают некоторую форму кольцевой защиты, хотя операционная система Windows NT , например Unix, не использует эту функцию в полной мере. В некоторой степени OS/2 использует три кольца: [7] кольцо 0 для кода ядра и драйверов устройств, кольцо 2 для привилегированного кода (пользовательские программы с разрешениями на доступ к вводу-выводу) и кольцо 3 для непривилегированного кода (почти все пользовательские программы) . программы). В DOS ядро, драйверы и приложения обычно работают в кольце 3 (однако это относится только к случаю, когда используются драйверы защищенного режима и/или расширители DOS; в ОС реального режима система работает практически без защиты). ), тогда как 386 менеджеров памяти, таких какEMM386 работает в кольце 0. В дополнение к этому, EMM386 3.xx DR-DOS может дополнительно запускать некоторые модули (такие как DPMS ) вместо этого в кольце 1. OpenVMS использует четыре режима, которые называются (в порядке уменьшения привилегий) Kernel, Executive, Supervisor и User.
Обновленный интерес к этой конструкции структуры пришел с распространением на Xen VMM программного обеспечения, продолжается обсуждение на монолитном против микро-ядрах ( в частности , в Usenet телеконференции и веб - форумах ), Microsoft, Ring-1 конструкция структура в рамках своей NGSCB инициативы и гипервизоры на основе виртуализации x86, такие как Intel VT-x (ранее Vanderpool).
В исходной системе Multics было восемь колец, но во многих современных системах их меньше. Аппаратное обеспечение всегда знает о текущем кольце потока выполнения инструкций с помощью специального машинного регистра. В некоторых системах областям виртуальной памяти вместо этого аппаратно назначаются кольцевые номера. Одним из примеров является Data General Eclipse MV/8000 , в котором три старших бита счетчика программ (PC) служили кольцевым регистром. Таким образом, код, выполняемый с виртуальным ПК, установленным, например, на 0xE200000, автоматически окажется в кольце 7, а вызов подпрограммы в другом разделе памяти автоматически вызовет кольцевую передачу.
Аппаратное обеспечение строго ограничивает способы передачи управления от одного кольца к другому, а также налагает ограничения на типы доступа к памяти, которые могут выполняться между кольцами. Используя в качестве примера x86, существует специальная структура шлюза [ требуется уточнение ] , на которую ссылается инструкция вызова , которая передает управление безопасным способом [ требуется разъяснение ] к предопределенным точкам входа в кольца более низкого уровня (более надежные); это работает как вызов супервизораво многих операционных системах, использующих кольцевую архитектуру. Аппаратные ограничения предназначены для ограничения возможности случайного или злонамеренного нарушения безопасности. Кроме того, самому привилегированному кольцу могут быть предоставлены специальные возможности (такие как адресация реальной памяти в обход оборудования виртуальной памяти).
Архитектура ARM версии 7 реализует три уровня привилегий: приложение (PL0), операционная система (PL1) и гипервизор (PL2). Необычно то, что уровень 0 (PL0) является наименее привилегированным, а уровень 2 — наиболее привилегированным. [8] ARM версии 8 реализует четыре уровня исключений: приложение (EL0), операционная система (EL1), гипервизор (EL2) и защищенный монитор/прошивка (EL3), для AArch64 [9] : D1-2454 и AArch32. [9] : G1-6013
Кольцевая защита может сочетаться с режимами процессора (главный/ядро/привилегированный/ супервизорный режим по сравнению с подчиненным/непривилегированным/пользовательским режимом) в некоторых системах. Операционные системы, работающие на оборудовании, поддерживающем оба варианта, могут использовать обе формы защиты или только одну.
Эффективное использование кольцевой архитектуры требует тесного взаимодействия между оборудованием и операционной системой [ почему? ] . Операционные системы, предназначенные для работы на нескольких аппаратных платформах, могут лишь ограниченно использовать кольца, если они не присутствуют на каждой поддерживаемой платформе. Часто модель безопасности упрощается до «ядра» и «пользователя», даже если аппаратное обеспечение обеспечивает более точную детализацию с помощью колец.
С точки зрения компьютера, режим супервизора — это аппаратно-опосредованный флаг, который можно изменить с помощью кода, работающего в программном обеспечении системного уровня. Для задач или потоков системного уровня этот флаг будет установлен во время их выполнения, а для приложений пользовательского уровня — нет. Этот флаг определяет возможность выполнения операций машинного кода, таких как изменение регистров для различных таблиц дескрипторов, или выполнение таких операций, как отключение прерываний. Идея иметь два разных режима для работы исходит из того, что «чем больше контроля, тем больше ответственности» - считается, что программа в режиме супервизора никогда не выйдет из строя, поскольку сбой может привести к сбою всей компьютерной системы.
Режим супервизора — это «режим выполнения на некоторых процессорах, который позволяет выполнять все инструкции, включая привилегированные инструкции. Он также может предоставлять доступ к другому адресному пространству, аппаратному обеспечению управления памятью и другим периферийным устройствам. обычно бегает». [10]
В монолитном ядре операционная система работает в режиме супервизора, а приложения работают в пользовательском режиме. Другие типы операционных систем , например, с экзоядром или микроядром , не обязательно разделяют такое поведение.
Несколько примеров из мира ПК:
Большинство процессоров имеют как минимум два разных режима. Процессоры x86 имеют четыре разных режима, разделенных на четыре разных кольца. Программы, работающие в кольце 0, могут делать с системой все, что угодно, а код, работающий в кольце 3, должен иметь возможность дать сбой в любой момент без воздействия на остальную часть компьютерной системы . Кольцо 1 и кольцо 2 используются редко, но могут быть настроены с разными уровнями доступа.
В большинстве существующих систем переключение из пользовательского режима в режим ядра сопряжено с большими потерями производительности. По базовым запросам было измерено, что getpid
на большинстве машин это стоит 1000–1500 циклов. Из них около 100 предназначены для фактического переключения (70 из пространства пользователя в пространство ядра и 40 обратно), остальные — «накладные расходы ядра». [11] [12] В микроядре L3 минимизация этих накладных расходов снизила общую стоимость примерно до 150 циклов. [11]
Морис Уилкс писал: [13]
... в конце концов стало ясно, что иерархическая защита, которую обеспечивали кольца, не совсем соответствовала требованиям системного программиста и практически не давала улучшений по сравнению с простой системой, имеющей только два режима. Кольца защиты поддавались эффективной реализации на аппаратном уровне, но больше о них сказать было нечего. [...] Привлекательность мелкозернистой защиты осталась, даже после того, как было замечено, что кольца защиты не дают ответа ... Это снова оказалось тупиком ...
Для повышения производительности и детерминизма некоторые системы помещают функции, которые, скорее всего, будут рассматриваться как логика приложения, а не как драйверы устройств, в режим ядра; в качестве примеров приводятся приложения безопасности ( управление доступом , брандмауэры и т. д.) и мониторы операционной системы. По крайней мере, одна встроенная система управления базами данных, e X treme DB Kernel Mode , была разработана специально для развертывания в режиме ядра, чтобы предоставить локальную базу данных для функций приложений на основе ядра и исключить переключения контекста , которые в противном случае происходили бы при взаимодействии функций ядра. с системой баз данных, работающей в пользовательском режиме. [14]
Функции также иногда перемещаются по кольцам в другом направлении. Ядро Linux, например, внедряет раздел vDSO в процессы, содержащие функции, которые обычно требуют системного вызова, т. е. кольцевого перехода. Но вместо системного вызова эти функции используют статические данные, предоставляемые ядром, что устраняет необходимость в кольцевом переходе, который легче, чем системный вызов. Функция gettimeofday может быть предоставлена таким образом.
Последние процессоры Intel и AMD предлагают инструкции по виртуализации x86 для гипервизора , чтобы управлять доступом к оборудованию Ring 0. Хотя они взаимно несовместимы, как Intel VT-x (кодовое название «Vanderpool»), так и AMD-V (кодовое название «Pacifica») создают новое «кольцо −1», так что гостевая операционная система может выполнять операции кольца 0 изначально, не затрагивая другие. гостей или хост-ОС.
Чтобы помочь виртуализации, VT-x и SVM вставляют новый уровень привилегий под кольцом 0. Оба добавляют девять новых инструкций машинного кода, которые работают только в «кольце -1», предназначенных для использования гипервизором. [15]
Уровень привилегий в наборе инструкций x86 контролирует доступ программы, работающей в данный момент на процессоре, к таким ресурсам, как области памяти, порты ввода-вывода и специальные инструкции. Существует 4 уровня привилегий, начиная от 0 (наиболее привилегированный) и заканчивая 3 (наименее привилегированный). Большинство современных операционных систем используют уровень 0 для ядра/исполнительной системы и уровень 3 для прикладных программ. Любой ресурс, доступный для уровня n, также доступен для уровней от 0 до n, поэтому уровни привилегий представляют собой кольца. Когда процесс с меньшими привилегиями пытается получить доступ к процессу с более высокими привилегиями, ОС сообщает об исключении общей ошибки защиты .
Нет необходимости использовать все четыре уровня привилегий. Текущие операционные системы с широкой долей рынка, включая Microsoft Windows , macOS , Linux , iOS и Android, в основном используют механизм пейджинга только с одним битом для указания уровня привилегий как супервизора или пользователя (бит U/S). Windows NT использует двухуровневую систему. [16] Программы реального режима в 8086 выполняются на уровне 0 (самый высокий уровень привилегий), тогда как в виртуальном режиме в 8086 все программы выполняются на уровне 3. [17]
Потенциальное будущее использование нескольких уровней привилегий, поддерживаемых семейством x86 ISA, включает контейнеризацию и виртуальные машины . Ядро операционной системы хоста может использовать инструкции с полным доступом к привилегиям ( режим ядра ), тогда как приложения, работающие в гостевой ОС на виртуальной машине или в контейнере, могут использовать самый низкий уровень привилегий в пользовательском режиме. Виртуальная машина и ядро гостевой ОС сами могут использовать промежуточный уровень привилегий инструкций для вызова и виртуализации операций режима ядра, таких как системные вызовы, с точки зрения гостевой операционной системы. [18]
Флаг IOPL ( уровень привилегий ввода/вывода ) присутствует на всех процессорах 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 иногда упоминаются как «кольцо −3». [19]
Многие аппаратные архитектуры ЦП обеспечивают гораздо большую гибкость, чем та, которую используют операционные системы, с которыми они обычно работают. Правильное использование сложных режимов ЦП требует очень тесного взаимодействия между операционной системой и ЦП и, таким образом, имеет тенденцию привязывать ОС к архитектуре ЦП. Когда ОС и ЦП специально разработаны друг для друга, это не проблема (хотя некоторые аппаратные функции могут оставаться неиспользованными), но когда ОС спроектирована так, чтобы быть совместимой с несколькими различными архитектурами ЦП, большая часть функции режима ЦП могут игнорироваться ОС. Например, причина, по которой Windows использует только два уровня (кольцо 0 и кольцо 3), заключается в том, что некоторые аппаратные архитектуры, которые поддерживались в прошлом (такие как PowerPC или MIPS) реализовано только два уровня привилегий. [5]
Multics была операционной системой, разработанной специально для специальной архитектуры ЦП (которая, в свою очередь, была разработана специально для Multics), и она в полной мере использовала доступные ей режимы ЦП. Однако это было исключением из правил. Сегодня такая высокая степень взаимодействия между ОС и аппаратным обеспечением часто не является рентабельной, несмотря на потенциальные преимущества для безопасности и стабильности.
ошибки и исключения на одном уровне привилегий могут дестабилизировать только уровни привилегий с более высокими номерами. Таким образом, сбой в кольце 0 (режим ядра с наивысшими привилегиями) приведет к сбою всей системы, а сбой в кольце 2 повлияет только на кольца 3 и далее и самое большее на кольцо 2.
Переходы между режимами осуществляются на усмотрение исполняющего потока, когда переход осуществляется с уровня высоких привилегий на уровень низких привилегий (например, из режимов ядра в пользовательские режимы), но переходы с более низких уровней привилегий на более высокие могут происходить только через безопасный режим. , аппаратно-управляемые «ворота», которые проходят при выполнении специальных инструкций или при получении внешних прерываний.
Операционные системы с микроядром пытаются свести к минимуму объем кода, работающего в привилегированном режиме, в целях безопасности и элегантности , но в конечном итоге жертвуют производительностью.
Причина, по которой Windows использует только два уровня, заключается в том, что некоторые аппаратные архитектуры, которые поддерживались в прошлом (например, Compaq Alpha и Silicon Graphics MIPS ), реализовывали только два уровня привилегий.