
Passive scanner per host Linux che classifica l'esposizione a CVE-2026-31431 tramite versione del kernel, changelog della distribuzione, stato dei moduli e raggiungibilità di AF_ALG, con output JSON per l'integrazione con SIEM.
Autori/Contributori: Patrick Doyle (Autore/Mantainer), Effie Renard (Co-Autore), Kimberly-Lee Banks (Co-Autore), Chris F. (Supporto/Revisione del codice)
Dichiarazione sull'IA: Claude Code è stato utilizzato per scrivere i file di test, scrivere i dati di test e per una revisione della sicurezza del codice. Tutte le modifiche sono state verificate manualmente da uno dei contributori.
Un singolo binario Go collegato staticamente che classifica l'esposizione di un host Linux a CVE-2026-31431.
Lo strumento è passivo. Non sfrutta il bug. La sonda del meccanismo (vedi dichiarazione di sicurezza sotto) emette esattamente due syscall e non tocca mai il percorso del codice vulnerabile.
| Segnale | Fonte | Flag |
|---|
| Versione del kernel rispetto alla correzione a monte | uname(2) | --kernel-version |
| Il changelog della distribuzione menziona la CVE | apt/rpm/apk o changelog.Debian.gz su disco | --changelog |
Stato del modulo algif_aead | /proc/modules, modprobe.d, /lib/modules | --module |
| Superficie vulnerabile raggiungibile | socket(AF_ALG) + bind(authencesn(...)) | --mechanism |
| Compilato in vmlinux | /boot/config-$(uname -r) o /proc/config.gz | (parte di --module) |
Se non vengono forniti flag di controllo, vengono eseguiti tutti e quattro.
| Modalità | Attivazione | Caso d'uso |
|---|---|---|
| Stile grafico (Predefinita) | stdout TTY, nessun override --format, nessuna env NO_COLOR | Esecuzioni in shell interattive |
| Testo semplice | stdout non-TTY, OPPURE --format=text, OPPURE NO_COLOR=1, OPPURE --no-color | Script di shell, Pipe |
| JSON | --format=json | Ingestione Syslog/SIEM, Script di shell |
| Silenziosa | --quiet | Solo codice di uscita (automazione/script) |
Forza la modalità grafica quando si usa una pipe: cvecheck --pretty | tee report.txt.
Forza la modalità testo in un TTY: cvecheck --no-color o NO_COLOR=1 cvecheck.
La sonda emette esattamente due syscall socket(AF_ALG, SOCK_SEQPACKET, 0) e bind(fd, &SockaddrALG{Type:"aead", Name:"authencesn(hmac(sha256), cbc(aes))"}). Segue poi close(fd). Non esegue nessun setsockopt per una chiave, nessun accept, nessun sendmsg, nessuna splice e nessuna creazione di pipe. Il percorso del codice vulnerabile richiede sendmsg di dati crittografici combinato con una splice da un file descriptor supportato da page-cache; nessuna di queste operazioni avviene, quindi il bug non può essere innescato.
Una sonda riuscita significa che la superficie è raggiungibile. Se il kernel contiene ancora il bug viene deciso dai segnali di versione del kernel + changelog.
Effetto collaterale: un bind riuscito carica automaticamente algif_aead tramite l'autoloader dei moduli del kernel. Il controllo del modulo viene eseguito prima della sonda del meccanismo, quindi il report sullo stato di caricamento è pre-sonda. Per sopprimere completamente l'autoload, inserire prima algif_aead nella blacklist.
| Codice | Significato |
|---|---|
0 | PATCHED / NOT_VULNERABLE / MITIGATED / LIKELY_NOT_EXPLOITABLE |
2 | VULNERABLE o MECHANISM_REACHABLE (scansione parziale, versione del kernel non controllata) |
3 | INCONCLUSIVE (segnali insufficienti) |
| Distribuzione | Rilevamento | Pacchetto kernel | Note |
|---|---|---|---|
| Ubuntu / Debian / Mint / Pop!_OS | apt | linux-image-$(uname -r) | La lettura del changelog da disco evita la fragilità di rete di apt changelog sui kernel firmati |
| RHEL / CentOS / Rocky / Alma / Fedora / Amazon Linux | rpm | kernel | Include algif_aead compilato (CONFIG_..._AEAD=y); la mitigazione tramite blacklist non è efficace |
| Oracle Linux | rpm | kernel o kernel-uek | UEK rilevato tramite la sottostringa uek in uname -r |
| openSUSE / SLES | rpm | kernel-default | |
| Alpine | apk | linux-lts / linux-virt / ecc. | La variante viene scelta dal suffisso della release |
| Arch / CachyOS / Manjaro / Endeavour / Gentoo | nessuno | n/d | Rolling/source: si basa sul controllo della versione del kernel |
Rileva automaticamente la tua architettura, scarica il binario corretto in $(pwd) e verifica il suo SHA-256 rispetto ai SHA256SUMS pubblicati:
curl -fsSL https://copyfail.pcdoyle.dev/install.sh | sh
Lo script esce con codice non-zero in caso di mancata corrispondenza del checksum e rimuove il file danneggiato.
Scegli il binario per l'architettura del tuo host:
| Architettura | Binario |
|---|---|
Intel/AMD 64-bit (x86_64) | cvecheck-linux-x86_64 |
ARM 64-bit (aarch64) | cvecheck-linux-arm64 |
Intel/AMD 32-bit (i?86) | cvecheck-linux-x86 |
Verifica prima di eseguire:
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/cvecheck-linux-x86_64
curl -LO https://github.com/pcdoyle/copy-fail-cve-2026-31431/releases/latest/download/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
chmod +x cvecheck-linux-x86_64
make build # bin/cvecheck-linux-{x86_64,arm64,x86}
# SCP(SFTP) al Server:
scp ./bin/cvecheck-linux-x86_64 host:/tmp/ # Meno di 4 MB, statico, nessuna dipendenza da glibc
# SSH:
ssh <host>
# Eseguire il Binario:
/tmp/cvecheck-linux-x86_64 # Output grafico leggibile.
/tmp/cvecheck-linux-x86_64 --format=json # Adatto a Script, Syslog e SIEM
/tmp/cvecheck-linux-x86_64 --format=text # Adatto a Script e Pipe
ssh <host> /tmp/cvecheck-linux-x86_64 # Se eseguito direttamente, il default è --format=text
ssh <host> /tmp/cvecheck-linux-x86_64 --format=json # Adatto a Syslog/SIEM
Monta la root dell'host in una posizione leggibile e passa --root:
docker run --rm -v /:/host:ro alpine /tmp/cvecheck --root /<host-path>
--root controlla tutte le ricerche su disco (/etc/os-release, modprobe.d, /lib/modules, /boot/config-*, file changelog). La sonda della versione del kernel e del meccanismo toccano comunque il kernel in esecuzione tramite uname(2) e socket(AF_ALG, ...).
Risolta in questo ordine (vince la prima corrispondenza):
PATCHED: Il changelog della distribuzione fa riferimento all'ID CVE.NOT_VULNERABLE: Il kernel in esecuzione è >= alla versione corretta a monte.MITIGATED: algif_aead in blacklist e non caricato e non compilato in vmlinux.LIKELY_NOT_EXPLOITABLE: AF_ALG non disponibile e modulo non su disco.MECHANISM_REACHABLE: Superficie raggiungibile ma versione del kernel non controllata.VULNERABLE: Kernel nell'intervallo vulnerabile e meccanismo raggiungibile.INCONCLUSIVE: Nessuna delle precedenti corrisponde.Se --mechanism viene eseguito insieme a --kernel-version ed entrambi segnalano problemi, il risultato è VULNERABLE con un suggerimento di rimedio.
algif_aead in blacklist finché non arriva l'aggiornamento del kernel.
echo 'blacklist algif_aead' | sudo tee /etc/modprobe.d/cve-2026-31431.conf
sudo rmmod algif_aead 2>/dev/null
CONFIG_CRYPTO_USER_API_AEAD=y mette il simbolo dentro vmlinux. Solo un aggiornamento del kernel (o una live patch stile kpatch) risolve l'esposizione. Lo strumento lo rileva.| Sintomo | Causa | Soluzione |
|---|---|---|
changelog: error="apt: exit status 100 ... Changelog unavailable for linux-signed-amd64" | Kernel firmato Debian/Ubuntu; il mirror apt non serve il changelog del pacchetto sorgente | L'errore appare solo quando il file su disco manca oltre al mirror inaccessibile; installa apt-doc o attendi il mirror. |
module: ... config_src="" | Nessun config del kernel leggibile (niente /boot/config-*, niente /proc/config.gz, /boot è accessibile solo da root) | Esegui come root, oppure accetta che BuiltIn non possa essere determinato. Il verdetto può comunque essere risolto tramite altri segnali. |
mechanism: error="EAFNOSUPPORT" | Kernel compilato senza CONFIG_CRYPTO_USER_API, quindi l'host non è vulnerabile tramite AF_ALG | Il verdetto sarà LIKELY_NOT_EXPLOITABLE. |