¿Por qué Linux permite 'init=/bin/bash'?

¿Por qué Linux permite 'init=/bin/bash'?

Recientemente descubrí que si edito GRUB antes de arrancar y agrego, rw init=/bin/bashtermino con un shell raíz.

Estando en una condición que quiero entender todo me gustaría saber por qué sucede esto. Quiero decir, ¿es un error? ¿Es una característica? ¿Está ahí para ayudar a los administradores a arreglar las cosas, ya que solo funciona si tienes acceso físico a una computadora?

¿Lo proporciona GRUB o el kernel real?

Respuesta1

Esta es una característica y se utiliza para el mantenimiento del sistema: permite a un administrador de sistemas recuperar un sistema de archivos de inicialización estropeados o cambiar una contraseña olvidada.

Esta publicación en la lista de correo de Red Hatexplica algunas cosas:

En sistemas tipo Unix, init es el primer proceso que se ejecuta y el ancestro último de todos los procesos que se ejecutan. Es responsable de ejecutar todos los scripts de inicio.

Le estás diciendo al kernel de Linux que ejecute /bin/bash como init, en lugar del init del sistema. [...]

Por lo tanto, no estás explotando nada, sólo estás usando una característica estándar del kernel.

Además, como se señaló en un comentario, la rwbandera está separada de init=, simplemente le dice al sistema que monte el sistema de archivos raíz como lectura-escritura (para que pueda, por ejemplo, editar el archivo mal configurado o cambiar una contraseña).

Respuesta2

Su sistema tiene mecanismos para ejecutar y depurar (como el parámetro init) y probablemente tenga mecanismos de seguridad para evitar que usuarios no deseados se aprovechen de ellos. Estas son características, no errores.

El gestor de arranque es responsable de iniciar el sistema operativo. La seguridad del sistema operativo obviamente no se aplica en ese momento. Podría simplemente cargar un kernel diferente, initrd, root fs o configurar diferentes opciones (como la ruta de inicio). Si desea evitar que los usuarios hagan eso, debe hacerlo en el gestor de arranque.

Su sistema (probablemente una PC, por lo tanto BIOS) carga el gestor de arranque y, obviamente, la seguridad del gestor de arranque no se aplica a él. Si desea evitar que los usuarios inicien la BIOS desde USB o algo así, debe hacerlo en ese nivel.

Es posible que su sistema esté en algún lugar de un escritorio. Si desea evitar que los usuarios abran la computadora y cambien el disco duro por uno propio o retiren la unidad para montarla en sus máquinas, debe hacerlo a nivel físico. Y eso no les impedirá recoger todo el escritorio y marcharse en su furgoneta de fuga...

Así es la seguridad. Elefantes hasta el final.

Respuesta3

Así es simplemente como se diseñó el núcleo. Tiene que haberalgopara ejecutarse cuando se inicia la computadora, y si bien existe un valor predeterminado, la línea de comando del kernel le permite cambiar ese valor predeterminado.

Normalmente ejecuta un programa llamado "init", que normalmente se encuentra en /bin/inito /sbin/init. Este programa es responsable de todo el inicio del sistema y de la creación de un entorno utilizable.

La especificación init=/bin/bashle dice al kernel que se ejecute /bin/bashen su lugar (que es un shell). La especificación rwle indica al kernel que arranque con el disco duro en modo lectura-escritura en lugar de modo de solo lectura. Tradicionalmente, el kernel comienza con el disco en modo de solo lectura y un proceso posterior verifica la integridad del disco antes de cambiar a lectura-escritura.

Respuesta4

init=puede tomarcualquierejecutable

init=puede tomar cualquier ejecutable, incluidoscripts de shell. La razón subyacente es probablemente que elexecsyscall puede manejar directamente tanto ejecutables ELF como shebangs.

Aquí, por ejemplo, demuestro cómo crear un compilado mínimo arbitrario en C init:¿Cómo crear una distribución de Linux personalizada que ejecute solo un programa y nada más?

Entonces ¿por quénoAccept /bin/bash, de todas las cosas, ¿cuál es solo un ejecutable normal y realmente puede ser útil? :-)

A continuación, también debería intentar comprender cuáles serán las compensaciones con su sistema habitual, initcomo systemd o Busybox.

Básicamente, con un raw /bin/bash, tú:

El control del trabajo se puede restaurar en el inicio de Busybox y otros inicios similares con un encabezado -en inittab:

tty3::respawn:-/bin/sh

Las entradas más normales inittab, que utilizan el inicio de sesión y siguen generando shells si haces Ctrl+D son:

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

que usan el gettyejecutable, pero TODO: No he podido generarlos yo mismo sin Busybox init:¿Empezar desde la línea de comando?

Puedes usaresta configuraciónjugar con ello y llegar a las conclusiones anteriores.

información relacionada