
Rileva e mitiga CVE-2026-31431 (Copy Fail) sui sistemi Linux.
Una CLI Python senza dipendenze che verifica se un host Linux risulta esposto a CVE-2026-31431 ("Copy Fail") senza eseguire un exploit. Può anche applicare una mitigazione temporanea conservativa quando il componente interessato è caricabile come modulo del kernel. Supporta Debian/Ubuntu, RHEL/Rocky/AlmaLinux, Fedora e SUSE.
pip install copyfail-guard
copyfail-guard
CVE-2026-31431 è un bug logico nell'interfaccia del kernel algif_aead (socket AF_ALG AEAD)
che consente a un utente locale non privilegiato di eseguire una scrittura controllata di 4 byte
nella cache delle pagine di qualsiasi file leggibile, portando all'escalation dei privilegi di root.
CVSS 7.8, presente dal kernel 4.14, corretto nelle release stabili a partire da aprile 2026.
Esiste un exploit pubblico e la vulnerabilità è elencata nel CISA KEV.
Alcuni controlli di vulnerabilità si riducono a "esegui l'exploit e vedi se funziona". Non è una buona pratica da adottare su host di produzione. copyfail-guard adotta un approccio senza exploit. Non tenta di innescare il bug, modificare binari setuid o dimostrare l'exploitabilità. Invece, ispeziona lo stato dell'host (versione del kernel, stato di caricamento dei moduli, configurazione di modprobe) e segnala se la macchina risulta esposta.
| Sottocomando | Azione |
|---|---|
detect | Combina cinque segnali (versione del kernel, /proc/modules, modules.builtin, modules.dep, configurazione modprobe) in uno dei sei verdetti |
fix | Scrive atomicamente una regola modprobe install algif_aead /bin/false e tenta di scaricare algif_aead |
reset | Rimuove la regola modprobe installata da fix (da eseguire dopo l'aggiornamento a un kernel patchato) |
fix è volutamente minimale — non chiama nessun gestore di pacchetti.
La correzione permanente richiede l'aggiornamento del kernel tramite il normale
meccanismo di aggiornamento della tua distribuzione.
pip install copyfail-guard
Oppure esegui direttamente da un checkout senza installare:
PYTHONPATH=src python3 -m copyfail_guard detect
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — VULNERABILE
Distribuzione: Ubuntu 24.04.1 LTS (famiglia debian)
Kernel: 6.8.0-50-generic (ramo 6.12, corretto in 6.12.85)
Modulo: algif_aead — caricato come .ko
Mitigazione: nessuna
Azioni consigliate:
1. Applica subito la mitigazione:
sudo copyfail-guard fix
2. Aggiorna il kernel per una correzione permanente:
Aggiorna il kernel su questo sistema a 6.12.85 o successivo (qualunque
versione la tua distribuzione fornisca una volta integrata la correzione
per CVE-2026-31431), quindi riavvia.
Anteprima sempre con --dry-run prima di applicare:
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Controlli preliminari (Linux, host, root)
[skip] Scriverebbe la blacklist modprobe [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Tenterebbe di scaricare algif_aead (non attualmente caricato) [algif_aead]
[skip] Aggiungerebbe il record di audit [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Controlli preliminari (Linux, host, root)
[ ok ] Scritta blacklist modprobe [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] Scaricato algif_aead [algif_aead]
[ ok ] Aggiunto record di audit [/var/log/copyfail-guard.log]
Prossimo passo per una correzione permanente:
Aggiorna il kernel a una versione con la patch per CVE-2026-31431 usando il
normale meccanismo di aggiornamento della tua distribuzione, quindi riavvia.
Se il modulo è attualmente in uso, il passaggio di scaricamento potrebbe fallire. In tal caso la regola modprobe persistente può comunque essere installata con successo, e copyfail-guard segnalerà il fallimento dello scaricamento come record di azione di tipo avviso piuttosto che fingere che il modulo sia stato rimosso.
--json emette un documento strutturato su stdout, adatto per pipeline jq, Ansible o SOAR:
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
| Codice | Significato |
|---|---|
0 | Sicuro — il verdetto è patched, mitigated o not_applicable; oppure il passaggio di correzione persistente è riuscito |
1 | Vulnerabile — il verdetto è vulnerable o unmitigable_builtin |
2 | Errore — lo stato non può essere determinato, precondizione rifiutata, oppure il passaggio di correzione persistente è fallito |
| Verdetto | Descrizione |
|---|---|
patched | Il kernel in esecuzione è alla versione corretta o successiva |
mitigated | Il kernel è vulnerabile ma algif_aead è bloccato dalla configurazione modprobe |
not_applicable | Il kernel è vulnerabile ma algif_aead non è presente su questo sistema |
vulnerable | Il kernel è vulnerabile, il modulo è caricabile, nessuna mitigazione in atto |
unmitigable_builtin | algif_aead è compilato direttamente nell'immagine del kernel — la mitigazione modprobe non ha effetto; è richiesto l'aggiornamento del kernel |
unknown | La versione del kernel non può essere analizzata o è al di fuori dell'intervallo valutato |
Dopo l'aggiornamento a un kernel patchato, usa il sottocomando reset per rimuovere la
regola modprobe installata da fix:
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Rimuoverebbe /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] Rimosso /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
Riavvia per consentire a algif_aead di caricarsi di nuovo se necessario.
reset è idempotente — se il file è già assente esce con 0 e un
messaggio "niente da fare". Quindi riavvia.
Contenitori. fix rifiuta di essere eseguito all'interno di un contenitore perché /proc/modules
riflette il kernel dell'host ma il contenitore non ha autorità per caricare o scaricare
moduli. Esegui copyfail-guard direttamente sull'host.
algif_aead integrato. Alcuni kernel compilano algif_aead direttamente
nell'immagine (CONFIG_CRYPTO_USER_API_AEAD=y). La mitigazione modprobe non ha effetto in
questa configurazione; l'unica correzione è l'aggiornamento del kernel. detect segnala
unmitigable_builtin in questo caso. Eseguire fix installerà comunque la regola modprobe
(che impedisce il caricamento di qualsiasi copia caricabile coesistente) ma l'istanza
integrata non è influenzata — l'aggiornamento del kernel e il riavvio sono l'unico vero rimedio.
blacklist vs install … /bin/false. Entrambe le direttive bloccano il normale
auto-caricamento, ma install algif_aead /bin/false è più forte perché blocca anche
le normali invocazioni esplicite di modprobe algif_aead. Un amministratore con privilegi
sufficienti può comunque bypassare la policy modprobe, ad esempio usando strumenti di
caricamento moduli di basso livello o flag speciali di modprobe. copyfail-guard installa
sempre la forma più forte. Se il tuo sistema ha già una direttiva blacklist semplice,
lo strumento segnala mitigated ma emette una nota che consiglia l'aggiornamento.
SELinux/AppArmor. Le scritture in /etc/modprobe.d/ su RHEL normalmente ereditano
system_u:object_r:modules_conf_t:s0 dalla directory padre, quindi di solito non è
necessario alcun relabel manuale per il file scritto da copyfail-guard.
initramfs. algif_aead normalmente non è incluso nell'immagine di avvio sulle principali
distribuzioni, quindi copyfail-guard non esegue update-initramfs -u o
dracut -f dopo l'installazione della regola modprobe. Se la tua distribuzione o build
locale include algif_aead in initramfs, segui le linee guida su kernel/moduli della tua
distribuzione.
Apache 2.0 — vedi LICENSE.