
Proof-of-concept che dimostra l'evasione dal container su Amazon EKS sfruttando Dirty Frag (CVE-2026-43284), una corruzione della page-cache del kernel tramite layer di immagini condivisi e DaemonSets privilegiati.
Una proof-of-concept che dimostra come un Pod Kubernetes predefinito e non privilegiato possa ottenere esecuzione di codice a livello di nodo su Amazon EKS sfruttando la vulnerabilità di corruzione della page cache del kernel Linux Dirty Frag tramite livelli di immagine container condivisi.
Il primitivo di attacco principale è: qualsiasi DaemonSet privilegiato che condivide livelli di immagine con un container controllato dall'attaccante può essere armato per il container escape. Questo PoC usa kube-proxy come esempio concreto, ma la tecnica si generalizza a qualsiasi workload privilegiato sul cluster.
Validato su Amazon EKS (kernel 6.12.80) — un pod non privilegiato scrive [*] success nel filesystem dell'host tramite il DaemonSet privilegiato kube-proxy:

Disclaimer: Questo repository è pubblicato esclusivamente a scopo educativo e difensivo. Usalo solo su sistemi di tua proprietà o per i quali hai esplicita autorizzazione al test.
Dirty Frag (CVE-2026-43284) è una vulnerabilità di corruzione della page cache del kernel Linux nel percorso di ricezione xfrm/ESP. Nel percorso interessato, esp_input() può saltare skb_cow_data() per uno skb non lineare senza frag_list, consentendo a crypto_authenc_esn_decrypt() di memorizzare 4 byte di dati controllati dall'attaccante in una pagina della page cache raggiunta tramite splice().
Il file su disco non viene modificato. I byte corrotti risiedono nella page cache del kernel e vengono osservati dai successivi lettori della stessa pagina di file in cache.
Per tutti i dettagli sulla vulnerabilità originale, vedi V4bel/dirtyfrag.
L'attacco sfrutta tre proprietà che coesistono comunemente nei cluster Kubernetes:
privileged: true, hostNetwork: true, ampie capability, ecc.) che eseguono periodicamente binari dalla propria immagine.Quando queste condizioni si allineano, un pod non privilegiato può corrompere un binario in un livello di immagine condiviso, e un DaemonSet privilegiato sullo stesso nodo eseguirà inconsapevolmente il binario corrotto con i suoi privilegi elevati — ottenendo piena esecuzione di codice a livello di nodo.
Il target della vulnerabilità NON è limitato a kube-proxy. Qualsiasi DaemonSet privilegiato (agenti di monitoraggio, plugin CNI, collector di log, agenti di sicurezza, ecc.) la cui immagine container condivide livelli con un'immagine controllata dall'attaccante è un target valido.
Questo progetto è ispirato al modello di sfruttamento Kubernetes documentato nel Copy Fail Kubernetes PoC, ma usa un primitivo del kernel diverso.
| Proprietà | Copy Fail | Dirty Frag |
|---|---|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 |
| Percorso kernel | AF_ALG + splice() | xfrm/ESP + splice() |
| Requisito namespace | Non richiesto | Richiede user namespace |
| Capability principale usata | Nessuna nel container iniziale | CAP_NET_ADMIN all'interno del nuovo net namespace |
| Modulo rilevante | algif_aead | esp4 |
| Distinzione pratica | Fallisce se il vettore AF_ALG è bloccato | Ancora rilevante quando AF_ALG non è disponibile ma ESP/user namespace sono abilitati |
La catena di attacco ha tre fasi: corruzione della page cache, propagazione tra container ed esecuzione privilegiata.
Il binario PoC esegue la seguente sequenza da un container non privilegiato:
unshare(CLONE_NEWUSER | CLONE_NEWNET).splice() e input ESP appositamente costruiti per attivare il percorso vulnerabile del kernel.Non è richiesto alcun permesso di scrittura sul file target. Il file su disco rimane invariato — solo la page cache in memoria viene corrotta.
I runtime container servono le letture dai livelli inferiori overlay tramite la page cache del kernel. Se il container PoC e kube-proxy condividono lo stesso file di livello inferiore, entrambi osservano le stesse pagine in cache.
L'immagine EKS in questo repository è costruita da:
public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023
Quella base è scelta per corrispondere al livello della toolchain userspace kube-proxy EKS usato nell'ambiente validato.
Quando kube-proxy esegue successivamente un binario della famiglia iptables patchato, il kernel carica le pagine in cache corrotte. Il payload PoC monta il dispositivo root dell'host e scrive un file marcatore in /root/res.
Il contenuto atteso del marcatore è:
[*] success
┌──────────────────────────────┐ ┌────────────────────────┐ ┌──────────────────────────┐
│ Pod PoC │ │ Page Cache del Kernel │ │ DaemonSet kube-proxy │
│ container non privilegiato │ │ │ │ container privilegiato │
│ │ │ │ │ │
│ 1. unshare user+net ns │ │ │ │ │
│ 2. installa SA xfrm │ │ │ │ │
│ 3. splice binario target │────▶│ binario livello │────▶│ esegue binario patchato │
│ tramite percorso ESP │ │ condiviso page cache │ │ payload gira con │
│ │ │ patchato │ │ privilegi di nodo │
└──────────────────────────────┘ └────────────────────────┘ └──────────────────────────┘