Опубликован: 03.03.2010 | Уровень: специалист | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»
Лекция 5:

Аппаратные средства защиты информации в микропроцессоре

< Лекция 4 || Лекция 5: 12 || Лекция 6 >

Использование шлюзов вызова

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

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

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

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

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

Формат шлюза вызова представлен на рис. 5.3.

Формат шлюза вызова

Рис. 5.3. Формат шлюза вызова

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

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

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

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

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

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

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

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

Предположим теперь, что пользователь хочет воспользоваться некоторыми системными утилитами. Пусть пользовательская программа имеет уровень привилегий 3, ядро ОС - уровень 0, утилиты ОС - уровень 1 (рис. 5.5).

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

Механизм вызова:

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

Рис. 5.5. Последовательное обращение к более привилегированным программам

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

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

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

При страничном преобразовании адреса применяется простой двухуровневый механизм защиты по привилегиям: пользователь (соответствует уровню 3 привилегий сегмента) и супервизор (уровни 0, 1, 2), указываемый в бите U/S ЭТС.

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

Краткие итоги. В лекции рассмотрены основные требования, предъявляемые к средствам защиты памяти, механизмы защиты, используемые при управлении памятью и при защите по привилегиям, доступ к программам на более высоком уровне привилегий посредством использования шлюзов вызова.

< Лекция 4 || Лекция 5: 12 || Лекция 6 >
Владислав Салангин
Владислав Салангин

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

Михаил Королёв
Михаил Королёв

Ирина Ткаченко
Ирина Ткаченко
Россия, Москва
Николай Ткаченко
Николай Ткаченко
Россия