rootsecdev/cve_2026_31431
GitHub: rootsecdev/cve_2026_31431
针对 Linux 内核 algif_aead 就地 AEAD 操作页缓存临时写入漏洞(CVE-2026-31431)的非破坏性检测器与本地提权概念验证工具。
Stars: 353 | Forks: 68
# CVE-2026-31431 ("Copy Fail") 工具包
用于 2026-04-29 披露的 Linux `algif_aead` /
`authencesn` 页缓存临时写入漏洞的检测器和本地提权 (LPE) 概念验证。
漏洞披露详情:
## 授权
仅在你拥有或受明确授权进行评估的主机上使用。该本地提权 (LPE)
会修改内存中的状态(页缓存),但此技术属于真实的
权限提升——在未经授权的系统上运行它,在大多数司法管辖区
都是违法的。
## 漏洞概述
`algif_aead` 就地执行 AEAD 操作(`req->src == req->dst`)。
当源数据通过 `splice()` 从常规文件传入时,
目标散列表包含对文件页缓存页的引用——即
内核将写入这些页面。
`authencesn(hmac(sha256), cbc(aes))` 算法随后会执行一次 4 字节的
AAD 的 `seqno_lo` 字段(sendmsg 提供的 AAD 的第 4–7 字节)的"临时"写入
到该目标位置,从而破坏了文件的页缓存副本。
由于磁盘上的文件从未被修改,因此没有磁盘上的
签名;这种破坏只能被共享该页缓存的读取者观察到。
`/etc/passwd` 和 `/usr/bin/su` 都是全局可读的,因此
无特权的本地用户可以破坏运行中内核对这两者的视图。
受影响系统:包含 commit `72548b093ee3`(就地 AEAD,2017 年)
但未包含上游 revert 的内核。披露信息确认了 Ubuntu 24.04 LTS、
Amazon Linux 2023、RHEL 14.3 和 SUSE 16 受到影响,但底层原语
早于该范围。
## 文件
| 文件 | 用途 |
| --- | --- |
| `test_cve_2026_31431.py` | 非破坏性检测器。在临时目录中的哨兵文件上操作;绝不触碰系统二进制文件。 |
| `exploit_cve_2026_31431.py` | 本地提权 (LPE)。在 `/etc/passwd` 的页缓存中将当前用户的 UID 翻转为 0,然后调用 `su` 获取 root shell。 |
这两个脚本均为纯 Python 3.10+ stdlib。
## 快速开始
```
# 检测
python3 test_cve_2026_31431.py
# exit 0 = 未受影响, 2 = 受影响, 1 = 测试错误
# 漏洞利用 (交互式 — su 将提示您输入自己的密码)
python3 exploit_cve_2026_31431.py --shell
```
## 检测器用法
```
python3 test_cve_2026_31431.py
```
它的功能:
1. 确认 `AF_ALG` 和 `authencesn(hmac(sha256),cbc(aes))`
算法可被无特权进程访问。
2. 在临时目录中创建一个 4 KiB 的哨兵文件,并填充页缓存。
3. 通过带有 `seqno_lo` 设置为标记 `PWND` 的 `sendmsg`+`cmsg` 内联发送 8 字节的 AAD,然后使用 `os.splice()` 将哨兵文件页缓存页中的 32 字节拼接到 AF_ALG 操作套接字。
4. 调用 `recv()` 驱动解密。认证检查失败并返回 `EBADMSG`;但临时写入依然会触发。
5. 重新读取文件(来自页缓存,而非磁盘)并查找标记。
输出类别:
- `Precondition not met` — `AF_ALG` 或 `authencesn` 不可用。退出码 0。
- `VULNERABLE to CVE-2026-31431` — 标记 `PWND` 成功写入被拼接的页中。退出码 2。
- `Page cache MODIFIED via in-place AEAD splice path` — 页面被写入,但标记未出现在预期位置。应当作受漏洞影响处理。退出码 2。
- `Page cache intact` — 已修补。退出码 0。
检测器绝不触碰 `/usr/bin/su`、`/etc/passwd` 或其创建的临时目录之外的任何其他文件,并且该文件在退出时会被删除。
## LPE 用法
```
python3 exploit_cve_2026_31431.py # patch only, print next steps
python3 exploit_cve_2026_31431.py --shell # patch and exec `su `
```
它的功能:
1. 在 `/etc/passwd` 中查找当前运行用户的 UID 行,并找到 4 字符 UID 字段的字节偏移量。
2. 针对该偏移量发起一次 `write4` 操作,将 UID 替换为 `0000`。
3. 调用 `pwd.getpwnam(user)` 确认 libc 现在报告 UID 为 0。
4. 如果带有 `--shell` 参数,则执行 `execvp("su", ["su", user])`。输入你自己的密码。PAM 会根据(未被修改的)`/etc/shadow` 进行验证,然后 `setuid(getpwnam(user).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 进行 page-cache eviction:
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 shell 中:
echo 3 > /proc/sys/vm/drop_caches
```
重新启动也可以清除它。
## `write4` 工作原理
```
sendmsg([8-byte AAD], 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; scratch write has already landed
```
来自 AAD 位置 4–7(`seqno_lo`)的 4 个字节由
`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` 应当报告 `Precondition
not met` 并以退出码 0 退出。
上游修复将就地 AEAD 操作还原为非就地操作,
从而将页缓存页面排除在可写散列表之外。
## 参考资料
- Xint 漏洞披露详情:
- CVE-2026-31431
标签:0day挖掘, algif_aead, authencesn, CVE-2026-31431, Exploit, LPE, Page Cache, POC, Python, Web报告查看器, Zero-Day, 内核安全, 内核漏洞, 协议分析, 攻击路径可视化, 数据展示, 文件包含, 无后门, 本地提权, 权限提升, 红队, 网络安全, 隐私保护, 黑客工具