
BPF LSM bloqueur pour CVE-2026-31431 (Copy Fail) — bloque les liaisons AF_ALG authencesn à l'exécution sans redémarrage
Preuve de concept d’atténuation à l’exécution pour CVE-2026-31431 (« Copy Fail ») — une élévation de privilèges dans le noyau Linux via le modèle cryptographique authencesn dans algif_aead.
Contrairement au blocage de modules, cela ne nécessite aucun redémarrage. Un programme BPF LSM intercepte socket_bind et bloque toutes les liaisons AEAD AF_ALG — la sous-couche exploitée par Copy Fail. Cela empêche les contournements via l’imbrication de modèles cryptographiques (par ex. pcrypt(authencesn(...))). Les autres usages d’AF_ALG (hash, skcipher) ne sont pas affectés.
Les tentatives bloquées sont journalisées en temps réel avec le PID, le nom du processus et l’horodatage.
CONFIG_BPF_LSM=y et lsm=bpf dans les paramètres de démarragemake doctor # vérifie tous les prérequis
git clone https://github.com/atgreen/block-copyfail.git
cd block-copyfail
make ubi8-build
sudo ./block-copyfail
Le bloqueur reste actif jusqu’à ce que vous appuyiez sur Ctrl-C, puis se détache proprement.
Pour compiler sur votre propre machine, vous avez besoin de SBCL et de Whistler (le compilateur eBPF Common Lisp) :
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
Compilez dans un conteneur UBI8 pour produire un binaire qui fonctionne sur RHEL/CentOS/Alma/Rocky 8+, Fedora, Ubuntu 20.04+ et tout Linux avec glibc 2.28 ou plus récent. Aucun SBCL ni Whistler n’est nécessaire sur le système cible — il suffit de copier le binaire et de l’exécuter.
make ubi8-build
scp block-copyfail root@server:
ssh root@server ./block-copyfail
Produit un fichier .bpf.o standard chargeable par bpftool, libbpf ou tout chargeur BPF :
make elf
sudo mkdir -p /sys/fs/bpf/copyfail
sudo bpftool prog loadall block-copyfail.bpf.o /sys/fs/bpf/copyfail autoattach
Pour détacher et supprimer :
sudo rm -rf /sys/fs/bpf/copyfail
Avec le bloqueur actif dans un terminal, déclenchez un test dans un autre :
python3 trigger-test.py
Le script de test tente une liaison AEAD AF_ALG (aucun exploit n’est exécuté).
Sortie attendue dans le terminal de 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)
Sortie attendue dans le terminal du bloqueur :
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
Sans le bloqueur actif, le script de test affiche ALLOWED pour les quatre algorithmes.
Le programme BPF lit 7 octets de struct sockaddr_alg depuis les arguments de socket_bind via bpf_probe_read_kernel, vérifie salg_family == AF_ALG et salg_type == "aead", et renvoie -EPERM en cas de correspondance. Cela bloque toutes les liaisons d’algorithmes AEAD, quelle que soit l’imbrication de modèles. Les événements sont envoyés à l’espace utilisateur via un tampon en anneau.
Écrit en Whistler, un dialecte Common Lisp qui compile directement en bytecode eBPF — aucun C, clang ou LLVM requis.
MIT