
# Implementazioni educative multi-linguaggio di exploit per CVE-2026-31431, un'escalation locale dei privilegi del kernel Linux tramite il modulo algif_aead, con un rilevatore sicuro e guida all'uso per CTF.
Repo educativo con implementaciones en múltiples lenguajes del exploit Copy Fail.
Creado y mantenido por @shotafry — perché leggere il CVE non basta. Bisogna riprodurlo.
Copy Fail è una vulnerabilità di escalation dei privilegi locale (LPE) nel kernel Linux, catalogata come CVE-2026-31431. Colpisce il sottosistema crittografico del kernel, in particolare il modulo algif_aead che gestisce le operazioni di cifratura autenticata (AEAD) tramite socket AF_ALG.
Il difetto è stato introdotto nel 2017 in un'ottimizzazione del modulo authencesn ed è rimasto non rilevato per quasi 9 anni, presente in praticamente tutte le distribuzioni Linux moderne.
Ciò che rende speciale Copy Fail rispetto ad altri LPE storici:
| Caratteristica | Copy Fail | LPE tipico |
|---|---|---|
| Necessita race condition | ❌ No | ✅ Sì |
| Necessita offset specifico del kernel | ❌ No | ✅ Sì |
| Funziona su tutte le distro | ✅ Sì | ❌ Normalmente no |
| Affidabilità | 100% deterministico | Variabile |
| Modifica il disco | ❌ No (solo RAM) | Dipende |
La vulnerabilità è stata scoperta da Taeyang Lee del team di ricerca di Theori. L'intera catena di exploit è stata sviluppata dal team Xint Code Research, che ha documentato il processo usando analisi assistita da IA sul sottosistema crypto/ del kernel Linux.
La divulgazione pubblica include PoC funzionante, analisi tecnica completa e documentazione su copy.fail.
CVE: CVE-2026-31431
CVSS: 7.8 — ALTA
Vector: Local
Impacto: Escalada de privilegios completa (root)
Distros: Todas las distribuciones Linux con kernel >= 2017 sin parchear
Il CVSS è 7.8 e non arriva a critico (9+) solo perché richiede accesso locale preventivo — l'attaccante deve già avere una sessione sul sistema. In ambienti cloud e con container Docker, questo requisito è considerevolmente più facile da soddisfare di quanto sembri.
Il kernel Linux conserva in RAM i file letti di recente. Questo si chiama page cache. Quando un processo legge /etc/passwd, il kernel non va al disco — serve la copia in RAM. Questo è più veloce, ma crea una superficie d'attacco: se puoi modificare quella copia in RAM senza toccare il disco, il sistema vedrà dati falsi.
Il modulo algif_aead consente di eseguire operazioni AEAD dallo spazio utente tramite socket AF_ALG. Il bug sta nell'ottimizzazione introdotta nel 2017: quando si usa splice() per passare pagine di un file al socket, quelle pagine della page cache finiscono nella lista di dispersione destinazione (scrivibile) dell'operazione crittografica.
Risultato: qualsiasi utente senza privilegi può scrivere 4 byte controllati in qualsiasi file che possa leggere, senza toccare il disco.
Usuario sin privilegios
│
▼
Abre socket AF_ALG (authencesn)
│
▼
sendmsg() — parámetros AEAD con nuestros 4 bytes en seqno_lo
│
▼
splice() — fichero → pipe → socket op
[BUG] La page cache del fichero queda en el scatterlist destino
│
▼
recv() dispara la operación AEAD
La auth falla (EBADMSG) pero el scratch-write ya ocurrió
│
▼
/etc/passwd (page cache) ahora dice: usuario → UID 0
│
▼
su <usuario> → PAM valida contraseña real → setuid(0) → ROOT
Immagina che il kernel abbia un libro dei registri del castello (/etc/passwd). Copy Fail è come scoprire che se apri l'officina di magia del castello in un ordine molto specifico, il libro dei registri finisce accidentalmente sulla tua scrivania — e puoi cambiare il tuo grado da "soldato semplice" a "re" con una penna. L'archivista (PAM) verifica la tua password ma non controlla il libro originale, solo la copia che hai davanti. Sei re.

>= ~2017 senza la patch di CVE-2026-31431algif_aead disponibile e caricabileQuesto si può davvero saltare e provare direttamente uno degli exploit, ma è anche valido se non vogliamo rischiare di caricarli o crearli e vogliamo solo vedere se funziona, ma gli exploit hanno la loro funzione per verificare se il sistema in questione è vulnerabile.
# Ver versión del kernel
uname -a
# Comprobar si el algoritmo está disponible
grep -i authencesn /proc/crypto
# Comprobar si el módulo está cargado
lsmod | grep alg
Se grep -i authencesn /proc/crypto restituisce authencesn(hmac(sha256),cbc(aes)), il sistema è vulnerabile.
| Lenguaje | Requisito en el objetivo | Compilación previa |
|---|---|---|
| C | Ninguno (binario estático) | gcc en máquina de compilación |
| Python | Python 3.10+ | No |
| Rust | Ninguno (binario estático) | rustc en máquina de compilación |
| Go | Ninguno (binario estático) | go en máquina de compilación |
| Ruby | Ruby + gem fiddle (incluido por defecto) | No |
| Perl | Perl 5 (incluido en prácticamente todo Linux) | No |
Questo repository contiene l'exploit implementato in 6 linguaggi, tutti funzionalmente equivalenti, con commenti didattici in spagnolo.
copy_fail_exploit.c → C — binario estático, cero dependencias
copy_fail_exploit.py → Python — más legible, ideal para aprender
copy_fail_exploit.rs → Rust — la ironía: lenguaje "seguro" explota kernel
copy_fail_exploit.go → Go — binario estático, muy portable
copy_fail_exploit.rb → Ruby — omnipresente en servidores Rails
copy_fail_exploit.pl → Perl — el más silencioso, está en todo Linux
test_cve_2026_31431.py → Detector — verifica vulnerabilidad sin explotar nada
python3 test_cve_2026_31431.py
# Compilar
gcc copy_fail_exploit.c -o copy_fail_c
# Dry-run (limpia al salir, no deja rastro)
./copy_fail_c