
Недавно я обнаружил, что если я редактирую GRUB перед загрузкой и добавляю, то rw init=/bin/bash
в итоге получаю оболочку root.
Находясь в состоянии, когда я хочу понять все, я хотел бы знать, почему это происходит. Я имею в виду, это баг? Это функция? Это нужно, чтобы помочь администраторам исправить что-то, поскольку это работает только при наличии физического доступа к компьютеру?
Это обеспечивается GRUB или самим ядром?
решение1
Это функция, которая используется для обслуживания системы: она позволяет системному администратору восстанавливать систему после испорченных файлов инициализации или изменять забытый пароль.
Этот пост в списке рассылки Red Hatобъясняет некоторые вещи:
В Unix-подобных системах init — это первый процесс, который должен быть запущен, и конечный предок всех процессов, когда-либо запущенных. Он отвечает за запуск всех скриптов init.
Вы сообщаете ядру Linux о необходимости запустить /bin/bash в качестве init, а не системный init. [...]
Таким образом, вы ничего не эксплуатируете, а просто используете стандартную функцию ядра.
Кроме того, как отмечено в комментарии, rw
флаг отделен от init=
, он просто сообщает системе о необходимости монтировать корневую файловую систему как доступную для чтения и записи (чтобы вы могли, например, отредактировать неправильно настроенный файл или изменить пароль).
решение2
В вашей системе есть механизмы для запуска и отладки (например, параметр init), и, вероятно, есть механизмы безопасности, чтобы не дать нежелательным пользователям воспользоваться ими. Это функции, а не ошибки.
Загрузчик отвечает за запуск ОС. Безопасность ОС, очевидно, не применяется в этот момент. Вы можете просто загрузить другое ядро, initrd, root fs или задать другие параметры (например, путь init). Если вы хотите запретить пользователям делать это, это должно быть сделано в загрузчике.
Ваша система (вероятно, ПК, поэтому BIOS) загружает загрузчик, и поэтому, очевидно, безопасность загрузчика к нему не применяется. Если вы хотите запретить пользователям загружать BIOS с USB или чего-то подобного, вам нужно сделать это на этом уровне.
Ваша система может быть где-то на столе. Если вы хотите запретить пользователям открывать компьютер и менять жесткий диск на свой собственный или вынимать диск, чтобы установить его в свои машины, вам нужно сделать это на физическом уровне. И это не помешает им поднять весь стол и уехать в своем фургоне для побега...
Вот такая она, охрана. Слоны повсюду.
решение3
Просто так было спроектировано ядро. Должно бытьчто-нибудьдля запуска при запуске компьютера, и хотя есть значение по умолчанию, командная строка ядра позволяет вам изменить это значение по умолчанию.
Обычно он запускает программу под названием "init", которая обычно находится в /bin/init
или /sbin/init
. Эта программа отвечает за весь запуск системы и создание пригодной для использования среды.
Указание init=/bin/bash
сообщает ядру, что нужно запуститься /bin/bash
вместо этого (что является оболочкой). Указание rw
сообщает ядру, что нужно загрузиться с жестким диском в режиме чтения-записи вместо режима только для чтения. Традиционно ядро запускается с диском в режиме только для чтения, а процесс позже проверяет целостность диска перед переключением в режим чтения-записи.
решение4
init=
могу взятьлюбойисполняемый
init=
может взять любой исполняемый файл, включаяскрипты оболочки. Основная причина, вероятно, в том, чтоexec
syscall может напрямую обрабатывать как исполняемые файлы ELF, так и shebang-ы.
Вот, например, я показываю, как создать произвольный минимальный скомпилированный код на языке C init
:Как создать собственный дистрибутив Linux, который запускает только одну программу и ничего больше?
Так почему бы этонетaccept /bin/bash
, из всего прочего, который является просто обычным исполняемым файлом и действительно может быть полезен? :-)
Далее вам следует попытаться понять, какие компромиссы будут с вашими обычными системами, init
такими как systemd или Busybox.
По сути, с помощью raw /bin/bash
вы:
- потеряете возможность контролировать вход с помощью паролей. Но иногда это желательно, например, при эмуляции системы:Как выполнить автоматический вход в систему без ввода имени пользователя root или пароля при инициализации Buildroot BusyBox?
- потеря контроля над работой, например, Ctrl + C не будет работать
- если нажать Ctrl+C, оболочка завершит работу, а ядро впадет в панику, так как
init
существует
Управление заданиями можно восстановить при инициализации Busybox и других подобных инициализациях с начальным -
символом inittab
:
tty3::respawn:-/bin/sh
Более нормальные inittab
записи, которые используют вход в систему и продолжают создавать оболочки, если вы нажмете Ctrl+D, следующие:
::respawn:/sbin/getty -L ttyS0 0 vt100
которые используют getty
исполняемый файл, но TODO: я не смог создать их самостоятельно без Busybox init
:getty запустить из командной строки?
Вы можете использоватьэта установкачтобы поиграться с этим и прийти к вышеуказанным выводам.