Um chroot é uma chamada de sistema e também um utilitário da linha de comando e é utilizado como mecanismo de segurança para rodar serviços, ou então, como uma caixa de areia para testes ou desenvolvimento.
Montar um chroot corresponde a criar em um diretório, um conjunto mínimo de arquivos necessários para a execução de um determinado programa, estes arquivos, correspondem as bibliotecas dinâmicas de suporte ao programa e arquivos de configuração.
Para o propósito deste artigo, o diretório destino do chroot estará em /var/chroot/ e conterá o mínimo de arquivos necessários para executar o interpretador de comandos Korn shell (ksh).
$ sudo mkdir -p /var/chroot/bin/ $ sudo cp -a /bin/ksh /var/chroot/bin/
É preciso conhecer quais são bibliotecas que o shell necessita para executar.
$ otool -L /bin/ksh /bin/ksh: /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0)
E então copiar as bibliotecas para dentro do chroot, tomando o cuidado de não copiar somente os links simbólicos.
$ sudo mkdir -p /var/chroot/usr/lib/ $ sudo cp -a /usr/lib/libiconv.* /var/chroot/usr/lib/ $ sudo cp -a /usr/lib/libSystem.dylib $ sudo cp -a /usr/lib/libSystem.B.dylib /var/chroot/usr/lib/
A primeira tentativa de entrar no chroot é catastrófica.
$ sudo chroot /var/chroot/ /bin/ksh Bus error
Esquecemos de copiar o linkeditor de bibliotecas dinâmicas (dyld).
$ sudo cp -a /usr/lib/dyld /var/chroot/usr/lib/ $ sudo chroot /var/chroot/ /bin/ksh dyld: Library not loaded: /usr/lib/system/libmathCommon.A.dylib Referenced from: /usr/lib/libSystem.B.dylib Reason: image not found Trace/BPT trap
Foi revelado que está faltando mais uma biblioteca (mathCommon), é necessário então instalar essa biblioteca para prosseguir.
$ sudo cp -a /usr/lib/system/libmathCommon.dylib /var/chroot/usr/lib/system/ $ sudo cp -a /usr/lib/system/libmathCommon.A.dylib /var/chroot/usr/lib/system/
E finalmente conseguimos deixar o ksh em um ambiente chroot.
$ sudo chroot /var/chroot/ /bin/ksh # pwd / # exit