概念验证 针对 CVE-2026-31431(“Copy Fail”)的运行时缓解方案——一种通过 algif_aead 中的 authencesn 加密模板实现的 Linux 内核权限提升漏洞。
与模块黑名单不同,此方案无需重启。一个 BPF LSM 程序挂接 socket_bind 并阻止所有 AF_ALG AEAD 绑定——即 Copy Fail 所利用的子系统。这可以防止通过加密模板嵌套(例如 pcrypt(authencesn(...)))实现的绕过。其他 AF_ALG 用法(hash、skcipher)不受影响。
被阻止的尝试会实时记录,包含 PID、进程名和时间戳。
make doctor # 检查所有前提条件
git clone https://github.com/atgreen/block-copyfail.git
cd block-copyfail
make ubi8-build
sudo ./block-copyfail
阻止器将持续运行,直到您按下 Ctrl-C,然后干净地分离。
要在您自己的机器上构建,您需要 SBCL 和 Whistler(Common Lisp eBPF 编译器):
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
在 UBI8 容器内构建,生成可在 RHEL/CentOS/Alma/Rocky 8+、Fedora、Ubuntu 20.04+ 以及任何使用 glibc 2.28 或更新版本的 Linux 上运行的二进制文件。目标系统上无需 SBCL 或 Whistler——只需复制二进制文件并运行即可。
make ubi8-build
scp block-copyfail root@server:
ssh root@server ./block-copyfail
生成可由 bpftool、libbpf 或任何 BPF 加载器加载的标准 .bpf.o 文件:
make elf
sudo mkdir -p /sys/fs/bpf/copyfail
sudo bpftool prog loadall block-copyfail.bpf.o /sys/fs/bpf/copyfail autoattach
分离并移除:
sudo rm -rf /sys/fs/bpf/copyfail
在一个终端中运行阻止器,在另一个终端中触发测试:
python3 trigger-test.py
测试脚本尝试进行 AF_ALG AEAD 绑定(不执行任何漏洞利用)。
测试终端中的预期输出:
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)
阻止器终端中的预期输出:
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
在未运行阻止器的情况下,测试脚本会对所有四种算法打印 ALLOWED。
BPF 程序通过 bpf_probe_read_kernel 从 socket_bind 参数中读取 struct sockaddr_alg 的 7 个字节,检查 salg_family == AF_ALG 和 salg_type == "aead",匹配时返回 -EPERM。这会阻止所有 AEAD 算法绑定,无论模板嵌套如何。事件通过环形缓冲区发送到用户空间。
使用 Whistler 编写,这是一种可直接编译为 eBPF 字节码的 Common Lisp 方言——无需 C、clang 或 LLVM。
MIT