
# Exploit di escalation dei privilegi locali per CVE-2026-31431, una sovrascrittura della page-cache AF_ALG + splice nel kernel Linux. Include PoC, script di rilevamento BPFtrace e ambiente di test QEMU per ricerca sulla sicurezza autorizzata.
Escalata di privilegi locale nel kernel Linux tramite AF_ALG + sovrascrittura della page cache con splice
Solo per ricerca sulla sicurezza autorizzata, test di penetrazione e scopi educativi. Non utilizzare contro sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione scritta al test.
CVE-2026-31431 è una vulnerabilità di escalation dei privilegi locale (LPE) nel kernel Linux. Un
utente locale non privilegiato può ottenere accesso root combinando l'interfaccia socket AF_ALG con
splice() per eseguire una scrittura autenticata direttamente in una pagina della page cache appartenente a un
binario setuid.
L'exploit sovrascrive il binario su nella page cache senza modificare l'inode su disco,
bypassando i meccanismi di integrità che si basano esclusivamente sui metadati dei file o sui checksum a livello di blocco.
.
├── exploit.py # PoC — sovrascrittura della page cache ed escalation dei privilegi
├── detect.bt # Script BPFtrace per il rilevamento in tempo reale
├── run-vm.sh # Automazione ambiente di test QEMU (opzionale)
├── PAYLOAD.md # Analisi della codifica del payload (hex → zlib → ELF → shellcode)
└── LICENSE
Esegui exploit.py come utente locale non privilegiato su qualsiasi sistema vulnerabile — non serve sudo:
python3 exploit.py
Lo script esegue i seguenti passaggi:
AF_ALG (algif_aead) e individua il binario su.su come descrittore di file grezzo e sovrascrive le sue pagine nella page cache tramite
AF_ALG + sendfile.Architetture supportate:
Monitora i tentativi di sfruttamento in tempo reale con detect.bt. Richiede root:
sudo bpftrace detect.bt
# oppure
doas bpftrace detect.bt
Lo script traccia tre indicatori per PID utilizzando una bitmask in @suspect[pid]:
Un avviso scatta quando tutti e tre i bit sono impostati (@suspect[pid] == 0x7) sullo stesso PID.
exploit.pyAF_ALG/algif_aead caricatodetect.btbpftrace ≥ 0.12# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
Aggiorna il pacchetto kernel della tua distribuzione a una versione che includa il commit mainline
a664bf3d603d,
che annulla l'ottimizzazione in-place del 2017 di algif_aead in modo che le pagine della page cache non possano più
finire nello scatterlist di destinazione scrivibile. La maggior parte delle principali distribuzioni sta
distribuendo la correzione.
algif_aead (in attesa di una patch)La blacklist può essere aggirata con un modprobe algif_aead esplicito. La direttiva install .../bin/false
sovrascrive completamente il comando di installazione, facendo fallire ogni tentativo di caricamento:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
I sottosistemi nella riga "No" usano direttamente l'API crittografica nel kernel — non passano mai attraverso
AF_ALG. Le prestazioni ricadono sulle normali librerie crittografiche in spazio utente, che è ciò che quasi
tutto il resto già utilizza.
Per verificare se qualcosa sul tuo sistema usa attivamente AF_ALG prima di disabilitarlo:
lsof | grep AF_ALG
ss -xa | grep alg
Nega la creazione di socket(AF_ALG, ...) per i carichi di lavoro non attendibili indipendentemente dallo stato della patch. Aggiungi
AF_ALG (famiglia 38) alla tua lista di negazione seccomp, oppure usa una policy AppArmor/SELinux che
limiti le chiamate socket per i processi non privilegiati.
detect.btDistribuisci lo script di rilevamento incluso su qualsiasi host che non possa essere patchato o bloccato immediatamente. Avviserà su qualsiasi processo che esegue la primitiva di exploit completa in tre passaggi.
run-vm.sh automatizza la creazione di una VM QEMU Ubuntu 24.04 per testare in un ambiente
controllato. exploit.py e detect.bt vengono eseguiti direttamente su qualsiasi host vulnerabile — QEMU non è
richiesto.
| Dipendenza | Note |
|---|---|
qemu-system-x86_64 + KVM | Vedi i comandi di installazione sotto |
wget o curl | Download dell'immagine cloud |
cloud-image-utils | Generazione dell'immagine seed (Docker può sostituire su host non Debian) |
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
sh run-vm.sh
1. Avvia/Crea VM
2. Connetti via SSH
3. Carica file sulla VM (exploit.py, detect.bt)
4. Esegui exploit nella VM
5. Esegui detect.bt nella VM
6. Controlla stato VM
7. Ferma VM
8. Pulisci file VM
0. Esci
| Campo | Valore |
|---|---|
| Utente | ubuntu |
| Password | cve123 |
| Porta SSH | 2222 |
crypto/af_alg.c — sorgente kernelmm/splice.c — sorgente kernelQuesto progetto è concesso in licenza sotto la GNU General Public License v3.0 o successiva. Vedi LICENSE per il testo completo.
Disclaimer: Questo repository è fornito esclusivamente per ricerca sulla sicurezza autorizzata, test di penetrazione e scopi educativi. Gli autori non accettano alcuna responsabilità per qualsiasi uso improprio o danno causato da questo software.
| Campo | Valore |
|---|
| ID CVE | CVE-2026-31431 |
| Tipo | Escalation dei Privilegi Locale (LPE) |
| Punteggio CVSS v3.1 | 7.8 Alto — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (fonte: kernel.org) |
| Sottosistemi kernel | crypto/af_alg.c, mm/splice.c |
| Vettore di attacco | Locale — richiesto account utente non privilegiato |
| Causa principale | algif_aead accetta sendfile() su un socket AEAD senza imporre la semantica copy-on-write sulla pagina della page cache mappata prima che splice() completi il trasferimento |
| Distribuzione | Versione kernel | Arch |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86_64 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86_64 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86_64 |
| SUSE 16 | 6.12.0-160000.9-default | x86_64 |
| Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 |
| Architettura | Varianti |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l, armv6l, armv7l |
| x86 32-bit | i386, i486, i586, i686 |
| MIPS 64-bit | mips64, mips64el |
| LoongArch | loong64, loongarch64 |
| s390x | — |
| Bit | Syscall | Indicatore |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | Socket AF_ALG creato |
0x2 | setsockopt(SOL_ALG, ...) | Operazione crittografica configurata |
0x4 | sendmsg(MSG_MORE) + splice() | Tentativo di sovrascrittura della page cache |
| Interessato? | Sottosistema/Caso d'uso |
|---|
| No | dm-crypt/LUKS, kTLS, IPsec/XFRM, TLS nel kernel |
| No | Build predefinite di OpenSSL, GnuTLS, NSS |
| No | SSH, crittografia del keyring del kernel |
| Forse | OpenSSL con il motore afalg abilitato esplicitamente |
| Forse | Percorsi di offload crittografico embedded o app che legano direttamente socket aead/skcipher/hash |