
BPF LSM blocker per CVE-2026-31431 (Copy Fail) — blocca i bind AF_ALG authencesn in runtime senza riavviare
Prova di concetto di mitigazione runtime per CVE-2026-31431 ("Copy Fail") — un'escalation di privilegi nel kernel Linux tramite il template crittografico authencesn in algif_aead.
A differenza del blacklisting dei moduli, questo non richiede riavvio. Un programma BPF LSM aggancia socket_bind e blocca tutti i bind AEAD AF_ALG — il sottosistema sfruttato da Copy Fail. Questo impedisce bypass tramite annidamento di template crittografici (es. pcrypt(authencesn(...))). Altri usi di AF_ALG (hash, skcipher) non vengono influenzati.
I tentativi bloccati vengono registrati in tempo reale con PID, nome del processo e timestamp.
make doctor # verifica tutti i prerequisiti
git clone https://github.com/atgreen/block-copyfail.git
cd block-copyfail
make ubi8-build
sudo ./block-copyfail
Il blocco rimane attivo finché non premi Ctrl-C, poi si scollega in modo pulito.
Per compilare sulla tua macchina ti servono SBCL e Whistler (il compilatore eBPF in Common Lisp):
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
Compila all'interno di un container UBI8 per produrre un binario che funziona su RHEL/CentOS/Alma/Rocky 8+, Fedora, Ubuntu 20.04+ e qualsiasi Linux con glibc 2.28 o successiva. Non serve SBCL o Whistler sul sistema di destinazione — basta copiare il binario ed eseguirlo.
make ubi8-build
scp block-copyfail root@server:
ssh root@server ./block-copyfail
Produce un file .bpf.o standard caricabile con bpftool, libbpf o qualsiasi loader BPF:
make elf
sudo mkdir -p /sys/fs/bpf/copyfail
sudo bpftool prog loadall block-copyfail.bpf.o /sys/fs/bpf/copyfail autoattach
Per scollegare e rimuovere:
sudo rm -rf /sys/fs/bpf/copyfail
Con il blocco attivo in un terminale, attiva un test in un altro:
python3 trigger-test.py
Lo script di test tenta un bind AEAD AF_ALG (non viene eseguito alcun exploit).
Output previsto nel terminale di test:
BLOCKED: aead/authencesn(hmac(sha256),cbc(aes)) — [Errno 1] Operation not permitted
BLOCKED: aead/gcm(aes) — [Errno 1] Operation not permitted
ALLOWED: hash/sha256
ALLOWED: skcipher/cbc(aes)
Output previsto nel terminale del blocco:
Copy Fail blocker active — all AF_ALG AEAD binds blocked.
Other AF_ALG usage (hash, skcipher) unaffected.
Watching for blocked attempts. Press Ctrl-C to exit.
TIME PID COMMAND
---- --- -------
06:38:12 31337 python3
Senza il blocco attivo, lo script di test stampa ALLOWED per tutti e quattro gli algoritmi.
Il programma BPF legge 7 byte di struct sockaddr_alg dagli argomenti di socket_bind tramite bpf_probe_read_kernel, verifica che salg_family == AF_ALG e salg_type == "aead", e restituisce -EPERM in caso di corrispondenza. Questo blocca tutti i bind di algoritmi AEAD indipendentemente dall'annidamento dei template. Gli eventi vengono inviati allo spazio utente tramite un ring buffer.
Scritto in Whistler, un dialetto di Common Lisp che compila direttamente in bytecode eBPF — senza C, clang o LLVM.
MIT