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

Я пытаюсь понять некоторые особенности об архитектуре Intel x86. Я еще не совсем понял механизм вызова вызовов, но без него для доступа к несогласованному сегменту кода его DPL должен быть равен CPL.

Я понимаю, что это важно в случае DPL CPL это запрещено? Я имею в виду, что CPL может остаться неизменным после перехода, если мы хотим сохранить тот же уровень привилегий, и если мы хотим снизить нашу привилегию, мы могли бы использовать RPL .

1 ответ

Решение

Как правило, когда вы обращаетесь к сегменту кода напрямую, вы можете делать это только для сегментов с одинаковыми привилегиями.
Это то, для чего используются сегменты несоответствующего кода (NCCS).
У Intel made есть возможность представить также сегмент согласованного кода (CCS), к которому могут обращаться менее привилегированные приложения (в случае, если ядру необходимо совместно использовать некоторый код без повышения привилегий вызывающего).

Доступ к сегменту кода напрямую никогда не изменяет текущую привилегию, CPL целевого кода является CPL вызывающей стороны.

RPL также не играет никакой роли. Он игнорируется для CCS и должен быть меньше или равен CPL вызывающего абонента для NCCS (это, вероятно, побочный эффект).

Правила таковы:

NCCS
1. CPL вызывающего абонента должен быть равен дескриптору DPL (та же самая привилегия). 2. Целевой код будет выполняться с CPL, равным CPL вызывающего абонента, независимо от RPL, используемого в селекторе. 3. Селектор RPL должен быть меньше или равен CPL вызывающего абонента.

CCS
1. CPL вызывающего абонента должен быть больше или равен дескриптору DPL (менее привилегированный). 2. Целевой код будет выполняться с CPL, равным CPL вызывающего абонента, независимо от RPL, используемого в селекторе.

Как вы видите, прямой доступ к сегменту кода не меняет CPL (и нет изменений стека).

Чтобы изменить привилегию (CPL), Intel представила Call Gates. С CG, как и с сегментами данных, RPL позволяет вам выдавать себя за менее привилегированную программу.
Если CG как DPL=2 (и целевой селектор также имеет DPL>=2), а ваш код имеет CPL=0, вы можете выполнить вызов как приложение пользовательского режима с CPL=3 (таким образом, не получая доступ) или как компонент ядра с CPL=2 (получение доступа, но без возможности вызова других более привилегированных сегментов кода).

Другие вопросы по тегам