On-entry container attack - CVE-2016-9962
Foi encontrada uma vulnerabilidade na entrada do container no docker e foi atribuída
CVE-2016-9962.
A falha aborda um ataque específico que usa
ptrace
e descarrega indevidamente descritores de arquivo para obter acesso ao conteúdo fora de um contêiner. Esse ataque é apenas um risco ao executar contêineres privilegiados e é mitigado pelo SELinux.
Este problema foi divulgado publicamente em 10 de janeiro de 2017.
Informações gerais
Esta vulnerabilidade surge quando um processo que normalmente seria executado em um namespace é lançado ou movido para um namespace diferente. Namespaces normalmente agem como mecanismo de segurança porque processos dentro namespaces diferentes não podem ver ou manipular um ao outro. O problema é quando um processo é movido para um namespace, ele fica exposto a ações maliciosas de processos que já estão naquele namespace. Vulnerabilidades de entrada atacam processos que juntam-se a containers via
nsenter
ou
docker exec
. Um ataque bem-sucedido pode resultar em um processo malicioso que gera acesso ao sistema ou outros privilégios.
Por exemplo, se um processo malicioso tomou conta de um container e conseguiu obter
raiz
dentro desse contêiner, o processo malicioso pode matar qualquer outro processo que ele possa "ver". Felizmente, o namespacing de contêiner evita que o processo malicioso possa detectar ou matar qualquer processo de host ou qualquer um dos processos em outros containers. No entanto, se um administrador tentar investigar o problema
nsenter
para mover um shell para o contêiner com mau comportamento, o processo malicioso pode ver e manipular esse shell também (e terminá-lo).
Funcionalidades Linux vulneráveis
As seguintes funcionalidades legítimas do Linux podem ser usadas indevidamente em ataques na entrada. Use mecanismos de segurança Linux, como
SELinux
e
seccomp
para evitar to prevent sua exploração.
-
ptrace
"Process trace" ouptrace
é uma recurso de depuração poderoso que está disponível em Linux. Qualquer processo com permissões adequadas podeptrace
outro processo através da chamadaptrace
kernel.ptrace
Concede acesso de nível extremamente baixo ao processo, incluindo sua memória, recursos (como descritores de arquivo) e a capacidade de interceptar chamadas de processo de kernel. -
docker exec
docker exec
é um serviço fornecido pelo daemon do docker que permite que um processo adicional seja lançado dentro de um contêiner existente. Isso é freqüentemente usado para inspecionar ou fazer alterações manuais ao contêiner. Por exemplo, para iniciar um bash shell dentro de um contêiner de mau comportamento para depurar seu comportamento, você pode usar:
docker exec -it container-name /bin/bash
-
nsenter
nsenter
é um utilitário Linux usado para mover ou iniciar processos dentro de namespaces específicos. Como os contêineres são criados em namespaces Linux,nsenter
pode ser usado como uma versão mais genérica dedocker exec
. -
funcionalidades de kernel
no Linux, os poderes especiais tradicionalmente concedidos à contaraiz
foram divididos em capacidades individuais e alguns concedem mais de um poder administrativo. Por exemplo,CAP_SYS_TIME
concede somente a habilidade de definir o relógio do sistema.CAP_SYS_ADMIN
, por outro lado, concede uma variedade de poderes necessários para administrar uma máquina. Cada capacidade do kernel pode ser concedida ou negada a um processo individualmente. -
seccomp
A funcionalidadeseccomp
Linux permite acesso às chamadas de kernel calls numa base individual.
A Red Hat Product Security classificou esta atualização como tendo um impacto de segurança Moderado .
Produtos Impactados
As seguintes versões dos produtos Red Hat estão impactadas:
- Red Hat Enterprise Linux 7
- Red Hat Openshift Container Platform
- RHEL Atomic Host
Impacto
A falha em CVE-2016-9962 ocorre porque falta um mecanismo de segurança a partir do
docker exec
.
Até o docker upstream 1.12.6, os processos que
docker exec
lançou puderam ser
ptrace
dentro do contêiner e mantiveram brevemente seus descritores de arquivo, que estavam ligados a conteúdo fora do contêiner. Isto poderia ser explorado por um processo dentro de um contêiner com habilidades
ptrace.
Se um processo malicioso agisse com rapidez suficiente, poderia
ptrace
o processo de entrada e obter acesso ao conteúdo fora do contêiner. Isto foi abordado no docker 1.12.6, impedindo que fizesse o `ptrace`destes processos (através dos atributos de processo
DUMPABLE)
e por ter processos de entrada liberar seus descritores de arquivo antes de serem movidos.
Mesmo sem o backport, a maioria das instalações não estão em risco:
-
O tempo de execução do docker suprime os contêineres de muitos recursos do kernel por padrão, incluindo
CAP_SYS_PTRACE
. Isso significa que somente os contêineres para os quais essa capacidade foi explicitamente adicionada (ou que estão sendo executadas com o--privilegiado
switch) representam um risco. Além disso, apenas os processos privilegiados dentro desses contêineres representam um risco. Processos de usuário desprivilegiados dentro desses contêineres não têm poderes suficientes para causar danos. Portanto, se você estiver seguindo as práticas de contêiner recomendadas de "não executar contêineres privilegiados" e "não executar processos raiz dentro de contêineres", você está seguro. - Nos sistemas Red Hat com o SELinux habilitado, os perigos de contêineres privilegiados são atenuados. O SELinux impede que os processos de contêiner acessem o conteúdo do host mesmo se esses processos de contêiner conseguirem o acesso aos verdadeiros descritores de arquivo.
-
Na maior parte das instalações,
nsenter
edocker exec
são puramente operações manuais. OpenShift usansenter
para facilitar a porta de encaminhamento, mas sem intervenção manual, vanilla docker nunca irá mover um processo em um contêiner ou entre contêineres.
Diagnostique sua vulnerabilidade
Intervenções necessárias
Todos os clientes da Red Hat que executam as versões afetadas do docker são recomendados a atualizar quando os patches estão disponíveis. Os detalhes sobre os pacotes impactados, bem como a mitigação recomendada, estão abaixo.
Atualizações para os Produtos Afetados
Produto | Pacote | Aviso/Atualização |
---|---|---|
Red Hat Enterprise Linux 7 | docker-latest, docker, runc | pendente |
Red Hat Openshift Container Host | docker-latest, docker | patch para RHEL7 pendente |
RHEL Atomic Host | docker-latest, docker, runc | RHEL7 patch e respin pendente |
Mitigação
ptrace
e outras chamadas perigosas do kernel podem ser banidas de seus contêineres. Perfis seccomp personalizados podem ser criados para proibir esse comportamento (suportado pelo vanilla docker, OpenShift e Kubernetes). Isto irá impedir completamente ataques baseados em CVE-2016-9962.
Comments