vyahello/CVE-2026-31431
GitHub: vyahello/CVE-2026-31431
针对 CVE-2026-31431 的 Linux 本地提权 PoC,利用内核 algif_aead 路径中的逻辑缺陷覆写页缓存,将「/usr/bin/su」替换为恶意 ELF 以获取 root shell。
Stars: 0 | Forks: 0
# 复制失败 - CVE-2026-31431
本仓库包含一个针对 CVE-2026-31431(也称为 "Copy Fail")的 Linux 本地提权小型 PoC。
该漏洞利用针对的是 AF_ALG 用户空间 crypto API 中的 Linux 内核 `algif_aead` 路径。它使用 `AF_ALG` 加上 `splice()` 强制内核以 4 字节的数据块写入 `/usr/bin/su` 的页缓存中,然后在页缓存被修改后执行 `su`。
## 源码概述
[`copy_fail_exp.py`](./copy_fail_exp.py) 中的 PoC 执行了四个步骤:
1. 为 `aead` 打开一个 `AF_ALG` 套接字,使用的变换为 `authencesn(hmac(sha256),cbc(aes))`。
2. 使用与原始概念验证中相同的 `setsockopt()` 值来配置请求。
3. 使用两次 `splice()` 调用将数据从目标文件移动到 AF_ALG 请求路径中,这正是存在漏洞的内核路径。
4. 解压一个 160 字节的内嵌 payload,并以 4 字节的数据块将其写入目标文件。该 payload 是一个包含 `/bin/sh` 的 ELF 存根。
`zlib` 二进制数据块并非随机数据。它是一个紧凑的 payload,旨在替换页缓存中 `/usr/bin/su` 的开头部分,使得下一次执行 `su` 时会生成一个 root shell。
## 受影响的版本
漏洞代码是在 Linux 内核 4.14 时代的 `algif_aead` 更改中引入的,并一直存在,直到上游修复还原了原地优化。
### 广泛影响范围
- 自 2017 年以来构建的、包含有漏洞的 `algif_aead` 原地路径的 Linux 内核。
- 在该时间窗口内发布内核且尚未向后移植修复补丁的大多数主流发行版。
- 启用了 `AF_ALG` crypto API 的系统,这是大多数通用 Linux 发行版的默认配置。
### 公开测试/验证环境
| 发行版 | 内核 |
| --- | --- |
| Ubuntu 24.04 LTS | `6.17.0-1007-aws` |
| Amazon Linux 2023 | `6.18.8-9.213.amzn2023` |
| RHEL 10.1 | `6.12.0-124.45.1.el10_1` |
| SUSE 16 | `6.12.0-160000.9-default` |
### 上游修复版本点
- `6.18.22`
- `6.19.12`
- `7.0`
下游 LTS 分支只有在厂商将向后移植的补丁应用到你实际运行的内核包中之后才是安全的。
## 复现步骤
请使用你自己的实验室虚拟机或容器宿主机。切勿在生产系统上运行此操作。
1. 启动一个带有受影响内核的系统。
2. 确认 `/usr/bin/su` 存在且具有 setuid-root 权限。
3. 运行 PoC:
```
python3 copy_fail_exp.py
```
4. 如果漏洞利用成功,脚本将修补 `/usr/bin/su`,然后调用 `su`。根据具体环境的不同,你最终应该会进入一个 root shell 或看到 root 提示符。
## 运行
除了 Python 3 标准库之外,该脚本没有其他额外的依赖项。
```
python3 copy_fail_exp.py
```
如果你想先检查目标文件,该脚本目前默认的目标是 `/usr/bin/su`。
## 更新修复
如果你维护下游内核,正确的修复方法是将移除原地 AEAD 优化的上游还原补丁进行向后移植:
- 上游修复提交:`a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5`
- 该修复主要是还原了之前 `72548b093ee3` 的原地更改。
针对下游内核树的推荐工作流程:
```
git cherry-pick a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
make olddefconfig
make -j"$(nproc)"
make modules_install
make install
reboot
```
如果你不自行重新编译内核,请安装包含向后移植补丁的厂商内核包并重新启动进入该系统。
### 临时缓解措施
如果补丁应用被延迟,作为临时措施,请禁用该模块路径:
```
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
```
这仅是一种缓解措施,并非根本修复。
## 备注
- 该 PoC 故意设计得非常小巧且具有确定性。
- 此漏洞利用仅在本地有效,但在共享主机、CI 运行器、Kubernetes 节点和容器平台上影响极大,因为宿主机的页缓存是共享的。
- 该内核漏洞是一个逻辑错误,而不是竞态条件,因此只要存在有漏洞的代码,漏洞利用路径就是可靠的。
标签:0day挖掘, AF_ALG, algif_aead, Amazon Linux, Copy Fail, CVE-2026-31431, PoC, RHEL, splice, SUSE, /usr/bin/su, Web报告查看器, 二进制漏洞, 内核安全, 内核漏洞, 协议分析, 子域名枚举, 安全渗透, 数据展示, 暴力破解, 本地提权, 权限提升, 漏洞复现, 系统安全, 红队, 网络安全, 隐私保护, 页面缓存