Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

В информатике , иерархические области защиты , [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 инициативы и гипервизоры, встроенные в микропрограммы, такие как Intel VT-x (ранее Vanderpool).

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

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

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

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

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

Режимы [ править ]

Режим супервизора [ править ]

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

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

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

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

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

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

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

Морис Уилкс писал: [12]

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

Для повышения производительности и детерминизма некоторые системы помещают в режим ядра функции, которые, скорее всего, будут рассматриваться как логика приложения, а не как драйверы устройств; приложения безопасности ( контроль доступа , межсетевые экраны и т. д.) и мониторы операционных систем приведены в качестве примеров. По крайней мере, одна встроенная система управления базами данных, e X treme DB Kernel Mode , была разработана специально для развертывания в режиме ядра, чтобы предоставить локальную базу данных для функций приложений на основе ядра и устранить переключение контекста , которое в противном случае могло бы произойти при взаимодействии функций ядра с системой баз данных, работающей в пользовательском режиме. [13]

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

Режим гипервизора [ править ]

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

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

Уровень привилегий [ править ]

Уровень привилегий в x86 набор команд управления, доступ к программе в настоящее время работает на процессоре к ресурсам , таким как области памяти, порты ввода / вывода, а также специальные инструкции. Существует 4 уровня привилегий: от 0 (самый высокий) до 3 (самый низкий). Большинство современных операционных систем используют уровень 0 для ядра / исполнительной системы и уровень 3 для прикладных программ. Любой ресурс, доступный для уровня n, также доступен для уровней от 0 до n, поэтому уровни привилегий - это кольца. Когда процесс с меньшими привилегиями пытается получить доступ к процессу с более высокими привилегиями, в ОС отправляется сообщение об общей ошибке защиты .

Нет необходимости использовать все четыре уровня привилегий. Текущие операционные системы с большой долей рынка, включая Microsoft Windows , macOS , Linux , iOS и Android, в основном используют механизм подкачки с одним битом для указания уровня привилегий как супервизора или пользователя (U / S Bit). Windows NT использует двухуровневую систему. [15] Программы реального режима в 8086 выполняются на уровне 0 (наивысший уровень привилегий), тогда как виртуальный режим в 8086 выполняет все программы на уровне 3. [16]

Возможное будущее использование нескольких уровней привилегий, поддерживаемых семейством x86 ISA, включает контейнеризацию и виртуальные машины . Ядро операционной системы хоста может использовать инструкции с полным доступом к привилегиям ( режим ядра ), тогда как приложения, работающие в гостевой ОС на виртуальной машине или контейнере, могут использовать самый низкий уровень привилегий в пользовательском режиме. Виртуальная машина и ядро ​​гостевой ОС могут сами использовать промежуточный уровень привилегий инструкций для вызова и виртуализации операций режима ядра, таких как системные вызовы, с точки зрения гостевой операционной системы. [17]

IOPL [ править ]

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

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

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

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

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

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

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

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

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

См. Также [ править ]

  • Вызов ворот (Intel)
  • Сегментация памяти
  • Защищенный режим  - доступен на x86-совместимых процессорах 80286 и новее
  • IOPL (директива CONFIG.SYS) - директива OS / 2 для запуска кода DLL на кольце 2 вместо кольца 3
  • Дескриптор сегмента
  • Режим управления системой (SMM) - иногда также называется «кольцо -2».
  • Ring −3 руткит
  • Принцип наименьших привилегий

Ссылки [ править ]

  1. ^ Каргер, Пол А .; Герберт, Эндрю Дж. (1984). «Архитектура с расширенными возможностями для поддержки безопасности решетки и отслеживания доступа». 1984 IEEE симпозиум по безопасности и конфиденциальности . п. 2. дои : 10,1109 / SP.1984.10001 . ISBN 0-8186-0532-4. S2CID  14788823 .
  2. Перейти ↑ Binder, W. (2001). «Разработка и реализация ядра мобильного агента J-SEAL2». Труды 2001 Симпозиум по приложениям и Интернету . С. 35–42. DOI : 10,1109 / SAINT.2001.905166 . ISBN 0-7695-0942-8. S2CID  11066378 .
  3. ^ «Аппаратная архитектура для реализации защитных колец» . Проверено 27 сентября 2012 года .
  4. ^ "Глоссарий Multics - кольцо" . Проверено 27 сентября 2012 года .
  5. ^ a b Руссинович, Марк Э .; Дэвид А. Соломон (2005). Microsoft Windows Internals (4-е изд.). Microsoft Press. С.  16 . ISBN 978-0-7356-1917-3.
  6. ^ Руссинович, Марк (2012). Внутреннее устройство Windows Часть 1. 6-е изд . Редмонд, Вашингтон: Microsoft Press. п. 17. ISBN 978-0-7356-4873-9. Причина, по которой Windows использует только два уровня, заключается в том, что некоторые аппаратные архитектуры, которые поддерживались в прошлом (например, Compaq Alpha и Silicon Graphics MIPS ), реализовали только два уровня привилегий.
  7. ^ «Справочник по драйверам презентационных устройств для OS / 2 - 5. Знакомство с драйверами презентаций OS / 2» . Архивировано из оригинала 15 июня 2015 года . Дата обращения 13 июня 2015 .
  8. ^ "Архитектура ARM 3.3.4: Уровни привилегий"
  9. ^ "режим супервизора" . FOLDOC . 15 февраля 1995 г.
  10. ^ а б Йохен Лидтке . О построении µ-ядра , Proc. 15-й симпозиум ACM по принципам операционных систем (SOSP) , декабрь 1995 г.
  11. ^ Ousterhout, JK 1990. Почему не операционные системы становятся все быстрее так быстро , как аппаратные средства? В летней конференции Usenix, Анахайм, Калифорния, стр. 247–256.
  12. ^ Морис Уилкс (апрель 1994). «Операционные системы в меняющемся мире». Обзор операционных систем ACM SIGOPS . 28 (2): 9–21. DOI : 10.1145 / 198153.198154 . ISSN 0163-5980 . S2CID 254134 .  
  13. ^ Gorine, Андрей и Криволапов, Александр. «Базы данных в режиме ядра: технология СУБД для высокопроизводительных приложений» , журнал доктора Добба , май 2008 г.
  14. ^ Дорнан, Энди (1 ноября 2005). «Intel VT против AMD Pacifica» . CMP. Архивировано из оригинального 30 мая 2013 года . Проверено 11 ноября 2012 года .
  15. ^ Руссинович, Марк Э .; Дэвид А. Соломон (2005). Microsoft Windows Internals (4-е изд.). Microsoft Press. стр. 16. ISBN 978-0-7356-1917-3 
  16. ^ Сунил Матур, «Микропроцессор 8086: архитектура, программирование и взаимодействие», издание Eastern Economy, PHI Learning
  17. ^ Андерсон, Томас; Далин, Майкл (21 августа 2014 г.). «2.2». Операционные системы: принципы и практика (2-е изд.). Рекурсивные книги. ISBN 978-0985673529.
  • Справочник программиста Intel 80386

Дальнейшее чтение [ править ]

  • Дэвид Т. Роджерс (июнь 2003 г.). «Фреймворк для динамической подрывной деятельности» (PDF) .
  • Глоссарий аббревиатур и терминов Multics : Кольцо
  • Уильям Дж. Каэлли (2002). «Повторное изучение« доверенных систем »в эпоху НИИП: уроки прошлого для будущего» (PDF) .
  • Харуна Р. Иса; Уильям Р. Шокли; Синтия Э. Ирвин (1999). «Многопоточная архитектура для многоуровневой безопасной обработки транзакций» (PDF) .
  • Иван Келли (8 мая 2006 г.). «Перенос MINIX на Xen» (PDF) . Архивировано из оригинального (PDF) 27 августа 2006 года.
  • Пол Бархэм; Борис Драгович; Кейр Фрейзер; Стивен Хэнд; Тим Харрис; Алекс Хо; Рольф Нойгебауэр; Ян Пратт; Эндрю Варфилд (2003). «Xen и искусство виртуализации» (PDF) .
  • Маркус Пейнадо; Юйкун Чен; Пол Инглэнд; Джон Манферделли. «NGSCB: открытая доверенная система» (PDF) . Архивировано из оригинального (PDF) 4 марта 2005 года.
  • Майкл Д. Шредер ; Джером Х. Зальцер (1972). «Аппаратная архитектура для реализации защитных колец» .
  • «Руководство разработчика программного обеспечения для архитектуры Intel, том 3: Системное программирование (номер для заказа 243192)» (PDF) . Глава 4 «Защита»; раздел 4.5 «Уровни привилегий». Архивировано из оригинального (PDF) 19 февраля 2009 года.
  • Ци-чкер Чиуэ; Ганеш Венкитачалам; Прашант Прадхан (1999). «Интеграция сегментации и защиты подкачки для безопасных, эффективных и прозрачных программных расширений» . Глава 3: Аппаратные функции защиты в архитектуре Intel X86; раздел 3.1 Проверка защиты.
  • Такахиро Синагава; Кенджи Коно; Такаши Масуда (17 мая 2000 г.). «Использование механизма сегментации для защиты от вредоносного мобильного кода» (PDF) . Глава 3 Реализация; раздел 3.2.1 Кольцевая защита. Архивировано из оригинального (PDF) 10 августа 2017 года . Проверено 2 апреля 2018 .
  • Боберт, Уильям Эрл; Р. Каин (1985). Практическая альтернатива политикам иерархической целостности . 8-я Национальная конференция по компьютерной безопасности.
  • Горин, Андрей; Криволапов, Александр (май 2008 г.). «Базы данных в режиме ядра: технология СУБД для высокопроизводительных приложений» . Журнал доктора Добба .