atgreen/block-copyfail

GitHub: atgreen/block-copyfail

利用 BPF LSM 在运行时精准拦截 CVE-2026-31431 漏洞所涉及的 authencesn 算法绑定,无需重启即可实现 Linux 内核提权漏洞的即时缓解。

Stars: 5 | Forks: 1

# 块复制失败 [CVE-2026-31431](https://copy.fail/)("Copy Fail")的概念验证运行时缓解方案——一个通过 `algif_aead` 中的 `authencesn` 密码学模板实现的 Linux 内核提权漏洞。 与模块黑名单不同,此方案**无需重启**。BPF LSM 程序会挂钩 `socket_bind` 并仅阻止存在漏洞的 `authencesn` 算法。所有其他的 `AF_ALG` 使用(dm-crypt、OpenSSL afalg engine、hash、skcipher)均不受影响。 被阻止的尝试会连同 PID、进程名和时间戳一起实时记录到日志中。 ## 前置条件 - Linux 内核 5.7+,并在启动参数中设置了 `CONFIG_BPF_LSM=y` 和 `lsm=bpf` - [SBCL](http://www.sbcl.org/) 2.0+ - [Whistler](https://github.com/atgreen/whistler) (Common Lisp eBPF 编译器) ``` make doctor # check all prerequisites ``` ## 快速开始 ``` git clone https://github.com/atgreen/block-copyfail.git cd block-copyfail make ubi8-build sudo ./block-copyfail ``` 阻止程序将保持活动状态,直到你按下 Ctrl-C,随后会干净地分离。 ## 构建独立二进制文件 ``` make build sudo ./block-copyfail ``` ## 构建可移植二进制文件 (EL8+) 在 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 ``` ## 编译为 ELF 目标文件 生成一个标准的 `.bpf.o` 文件,可由 `bpftool`、`libbpf` 或任何 BPF 加载器加载: ``` 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 ``` 测试脚本会尝试一次 `authencesn` AF_ALG 绑定(不会执行任何漏洞利用)。 **测试终端中的预期输出:** ``` BLOCKED: [Errno 1] Operation not permitted ``` **阻止程序终端中的预期输出:** ``` Copy Fail blocker active — authencesn bind blocked. Other AF_ALG usage (dm-crypt, hash, skcipher) unaffected. Watching for blocked attempts. Press Ctrl-C to exit. TIME PID COMMAND ---- --- ------- 06:38:12 31337 python3 ``` 在未运行阻止程序的情况下,测试脚本会打印: ``` FAIL: bind succeeded (blocker not working) ``` ## 工作原理 BPF 程序通过 `bpf_probe_read_kernel` 从 `socket_bind` 参数中读取 34 字节的 `struct sockaddr_alg`,检查 `salg_family == AF_ALG` 且 `salg_name` 是否以 `"authencesn"` 开头,如果匹配则返回 `-EPERM`。事件会通过环形缓冲区发送到用户空间。 使用 [Whistler](https://github.com/atgreen/whistler) 编写,这是一种可直接编译为 eBPF 字节码的 Common Lisp 方言——不需要 C、clang 或 LLVM。 ## 许可证 MIT
标签:AF_ALG, BPF LSM, Common Lisp, CVE-2026-31431, Docker镜像, Linux内核安全, SBCL, Web报告查看器, Whistler, 协议分析, 子域名枚举, 安全渗透, 密码学, 手动系统调用, 无重启修复, 权限提升, 漏洞缓解, 热补丁, 私有化部署, 系统安全, 网络套接字绑定, 运行时拦截, 防御规避