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

51

Recentemente, descobri que se eu editar o GRUB antes de inicializar e adicionar rw init=/bin/bash, acabarei com um shell raiz.

Estar em uma condição que eu quero entender tudo o que eu gostaria de saber por que isso acontece. Quero dizer, é um bug? é uma característica? existe 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?

strugee
fonte
12
Se você quiser "consertar" isso, bloqueie o GRUB e seu BIOS com uma senha e coloque seu disco rígido primeiro na ordem de inicialização. Se alguém tem acesso físico e pode colocar o disco rígido (não-criptografado) em outro computador, você perdeu qualquer maneira
Jofel

Respostas:

44

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

Este post na lista de discussão do Red Hat explica algumas coisas:

Em sistemas tipo Unix, o init é o primeiro processo a ser executado e o ancestral final de todos os processos já executados. É responsável por executar todos os scripts init.

Você está dizendo ao kernel do Linux para executar / bin / bash como init, em vez do init do sistema. [...]

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

Além disso, como observado em um comentário, o rwsinalizador é separado init=, apenas informa ao sistema para montar o sistema de arquivos raiz como leitura / gravação (para que você possa, por exemplo, editar o arquivo mal configurado ou alterar uma senha).

Renan
fonte
2
Além disso, rwé completamente separado de init=. O primeiro diz ao kernel para montar a leitura / gravação do sistema de arquivos raiz.
Alexs
19

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. Estes são recursos, não bugs.

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

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

Seu sistema pode estar em uma mesa em algum lugar. Se você deseja impedir que os usuários abram o coputer e troquem o disco rígido por um deles ou removam a unidade para montá-lo em suas máquinas, é necessário fazê-lo em nível físico. E isso não os impedirá de pegar a mesa inteira e ir embora na van de fuga ...

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

XTL
fonte
Bom resumo. Pode querer adicionar criptografia de disco rígido a isso, como uma possível resposta contra a van.
MvG 02/08
11

Quando o computador inicia, ele executa um programa chamado "init", geralmente encontrado em /bin/initou /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/bashdiz ao kernel para rodar /bin/bash(que é um shell). A especificação rwdiz ao kernel para inicializar com o disco rígido no modo de leitura e gravação em vez do modo somente leitura. Tradicionalmente, o kernel inicia com o disco no modo somente leitura e, posteriormente, um processo verifica a integridade do disco antes de mudar para leitura e gravação.

tylerl
fonte
6

Reunidos no 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
Philip Durbin
fonte
1

Este é um recurso do kernel: permite ao seu "chamador", ou seja, o carregador de inicialização, uma grande flexibilidade. O Grub fornece os meios para usar essa flexibilidade durante a inicialização, mas também fornece os meios para restringir esse tipo de violação . Isso faz sentido principalmente nos casos em que usuários não autorizados podem se apossar do processo de inicialização, mas, de outra forma, têm acesso negado ao próprio disco rígido.

MvG
fonte
1

init=pode levar qualquer executável

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

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

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

Em seguida, você também deve tentar entender quais serão as compensações com o seu regular init, como systemd ou Busybox '

Basicamente, com uma matéria prima /bin/bash, você:

O controle de tarefas pode ser restaurado no init do Busybox e em outras unidades semelhantes, com destaque -no inittab:

tty3::respawn:-/bin/sh

As inittabentradas mais normais , que usam login e mantêm conchas de desova se você pressionar Ctrl + D, são:

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

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

Você pode usar essa configuração para brincar com ela e chegar às conclusões acima.

Ciro Santilli adicionou uma nova foto
fonte