Методы защиты в процессорах семейства Х86, страница 6

                     Рис.VI.8. Содержимое первых 24 байт сегмента TSS

После успешного прохождения командой CALL шлюза вызова без нарушения правил защиты по привилегиям, процессор должен начать работать с новым стеком. Для этого в регистры SS и ESP из сегмента TSS загружаются селектор сегмента и указатель стека, соответствующие новому уровню привилегий. Если, например, вызвана процедура, находящаяся на уровне привилегий PL1, то в регистры SS:ESP загружаются значения SS1 и ESP1.  

Следует отметить, что переключение стека реализуется только при обращении к неподчиненным сегментам, у которых в байте прав доступа дескриптора бит С = 0. Если через шлюз происходит вызов подчиненного сегмента, то переключение стека не производится.

При поступлении команды RETосуществляется восстановление из стека старого содержимого регистров CS,EIP (IP) и SS, ESP (SP). Следовательно, вместе с возвращением к исходной программе, происходит и возврат к старому стеку. Команда RETпроверяет значение CPLи два младших разряда извлекаемого из стека старого содержимого CS, которые определяют уровень привилегий программы, к которой осуществляется возврат. Команда выполняется только при выполнении условия большего или равного значения этих битов значению CPL. Это означает, что возврат осуществляется к программе с таким же или меньшим уровнем привилегий.

3.2  Защита по привилегированным командам.

Под привилегированными командами понимаются команды, которые исполняются только в тех программах, которые имеют соответствующий уровень привилегий. Так, в процессорах семейства Х86 имеются ряд команд, которые выполняются только в программах, находящихся на нулевом уровне привилегий. К ним относятся, например, команды:

·  HLT – останов процессора;

·  CLTS – сброс флага переключения задач;

·  LGDT, LIDT, LLDT – загрузка регистров дескрипторных таблиц;

·  LTR – загрузка регистра задачи;

·  LMSW – загрузка слова состояния машины.

Кроме того, в эту же группу входят команды, связанные с загрузкой или считыванием системных регистров общего управления CRi, регистров отладки DRi  и регистров тестирования TRi.

Ко второй группе привилегированных команд  относятся команды, которые связаны с управлением обмена информацией между процессором и периферийными устройствами. К ним относятся команды:

·  CLI – запрещение прерываний (установка флага IF в 0);

·  STI – разрешение прерываний (установка флага IF в 1);

·  IN, INS – ввод данных из входного порта;

·  OUT, OUTS – вывод данных в выходной порт.

Для того чтобы эти команды исполнялись, программа не обязательно должна находиться на нулевом уровне привилегий. Привилегированность их заключается в том, что для возможности их исполнения программа должна находиться на уровне привилегий не ниже, чем это определено в битах поля IOPL в регистре флагов EFLAGS. Таким образом, поле IOPL определяет уровень привилегий операций ввода/вывода в процессоре. Для выполнения этих команд необходимо, чтобы CPL численно был меньше или равен коду, занесенному в поле IOPL (12 и 13 биты регистра EFLAGS). Поэтому, часто этот тип команд называют IOPL – sensitive (IOPL – чувствительными) командами.

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

Использование таких привилегированных, IOPL – чувствительных команд, дает возможность защитить подсистему прерываний и подсистему ввода/вывода компьютера от несанкционированного запуска.

Однако следует иметь в виду, что команды ввода/вывода для некоторых портов могут выполняться и при условии CPL ≥ IOPL. Это может произойти тогда, когда номера этих портов включены в битовую карту разрешения ввода/вывода (БКВВ). Эта битовая карта разрешения ввода/вывода (I/O Permission Bit Map) расположена в конце сегмента состояния задачи TSS (Task State Segment), и состояние каждого бита в ней управляет разрешением использования соответствующего порта  ввода/вывода (1 – запрещено, 0 – разрешено).

   4.     Перечень основных проверок в системе защиты.

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

I.  Проверка при загрузке системных регистров.

1.  Превышение предела таблицы дескрипторов (13).

2.  Несуществующий дескриптор сегмента (11 или 12).

3.  Нарушение привилегий сегментов (13).

4.  Загрузка неверного дескриптора или типа сегмента (13):

·  загрузка в регистр SS селектора сегмента кода или сегмента данных только для чтения;

·  загрузка  в регистры CS, DS, ES, FS, GS или SS  селекторов системных сегментов;

·  загрузка в регистры DS, ES, FS, GS или SS селекторов только исполняемых сегментов.

·  Загрузка в регистр CS селектора сегмента данных

II.  Проверка ссылок операндов.

1.  Запись в сегмент кода или в сегмент данных, определенный только для чтения (13).

2.  Чтение из сегмента кода, определенного только для исполнения (13).

3.  Превышение предела сегмента (12 или 13).

III. Проверка привилегий команд.

1.  CPL ≠ 0 при выполнении привилегированных команд LIDT, LLDT, LGDT, LTR, LMSW, CTS, HLT и некоторых других, а также при выполнении операций с регистрами DRi, TRi, CRi (13).

2.  CPL > IOPL при выполнении команд STI и CLI (13).

3.  CPL > IOPL при выполнении команд IN, INS, OUT, OUTS с портами, не разрешенными битовой картой ввода/вывода (13).