kaleth4/CVE-2026-31431
GitHub: kaleth4/CVE-2026-31431
Linux内核CVE-2026-31431本地权限提升漏洞的检测与利用工具,通过algif_aead子系统的4字节可控写入实现root提权。
Stars: 0 | Forks: 0
# 🚨 CVE-2026-31431:Copy Fail
## 📋 执行摘要
| 属性 | 详情 |
|----------|----------|
| **CVE** | CVE-2026-31431 |
| **绰号** | Copy Fail |
| **类型** | 本地权限提升(LPE) |
| **CVSS** | 7.8(高危) |
| **发现者** | Theori(Xint Code) |
| **披露日期** | 2026年4月29日 |
| **受影响组件** | Linux 内核 `algif_aead` 子系统 |
## ⚡ 为何如此危险?
### 🎯 速度极快
- 漏洞利用即时生效:**不到 1 秒**即可获得 root 权限
- Python 脚本仅 **732 字节**
### 👻 完全隐蔽
- 仅修改 **内存 RAM**(页缓存),不修改磁盘
- 文件完整性工具 **无法检测到**
- 重启后痕迹消失(取证分析受阻)
### 🌍 影响范围极广
- 影响 **几乎所有现代发行版**
- 内核版本从 **v4.14(2017)到 v7.0-rc**
- 长达 **9 年**未被发现的漏洞
### ☁️ 云/Kubernetes 风险
- 可实现 **容器逃逸**到宿主机
- 页缓存在宿主机和容器之间共享
- 对多租户环境影响严重
## 🔍 技术细节
### 根本原因
2017 年引入的"原地操作"优化存在缺陷(提交 `72548b093ee3`)。允许本地用户进行 **受控的 4 字节写入**,直接写入内核页缓存。
### 利用机制
1. 攻击者使用 `AF_ALG` 接口访问内核加密算法
2. 篡改内存中的 setuid 二进制文件(`/usr/bin/su`)或敏感文件(`/etc/passwd`)
3. 执行被篡改的二进制文件后获得 root shell
### 为何未被察觉
这是一个 **逻辑设计缺陷**,而非内存溢出。发现它需要深入分析加密子系统。
## 📊 受影响系统
### ✅ 已确认
- **Ubuntu**:20.04、22.04、24.04 LTS
- **RHEL/AlmaLinux/Rocky Linux**:所有现代版本
- **Debian**:所有使用 v4.14+ 内核的版本
- **Amazon Linux 2023**
- **SUSE**:近期版本
## 🛡️ 修复方案
### 1️⃣ 根本解决方案:更新内核
```
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# 验证内核版本
uname -r
```
⚠️ **必须重启**才能激活新内核。
### 2️⃣ 紧急缓解措施(无需立即重启)
#### 适用于 Ubuntu/Debian:
```
# 禁用易受攻击模块的加载
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# 如果已使用则卸载模块
sudo rmmod algif_aead
```
#### 适用于 RHEL/AlmaLinux:
```
# 该模块通常已内置在内核中
# 添加启动参数以禁用它
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# 重启以应用更改
sudo reboot
```
### 3️⃣ 清理缓存(若怀疑已被利用)
```
# 清除热页缓存
sudo sysctl -w vm.drop_caches=3
```
⚠️ **注意**:这不能替代补丁,仅作为补充措施。
## 📅 事件时间线
| 日期 | 事件 |
|-------|--------|
| **4 月 29 日** | Theori 公开披露 |
| **5 月 1 日** | 检测到首批主动利用尝试 |
| **5 月 2 日** | CISA 命令美国联邦机构在 5 月 15 日前完成修补 |
| **5 月 3 日** | Ubuntu、RHEL、AlmaLinux、Debian 推出补丁 |
## 📦 补丁状态
| 发行版 | 状态 | 参考 |
|--------------|--------|-----------|
| **Ubuntu** | ✅ 已修复 | USN-8226-1(20.04、22.04、24.04) |
| **RHEL/AlmaLinux/Rocky** | ✅ 可用 | 自 5 月 1 日起 |
| **Debian** | ✅ 安全仓库已更新 | 更新可用 |
| **Android** | ⏳ 即将推出 | 2026 年 6 月安全公告 |
## 🔐 验证您的系统
### 您的内核是否易受攻击?
```
# 获取内核版本
uname -r
# 如果符合以下条件则存在漏洞:
# - v4.14 到 v7.0-rc(2017年4月至2026年发布)
# - 包含 commit 72548b093ee3
# 验证 algif_aead 模块是否已加载
lsmod | grep algif_aead
# 如果出现在列表中,则您的系统存在漏洞
```
## 🧬 安全分析:AI 因素
### 最具颠覆性:AI 在 1 小时内发现
一个 AI 发现了这个被开发者忽视长达 **9 年** 的漏洞。这是一个分水岭:
- 🤖 机器可以 **比人类更快** 审计内核代码
- 🔍 自动发现复杂的逻辑缺陷
- ⚠️ 对未来零日研究的 implications
## 快速开始
```
# 1. Detect
python3 prueba.py
# exit 0 = not vulnerable, 2 = vulnerable, 1 = test error
# 2. Exploit (interactive — su will prompt for your own password)
python3 exploit.py --shell
```
## 检测器使用方法
```
python3 prueba.py
```
功能说明:
1. 确认 `AF_ALG` 和 `authencesn(hmac(sha256),cbc(aes))` 算法可从非特权进程访问。
2. 在临时目录中创建 4 KiB 哨兵文件并填充页缓存。
3. 通过 `sendmsg`+cmsg 发送 8 字节 AAD,其中 seqno_lo 设置为 `PWND` 标记,然后通过 `os.splice()` 将哨兵页缓存中的 32 字节复制到 AF_ALG 操作套接字。
4. 调用 `recv()` 开始解密。认证检查失败并返回 `EBADMSG`;但写入操作仍会执行。
5. 重新读取文件(从页缓存,非磁盘)并搜索标记。
输出类别:
- **前置条件未满足**:`AF_ALG` 或 `authencesn` 不可用。退出码 0。
- **易受 CVE-2026-31431 攻击**:`PWND` 标记被插入到修改后的页面中。退出码 2。
- **页缓存通过 AEAD 原地插入路径被修改**:有数据写入页面,但标记未出现在预期位置。按易受攻击处理。退出码 2。
- **页缓存完好**:已打补丁。退出码 0。
检测器永远不会修改 `/usr/bin/su`、`/etc/passwd` 或其创建的临时目录之外的任何文件,且该文件在退出时会删除。
## LPE 使用方法
```
python3 exploit_cve_2026_31431.py # Solo parchea, imprime los siguientes pasos
python3 exploit_cve_2026_31431.py --shell # Parchea y ejecuta `su `
```
功能:
1. 在 `/etc/passwd` 中查找当前用户的 UID 行,并定位 4 字符 UID 字段的字节偏移量。
2. 在该偏移量上执行 `write4`,将 UID 替换为 `0000`。
3. 调用 `pwd.getpwnam(用户)` 确认 libc 现在报告 UID 为 0。
4. 使用 `--shell` 时,执行 `execvp("su", ["su", 用户])`。输入您自己的密码。PAM 针对 `/etc/shadow`(未修改)进行验证,然后 `setuid(getpwnam(用户).pw_uid)` 被设置为 0。
### 前提条件
- 运行中的用户具有 4 位 UID(1000-9999)。1-3 位 UID 需要多次写入;请根据需要扩展 `write4`。
- 没有 NSS 缓存守护进程(`nscd`、`sssd`、`systemd-userdbd`)掩盖对 `/etc/passwd` 的读取。如果补丁应用后 `getpwnam` 仍返回真实 UID,请重启或清除缓存,或选择其他用户。
- `/etc/passwd` 页面必须在补丁应用和 `su` 执行之间保留在缓存中。在任何内存压力正常的系统中,这在实践中是可靠的。
### 还原
磁盘上的 `/etc/passwd` 文件保持不变。
干运行(不带 `--shell` 运行 `exploit_cve_2026_31431.py`)会在退出时通过 `POSIX_FADV_DONTNEED` 自动清除损坏的页面,因此 UID → 名称查找会立即恢复正常。
使用 **`--shell`** 后,页面保持损坏状态直到被清除。损坏期间,任何解析 UID 1000 → 名称的操作(例如 `ls`、文件管理器、scp/sftp 所有权检查)都会失败或显示数字 ID。清除方法:
```
# 无权限:请求清除 /etc/passwd 的页缓存:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# 从 root 控制台:
echo 3 > /proc/sys/vm/drop_caches
```
重启也会清除它。
## `write4` 工作原理
```
sendmsg([AAD de 8 bytes], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; la escritura temporal ya se ha realizado
```
AAD 位置 4-7 的 4 字节(`seqno_lo`)由 `authencesn` 写入目标分散列表,在该代码路径中,这是我们从 `target_fd` 提取的页缓存页面。页面内的着陆偏移量对应于我们传递给 `splice()` 的 `offset_src`。
## 缓解措施
在补丁内核到达您的发行版之前:
```
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
```
应用补丁后,`test_cve_2026_31431.py` 应显示"前置条件未满足"消息并以退出码 0 退出。
原始修复将 AEAD 原地操作恢复为原地操作,使页缓存页面远离可修改的分散列表。
## 📚 官方参考
- [CVE-2026-31431 - NVD](https://nvd.nist.gov)
- [Copy Fail 补丁 - AlmaLinux](https://almalinux.org)
- [Sysdig 安全研究](https://sysdig.com)
- [CISA 警报](https://cisa.gov)
## ⚡ 最终建议
1. **关键优先级**:在 **2026 年 5 月 15 日前**更新内核(CISA 强制要求)
2. **若无法重启**:应用临时缓解措施,禁用 `algif_aead`
3. **在云/Kubernetes 环境中**:立即确认您的节点已打补丁
4. **监控**:在审计日志中查找 `algif_aead` 模块加载尝试
**最后更新**:2026 年 5 月 3 日
**状态**:🔴 严重 - 需要立即行动
标签:0day挖掘, AF_ALG, algif_aead, Chrome Headless, CVE-2026-31431, exploit, Kubernetes安全, Linux Kernel, Linux内核漏洞, LPE, page cache, Privilege Escalation, setuid, Web截图, Web报告查看器, 内核安全, 内核提权, 加密子系统, 协议分析, 多租户安全, 安全渗透, 容器安全, 容器逃逸, 本地提权, 权限提升, 逆向工具