
Un'implementazione in Go di dirtyfrag (CVE-2026-43284 / CVE-2026-43500)
Due bug. Una shell. Nessuna scrittura su disco.
Porting Go di dirtyfrag (CVE-2026-43284 / CVE-2026-43500).
La classe di bug risiede nel sottosistema XFRM del kernel Linux. Quando una pagina di un file viene passata con splice() in una pipe e poi in un socket crittografato ESP, il kernel decritta il payload ESP in-place - direttamente nella pagina della page cache del file sorgente. Il file è di sola lettura. La page cache no.
dirtyfrag combina due bug indipendenti che sfruttano questa primitiva:
CVE-2026-43284 - percorso ESP/XFRM
Installa 48 SA in modalità trasporto XFRM tramite NETLINK_XFRM. Ogni SA codifica 4 byte del payload shellcode nel campo seq_hi del proprio stato di replay ESN. Una catena vmsplice + splice attiva la decrittazione ESP in-place per ogni SA, scrivendo quei 4 byte nella voce della page cache di /usr/bin/su. 48 trigger, 192 byte scritti, nessuna race condition.
CVE-2026-43500 - percorso RxRPC/rxkad
Esegue brute-force offline su 3 chiavi di sessione PCBC(fcrypt) che producono le sequenze di byte desiderate quando decrittate. Attiva un trigger del socket AF_RXRPC per ogni chiave per modificare la voce di root in /etc/passwd in root::0:0 (nullok). su - accetta quindi una password vuota.
Entrambi i percorsi girano in un namespace utente + di rete (CLONE_NEWUSER | CLONE_NEWNET) per non richiedere CAP_NET_ADMIN sull'host.
go build -o dirtyfrag-go .
./dirtyfrag-go
# Force a specific path
./dirtyfrag-go --force-esp
./dirtyfrag-go --force-rxrpc
# Verbose output
./dirtyfrag-go -v
Il binario tenta prima il percorso ESP. Se /usr/bin/su non risulta patchato, ripiega sul percorso RxRPC (fino a 3 tentativi). In caso di successo apre una shell di root tramite una nuova PTY.
L'exploit tocca solo la page cache. I binari su disco e /etc/passwd non vengono modificati. Un riavvio ripristina tutto. Per svuotare immediatamente senza riavviare:
echo 1 | tee /proc/sys/vm/drop_caches
esp4, esp6 (percorso ESP) e/o rxrpc (percorso RxRPC)Tutti i kernel precedenti alle patch:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
Il runtime di Go è multi-thread fin dall'avvio, quindi unshare(CLONE_NEWUSER) non è consentito. La porta Go riesegue se stessa come processo figlio con SysProcAttr.Cloneflags impostato, che chiama clone() prima che il runtime Go venga inizializzato.
| C (originale) | Go |
|---|
| Dipendenze esterne | nessuna | nessuna |
| File singolo | no | no |
| Binario statico | sì | sì |
| Percorso RxRPC | sì | sì |
| Percorso ESP | sì | sì |
| Isolamento dei namespace | unshare() | re-exec con Cloneflags |