Por que o Linux permite "init = / bin / bash"?

45

Eu descobri recentemente que, se eu editar o GRUB antes de inicializar e adicionar rw init=/bin/bash , acabo com um shell de root.

Estar em uma condição que eu quero entender tudo que eu gostaria de saber porque isso acontece. Quero dizer, é um erro? é um recurso? está lá para ajudar os administradores a consertar as coisas, pois só funciona se você tiver acesso físico a um computador?

É fornecido pelo GRUB ou pelo kernel real?

    
por strugee 18.03.2012 / 20:14

6 respostas

41

Este é um recurso, e é usado para manutenção do sistema: ele permite que um administrador de sistema recupere um sistema de arquivos de inicialização confusos ou altere uma senha esquecida.

Esta publicação na lista de discussão Red Hat explica algumas coisas:

In Unix-like systems, init is the first process to be run, and the ultimate ancestor of all processes ever run. It's responsible for running all the init scripts.

You're telling the Linux kernel to run /bin/bash as init, rather than the system init. [...]

Assim, você não está explorando nada, você está apenas usando um recurso de kernel padrão.

Além disso, como observado em um comentário, o rw sinalizador é separado de init= , ele apenas diz ao sistema para montar o sistema de arquivos raiz como leitura-escrita (assim você pode, por exemplo, editar o arquivo mal configurado ou alterar um senha).

    
por 18.03.2012 / 20:44
18

Seu sistema possui mecanismos para execução e depuração (como o parâmetro init) e provavelmente possui mecanismos de segurança para impedir que usuários indesejados tirem proveito deles. Estas são características, não erros.

O bootloader é responsável por iniciar o sistema operacional. A segurança do sistema operacional obviamente não se aplica nesse momento. Você poderia apenas carregar um kernel diferente, initrd, root fs ou definir opções diferentes (como o caminho do init). Se você quiser impedir que os usuários façam isso, isso deve ser feito no bootloader.

Seu sistema (provavelmente um PC, portanto, BIOS) carrega o gerenciador de inicialização e, obviamente, a segurança do bootloader não se aplica a ele. Se você quiser impedir que os usuários façam o boot do BIOS a partir de USB ou algo semelhante, você precisa fazer isso nesse nível.

Seu sistema pode estar em uma mesa em algum lugar. Se você quiser impedir que os usuários abram o copiador e trocar o disco rígido por um deles ou removê-lo para montá-lo em suas máquinas, você precisará fazê-lo em um nível físico. E isso não vai impedi-los de pegar a mesa inteira e ir embora em sua van de fuga ...

É assim que a segurança é. Elefantes todo o caminho.

    
por 20.03.2012 / 12:19
10

Quando o computador é iniciado, ele executa um programa chamado "init", normalmente encontrado em /bin/init ou /sbin/init . Este programa é responsável por toda a inicialização do sistema e pela criação de um ambiente utilizável.

Especificar init=/bin/bash diz ao kernel para executar /bin/bash (que é um shell). A especificação de rw diz ao kernel para inicializar com o disco rígido no modo de leitura / gravação em vez do modo somente leitura. Tradicionalmente, o kernel inicia com o disco em modo somente leitura e um processo mais tarde verifica a integridade do disco antes de mudar para leitura / gravação.

    
por 19.03.2012 / 01:57
5

Reunidos de kernel.org :

KNL     Is a kernel start-up parameter.

init=   [KNL]
        Format: <full_path>
        Run specified binary instead of /sbin/init as init
        process.

rw      [KNL] Mount root device read-write on boot
    
por 31.03.2012 / 17:59
1

Este é um recurso do kernel: ele permite seu “chamador”, ou seja, o gerenciador de inicialização, grande flexibilidade. O Grub fornece os meios para fazer uso dessa flexibilidade durante o boot, mas também fornece significa restringir este tipo de adulteração . Isso faz sentido nos casos em que usuários não autorizados podem se apossar do processo de inicialização, mas de outra forma é negado o acesso ao disco rígido em si.

    
por 02.08.2013 / 23:01
1

init= pode usar qualquer executável

init= pode usar qualquer executável, incluindo scripts de shell .

Aqui, por exemplo, eu demonstro como criar um C mínimo arbitrário compilado init : Como criar uma distribuição Linux personalizada que executa apenas um programa e nada mais?

Então, por que não aceita /bin/bash , de todas as coisas, que é apenas um executável comum e pode realmente ser útil? : -)

Em seguida, você também deve tentar entender quais serão os trade-offs com seu init regular, como systemd ou Busybox '

Basicamente, com um /bin/bash bruto, você:

O controle do trabalho pode ser restaurado no início do Busybox e outros inits semelhantes com um - no inittab :

tty3::respawn:-/bin/sh

As entradas mais normais de inittab , que usam o login e continuam gerando shells se você fizer Ctrl + D são:

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

que usam o executável getty , mas TODO: Eu não consegui gerar sozinho sem o Busybox init : getty inicia a partir da linha de comando?

Você pode usar esta configuração para brincar com ele e alcançar o conclusões acima.

    
por 04.10.2018 / 16:00