
Exploit e detector per un'escalation locale dei privilegi nel kernel Linux (CVE-2026-31431) che corrompe la page cache per ottenere i privilegi di root, con indicazioni di mitigazione.
Un fallo critico di 9 anni nel kernel Linux che consente di ottenere accesso root in pochi secondi
| Attributo | Dettagli |
|---|---|
| CVE | CVE-2026-31431 |
| Soprannome | Copy Fail |
| Tipo | Escalation dei Privilegi Locale (LPE) |
| CVSS | 7.8 (High) |
| Scoperto da | Theori (Xint Code) |
| Divulgazione | 29 aprile 2026 |
| Componente | Sottosistema algif_aead del kernel Linux |
Errore nell'ottimizzazione dell'"operazione in-place" introdotta nel 2017 (commit 72548b093ee3). Consente a un utente locale di eseguire una scrittura controllata di 4 byte direttamente nella cache delle pagine del kernel.
AF_ALG per accedere agli algoritmi crittografici del kernel/usr/bin/su) o file sensibili (/etc/passwd)È un bug logico di progettazione, non un overflow di memoria. Richiedeva un'analisi approfondita del sottosistema crittografico per essere rilevato.
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# Verificare la versione del kernel
uname -r
⚠️ Il riavvio è obbligatorio per attivare il nuovo kernel.
# Disabilitare il caricamento del modulo vulnerabile
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# Scaricare il modulo se già in uso
sudo rmmod algif_aead
# Il modulo è solitamente integrato nel kernel
# Aggiungere il parametro di avvio per disabilitarlo
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# Riavviare per applicare le modifiche
sudo reboot
# Svuotare la cache delle pagine a caldo
sudo sysctl -w vm.drop_caches=3
⚠️ Nota: Questo non sostituisce la patch. È solo una misura complementare.
| Data | Evento |
|---|---|
| 29 aprile | Divulgazione pubblica da parte di Theori |
| 1 maggio | Primi tentativi di sfruttamento attivo rilevati |
| 2 maggio | CISA ordina alle agenzie federali USA di applicare la patch entro il 15 maggio |
| 3 maggio | Patch disponibili in Ubuntu, RHEL, AlmaLinux, Debian |
| Distribuzione | Stato | Riferimento |
|---|---|---|
| Ubuntu | ✅ Patchato | USN-8226-1 (20.04, 22.04, 24.04) |
| RHEL/AlmaLinux/Rocky | ✅ Disponibile | Dal 1 maggio |
| Debian | ✅ Nei repository di sicurezza | Aggiornamento disponibile |
| Android | ⏳ Prossimamente | Bollettino di sicurezza di giugno 2026 |
# Ottenere la versione del kernel
uname -r
# Vulnerabile se:
# - v4.14 fino a v7.0-rc (rilasciato tra 2017 e aprile 2026)
# - Contiene il commit 72548b093ee3
# Verificare se il modulo algif_aead è caricato
lsmod | grep algif_aead
# Se appare nell'elenco, il tuo sistema è vulnerabile
Un'IA ha identificato questo difetto che è sfuggito agli sviluppatori per 9 anni. Questo segna un prima e un dopo:
# 1. Detect
python3 prueba.py
# exit 0 = not vulnerable, 2 = vulnerable, 1 = test error
# 2. Exploit (interactive — su will prompt for your own password)
python3 exploit.py --shell
python3 prueba.py
Cosa fa:
Conferma che AF_ALG e l'algoritmo authencesn(hmac(sha256),cbc(aes))
siano accessibili da un processo senza privilegi.
Crea un file sentinella di 4 KiB in una directory temporanea e riempie la cache delle pagine.
Invia 8 byte di AAD inline tramite sendmsg+cmsg con seqno_lo impostato sul
marcatore PWND, quindi copia 32 byte dalla pagina della cache delle pagine della sentinella nel socket di operazione AF_ALG tramite os.splice().
Chiama recv() per avviare la decrittazione. Il controllo di autenticazione fallisce con
EBADMSG; la scrittura temporanea viene eseguita comunque.
Rilegge il file (cache delle pagine, non disco) e cerca il marcatore.
Classi di output:
Precondizione non soddisfatta: AF_ALG o authencesn non disponibili. Exit 0.VULNERABILE a CVE-2026-31431: il marcatore PWND è stato inserito nella pagina modificata.Exit 2.
Cache delle pagine MODIFICATA tramite un percorso di inserimento AEAD in-place: è stata scritta nella pagina,
ma il marcatore non è stato inserito nella posizione prevista.
Trattare come vulnerabile. Exit 2.Cache delle pagine intatta: patchato. Exit 0.Il detector non modifica mai /usr/bin/su, /etc/passwd né alcun altro file al di fuori della directory temporanea che crea, e tale file viene eliminato al termine.
Output. ## Utilizzo LPE
python3 exploit_cve_2026_31431.py # Solo patch, stampa i passaggi successivi
python3 exploit_cve_2026_31431.py --shell # Patch ed esegue `su <utente>`
Funzione:
/etc/passwd e trova l'offset in byte del campo UID di 4 caratteri.
write4 su quell'offset, sostituendo l'UID con0000.
pwd.getpwnam(utente) per confermare che libc ora riporta UID 0.--shell, esegue execvp("su", ["su", utente]). Inserisci la tua
password. PAM valida contro /etc/shadow (non modificato), quindisetuid(getpwnam(user).pw_uid) viene impostato a 0.
richiedono scritture multi-colpo; estendere write4 di conseguenza.
Nessun demone di cache NSS (nscd, sssd, systemd-userdbd) sta mascherando
le letture di /etc/passwd. Se getpwnam restituisce ancora l'UID reale dopo
l'applicazione della patch, riavvia o ignora la cache, oppure seleziona un utente diverso.
La pagina /etc/passwd deve rimanere nella cache tra l'applicazione della patch e
l'esecuzione di su. In pratica, questo è affidabile su qualsiasi sistema con una pressione di memoria normale.
Il file /etc/passwd su disco rimane invariato.