Разница между DPL и RPL в x86

читая руководство intel x86 и другие источники, я не понял разницы между DPL (уровень привилегий дескриптора) и RPL (запрошенный уровень привилегий). Почему необходимо иметь и то, и другое? Спасибо

1 ответов


хороший вопрос.

CPL против DPL против RPL

чтобы сделать это проще, давайте сначала рассмотрим CPL и DPL:

  • CPL-ваш текущий уровень привилегий.
  • DPL-это уровень привилегий сегмента. Он определяет минимум1 уровень привилегий, необходимый для доступа к сегменту.
  • уровни привилегий варьируются от 0-3; более низкие номера больше привилегия
  • Итак: для доступа сегмент, CPL должен быть меньше или равен DPL сегмента

RPL-это уровень привилегий, связанный с сегмент селектора. Селектор сегментов-это всего лишь 16-разрядное значение, которое ссылается на сегмент. Каждый доступ к памяти (неявно2 или иначе) использует селектор сегмента в рамках доступа.

при доступе к сегменту на самом деле необходимо выполнить две проверки. Доступ к сегменту разрешен, только если и из следующих условий:

  • CPL
  • RPL

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

мотивация RPL

какова цель этого? ну, рассуждения немного устарели, но Intel документация предлагает сценарий, который выглядит примерно так:

  • предположим, что операционная система предоставляет системный вызов, который принимает логический адрес (селектор сегментов + смещение) от вызывающего абонента и записывает на этот адрес
  • обычные приложения работают с CPL 3; системные вызовы выполняются с CPL 0
  • предположим, что некоторый сегмент (назовем его X) имеет DPL 0

приложение обычно не сможет получить доступ к память в сегменте X (потому что CPL > DPL). Но в зависимости от того, как был реализован системный вызов, приложение может вызвать системный вызов с параметром адреса в сегменте X. Тогда, поскольку системный вызов является привилегированным, оно сможет писать в сегмент X от имени приложения. Это может ввести уязвимость повышения привилегий в операционную систему.

чтобы избежать этого, официальная рекомендация заключается в том, что когда привилегированная подпрограмма принимает селектор сегментов, предоставляемый непривилегированным кодом, он должен сначала установить RPL селектора сегментов в соответствии с непривилегированным кодом3. Таким образом, операционная система не сможет получить доступ к этому сегменту, который непривилегированный абонент уже не сможет сделать. Это помогает обеспечить соблюдение границы между операционной системой и приложениями.

тогда и сейчас

защита сегменте введенный с 286, до пейджинга существовал в семействе процессоров x86. Тогда сегментация была единственным способом ограничить доступ к памяти ядра из контекста пользовательского режима. РПЛ предоставлен удобный способ применения этого ограничения при передаче указателей на разных уровнях привилегий.

современные операционные системы используют пейджинг для ограничения доступа к памяти, что устраняет необходимость сегментации. Поскольку нам не нужна сегментация, мы можем использовать плоские память модель, что означает, что сегментные регистры CS, DS, SS и ES все имеют нулевую базу и распространяются на все адресное пространство. На самом деле, в 64-битном "длинном режиме" плоская модель памяти действие, независимо от содержания этих четырех сегментных регистров. Сегменты все еще используются иногда (например, Windows использует FS и GS указать Информационный Блок Потока и 0x23 и 0x33 до переключение между 32-и 64-битный код, и Linux похож), но вы просто больше не проходите сегменты. Таким образом, RPL-это в основном неиспользованный остаток от старых времен.

RPL: было ли это когда-нибудь необходимые?

вы спросили, почему было необходимо иметь и DPL, и RPL. Даже в контексте 286, это не было на самом деле необходимость иметь RPL. Учитывая вышеизложенный сценарий, привилегированная процедура всегда может просто получить DPL предоставленного сегмент с помощью инструкции LAR сравните это с привилегией вызывающего абонента и упреждающе выручите, если привилегия вызывающего абонента недостаточна для доступа к сегменту. Однако установка RPL, на мой взгляд, является более элегантным и простым способом управления доступом к сегментам на разных уровнях привилегий.

чтобы узнать больше об уровнях привилегий, ознакомьтесь с Томом 3 из руководства разработчика программного обеспечения Intel, в частности разделы под названием "уровни привилегий" и "Проверка Прав Доступа Вызывающего Абонента".

1 технически, DPL может иметь различные значения в зависимости от того, к какому типу сегмента или ворот осуществляется доступ. Для простоты, все, что я описываю, относится к сегментов данных специально. Проверьте документы Intel для получения дополнительной информации
2 например, указатель инструкции неявно использует селектор сегментов, хранящийся в CS при извлечении инструкций; большинство типов данных доступы неявно используют селектор сегментов, хранящийся в DS и т. д.
3 см. инструкцию ARPL (только 16-разрядный/32-разрядный защищенный режим)