Уровни привилегий
100%

Ядро · Урок 2

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

Узнайте, как привилегии процессора отделяют пользовательское выполнение от доверенного выполнения ядра.

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

Пользовательский режим

Обычный процесс выполняется в пользовательском режиме внутри своего виртуального адресного пространства. Он свободно вычисляет и обращается к разрешённым ядром отображениям памяти, которые могут быть большими; пользовательский режим не означает «только маленький объём памяти». Процесс не может напрямую обращаться к произвольной физической памяти, приватным отображениям другого процесса или привилегированным средствам CPU.

Таблицы страниц и биты защиты обеспечивают доступ. Если thread обращается к недействительному или запрещённому адресу, процессор передаёт управление ядру, которое может обработать допустимый page fault либо доставить сигнал, например SIGSEGV.

К какой памяти процесс пользовательского режима обычно может обращаться напрямую?

Режим ядра

Режим ядра позволяет выполнять привилегированные инструкции и обращаться к защищённым отображениям для управления памятью, планирования, обработки прерываний и драйверов. На x86 это обычно описывают как ring 0 для ядра и ring 3 для пользовательских процессов. Linux обычно не использует rings 1 и 2 для обычной изоляции процессов.

Другие архитектуры применяют иные названия и механизмы, например exception levels. Виртуализация добавляет связи гипервизора и гостя, не укладывающиеся в простую схему двух колец. Важна идея контролируемых привилегий, а не сами номера x86.

В каком кольце защиты x86 обычно выполняется ядро Linux?

Контролируемые переходы

Несколько событий передают управление точке входа ядра:

  • инструкция системного вызова запрашивает службу ядра;
  • исключение сообщает page fault, недействительную инструкцию или другое условие;
  • аппаратное прерывание сообщает внешнее событие.

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

Приложение временно не становится кодом ядра. CPU исполняет обработчик ядра от имени thread, используя контролируемые ядром стеки и отображения.

Что происходит при переходе системного вызова?

Привилегия CPU не равна идентичности пользователя

Приложение пользователя root обычно всё равно исполняется в пользовательском режиме. UID 0 влияет на проверки авторизации ядра, но не позволяет инструкциям напрямую обращаться к памяти ядра. И наоборот, код ядра выполняется привилегированно независимо от того, системный вызов какого пользователя его вызвал.

Capabilities, namespaces, seccomp, модули безопасности и cgroups дополнительно ограничивают запросы процесса. Эта многоуровневая политика отделена от аппаратной границы user/kernel mode.

Какое утверждение правильно сравнивает root и режим ядра?

Значение границы

Граница ограничивает ущерб обычных ошибок и предоставляет место проверок доступа, но уязвимости ядра и вредоносные модули могут её преодолеть. Обновляйте ядро и прошивку из доверенных источников, минимизируйте привилегированный код и не загружайте недоверенные модули.

Проблемы спекулятивного выполнения и побочные каналы также показывают, что аппаратной изоляции нужны постоянные меры. «Другое кольцо» — фундамент, а не полное доказательство безопасности.

Гарантирует ли разделение пользовательского режима и режима ядра полную безопасность?

Урок завершён

Вы завершили Уровни привилегий

Теперь вы можете отличать аппаратные привилегии выполнения от полномочий учётной записи Linux.

  • Связывать пользовательский режим с защищёнными виртуальными адресными пространствами.

  • Связывать режим ядра с привилегированными инструкциями и отображениями.

  • Считать системные вызовы, исключения и прерывания контролируемыми входами.

  • Отделять авторизацию UID 0 от выполнения ring 0.

  • Рассматривать режимы привилегий как один слой более широкой защиты.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Ядро