
Exploit per CVE-2026-31431, una vulnerabilità authencesn del kernel Linux che consente l'escalation dei privilegi locali a root tramite la manipolazione della cache di pagina.
"Copy Fail" è una vulnerabilità logica critica nel template crittografico authencesn del kernel Linux. Consente a un utente locale non privilegiato di attivare una scrittura deterministica e controllata di 4 byte nella cache delle pagine di qualsiasi file leggibile sul sistema. Prendendo di mira i binari setuid (come /usr/bin/su), un attaccante può modificare la cache di esecuzione in memoria per elevare i privilegi a Root (UID 0).
A differenza di vulnerabilità più vecchie come "Dirty Cow" o "Dirty Pipe", Copy Fail è un difetto logico lineare che si attiva senza condizioni di gara, tentativi ripetuti o finestre temporali soggette a crash. È altamente portabile e furtivo, poiché modifica solo la cache delle pagine in memoria lasciando il file su disco completamente invariato, bypassando gli strumenti standard di monitoraggio dell'integrità dei file.
La vulnerabilità esiste all'intersezione di tre distinti componenti del kernel:
splice(): La syscall splice() trasferisce dati tra descrittori di file e pipe senza copiarli, passando le pagine della cache per riferimento. Quando un utente esegue lo splice di un file (come /usr/bin/su) in un socket AF_ALG, la scatterlist di input del socket contiene riferimenti diretti alle pagine memorizzate nella cache del kernel di quel file.authencesn: L'algoritmo authencesn (usato per i Numeri di Sequenza Estesi IPsec) richiede il riarrangiamento dei byte. Per fare ciò, scrive temporaneamente 4 byte di numeri di sequenza nel buffer di output come "spazio scratch". Tuttavia, scrive oltre il legittimo confine di output.A causa dell'ottimizzazione in-place del 2017, la scatterlist di output contiene le pagine della cache di sola lettura passate da splice(). Quando authencesn scrive oltre il confine di output, sovrascrive direttamente 4 byte nella memoria cache del kernel del file di destinazione.
Un attaccante può sfruttare questa vulnerabilità seguendo questi passaggi:
AF_ALG non privilegiato e associarlo a authencesn(hmac(sha256),cbc(aes)).sendmsg() appositamente costruita con un payload di Dati Autenticati Associati (AAD) contenente i 4 byte che si desidera scrivere.splice() per convogliare il file di destinazione (/usr/bin/su) nel socket. L'offset e la lunghezza definiscono esattamente dove nella cache delle pagine verranno scritti i 4 byte.recv() attiva l'operazione di decrittazione, eseguendo la scrittura scratch fuori dai limiti direttamente nella cache delle pagine del file di destinazione.execve("/usr/bin/su")). Il kernel esegue la versione manomessa della cache delle pagine contenente lo shellcode dannoso iniettato, concedendo l'accesso root.Se l'applicazione della patch o il riavvio del kernel non sono immediatamente possibili, è possibile mitigare questa vulnerabilità mettendo in blacklist tutti i moduli af_alg correlati e scaricandoli dalla memoria.
Per bloccare questi moduli, eseguire i seguenti comandi:
# 1. Scaricare i moduli dalla memoria se attualmente caricati
sudo modprobe -r algif_hash algif_skcipher algif_aead algif_rng af_alg
# 2. Aggiungere i moduli alla blacklist
echo -e "blacklist af_alg\nblacklist algif_hash\nblacklist algif_skcipher\nblacklist algif_aead\nblacklist algif_rng" | sudo tee /etc/modprobe.d/stop-exploit.conf
# 3. Impedire il caricamento completo del modulo af_alg
echo "install af_alg /bin/true" | sudo tee -a /etc/modprobe.d/stop-exploit.conf
# 4. Riavviare il sistema per garantire che le modifiche abbiano pieno effetto
sudo reboot
Il team di sicurezza del kernel Linux ha corretto questa vulnerabilità (Commit: a664bf3d603d). La patch ripristina le operazioni AEAD di AF_ALG a un modello out-of-place, separando le scatterlist di origine e destinazione. Ciò impedisce che le pagine della cache vengano esposte alla scatterlist di destinazione scrivibile.
Azione Richiesta: Aggiornare il kernel della propria distribuzione all'ultima versione fornita dal proprio vendor (Ubuntu, Amazon Linux, RHEL, SUSE, ecc.) e riavviare il sistema.