Защита.

Глава 2. Использование уровней привилегий.

2.1. Уровни привилегий.

        Механизм защиты использует 4 уровня привилегий - от 0 до 3. Большее значение соответствует меньшим привилегиям. На рис. 2-1 показано, как эти уровни привилегий могут быть интерпретированы как кольца защиты. Центр, предназначенный для наиболее привилегированного кода, данных и стека, используется для сегментов, содержащих наиболее важные компоненты системы, такие, как ядро операционной системы. Внешние кольца используются для менее важных частей системы. Для систем, использующих только два из четырёх уровней привилегий, рекомендуется использовать уровни 0 и 3.


Рисунок 2-1. Кольца защиты.
Примечания:
1. "PL" означает "уровень привилегий" (сокращение от англ. Privilege Level).
2. Синим цветом выделено рекомендуемое расположение компонентов операционной системы

        Когда процессор обнаруживает нарушение использования уровней привилегий, он генерирует исключение общей защиты. Процессор использует три обозначения уровней привилегий:
  • Текущий уровень привилегий - CPL (Current privilege level). CPL - это уровень привилегий текущего исполняемого кода. Он хранится в битах 0 и 1 регистров CS и SS. Обычно, CPL равен уровню привилегий сегмента кода, из которого выбираются команды. Процессор меняет CPL, когда управление передаётся сегменту кода с другим уровнем привилегий. CPL интерпретируется немного иначе, когда управление передаётся подчинённому сегменту кода. Подчинённый сегмент кода доступен с тех уровней привилегий, которые численно не меньше, чем DPL подчинённого сегмента кода. CPL не меняется, когда происходит передача управления на подчинённый сегмент кода, имеющий уровень привилегий, отличный от CPL.
  • Запрашиваемый уровень привилегий - RPL (Requested privilege level). RPL - это уровень привилегий, назначаемый селекторам сегментов. Он хранится в битах 0 и 1 селектора сегмента. Процессор проверяет RPL совместно с CPL, определяя возможность доступа к сегменту. Даже если программа или задача, запрашивающая доступ к сегменту, имеет достаточные привилегии для доступа, доступ будет запрещён, если RPL не имеет достаточных привилегий. Таким образом, если RPL селектора сегмента численно превосходит CPL, то значение RPL будет решающим и наоборот. RPL можно использовать для обеспечения того, что привелигерованный код не обратится к сегменту от имени прикладной программы, пока эта программа не получит достаточных на то привилегий.
  • Уровень привилегий дескриптора - DPL (Descriptor privilege level). DPL - это уровень привилегий сегмента или шлюза. Он хранится в поле DPL дескриптора сегмента или шлюза. При попытке доступа из текущего сегмента кода к другому сегменту кода или шлюзу, DPL целевого дескриптора сравнивается с CPL и RPL. В зависимости от типа сегмента или шлюза, DPL интерпретируется следующим образом:
    - Сегмент данных. DPL определяет наибольший номер уровня привилегий, который программа или задача может иметь для доступа к этому сегменту. Например, если DPL сегмента данных равен 1, то только программы, работающие на уровнях 0 и 1 (т.е. имеющие CPL 0 или 1) могут обращаться к этому сегменту.
    - Неподчинённый (т.е. обычный) сегмент кода, без использования шлюза вызова. DPL определяет уровень привилегий, который должна иметь программа или задача для доступа к этому сегменту. Например, если DPL неподчинённого сегмента кода равен 0, то только программа, работающая на CPL = 0 может обратиться к этому сегменту.
    - Шлюз вызова. DPL определяет номер наибольшего уровня привилегий, который может иметь текущая программа или задача для доступа к этому шлюзу вызова (правило доступа - такое же, как и для сегмента данных).
    - Подчинённый или неподчинённый сегмент кода, доступный через шлюз вызова. DPL определяет наименьший номер уровня привилегий, который должна иметь программа или задача для доступа к этому сегменту. Например, если DPL подчинённого сегмента кода равен 2, то к нему будут иметь доступ только программы с CPL 2 или 3.
    - TSS. DPL определяет наибольший номер уровня привилегий, с которого программа или задача может обратиться к этому TSS (правила доступа - такие же, как и для сегмента данных).

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

    2.2. Проверка уровня привилегий при доступе к сегментам данных.

            Для доступа к операнду в сегменте данных, необходимо загрузить в сегментный регистр (DS, ES, FS или GS) селектор дескриптора сегмента данных. Для этого предназначены команды MOV, POP, LDS, LES, LFS и LGS.
            Перед тем, как загрузить селектор в сегментный регистр, процессор проверяет уровень привилегий, сравнивая уровень привилегий текущего кода (CPL), RPL селектора и DPL дескриптора. Загрузка селектора производится, когда DPL больше либо равен CPL или RPL, иначе загрузка не произойдёт и процессор сгенерирует исключение общей защиты.

            Адресное пространство процедуры или задачи зависит от значения её CPL. Когда CPL = 0, доступны сегменты данных на всех уровнях привилегий, при CPL = 1 - на уровнях 1, 2 и 3, при CPL = 3 - только на 3-м уровне.
            Прикладная программа может изменить RPL селектора, например, установить его в 0, и тогда проверка доступа будет осуществляться только по CPL.

    2.3. Доступ к данным в сегменте кода.

            В некоторых случаях может понадобиться доступ к данным (точнее - чтение), содержащимся в сегменте кода; для этого возможны следующие способы:
  • Загрузить в сегментный регистр данных селектор сегмента кода, разрешённого для чтения.
  • Использовать префикс замены сегмента (CS) для чтения сегмента кода, разрешённого для чтения, чей селектор уже загружен в регистр CS.

    2.4. Проверка уровня привилегий при загрузке регистра SS.

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

    Следующая глава Оглавление Вопросы? Замечания? Пишите: sasm@narod.ru

      Copyright © Александр Семенко.
    TopList

    Hosted by uCoz