Защита.

Глава 5. Использование стека.

5.1. Переключение стека.

        Когда шлюз вызова используется для передачи управления более привилегированному неподчинённому сегменту кода (т.е., чей DPL < CPL), процессор автоматически переключает стек на другой, находящийся на уровне привилегий вызываемого сегмента. Благодаря переключению стека такая ситуация, как нехватка стека, не произойдёт для привилегированной процедуры, к тому же это защищает привилегированную процедуру от вмешательства в её стек со стороны вызывающей процедуры.
        Каждая задача должна определить до 4-х стеков: один - для прикладного кода, работающего на уровне привилегий 3, и один для каждого уровня привилегий - 0, 1 и 2. Если используются только два уровня - 0 и 3, то нужно определить только стек для 0-го. Каждый из этих стеков (селектор и смещение) определён в сегменте состояния задачи. Их значения предназначены только для чтения и процессор не меняет их в процессе выполнения задачи; они предназначены для создания новых стеков при вызове более привилегированных процедур. Значения, описанные в полях для SS:EIP соответствуют 3-му уровню привилегий. Для такого стека не выделено отдельное поле, потому что процессор не допустит передачи управления с уровня 0..2 на 3 (разве что, только при возврате из процедуры).
        Каждый раз, при переключении на меньший уровень привилегий, процессор создаёт новый стек, используя значения из TSS и после возврата из привилегированной процедуры, этот стек больше не используется (обычно - уничтожается).
        О создании и удалении стеков должна заботиться операционная система. Стеки должны быть достаточного размера, чтобы хранить:
  • Содержимое регистров вызывающей процедуры: SS, ESP, CS и EIP.
  • Параметров и временных переменных, требуемых вызванной процедуре.
  • Регистра EFLAGS и кода ошибки, если есть явный вызов обработчика исключения или прерывания.

            Стек также должен быть достаточно большой, чтобы учитывать вызовы внутри вызванной процедуры, вложенные процедуры и задачи и обработку прерываний и исключений.
            Если операционная система не использует мультизадачность, она всё равно должна определить как минимум один TSS для переключения стеков.

            Когда процедура вызывает через шлюз вызова другую, более привилегированную процедуру, процессор выполняет следующие действия:
    1. Используя DPL целевого сегмента кода (это - будет новым значением CPL), выбирает из TSS указатель нового стека SSi:ESPi.
    2. Проверяет селектор и смещение нового стека, при этом любые нарушения приводят к генерации исключения недопустимого TSS (#TS).
    3. Проверяет дескриптор сегмента стека на соответствующие привилегии и его тип. В случае нарушения - генерирует исключение недопустимого TSS.
    4. Временно сохраняет текущие значения SS и ESP.
    5. Загружает селектор сегмента и смещение нового стека в SS:ESP.
    6. Помещает в новый стек временно сохранённые значения для SS:ESP (см. рис. 5-1)
    7. Копирует указанное в шлюзе вызова число параметров из стека вызывающей процедуры в новый стек. Если счётчик параметров равен 0, то параметры не копируются.
    8. Помещает в новый стек адрес возврата в вызывающую процедуру (т.е. текущее значение CS:EIP).
    9. Загружает новые значения CS:EIP из шлюза вызова и начинает выполнение вызванной процедуры.


    Рисунок 5-1. Переключение стека при межуровневом вызове.

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

    5.2. Возврат из вызванной процедуры.

            Команда RET может использоваться для выполнения близкого возврата и дальнего возврата на тот же или другой уровень привилегий. Близкий возврат возвращает управление внутри текущего сегмента кода и при этом процессор проверяет только предел сегмента.
            При дальнем возврате на тот же уровень привилегий, процессор проверяет селектор, дескриптор, на который он указывает и новое значение EIP (чтобы оно было в пределах сегмента).
            Дальний возврат со сменой уровня привилегий разрешается только на менее привилегированный уровень.
            Процессор использует поле RPL из сохранённого в стеке значения CS (см. рис. 5-1), чтобы определить, нужен ли возврат на менее высокий уровень привилегий. Если это значение RPL численно больше CPL, то происходит возврат на другой уровень привилегий.

    5.3. Быстрый вызов системных процедур командами SYSENTER и SYSEXIT.

            Команды SYSENTER и SYSEXIT появились в процессоре Pentium II и они предназначены для быстрого вызова системных процедур. Команда SYSENTER позволяет процедуре на не нулевом уровне привилегий вызывать системную процедуру, находящуюся на уровне привилегий 0. Команда SYSEXIT позволяет быстро вернуть управление с 0-го уровня привилегий на любой другой.
            Эти две команды используются совместно, они действуют не так как команды вызова и возврата и не сохраняют значений в стеке. Параметры этих команд указываются не в операндах, а в регистрах MSR и регистрах общего назначения. Для команды SYSENTER параметры указываются следующим образом:
  • Целевой сегмент кода - в SYSENTER_CS_MSR.
  • Целевой указатель команд - в SYSENTER_EIP_MSR.
  • Сегмент стека - вычисляет команда, добавляя 8 к значению в SYSENTER_CS_MSR.
  • Указатель стека - в SYSENTER_ESP_MSR.

            Для SYSEXIT параметры задаются так:
  • Целевой сегмент кода - значение из SYSENTER_CS_MSR + 16.
  • Целевой указатель кода - в EDX.
  • Сегмент стека - значение из SYSENTER_CS_MSR + 24.
  • Указатель стека - в ECX.

            Значения, находящиеся в регистрах MSR, процессором проверяются при их загрузке; при выполнении команд SYSENTER и SYSEXIT проверки сведены к минимуму, обращение к памяти в дескрипторы не происходит и передача управления происходит быстрее.
            Прочие параметры, используемые при передаче управления и возврате этими двумя командами, должны передаваться программой явно.

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

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

    Hosted by uCoz