
Script per rilevare l'esposizione a CVE-2026-31431 (Copy Fail) e le relative mitigazioni su sistemi Linux: verifica del kernel, stato dei moduli, parametri di avvio, raggiungibilità di AF_ALG e stato delle patch della distribuzione.
Script di shell per rilevare vulnerabilità del kernel Linux, verificare lo stato delle mitigazioni e guidare la correzione — progettati per essere eseguiti localmente o su intere flotte tramite SSH, Ansible o pssh.
Copy Fail è una vulnerabilità di escalation dei privilegi locali (LPE) ad alta gravità nel modulo crittografico algif_aead del kernel Linux. Un difetto logico introdotto nel 2017 consente a qualsiasi utente locale non privilegiato di scrivere 4 byte controllati nella cache delle pagine di qualsiasi file leggibile — abbastanza per sovrascrivere un binario setuid e ottenere i privilegi di root. Esiste una proof-of-concept Python funzionante di 732 byte, disponibile pubblicamente.
| CVE | CVE-2026-31431 |
| CVSS | 7.8 (Alto) |
| Divulgata | 29 aprile 2026 |
| Sistemi interessati | Kernel Linux 4.13 – 6.x (2017–2026) |
| Distribuzioni | Ubuntu, RHEL, SUSE, Debian, Amazon Linux e molte altre |
| Sfruttabile da remoto | No — richiede accesso locale |
| Patch disponibile | Parziale — consulta gli advisory della tua distribuzione |
| Controllo | Richiede root? |
|---|---|
| Versione del kernel — se rientri nell'intervallo interessato (≥ 4.13) | No |
Modulo algif_aead — caricato, presente su disco o in blacklist | No |
Parametri di avvio — presenza di initcall_blacklist=algif_aead_init | No |
| Raggiungibilità dei socket AF_ALG — se il percorso di sfruttamento è aperto | No |
| Stato di SELinux | No |
| Stato di AppArmor | Sì — output parziale senza root |
| Stato della patch della distribuzione — CVE elencata nel changelog del kernel | No |
Root non è richiesto per eseguire lo script — tutti i controlli tranne lo stato di AppArmor funzionano come utente normale. L'esecuzione con
sudoè consigliata per risultati completi ed è la scelta più sicura quando si usa il piping dacurl.
Lo script è progettato per funzionare su tutte le principali distribuzioni Linux:
| Famiglia di distribuzioni | Controllo del gestore pacchetti | Percorso del modulo |
|---|---|---|
| Debian, Ubuntu | dpkg + changelog del kernel | /lib/modules/ |
| RHEL, CentOS, Amazon Linux | rpm (kernel, kernel-rt) | /lib/modules/ |
| SUSE, openSUSE | rpm (kernel-default) | /lib/modules/ |
| Arch Linux | pacman + link all'advisory | /usr/lib/modules/ |
| Fedora | rpm + fallback /usr/lib/modules/ | /usr/lib/modules/ |
Richiede
bash— lo script usa sintassi specifica di bash e non funzionerà consh,ashodash. Su Alpine Linux (che usa busybox ash di default), installa prima bash:apk add bash
Senza root — la maggior parte dei controlli funziona:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | bash
Con root — risultati completi inclusa lo stato di AppArmor:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash
Suggerimento: Fissa uno SHA di commit specifico in produzione così lo script non può cambiare all'insaputa:
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/COMMIT_SHA/check_copyfail.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh -o check_copyfail.sh
less check_copyfail.sh
bash check_copyfail.sh # senza root
sudo bash check_copyfail.sh # risultati completi
Ciclo SSH
for HOST in server1 server2 server3; do
echo "=== $HOST ==="
ssh "$HOST" "curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
done
Ansible
- name: Check Copy Fail vulnerability
hosts: all
tasks:
- name: Run check script
script: check_copyfail.sh
become: yes
SSH parallelo
pssh -h hosts.txt -i \
"curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
============================================================
Copy Fail CVE-2026-31431 – Vulnerability Check
============================================================
>>> Kernel Version
[INFO] Running kernel: 5.15.0-107-generic
[WARN] Kernel 5.15.0-107-generic is in the affected range (4.13 – 6.x).
>>> algif_aead Module Status
[WARN] algif_aead module is currently LOADED — system is exploitable.
[WARN] Module file found at: /lib/modules/5.15.0-107-generic/kernel/crypto/algif_aead.ko
[WARN] algif_aead is NOT blacklisted — it can be loaded on demand.
>>> Kernel Boot Parameter Mitigation
[WARN] initcall_blacklist=algif_aead_init is NOT set in boot parameters.
>>> AF_ALG Socket Reachability
[WARN] AF_ALG sockets are reachable by this user — exploit path is open.
>>> Mandatory Access Control (SELinux / AppArmor)
[WARN] Neither SELinux nor AppArmor tools detected — no MAC layer present.
>>> Distribution Patch Status
[WARN] Could not confirm CVE-2026-31431 is listed as fixed in running kernel's changelog.
============================================================
SUMMARY
============================================================
!! LIKELY VULNERABLE — No confirmed mitigation detected.
Recommended actions (in order of preference):
1. Apply your distro's kernel update as soon as available.
2. Add to /etc/modprobe.d/copyfail.conf:
blacklist algif_aead
install algif_aead /bin/true
Then run: sudo depmod -a && sudo update-initramfs -u
3. Add to kernel boot parameters (grub):
initcall_blacklist=algif_aead_init
4. Immediately unload the module if loaded:
sudo rmmod algif_aead
============================================================
Applica queste in ordine di preferenza:
1. Aggiorna il kernel (migliore soluzione)
# Debian / Ubuntu
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
# RHEL / CentOS / Amazon Linux
sudo yum update kernel
# SUSE
sudo zypper update kernel-default
2. Metti il modulo in blacklist (immediato, persistente)
sudo tee /etc/modprobe.d/copyfail.conf << 'EOF'
blacklist algif_aead
install algif_aead /bin/true
EOF
sudo depmod -a
# Debian/Ubuntu
sudo update-initramfs -u
# RHEL/Fedora
sudo dracut -f
3. Scarica il modulo ora (immediato, non persistente tra i riavvii)
sudo rmmod algif_aead
4. Parametro di avvio del kernel (alternativa alla blacklist)
Aggiungi initcall_blacklist=algif_aead_init alla configurazione GRUB e riavvia.
MIT — uso libero, nessuna garanzia implicita. Controlla sempre gli script prima di eseguirli come root.