
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 |
# 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.
L'esecuzione a secco (exploit_cve_2026_31431.py senza --shell) elimina automaticamente
la pagina corrotta all'uscita tramite POSIX_FADV_DONTNEED, quindi le ricerche UID → nome
tornano alla normalità immediatamente.
Dopo l'uso di --shell**, la pagina rimane corrotta finché non viene cancellata.
Finché è corrotta, qualsiasi operazione che risolve UID 1000 → nome (ad esempio ls,
file manager, controlli di proprietà scp/sftp) fallirà o mostrerà identificatori numerici. Per cancellarla:
# Senza privilegi: richiedi l'eliminazione della cache delle pagine di /etc/passwd:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# Dalla console di root:
echo 3 > /proc/sys/vm/drop_caches
Anche un riavvio la cancella.
write4sendmsg([AAD di 8 byte], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; la scrittura temporanea è già stata eseguita
I 4 byte delle posizioni da 4 a 7 dell'AAD (seqno_lo) vengono scritti da
authencesn nella scatterlist di destinazione, che in questo percorso di codice
è la pagina della cache delle pagine che abbiamo estratto da target_fd. L'offset di atterraggio
all'interno della pagina corrisponde all'offset_src che abbiamo passato a splice().
Fino a quando il kernel patchato non arriva alla tua distribuzione:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
Dopo aver applicato la patch, test_cve_2026_31431.py dovrebbe mostrare il messaggio «Precondizione
non soddisfatta» e uscire con codice 0.
La correzione originale riporta le operazioni AEAD in-place a operazioni out-of-place, mantenendo le pagine della cache delle pagine fuori dalle scatterlist modificabili.
algif_aeadalgif_aead nei log di auditUltimo aggiornamento: 3 maggio 2026
Stato: 🔴 CRITICO - Azione immediata richiesta
| 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 |