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, 协议分析, 子域名枚举, 安全渗透, 密码学, 手动系统调用, 无重启修复, 权限提升, 漏洞缓解, 热补丁, 私有化部署, 系统安全, 网络套接字绑定, 运行时拦截, 防御规避