
Controllore Bash in sola lettura per la vulnerabilità Copy Fail del kernel Linux (CVE-2026-31431)
Uno script Bash piccolo e leggero in termini di dipendenze che ti dice se il tuo sistema Linux è esposto alla vulnerabilità di escalation dei privilegi locali Copy Fail (CVE-2026-31431).
Lo script è read-only: non sfrutta mai il bug, non carica mai moduli del kernel e non modifica mai il sistema.
Copy Fail è un bug logico nel template crittografico AEAD authencesn del kernel Linux, raggiungibile dallo spazio utente tramite l'interfaccia socket AF_ALG (algif_aead).
| Campo | Valore |
|---|---|
| CVE | CVE-2026-31431 |
| Divulgato | 2026-04-29 |
| CVSS v3.1 | 7.8 (Alto) |
| Classe | Escalation dei Privilegi Locale |
| Componente affetto | crypto/authencesn + crypto/algif_aead |
| Introdotto in | 2017 (ottimizzazione AEAD in-place in algif_aead.c) |
| Correzione principale | commit a664bf3d603d, merged 2026-04-01 |
Un utente locale non privilegiato può attivare una scrittura deterministica e controllata di 4 byte nella cache delle pagine di qualsiasi file che può leggere. Un proof-of-concept pubblico (732 byte di Python) usa questa primitiva per sovrascrivere un binario setuid e ottenere root su praticamente ogni distribuzione mainstream rilasciata dal 2017.
Ogni distribuzione Linux che fornisce un kernel costruito dal 2017 con algif_aead abilitato. Le famiglie confermate affette includono:
# Download the script
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# Make it executable
chmod +x check-copy-fail.sh
# Run it
./check-copy-fail.sh
Oppure clona il repository:
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
Lo script non richiede root. Eseguirlo come utente normale fornisce la visione più realistica della superficie d'attacco, perché è esattamente il contesto che un attaccante avrebbe.
Lo script esegue tre controlli indipendenti e li combina in un unico verdetto.
Legge /etc/os-release e uname -r, quindi confronta il kernel in esecuzione con la versione ufficiale corretta pubblicata dal team di sicurezza della distribuzione. La tabella delle versioni attualmente copre:
Se la tua distribuzione non è nella tabella, lo script utilizza i controlli di runtime qui sotto.
algif_aeadLo script ispeziona quattro cose senza modificare nulla:
lsmod)modinfo)/etc/modprobe.d, /usr/lib/modprobe.d, o /run/modprobe.d/boot/config-<uname> o /proc/config.gzUn modulo blacklistato, non caricato e non built-in chiude la superficie d'attacco anche su un kernel non patchato.
AF_ALGIl segnale più affidabile è ciò che un attaccante vedrebbe effettivamente. Lo script utilizza una piccola sonda Python (socket.socket(AF_ALG, SOCK_SEQPACKET, 0) seguita da bind() al template AEAD authencesn(hmac(sha256),cbc(aes))) per scoprire se i socket AF_ALG possono essere creati e associati da un contesto non privilegiato. La sonda crea, associa e chiude immediatamente il socket senza lasciare nulla di sfruttabile.
Se python3 non è installato, la sonda viene saltata e il verdetto si basa sui controlli 1 e 2.
Per pipeline, gestione della configurazione o scansione di flotte, passa --json:
./check-copy-fail.sh --json
Esempio di output:
{
"verdict": "vulnerable",
"distro_id": "ubuntu",
"distro_version_id": "24.04",
"kernel": "6.8.0-31-generic",
"patched_version": "",
"kernel_status": "unknown",
"module_loaded": 0,
"module_builtin": 0,
"module_available": 1,
"module_blacklisted": 0,
"af_alg_status": "reachable"
}
Questa è l'unica correzione completa. Dopo l'aggiornamento, riavvia affinché il nuovo kernel sia effettivamente in esecuzione.
# Debian / Ubuntu
sudo apt update && sudo apt full-upgrade && sudo reboot
# RHEL / AlmaLinux / Rocky / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# openSUSE / SLES
sudo zypper refresh && sudo zypper update && sudo reboot
# Amazon Linux 2023
sudo dnf upgrade --releasever=latest && sudo reboot
algif_aeadSe non puoi riavviare su un kernel patchato immediatamente, blacklista il modulo vulnerabile. Questo interrompe qualsiasi applicazione che utilizza legittimamente cifrari AEAD AF_ALG (raro sulla maggior parte dei server — verifica prima in un ambiente di staging).
# Persist the blacklist across reboots
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# Unload it from the running kernel right now
sudo rmmod algif_aead 2>/dev/null || true
Se il modulo è built-in, il blacklist non funzionerà ma è possibile disabilitare l'initcall. È necessario un riavvio.
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
Per carichi di lavoro containerizzati, blocca anche la famiglia di socket AF_ALG dal tuo profilo seccomp in modo che un container compromesso non possa raggiungere la superficie del kernel.
== System information ==
[INFO] Distribution : Ubuntu 24.04.2 LTS (ubuntu 24.04)
[INFO] Kernel : 6.8.0-31-generic
== Check 1 / 3 — Kernel version ==
[WARN] No vendor-fixed kernel version is recorded for ubuntu 24.04.
[WARN] Falling back to runtime mitigation checks below.
== Check 2 / 3 — algif_aead kernel module ==
[WARN] algif_aead is not loaded but can be autoloaded on demand (no blacklist found).
== Check 3 / 3 — AF_ALG socket reachability ==
[VULN] AF_ALG sockets are reachable from this unprivileged context.
== Verdict ==
[VULN] This system appears to be VULNERABLE to CVE-2026-31431.
[VULN] Apply the vendor kernel update or blacklist algif_aead as a temporary mitigation.
uname -r. Se stai eseguendo un kernel out-of-tree o ricostruito, il confronto delle versioni potrebbe non riflettere se la correzione è stata effettivamente backportata.blocked_permission per AF_ALG semplicemente perché è in atto seccomp — il kernel host stesso potrebbe essere ancora vulnerabile.MIT — usa, modifica e distribuisci liberamente. Nessuna garanzia.
| Distribuzione | Kernel corretto (≥) |
|---|
| AlmaLinux / RHEL / Rocky / CentOS 8 | 4.18.0-553.121.1.el8_10 |
| AlmaLinux / RHEL / Rocky / CentOS 9 | 5.14.0-611.49.2.el9_7 |
| AlmaLinux / RHEL / Rocky / CentOS 10 | 6.12.0-124.52.2.el10_1 |
| Ubuntu 26.04+ ("Resolute") | non affetto |
| Ubuntu 18.04 – 25.10 | rolling, vedere apt |
| Debian (tutte le suite) | rolling, vedere DSA |
| Verdetto | Codice di uscita | Significato |
|---|
patched | 0 | Il kernel in esecuzione è alla versione corretta dal vendor o superiore. |
mitigated | 0 | AF_ALG è bloccato e il modulo non è caricato. |
likely_mitigated | 0 | Il modulo è blacklistato e non caricato; nessuna sonda live possibile. |
vulnerable | 1 | Il kernel non è patchato e algif_aead / AF_ALG è raggiungibile. |
unknown | 2 | Segnale insufficiente per decidere. Considerare potenzialmente vulnerabile. |
not_applicable | 3 | Non in esecuzione su Linux. |