
BPF-LSM-Blocker für CVE-2026-31431 (Copy Fail) — blockiert authencesn AF_ALG-Bindungen zur Laufzeit, ohne einen Neustart durchzuführen
Proof of Concept-Laufzeitminderung für CVE-2026-31431 („Copy Fail") — eine Linux-Kernel-Privilegieneskalation über die kryptografische Vorlage authencesn in algif_aead.
Im Gegensatz zum Blacklisting von Modulen erfordert dies keinen Neustart. Ein BPF-LSM-Programm hakt socket_bind ein und blockiert alle AF_ALG-AEAD-Bindings — das Subsystem, das von Copy Fail ausgenutzt wird. Dies verhindert Umgehungen über die Verschachtelung kryptografischer Vorlagen (z. B. pcrypt(authencesn(...))). Andere AF_ALG-Nutzungen (Hash, Skcipher) bleiben unberührt.
Blockierte Versuche werden in Echtzeit mit PID, Prozessname und Zeitstempel protokolliert.
CONFIG_BPF_LSM=y und lsm=bpf in den Boot-Parameternmake doctor # alle Voraussetzungen prüfen
git clone https://github.com/atgreen/block-copyfail.git
cd block-copyfail
make ubi8-build
sudo ./block-copyfail
Der Blocker bleibt aktiv, bis Sie Strg-C drücken, und löst sich dann sauber.
Zum Bauen auf Ihrem eigenen Rechner benötigen Sie SBCL und Whistler (den Common-Lisp-eBPF-Compiler):
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
Bauen Sie in einem UBI8-Container, um ein Binary zu erzeugen, das auf RHEL/CentOS/Alma/Rocky 8+, Fedora, Ubuntu 20.04+ und jedem Linux mit glibc 2.28 oder neuer läuft. Auf dem Zielsystem sind weder SBCL noch Whistler erforderlich — kopieren Sie einfach das Binary und führen Sie es aus.
make ubi8-build
scp block-copyfail root@server:
ssh root@server ./block-copyfail
Erzeugt eine standardmäßige .bpf.o-Datei, die von bpftool, libbpf oder einem beliebigen BPF-Loader geladen werden kann:
make elf
sudo mkdir -p /sys/fs/bpf/copyfail
sudo bpftool prog loadall block-copyfail.bpf.o /sys/fs/bpf/copyfail autoattach
Zum Trennen und Entfernen:
sudo rm -rf /sys/fs/bpf/copyfail
Lassen Sie den Blocker in einem Terminal laufen und lösen Sie in einem anderen einen Test aus:
python3 trigger-test.py
Das Testskript versucht ein AF_ALG-AEAD-Binding (es wird kein Exploit ausgeführt).
Erwartete Ausgabe im Testterminal:
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)
Erwartete Ausgabe im Blockerterminal:
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
Ohne laufenden Blocker gibt das Testskript für alle vier Algorithmen ALLOWED aus.
Das BPF-Programm liest 7 Bytes von struct sockaddr_alg aus den socket_bind-Argumenten über bpf_probe_read_kernel, prüft salg_family == AF_ALG und salg_type == "aead" und gibt bei Übereinstimmung -EPERM zurück. Dies blockiert alle AEAD-Algorithmus-Bindings unabhängig von der Vorlagenverschachtelung. Ereignisse werden über einen Ringpuffer an den Userspace gesendet.
Geschrieben in Whistler, einem Common-Lisp-Dialekt, der direkt in eBPF-Bytecode kompiliert — ohne C, clang oder LLVM.
MIT