O Chroot não encontra '/ bin / bash'

6

Eu diria que o seguinte funcionaria:

mkdir /tmp/chrootTest # Create chroot folder.
mkdir /tmp/chrootTest/bin # Create '/bin' in the chroot folder.
sudo mount -B /bin /tmp/chrootTest/bin/ # Bind-mount the real system's '/bin' to the chroot's '/bin'.
sudo chroot /tmp/chrootTest/ /bin/bash # Execute (open) '/bin/bash' in the chroot.

No entanto, o último comando gera:

chroot: failed to run command ‘/bin/bash’: No such file or directory

Eu também tentei copiar /bin para /tmp/chrootTest/bin e conceder permissões completas. No entanto, isso não funciona também.

Eu não ficaria totalmente surpreso ao ver uma mensagem de erro informando que /bin/bash não pode funcionar em seu chroot muito rudimentar, já que outros arquivos não podem ser encontrados. No entanto, a mensagem de erro impressa é surpreendente, pois o arquivo claramente existe.

Por que isso acontece? O que é necessário para abrir com sucesso um bash em um chroot?

    
por UTF-8 18.01.2017 / 11:33

3 respostas

13

Se /bin/bash é um binário com dependências de bibliotecas compartilhadas, essas dependências precisam poder ser resolvidas dentro do chroot.

No meu sistema:

$ ldd $( command -v bash )
/usr/local/bin/bash:
        Start            End              Type Open Ref GrpRef Name
        0000115f08700000 0000115f08a0c000 exe  1    0   0      /usr/local/bin/bash
        00001161f6a2e000 00001161f6c88000 rlib 0    1   0      /usr/lib/libtermcap.so.14.0
        00001161bc41e000 00001161bc629000 rlib 0    1   0      /usr/local/lib/libintl.so.6.0
        000011614b1de000 000011614b4dd000 rlib 0    2   0      /usr/local/lib/libiconv.so.6.0
        00001161bd091000 00001161bd35b000 rlib 0    1   0      /usr/lib/libc.so.89.2
        000011612ef00000 000011612ef00000 rtld 0    1   0      /usr/libexec/ld.so

Em contraste:

$ ldd $( command -v sh )
/bin/sh:
        Start            End              Type Open Ref GrpRef Name
        000007ca3c446000 000007ca3c6c6000 dlib 1    0   0      /bin/sh

Estou no OpenBSD. O formato da saída de ldd será diferente em um sistema Linux, mas as mesmas informações essenciais (quais bibliotecas são compartilhadas e onde elas estão) também devem ser exibidas no Linux.

Quando eu tento com um chroot simplista muito que contém apenas /bin/sh e /bin/bash ( doas é o" sudo replacement "do OpenBSD:

$ doas chroot -u kk t /bin/sh
/bin/sh: No controlling tty (open /dev/tty: No such file or directory)
/bin/sh: warning: won't have full job control
$ /bin/bash
Abort trap

Observe que eu recebo um shell ( /bin/sh ), mas esse /bin/bash falha. O erro é diferente do seu, mas, na minha opinião, a mesma causa. Executar /bin/bash diretamente com o comando chroot apenas fornece uma mensagem "Abortar" de uma só palavra, presumivelmente devido ao mesmo problema com as bibliotecas.

Conclusão: O chroot precisa conter pelo menos uma instalação mínima de um sistema, incluindo arquivos de dispositivos e bibliotecas que são necessários para executar os executáveis dentro dele.

Explicação do erro "Nenhum arquivo ou diretório" no Linux:

Eu estava um pouco confuso sobre por que o erro era "Nenhum arquivo ou diretório desse tipo" no Linux, então fiz um teste em strace .

A chamada execve() que deveria ter executado o shell retorna ENOENT:

execve("/bin/bash", ["/bin/bash"], [/* 13 vars */]) = -1 ENOENT (No such file or directory)

... então achei que havia algo errado em encontrar /bin/bash . No entanto, ao ler o manual execve(2) , vi:

ENOENT The file filename or a script or ELF interpreter does not exist, or a shared library needed for file or interpreter cannot be found.

Então lá vai você.

    
por 18.01.2017 / 11:40
4

Certifique-se de que seu sistema de instalação e o meio que você usa para chroot tenham o mesmo arco.

A partição que você monta em / mnt sua / partition está instalada no sistema?

Eu chroot desta maneira.

Para o sistema de arquivos ext *.

sudo mount /dev/sdxY /mnt

Para partição de modo separado / boot bios

sudo mount /dev/sdzY /mnt/boot

Para o modo efi

sudo mount /dev/sdwY /mnt/boot/efi

Monte os sistemas de arquivos vituelle

for dir in /dev /dev/pts /proc /sys /run; do sudo mount --bind $dir /mnt/$dir; done

Para acesso à rede

cp -a /etc/resolv.conf /mnt/etc/resolve.conf

então

sudo chroot /mnt /bin/bash

Mas eu só uso com Debian e Ubuntu.

    
por 18.01.2017 / 12:24
1

Basta modificar seu código de exemplo para o seguinte: (funcionou para mim)

mkdir /tmp/chrootTest
mkdir /tmp/chrootTest/bin
mkdir /tmp/chrootTest/lib
mkdir /tmp/chrootTest/lib64
sudo mount -B /bin /tmp/chrootTest/bin/
sudo mount -B /lib /tmp/chrootTest/lib/
sudo mount -B /lib64 /tmp/chrootTest/lib64/
sudo chroot /tmp/chrootTest/ /bin/bash
    
por 10.12.2017 / 07:49

Tags