
Prova de conceito demonstrando escape de contêiner no Amazon EKS ao explorar a corrupção do page-cache do kernel Dirty Frag (CVE-2026-43284) por meio de camadas de imagem compartilhadas e DaemonSets privilegiados.
Uma prova de conceito demonstrando como um Pod Kubernetes padrão, sem privilégios pode alcançar execução de código em nível de nó no Amazon EKS ao explorar a vulnerabilidade de corrupção do page-cache do kernel Linux Dirty Frag por meio de camadas de imagem de contêiner compartilhadas.
O primitivo de ataque central é: qualquer DaemonSet privilegiado que compartilhe camadas de imagem com um contêiner controlado pelo atacante pode ser transformado em arma para escape de contêiner. Este PoC usa o kube-proxy como um exemplo concreto, mas a técnica se generaliza para qualquer workload privilegiado no cluster.
Validado no Amazon EKS (kernel 6.12.80) — um pod sem privilégios escreve [*] success no sistema de arquivos do host por meio do DaemonSet privilegiado kube-proxy:

Aviso: Este repositório é publicado apenas para fins educacionais e defensivos. Use-o exclusivamente em sistemas que você possui ou para os quais tenha autorização explícita para testar.
Dirty Frag (CVE-2026-43284) é uma vulnerabilidade de corrupção do page-cache do kernel Linux no caminho de recepção xfrm/ESP. No caminho afetado, esp_input() pode pular skb_cow_data() para um skb não linear sem frag_list, permitindo que crypto_authenc_esn_decrypt() armazene 4 bytes de dados controlados pelo atacante em uma página do page-cache alcançada por meio de splice().
O arquivo no disco não é modificado. Os bytes corrompidos residem no page-cache do kernel e são observados por leitores posteriores da mesma página de arquivo em cache.
Para detalhes completos sobre a vulnerabilidade original, consulte V4bel/dirtyfrag.
O ataque explora três propriedades que comumente coexistem em clusters Kubernetes:
privileged: true, hostNetwork: true, capabilities amplas, etc.) que executam periodicamente binários de suas imagens.Quando essas condições se alinham, um pod sem privilégios pode corromper um binário em uma camada de imagem compartilhada, e um DaemonSet privilegiado no mesmo nó executará sem saber o binário corrompido com seus privilégios elevados — alcançando execução completa de código em nível de nó.
O alvo da vulnerabilidade NÃO está limitado ao kube-proxy. Qualquer DaemonSet privilegiado (agentes de monitoramento, plugins CNI, coletores de logs, agentes de segurança, etc.) cuja imagem de contêiner compartilhe camadas com uma imagem controlada pelo atacante é um alvo viável.
Este projeto é inspirado no modelo de exploração Kubernetes documentado no Copy Fail Kubernetes PoC, mas usa um primitivo de kernel diferente.
| Propriedade | Copy Fail | Dirty Frag |
|---|---|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 |
| Caminho do kernel | AF_ALG + splice() | xfrm/ESP + splice() |
| Requisito de namespace | Não necessário | Requer user namespaces |
| Principal capability usada | Nenhuma no contêiner inicial | CAP_NET_ADMIN dentro do novo net namespace |
| Módulo relevante | algif_aead | esp4 |
| Distinção prática | Falha se o vetor AF_ALG for bloqueado | Ainda relevante quando AF_ALG está indisponível, mas ESP/user namespaces estão habilitados |
A cadeia de ataque tem três estágios: corrupção do page-cache, propagação entre contêineres e execução privilegiada.
O binário do PoC executa a seguinte sequência a partir de um contêiner sem privilégios:
unshare(CLONE_NEWUSER | CLONE_NEWNET).splice() e entrada ESP elaborada para acionar o caminho vulnerável do kernel.Nenhuma permissão de escrita no arquivo alvo é necessária. O arquivo no disco permanece inalterado — apenas o page-cache na memória é corrompido.
Os runtimes de contêiner atendem leituras das camadas inferiores do overlay por meio do page-cache do kernel. Se o contêiner do PoC e o kube-proxy compartilham o mesmo arquivo de camada inferior, ambos observam as mesmas páginas em cache.
A imagem EKS neste repositório é construída a partir de:
public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023
Essa base é escolhida para corresponder à camada da toolchain userspace do kube-proxy EKS usada no ambiente validado.
Quando o kube-proxy executa em seguida um binário da família iptables com patch, o kernel carrega as páginas em cache corrompidas. O payload do PoC monta o dispositivo raiz do host e escreve um arquivo marcador em /root/res.
O conteúdo esperado do marcador é:
[*] success
┌──────────────────────────────┐ ┌────────────────────────┐ ┌──────────────────────────┐
│ Pod PoC │ │ Page Cache do Kernel │ │ DaemonSet kube-proxy │
│ contêiner sem privilégios │ │ │ │ contêiner privilegiado │
│ │ │ │ │ │
│ 1. unshare user+net ns │ │ │ │ │
│ 2. instalar SAs xfrm │ │ │ │ │
│ 3. splice do binário alvo │────▶│ binário de camada │────▶│ executa binário com │
│ pelo caminho ESP │ │ compartilhada com │ │ patch; payload roda │
│ │ │ page cache alterado │ │ com privilégios de nó │
└──────────────────────────────┘ └────────────────────────┘ └──────────────────────────┘