Почему Linux допускает «init=/bin/bash»?

Почему Linux допускает «init=/bin/bash»?

Недавно я обнаружил, что если я редактирую 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=может взять любой исполняемый файл, включаяскрипты оболочки. Основная причина, вероятно, в том, чтоexecsyscall может напрямую обрабатывать как исполняемые файлы ELF, так и shebang-ы.

Вот, например, я показываю, как создать произвольный минимальный скомпилированный код на языке C init:Как создать собственный дистрибутив Linux, который запускает только одну программу и ничего больше?

Так почему бы этонетaccept /bin/bash, из всего прочего, который является просто обычным исполняемым файлом и действительно может быть полезен? :-)

Далее вам следует попытаться понять, какие компромиссы будут с вашими обычными системами, initтакими как systemd или Busybox.

По сути, с помощью raw /bin/bashвы:

Управление заданиями можно восстановить при инициализации Busybox и других подобных инициализациях с начальным -символом inittab:

tty3::respawn:-/bin/sh

Более нормальные inittabзаписи, которые используют вход в систему и продолжают создавать оболочки, если вы нажмете Ctrl+D, следующие:

::respawn:/sbin/getty -L ttyS0 0 vt100

которые используют gettyисполняемый файл, но TODO: я не смог создать их самостоятельно без Busybox init:getty запустить из командной строки?

Вы можете использоватьэта установкачтобы поиграться с этим и прийти к вышеуказанным выводам.

Связанный контент