Похоже, ваша учетная запись root не имеет связанного пароля, поэтому вы не можете напрямую войти в свою учетную запись root. Другой способ получить root - это sudo
, который в настоящее время не работает из-за неправильных разрешений файла sudoers.
Поскольку для исправления этих разрешений вам нужен root-доступ, вам нужно найти другой способ.
Возможно, самый простой способ - добавить в ядро пользовательскую опцию инициализации при загрузке.
Ваш менеджер загрузки должен позволять вам добавлять пользовательские параметры в командную строку ядра. Перезагрузите компьютер и добавьте что-нибудь вроде init = / bin / bash
в конце строки ядра.
Тогда ваше ядро должно запустить bash вместо обычного init deamon. Таким образом вы можете исправить свои разрешения, и после очередной перезагрузки ваше обычное sudo должно снова работать.
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, так что нельзя сказать, что он противоречит их назначению.)
Только так же, как modprobe
«победит» безопасность, загрузив новый код в ядро.
По разным причинам иногда имеет смысл иметь полу-привилегированный код (, например графические драйверы, внутри X-сервера ), работающего в пользовательском -пространстве, а не в потоке ядра.
kill
сделать это легче, если только это не блокирует HW. Это не сильно влияет на безопасность, но дает большие преимущества в плане надежности и архитектуры программного обеспечения.
Встраивание графических драйверов в ядро может уменьшить количество переключений контекста между 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 в точке входа ядра.