Disallow File IO para um processo, exceto para FIFOs

4

Como você inicia um processo que não pode fazer qualquer arquivo IO (abertura / fechamento de arquivos, criação / exclusão de arquivos, leitura / gravação de arquivos, etc.), exceto para ler e gravar em arquivos anteriores. FIFOs criados?

( chroot não funcionará porque o processo pode sair dele, mas mexendo com / modificando o kernel e tudo bem)

BTW: não consigo modificar os programas que estão sendo executados

    
por haneefmubarak 03.11.2013 / 22:49

3 respostas

4

Se

  1. o programa pode ser modificado para fazer uma chamada de sistema de sua escolha antes de qualquer código não confiável (isso pode ser feito via LD_PRELOAD ) e
  2. o programa não precisa fazer chamadas do sistema além de exit() , sigreturn() , read() e write()

você pode usar seccomp (artigo da Wikipedia). Para permitir mais do que apenas as chamadas do sistema, há o seccomp-bpf, que usa o Filtro de Pacotes de Berkeley para determinar quais chamadas do sistema permitir . A biblioteca libseccomp simplifica o seccomp-bpf (por exemplo) se você quiser permitir a chamada do sistema close() :

seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);

Ou para algo semelhante a chroot , mas que não pode ser quebrado, você pode tentar recipientes do Linux , OpenVZ ou VServer do Linux .

    
por 03.11.2013 / 23:37
1

Sua melhor aposta é executar o problema como um usuário sem privilégios. O dar as permissões corretas para o FIFO.

Dito isto, o usuário sem privilégios terá acesso a todos os arquivos que qualquer outro usuário não privilegiado terá.

Para fazer mais, você terá que modificar seriamente as coisas no sistema de arquivos. mas:

chmod o-rwx / -R

Certamente trancará as coisas. Mas, novamente, outros usuários também não poderão ler nada.

Eu acho que as perguntas mais importantes a se fazer é "Por que eu preciso dessa restrição?" Talvez exista uma maneira melhor de obter seus objetivos?

    
por 03.11.2013 / 23:20
1

Um processo não pode sair de um chroot se você fizer as coisas corretamente, ou seja, executar o processo sob seu próprio ID de usuário (ou seja, não deve haver nenhum processo sendo executado como o mesmo usuário fora do chroot).

Chroot o processo para um diretório para o qual o processo não pode gravar e que contém apenas FIFOs. Você precisará colocar o executável e as bibliotecas e os arquivos de dados necessários nesse chroot, ou então iniciar o processo como root, então chroot e depois alterar o ID do usuário.

Se você não pode envolver o root, é possível usar um namespace , mas você precisa de um kernel recente para isso (≥3,8). Primeiro, crie um namespace de usuário e, em seguida, dentro dele chroot e mude para um ID de usuário no namespace com a ausência necessária de privilégios. / p>

Como alternativa, isso pode ser feito (com a cooperação do root) por meio de estruturas de segurança como SELinux ou AppArmor: desabilitar todos os syscalls relacionados ao sistema de arquivos, exceto open , read , write , close e lseek e restrinja open para o diretório que contém os FIFOs. Não se esqueça de desativar ptrace .

    
por 04.11.2013 / 23:46