Criando um chroot no Macintosh

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
©2009 Rudá Moura