Не позволяет ли программе пользовательского режима получить доступ к памяти пространства ядра и выполнить инструкции IN и OUT, что лишает смысла иметь режимы ЦП?

Похоже, ваша учетная запись root не имеет связанного пароля, поэтому вы не можете напрямую войти в свою учетную запись root. Другой способ получить root - это sudo , который в настоящее время не работает из-за неправильных разрешений файла sudoers.

Поскольку для исправления этих разрешений вам нужен root-доступ, вам нужно найти другой способ.

Возможно, самый простой способ - добавить в ядро ​​пользовательскую опцию инициализации при загрузке.

Ваш менеджер загрузки должен позволять вам добавлять пользовательские параметры в командную строку ядра. Перезагрузите компьютер и добавьте что-нибудь вроде init = / bin / bash в конце строки ядра.

Тогда ваше ядро ​​должно запустить bash вместо обычного init deamon. Таким образом вы можете исправить свои разрешения, и после очередной перезагрузки ваше обычное sudo должно снова работать.

19
10.03.2019, 23:34
2 ответа

So a user mode program in Linux can do most things (I think most things) that can be done in kernel mode.

Ну, не все программы пользовательского режима могут, только те, у кого есть соответствующие привилегии. И это определяется ядром.

/dev/memзащищен обычными правами доступа к файловой системе и возможностью CAP_SYS_RAWIO. iopl()и ioperm()также ограничены той же возможностью.

/dev/memтакже может быть полностью скомпилирован из ядра(CONFIG_DEVMEM).

Doesn't allowing a user mode program to have all this power defeats the purpose of having CPU modes?

Ну, может быть. Это зависит от того, что вы хотите, чтобы космические процессы привилегированного пользователя -могли делать. Пользовательские космические процессы -также могут уничтожить весь жесткий диск, если у них есть доступ к/dev/sda(или эквивалентному ), даже если это противоречит цели наличия драйвера файловой системы для обработки доступа к хранилищу.

(Далее следует тот факт, что iopl()работает, используя режимы привилегий процессора на i386, так что нельзя сказать, что он противоречит их назначению.)

23
27.01.2020, 19:44

Только так же, как modprobe«победит» безопасность, загрузив новый код в ядро.

По разным причинам иногда имеет смысл иметь полу-привилегированный код (, например графические драйверы, внутри X-сервера ), работающего в пользовательском -пространстве, а не в потоке ядра.

  • Имея возможность killсделать это легче, если только это не блокирует HW.
  • Запросить -страницу своего кода/данных из файлов в файловой системе. (Память ядра не выгружается)
  • Предоставление ему собственного виртуального адресного пространства, в котором ошибки в X-сервере могут просто привести к сбою X-сервера без отключения ядра.

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

Встраивание графических драйверов в ядро ​​может уменьшить количество переключений контекста между X-клиентами и X-сервером, например, одним пользователем ->kernel ->user вместо того, чтобы получать данные в другой процесс использования -пространства, но X-серверы исторически были слишком большими и слишком глючными, чтобы их можно было полностью включить в ядро.


Да, вредоносный код с этими привилегиями может захватить управление ядром, если захочет, используя /dev/memдля модификации кода ядра.

Или, например, на платформе x86 запустите инструкцию cli, чтобы отключить прерывания на этом ядре после выполнения системного вызова iopl, чтобы установить его уровень привилегий ввода-вывода равным звонку 0.

Но даже x86 iopl"только" дает доступ к некоторым инструкциям:in/out (и строковым версиям ins/outs )и cli/sti. Это не позволяет вам использовать rdmsrили wrmsrдля чтения или записи «регистров, специфичных для модели» (, например. IA32_LSTAR, который устанавливает адрес точки входа ядра для инструкции x86 -64 syscall), или используйте lidtдля замены таблицы дескрипторов прерываний -(, что позволит вам полностью взять на себя управление машина с существующим ядром, по крайней мере на этом ядре.)

Вы даже не можете прочитать регистры управления (, такие как CR3, которые содержат физический адрес каталога страниц -верхнего -уровня, который атакующий процесс может счесть полезным в качестве смещения в /dev/memдля изменения свои собственные таблицы страниц в качестве альтернативы mmapрасширению /dev/mem.)

invd(сделать недействительными все кэши без записать -обратно!!(вариант использования = ранний BIOS до настройки ОЗУ ))— еще один забавный вариант, который всегда требует полного CPL 0 (текущего уровня привилегий ), а не только IOPL. Дажеwbinvdявляется привилегированным, потому что он такой медленный (и непрерываемый ), и должен сбрасывать все кеши на всех ядрах. (См. Есть ли способ сбросить весь кэш ЦП, связанный с программой? и Использование инструкции WBINVD)

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


Текущий уровень привилегий (в защищенном и длинном режиме)представляет собой младшие 2 битаcs(селектора сегмента кода). mov eax, cs/ and eax, 3работает в любом режиме для чтения уровня привилегий.

Чтобы записать уровень привилегий, вы выполняете jmp farили call far, чтобы установить CS:RIP(, но запись GDT/LDT для целевого сегмента может ограничить его на основе старого уровня привилегий, поэтому пользователь -пространство не может сделать это, чтобы возвыситься ). Или вы используете intили syscallдля переключения на кольцо 0 в точке входа ядра.

16
27.01.2020, 19:44

Теги

Похожие вопросы