
Exploit in Rust per CVE-2026-31431, una primitiva di scrittura della page-cache del kernel Linux tramite AF_ALG splice, che consente l'escalation dei privilegi a root attraverso la modifica di /etc/passwd o l'esecuzione di shellcode.
Implementazione in Rust di CVE-2026-31431 (Copy Fail) — una primitiva di scrittura nella page cache del kernel Linux tramite AF_ALG splice.
L'implementazione algif_aead del kernel Linux consente a un utente non privilegiato di scrivere dati arbitrari nella page cache di qualsiasi file leggibile tramite la syscall splice(). L'algoritmo AEAD authencesn scrive seqno_lo (byte AAD 4-7 controllati dall'utente) nello scatterlist di destinazione all'offset assoclen + cryptlen, che — quando concatenato alle pagine della page cache tramite splice() — produce una scrittura arbitraria di 4 byte. Il contenuto su disco rimane invariato, ma tutti i lettori successivi vedono dati corrotti nella page cache.
Kernel interessati: Linux < 6.12.23, < 6.13.11, < 6.14.2
1. --uid — Imposta il campo UID dell'utente corrente a 0000 in /etc/passwd tramite scrittura nella page cache. Dopo la modifica, su <username> con la propria password apre una shell di root. Lo strumento tenta di svuotare la page cache dopo l'autenticazione e prima di avviare la shell, riducendo la possibilità che SSH continui a vedere l'account come UID 0. Nessuna modifica alla password di root necessaria. Funziona per qualsiasi UID a 4 cifre (1000-9999).
2. --escalate — Modifica la riga di root in /etc/passwd tramite scrittura nella page cache: root:x:0:0:root:... → root::0:0:root :.... Il campo commento viene riempito con spazi per mantenere identica la lunghezza della riga. Dopo la modifica, su root funziona senza password.
3. --set-password — Prima esegue l'escalation (rimuove la password di root), poi legge la nuova password da stdin e la applica con chpasswd.
4. Modalità predefinita (nessuna flag) — Sovrascrive la page cache del binario su con payload shellcode specifici per architettura (x86_64, x86, aarch64), poi esegue su per ottenere una shell di root.
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
Le modifiche alla page cache sono volatili — svuotare la cache ripristina il contenuto originale su disco:
echo 3 > /proc/sys/vm/drop_caches
Questo progetto è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi.
| Flag | Descrizione |
|---|
--check | Preflight sicuro: ispeziona il target su risolto ed esce |
--escalate | Modifica /etc/passwd nella page cache per rimuovere la password di root, poi su root |
--set-password | Prima esegue l'escalation, poi legge una nuova password di root da stdin e la applica tramite chpasswd |
--uid | Imposta l'UID dell'utente corrente a 0 in /etc/passwd, poi su <username> |
--backup <path> | Esegue il backup del binario su prima della sovrascrittura |
--exec <path> | Esegue un comando specifico come root dopo la sovrascrittura |
| OS | Kernel | Risultato |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate superato, --set-password superato, --uid superato |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate superato, --uid superato |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, kernel patchato |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid superato |
| Alpine Linux edge | 6.19.12 | Exploit eseguito, scrittura nella page cache bloccata dalla correzione del kernel |