Atualmente, uso um software de sandbox em minha máquina 14.04 que isola binários Linux uns dos outros (usando um tipo especial de isolamento de namespace diferente do AppArmor)
Atualmente, a forma de invocar o sandbox é assim:
/usr/local/bin/sandbox /path/to/binary --optional-arguments
Meu problema é que quero invocar certos binários arbitrários e executá-los na sandboxsemter que acrescentar a /usr/local/bin/sandbox
parte ao meu comando shell. Ou seja:
/usr/local/bin/sandbox /path/to/binary --optional-arguments --> *new process*
Torna-se:
/path/to/binary --optional-arguments --> *binfmt-misc* --> *new process*
Achei que poderia fazer isso facilmente graças ao binfmt-misc, no entanto, depois de ler a documentação, ele só parece suportar a solicitação de um intérprete por meio de bits mágicos no próprio arquivo ou por meio de sua extensão de arquivo. Como não é pago fazer nenhuma dessas coisas neste caso específico, procurei uma opção em binfmt-misc que pudesse me permitir especificar atributos estendidos em certos binários que desejo lançar na sandbox que binfmt-misc poderia então ler e use para determinar que esses binários devem ser executados pelo /usr/local/bin/sandbox
"intérprete". No entanto, ainda não encontrei nele um recurso que me permitisse fazer isso.
Existe alguma maneira de lançar binários ELF arbitrários sem extensão compilada para a mesma arquitetura do meu computador usando o sandbox automaticamente?
Responder1
Não conheço uma maneira de fazer isso através do binfmt-misc e do xattrs, mas proporei uma abordagem diferente. Ainda não experimentei, mas não vejo por que não funcionaria.
A ideia é usar ummontagem sindicalpara ocultar os binários reais por meio de um script wrapper que chama o sandbox. Precisamos de uma montagem sindical onde o diretório superior seja principalmente lido e gravado em um arquivo não sombreado, vá para o diretório inferior, que não é suportado por todos os sistemas de montagem sindical. Em particular, isso exclui o OverlayFS, que agora está integrado ao kernel do Linux.
Escreva um script wrapper genérico:
#!/bin/sh
exec /usr/local/bin/sandbox "${0#/sandboxed}" "$@"
Crie um diretório /sandbox
e crie uma montagem de união que acompanhe o sistema de arquivos raiz. vou usaraufs(Ubuntu:aufs-tools
), que infelizmente foi recentemente abandonado; pode haver uma escolha melhor.
mount -t aufs -o br:/,br:/sandbox aufs-sandbox /
Para cada executável que você deseja colocar em sandbox, vincule /sandbox/path/to/foo
ao script wrapper (depois de criar os diretórios necessários /path/to
em /sandbox
).