
Perfil de sandboxing sem privilégios para bubblewrap
Muitas ferramentas de tempo de execução de contêineres, como SystemD-NSpawn, Dockeretc., Focam no fornecimento de infraestrutura para administradores de sistema e ferramentas de orquestração (por exemplo, Kubernettes) para executar contêineres.
Essas ferramentas não são adequadas para entregá -las a usuários sem privilégios, porque é trivial converter esse acesso em uma concha raiz com privilégios completos no host.
Existe um sistema de isolamento no nível do kernel Linux chamado "Namespaces de usuário", espaços de nome de usuário que tentam permitir que os usuários sem privilégios usem as funções do contêiner. Embora tenha sido alcançado um progresso significativo, ainda existem preocupações a esse respeito e não estão disponíveis para usuários sem privilégios em várias distribuições de produção, como Centos / Red Hat Enterprise Linux 7, Debian Jessie, etc.
Veja, por exemplo, CVE-2016-3135, que é uma vulnerabilidade local de raiz introduzida pelos usuários. Esta publicação em março de 2016 tem mais discussão.
Bubblewrap pode ser visto como uma implementação inteira de um subconjunto de espaços de nome de usuário. Ênfase no subconjunto - especificamente relevante para o CVE anterior, o bubblewrap não permite o controle sobre os iptables.
O código Bubblewrap original existia antes dos espaços de nomes de usuário: herda o código auxiliar XDG -App que, por sua vez, é perturbado pelo Linux-User-Croot.
Os mantenedores dessa ferramenta acreditam que, mesmo quando usados em combinação com o software típico instalado nessa distribuição, ela não permite a escalada de privilégios. No entanto, pode aumentar a capacidade de um usuário que fez login para realizar ataques de negação de serviço.
Em particular, o bubblewrap é usado pr_set_no_new_privs para desativar o binário setuid, que é a maneira tradicional de sair de coisas como chroots.
Este programa pode ser compartilhado por todas as ferramentas de contêiner que não são operações radicais, como:
FLATPAK RPM-OSTREE SEM privilégios de Bwrap-OCIs, também gostaríamos que este estivéssemos disponíveis nos clusters Kubernetes / OnShift. Ter a capacidade que os usuários sem privilégios usam as funções do contêiner facilitariam significativamente a realização de cenários de purificação interativos e semelhantes.
O BubbleWrap funciona criando um novo e completamente vazio o espaço de montagem, onde a raiz está em um TMPFS que é invisível para o host e será limpo automaticamente quando o último processo terminar. Em seguida, você pode usar as opções da linha de comando para criar o sistema de arquivos raiz e o ambiente de processo e o comando para executar no espaço de nome.
Há uma sequência de comando de demonstração maior no código -fonte, mas aqui há uma versão pequena que executa um novo shell reutilizando o arquivo /usr.
Bwrap--bind /usr /usr-symlink usr /lib64 /lib64 --proc /proc--dev /dev share-pid bash Este é um exemplo incompleto, mas útil para fins ilustrativos. Mais frequentemente, em vez de criar um contêiner usando a árvore do sistema de arquivos host, você deseja se inscrever em um chroot. Lá, em vez de criar o link simbólico Lib64 -> usr/lib64, o TMPFS pode já ter criado no Rootfs de destino.
O objetivo do BubbleWrap é executar um aplicativo em uma caixa de areia, onde restringiu o acesso a partes do sistema operacional ou dados do usuário, como o diretório inicial.
O BubbleWrap sempre cria um novo espaço de nomeação, e o usuário pode especificar exatamente quais partes do sistema de arquivos devem ser visíveis na caixa de areia. Qualquer um desses diretórios especificado será montado por forma predeterminado e pode ser feito apenas leitura.
Além disso, você pode usar estas funções do kernel:
Nome de usuário espaços (clone_newuser): Isso esconde tudo, exceto o UID atual e a caixa de areia. Também pode alterar o que o valor UID / GID deve estar na caixa de areia.
O IPC nomes espaços (clone_newipc): a caixa de areia obterá sua própria cópia de todas as formas diferentes de CPI, como a memória compartilhada SYSV e os semáforos.
O PID nomes espaços (clone_newpid): o Sandbox não verá nenhum processo fora da caixa de areia. Além disso, o Bubblewrap executará um trivial PID1 dentro de seu recipiente para lidar com os requisitos de colher crianças na caixa de areia. Isso evita o que agora é conhecido como o problema do Docker PID 1.
Espaços dehttp: //linux.die.net/man/2/clone nomes de rede (clone_newnet): o sandbox não verá a rede. Em vez disso, você terá seu próprio espaço de nome de rede com apenas um dispositivo de loop invertido.
O UTS nomeia o espaço (clone_newuts): a caixa de areia terá seu próprio nome de host.
FILTROS SECCOMP: Os filtros Seccomp que limitam as chamadas para o sistema que podem ser executadas na zona de teste podem passar. Para mais informações, consulte Seccomp.
O FireJail é semelhante ao Flatpak antes que o Bubblewrap fosse dividido no sentido de que ele combina uma ferramenta setuid com muitas funções específicas de sandboxing de desktop. Por exemplo, o FireJail conhece Pulseaudio, enquanto Bubbleprap no.
Os autores da BubbleWrap acreditam que é muito mais fácil auditar um pequeno programa setuid e manter características como a filtragem PULSEAUDIO como um processo sem privilégios, como é o caso agora em Flatpak.
Além disso, o @cgwalters acha que tentar incluir rotas de arquivos na lista branca é uma má idéia, dadas as inúmeras maneiras pelas quais os usuários precisam manipular rotas e inúmeras maneiras pelas quais os administradores de sistema podem configurar um sistema. A abordagem Bubblewrap é reter apenas alguns recursos específicos do Linux, como CAP_SYS_ADMIN, mas sempre acessar o sistema de arquivos como o UID de invocação. Isso fecha completamente os ataques de Toctou e outros.
Sandstorm.io requer espaços para nomes de usuário sem privilégios para configurar sua caixa de areia, embora também possa se adaptar facilmente para operar em um modo setuid. @Cgwalters acredita que seu código é muito bom, mas ainda poderia fazer sentido unificar no Bubblewrap. No entanto, @kentonv (de Sandstorm) sente que, embora isso faça sentido em princípio, o custo da mudança excede os benefícios práticos por enquanto. Essa decisão pode ser reavaliada no futuro, mas hoje não é aplicada ativamente.
O Runc está atualmente trabalhando no suporte do contêiner sem root, sem a necessidade de nenhum outro privilégio durante a instalação do RUNC (usando espaços de nome de usuário sem privilégios em vez de setuid), criação e administração de contêineres. No entanto, o modo padrão de usar o RUNC é semelhante ao Systemd NSpawn, no qual foi projetado para ser chamado pela raiz.
Os autores da BubbleWrap acreditam que o Runc e o Systemd-NSpawn não foram projetados para se tornarem setes e estão longe de admitir dessa maneira. No entanto, com contêineres sem raiz, o Runc pode cumprir com certos casos de uso admitidos pelo BubbleWrap (com o benefício adicional de ser um tempo de execução completo e padronizado da OCI).
Binctr é apenas um envelope para Runc, então ele herda todas as suas compensações de design.