Почему нельзя изменить CPL при работе в непривилегированном кольце (пользовательский режим)?

Если текущий уровень привилегий закодирован в CS, который может быть изменен кодом пользовательского режима, почему код пользовательского режима не может изменить CS, чтобы изменить CPL?


person zerocool    schedule 02.09.2019    source источник
comment
Можно: просто выполнить syscall или int3 ;)   -  person Ruslan    schedule 02.09.2019
comment
@Ruslan SYSCALL вызывает обработчик системных вызовов ОС с уровнем привилегий 0, но в этом случае именно ОС помещает адрес в CS (CS указывает на адрес обработчика), а не пользователь   -  person zerocool    schedule 02.09.2019
comment
Нет, это не ОС напрямую: это инструкция syscall, которая изменяет cs вместе с кучей других регистров. То же самое для обработчиков прерываний (хотя они не используют MSR для поиска целей, вместо этого используют шлюзы прерывания в IDT).   -  person Ruslan    schedule 02.09.2019
comment
Но кто настраивает эти адреса в первую очередь, это рулон ОС для настройки IDT, например, во время загрузки.   -  person zerocool    schedule 02.09.2019
comment
Если ваша пользовательская программа имеет прямой доступ к GDT, IDT или LDT, это проблема безопасности вашей ОС. Конечно, ОС должна создать все дескрипторы. И это не позволит пользовательскому пространству произвольно переключать CPL.   -  person Ruslan    schedule 02.09.2019
comment
Каков ваш актуальный вопрос? Какой механизм предотвращает смену CPL при загрузке селектора в CS?? Или, может быть, в чем причина этой невозможности??   -  person Ruslan    schedule 02.09.2019
comment
Какой механизм предотвращает изменение CPL при загрузке селектора в CS в пользовательском режиме?   -  person zerocool    schedule 02.09.2019
comment
В какой среде вы тестируете? КЭМУ? Бохи? Реальное оборудование (не зря я задаю этот вопрос первым). Второй вопрос. Как вы меняете CS? (какая инструкция). MOV и POP не могут изменить CS или выдают исключение. Это оставляет FAR CALL и JMP косвенно через Call Gates (или косвенно через системный вызов/ловушки/прерывания и т. д.) или используя IRED или RETF (дальний возврат). Ссылка на набор инструкций для инструкции, которую вы используете для изменения CS, будет включать правила, какие изменения CPL разрешены (изменения уровня привилегий включают проверки с RPL и DPL для CS). )   -  person Michael Petch    schedule 02.09.2019
comment
Этот вопрос основан на ошибочном предположении.   -  person Hans Passant    schedule 02.09.2019
comment
@MichaelPetch скажем все, что может это изменить ( FAR CALL/JMP IRET/IRETD/IRETQ )   -  person zerocool    schedule 02.09.2019
comment
Я должен был также задать вопрос о заголовке этого вопроса. Изменение CS из UserMode не влияет на CPL. Был ли какой-то определенный фрагмент кода, который вы использовали для модификации CS, который не привел к изменениям? Обычно при косвенном изменении CS (с помощью других ранее перечисленных инструкций) происходит одно из двух. Вы получите исключение, потому что у вас нет надлежащего разрешения на изменение CPL на другое или вы перешли в другое кольцо, и произойдет изменение CPL (есть некоторые исключения, если вы используете соответствующие сегменты кода, где CPL не работает). изменения и код запускается с CPL‹›DPL).   -  person Michael Petch    schedule 02.09.2019
comment
@MichaelPetch, на самом деле кода нет, просто парень спросил меня, и я не смог ему ответить   -  person zerocool    schedule 02.09.2019
comment
Реальный ответ на вопрос, что происходит с каждой инструкцией, которая может изменить CPL (JMP/CALL/IRET/RETF и т. д.), находится в справочнике по архитектуре набора инструкций для каждой инструкции. felixcloutier.com/x86   -  person Michael Petch    schedule 02.09.2019
comment
я проверю   -  person zerocool    schedule 02.09.2019
comment
У меня есть подозрение, что тот, кто задал вам вопрос, запутался/был сбит с толку, хотя я не могу сказать, так как не могу задать им эти вопросы напрямую.   -  person Michael Petch    schedule 02.09.2019
comment
@MichaelPetch Обычно я не придаю такого рода вопросам большого значения, но когда ученик останавливает вас на уроке, и я обещаю ему хороший ответ, так что я лучше сделаю это (^_^)   -  person zerocool    schedule 02.09.2019
comment
Вопрос @MichaelPetch взят дословно из книги «Практический реверс-инжиниринг», так что вот.   -  person Assaf Levy    schedule 17.08.2020


Ответы (1)


Вопрос широкий, но я могу дать некоторую общую информацию и ссылки на архитектуру набора инструкций (ISA ), в котором описаны все инструкции.

Вы не можете MOV или POP значение в CS (на 286+1), чтобы вы не могли изменять CS таким образом. Например для POP есть правило:

Инструкция POP не может вставить значение в регистр CS. Чтобы загрузить регистр CS из стека, используйте инструкцию RET.

И правило для MOV аналогично:

Инструкцию MOV нельзя использовать для загрузки регистра CS.

Вы можете изменить CS косвенно через syscall, sysenter, FAR jmp (через шлюз вызова), FAR call (через вызов ворота), iret, retf(возврат FAR) или int . Вы можете просмотреть ISA для каждой инструкции и какие проверки уровня привилегий применяются. Вы не можете произвольно изменить CPL, если у вас нет на это привилегий и прав доступа.

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


Сноски

1Вам было разрешено изменять CS через POP и MOV на процессорах 8088/8086.

person Michael Petch    schedule 02.09.2019