
# Riscrittura in Golang dell'exploit di escalation dei privilegi locali Copy Fail (CVE-2026-31431), che corrompe la cache di pagina per ottenere i privilegi di root sui sistemi Linux.
732 Byte per Root su ogni principale distribuzione Linux
CVE-2026-31431 (Copy Fail) è un bug logico nel template crittografico authencesn del kernel Linux. Consente a un utente locale non privilegiato di attivare una scrittura deterministica e controllata di 4 byte nella cache delle pagine di qualsiasi file leggibile sul sistema.
CONFIG_CRYPTO_AUTHENC (praticamente tutte le principali distribuzioni dal 2017)Il bug combina due comportamenti:
AF_ALG + splice: splice() trasferisce le pagine della cache per riferimento nello scatterlist di un socket AF_ALG. Per la modalità in-place di decrittazione AEAD, le pagine dei tag (dalla cache delle pagine del file di destinazione) rimangono concatenate allo scatterlist di output tramite sg_chain().
Scrittura scratch di authencesn: crypto_authenc_esn_decrypt() usa dst[assoclen + cryptlen] (oltre il tag, nelle pagine della cache) come spazio scratch per il riordino del numero di sequenza ESN, scrivendo 4 byte controllati dall'attaccante senza mai ripristinarli.
La pagina corrotta non viene mai marcata come sporca, quindi il file su disco rimane invariato. Ma la cache delle pagine in memoria è ciò che viene effettivamente letto — rendendo la corruzione immediatamente visibile a livello di sistema.
L'exploit corrompe la cache delle pagine di /usr/bin/su (o qualsiasi binario setuid) con un piccolo payload shellcode, 4 byte alla volta. Dopo tutte le iterazioni, eseguire su attiva il payload e apre una shell di root.
python3 exp.py
go run exp.go
go build -ldflags "-w -s" -trimpath -o exp exp.go
tinygo build -o exp exp.go
| Capacità | Dettagli |
|---|---|
| Portabile | Lo stesso script funziona su Ubuntu, Amazon Linux, RHEL, SUSE e altro — nessun offset per distribuzione |
| Minuscolo | L'exploit Python è di ~732 byte |
| Furtivo | Bypassa il percorso di scrittura VFS; la pagina non viene mai marcata come sporca; i checksum su disco rimangono invariati |
| Cross-container | La cache delle pagine è condivisa tra i container — vettore di evasione dal container (vedi Parte 2) |
Questo repository è pubblicato esclusivamente a scopo di ricerca educativa e difensiva. Non utilizzare questo codice su sistemi che non possiedi o per i quali non hai esplicita autorizzazione al test.