Аппаратные средства защиты в универсальном 32-разрядном микропроцессоре. Защита при управлении памятью. Защита по привилегиям

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

 

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

 

Средства защиты памяти должны предотвращать: 1)неразрешенное взаимодействие пользователей друг с другом; 2)несанкционированный доступ пользователей к данным; 3)повреждение программ и данных из-за ошибок в программах; 4)намеренные попытки разрушить целостность системы; 5)случайные искажения данных.

 

Средства защиты МП делятся на 2 группы: защиту при управлении памятью и защиту по привилегиям. Средства управления памятью обнаруживают большинство программных ошибок. До загрузки селектора в сегментный регистр и кэширования дескриптора осуществляется несколько контрольных проверок: МП проверяет, что поле Index селектора находится в пределах таблицы, определяемой его битом TI:

· при загрузке селектора в сегментный регистр данных (DS, ES, FS, GS) тип дескриптора должен разрешать считывание из сегмента. (Только выполняемые сегменты для этих регистров не допускаются, но сегменты с разрешенными операциями выполнения/считывания допустимы);

· в случае сегментного р-ра стека (SS) в сегменте д.б. разрешены операции считывания и записи;

· при загрузке регистра CS сегмент должен быть обязательно исполняемым;

· в регистр LDTR можно загружать только селектор, указывающий на дескриптор сегмента типа LDT;

· в р-р TR можно загружать только селектор, указывающий на дескриптор сегмента состояния задачи.

 

Если хотя бы одна проверка дала отрицательный результат, то формируется особый случай и загрузка селекторане производится. После загрузки селектора при фактическом обращении к ОП МП контролирует, чтобы запрашиваемая операция (чтение/запись)для этого сегмента была разрешена. На этом этапе обнаруживаются и отвергаются попытки записи в сегмент кода или в только считываемые сегменты данных, а также считывание из сегмента кода, для которого разрешено только выполнение. Здесь же проводится проверка превышения сформированного смещения в сегменте длины сегмента, указанной в поле предела дескриптора. Такие ситуации невозможно выявить при загрузке селектора.

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

 

На аппаратном уровне в процессоре поддерживаются 4 уровня привилегий. Распознаваемым процессором объектам назначается значение от 0 до 3, причем 0 соответствует высшему, а 3 - низшему уровню привилегий. С помощью указания уровня привилегий и правил защиты обеспечивается управляемый доступ к процедурам и данным операционной системы и других задач. Привилегииустанавливаются значениями соответствующих полей в следующих основных системных объектах МП:

· DPL - уровень привилегий сегмента (находится в байте доступа дескриптора сегмента);

· RPL - биты <0,1> селектора, хранящегося в сегментном регистре (текущий уровень привилегий программы CPL задается полем RPL селектора, хранящегося в сегментном регистре CS);

· IOPL - поле регистра флагов, которое указывает, на каком уровне привилегий разрешено выполнять операции ввода/вывода, а также в некоторых других объектах, используемых, например, при переключении задач и обработке прерываний.

 

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

· уровень 0: ядро ОС, обеспечивающее инициализацию работы, управление доступом к ОП, защиту и ряд других жизненно важных функций, нарушение которых полностью выводит из строя МП;

· уровень 1: основная часть программ ОС (утилиты);

· уровень 2: служебные программы ОС (драйверы, СУБД, специализир-е подсистемы программ-я...);

· уровень 3: прикладные программы пользователя.

 

Аппаратные средства процессора, работающего в защищенном режиме, постоянно контролируют, что текущая программа достаточно привилегированна для того, чтобы: 1)выполнять некоторые команды, называемые привилегированными; 2)выполнять операции ввода/вывода на том или ином внешнем устройстве; 3)обращаться к данным других программ; 4)передавать управление внешнему (по отношению к самой программе) коду командами межсегментной передачи управления.

Привилегированные команды - это те команды, которые влияют на механизмы управления памятью, защиты и некоторые другие жизненно важные функции. Это, например, команды загрузки таблиц дескрипторов GDT, IDT, LDT, команды обмена с регистрами управления CRi. Они могут выполняться только программами, имеющими наивысший (нулевой) уровень привилегий. Это приводит к тому, что простую незащищенную систему можно целиком реализовать только в кольце 0, так как в других кольцах защиты не будут доступны все команды. Операции ввода/вывода разрешено выполнять программам, уровень привилегий которых не ниже значения, установленного в поле IOPL регистра флагов. То есть должно выполняться соотношение: CPL≤IOPL. Обращение к данным других программ разрешается только на своем и менее привилегированном уровнях защиты (рис.).

 

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

При передаче управления подчиненному сегменту действует правило: DPL≥max (CPL, RPL). Однако при этом подчиненный код будет выполняться на том же уровне привилегий, что и вызвавший его код (CPL не изменится). Ограничивая передачу управления в пределах одного кольца защиты, процессор предотвращает произвольное изменение уровней привилегий. Ели бы значение CPL можно было легко изменить, все остальные средства защиты по привилегиям потеряли бы смысл.

 

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

Шлюз должен быть предварительно помещен в таблицу дескрипторов. Дескрипторы шлюзов не определяют никакого адресного пространства, поэтому в них нет полей базы и предела, т.е. они фактически не являются дескрипторами. Обращение к более привилегированным программам производится командами, аналогичными командам обращения к подпрограммам в другом кодовом сегменте. Переход возможен только с помощью команд с возвратом. Эти команды должны адресовать шлюз вызова, который определяет сегмент кода, которому передается управление, и точное смещение в этом сегменте, где начинается выполнение процедуры. Формат шлюза вызова представлен на рис. Шлюз вызова содержит селектор того сегмента, куда передается управление, и смещение в этом сегменте. Это, с одной стороны, позволяет найти данную программу, но, с другой стороны, строго определяет точку входа в программу, чтобы можно было запустить ее только со строго определенного места. Другими важными параметрами, определяемыми шлюзом вызова, являются: P - бит присутствия; WC – кол-во параметров, передаваемых из стека текущей программы в стек вызываемой программы; DPL -уровень привилегий.

 

При использовании шлюза вызова проводится следующий анализ уровней привилегий:

· значение DPL шлюза вызова должно быть больше или равно значению текущего уровня привилегий CPL и значению RPL селектора, вызывающего шлюз;

· значение DPL шлюза вызова должно быть больше или равно значению DPL целевого сегмента кода;

· значение DPL целевого сегмента кода должно быть меньше или равно значению текущего уровня привилегий CPL.

 

Порядок использования шлюза вызова представлен на рис.

1. Как любая команда межсегментного перехода, команда FAR CALL содержит селектор сегмента и смещение в этом сегменте. Смещение, которое указано в команде, МП игнорирует: положение вызываемого кода в более привилегированном сегменте определяется не им, а шлюзом вызова. По селектору, определенному в команде, идет обращение к таблице дескрипторов. По типу дескриптора определяется, что это системный объект типа "шлюз вызова".

2. Селектор из шлюза вызова заносится в регистр CS МП, а смещение - в регистр - указателя команд EIP.

3. По полученному селектору обращаемся к дескриптору сегмента более привилегированной программы.

4. Из дескриптора извлекается базовый адрес нового сегмента. Его суммирование со значением смещения из шлюза вызова, занесенного в EIP, определяет ФА начала новой программы.

 

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

Предположим теперь, что пользователь хочет воспользоваться некоторыми системными утилитами. Пусть пользовательская программа имеет уровень привилегий 3, ядро ОС - уровень 0, утилиты ОС - уровень 1 (рис.). В этом случае шлюз утилиты должен иметь DPL = 3. Это позволит пользовательской программе вызвать утилиты ОС, но не ее ядро. При необходимости к ядру ОС могут обратиться утилиты.

Механизм вызова: 1)шлюзу утилит присваивается уровень привилегий 3, обеспечивая его доступность пользовательским программам; 2)шлюзу ядра присваивается уровень привилегий1, что делает его доступным для программ-утилит, но обращение пользовательских программ к шлюзу ядра невозможно.

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

Конкретная ОС необязательно должна поддерживать все 4 уровня привилегий. Так, UNIX работает с двумя кольцами защиты: супервизор (уровень 0) и пользователь (уровни 1, 2, 3). В Windows NT используются только два уровня привилегий: нулевое и третье кольцо. В нулевом кольце работает ядро системы и системные драйверы, а в третьем - все запущенные приложения.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: