ASA-2019-00073 – runC: A execução de contêineres maliciosos permite escapar de contêineres e o acesso ao sistema de arquivos do host


For the English version of this alert, click here.

Allele Security Alert

ASA-2019-00073

Identificador(es)

ASA-2019-00073, CVE-2019-5736

Título

A execução de contêineres maliciosos permite escapar de contêineres e o acesso ao sistema de arquivos do host

Fabricante(s)

Open Container Initiative

Produto(s)

runC

Versão(ões) afetada(s)

Todas as versões do runC suportadas

Versão(ões) corrigida(s)

Versões com o seguinte commit:

https://github.com/opencontainers/runc/commit/0a8e4117e7f715d5fbeef398405813ce8e88558b

Prova de conceito

Sim

Descrição

A vulnerabilidade permite que um contêiner mal-intencionado (com interação mínima do usuário) substitua o binário do host runC e, assim, obtenha execução de código no nível root no host. O nível de interação do usuário é ser capaz de executar qualquer comando (não importa se o comando não é controlado pelo atacante) como root dentro de um contêiner em um desses contextos:

  1. Criando um novo contêiner usando uma imagem controlada pelo atacante.
  2. Anexando (docker exec) em um contêiner existente ao qual o atacante tinha acesso de gravação anterior.

Detalhes técnicos

Foi descoberto que um atacante pode comprometer o binário do host runC de dentro de um contêiner runC privilegiado. Como resultado, isso poderia ser explorado para obter acesso root no host. runC é usado como o tempo de execução padrão para contêineres com Docker, containerd, Podman e CRI-O.

O ataque pode ser feito ao anexar a um contêiner em execução ou ao iniciar um contêiner executando uma imagem especialmente criada. Por exemplo, quando o runC é anexado a um contêiner, o atacante pode executá-lo. Isso pode ser feito substituindo o binário de destino dentro do contêiner por um binário personalizado apontando de volta para o próprio binário do runC. Por exemplo, se o binário de destino era /bin/bash, isso poderia ser substituído por um script executável especificando o caminho do interpretador #!/proc/self/exe (/proc/self/exec é um link simbólico criado pelo kernel para cada processo que aponta para o binário que foi executado para esse processo). Assim, quando o /bin/bash é executado dentro do container, em vez disso, o destino de /proc/self/exe será executado – o que apontará para o binário runc no host. O atacante pode então continuar a escrever no destino /proc/self/exe para tentar substituir o binário runC no host. No entanto, em geral, isso não será bem-sucedido, pois o kernel não permitirá que seja sobrescrito enquanto o runC estiver sendo executado. Para superar isso, o atacante pode, em vez disso, abrir um descritor de arquivo para /proc/self/exe usando o sinalizador O_PATH e então reabrir o binário como O_WRONLY através de /proc/self/fd/<nr> e tentar gravar nele um loop ocupado de um processo separado. Em última análise, ele será bem-sucedido quando as saídas binárias runC. Depois disso, o binário runC é comprometido e pode ser usado para atacar outros contêineres ou o próprio host.

Esse ataque só é possível com contêineres privilegiados, pois exige privilégio de root no host para sobrescrever o binário runC. Os contêineres não privilegiados com um mapeamento de ID sem identidade não têm permissão para gravar no binário do host e, portanto, não são afetados por esse ataque.

Créditos

Adam Iwaniuk e Borys Popławski

Referência(s)

CVE-2019-5736: runc container breakout (all versions)
https://seclists.org/oss-sec/2019/q1/119

CVE-2019-5736 – Red Hat Customer Portal
https://access.redhat.com/security/cve/cve-2019-5736

CVE-2019-5736 (runC): rexec callers as memfd
https://github.com/lxc/lxc/commit/6400238d08cdf1ca20d49bafb85f4e224348bf9d

nsenter: clone /proc/self/exe to avoid exposing host binary to container
https://github.com/opencontainers/runc/commit/0a8e4117e7f715d5fbeef398405813ce8e88558b

CVE-2019-5736
https://github.com/feexd/pocs/tree/master/CVE-2019-5736

Breaking out of Docker via runC – Explaining CVE-2019-5736
https://www.twistlock.com/labs-blog/breaking-docker-via-runc-explaining-cve-2019-5736/

CVE-2019-5736
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736

CVE-2019-5736
https://nvd.nist.gov/vuln/detail/CVE-2019-5736

Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.

Última modificação: 14 junho 2019