Я готовлюсь к экзамену по компьютерной безопасности и мне сложно понять следующий пример вопроса.
«Объясните разницу между запуском в кольце 0 на x86 и запуском как UID 0 в Linux. Приведите пример того, что каждый из них включает, а другой нет».'
Мое текущее понимание заключается в том, что кольцо 0 на x86 является наиболее привилегированным уровнем ОС, и что код ядра выполняется в кольце 0. UID 0 является суперпользователем Linux, который может по сути запускать что угодно. С моим текущим пониманием этих концепций я не понимаю, как ответить на этот вопрос.
Обратите внимание, что это НЕ вопрос домашнего задания и НЕ то, по которому меня будут оценивать, это всего лишь учебный материал.
решение1
Вы правильно понимаете. «Кольцо 0» — это термин x86 для режима ядра процессора. «Работа в кольце 0» означает «код ядра».
С точки зрения безопасности, все, что может сделать процесс (под любым UID), может сделать и ядро. Некоторые вещи очень неудобно делать из кода ядра, например, открытие файла, но это возможно.
Наоборот, при обычных обстоятельствах, если вы можете запустить код под UID 0, то вы можете запустить код ядра, загрузив модуль ядра. Таким образом, нет барьера безопасности между UID 0 и уровнем ядра в типичной конфигурации. Однако код, работающий в процессе, по-прежнему связан ограничениями пользовательского режима процессора: каждый доступ к периферийному устройству (включая диски, сеть и т. д.) по-прежнему должен проходить через системный вызов. Можно настроить машину так, чтобы она имела UID 0, который не является всемогущим, например:
- Отключить загрузку модулей ядра.
- Использоватьструктура безопасноститакой какSELinuxчтобы лишить процесс привилегий: UID 0 не обязательно перевешивает их, например, можно создать гостевую учетную запись с UID 0, но по сути без привилегий при правильной политике SELinux.
- UID 0 впространство имен пользователяимеет только разрешения создателя пространства имен.