xn0kkx/CVE-2026-31431_CopyFail_LinuxKernel_LPE
GitHub: xn0kkx/CVE-2026-31431_CopyFail_LinuxKernel_LPE
Linux内核本地权限提升漏洞CVE-2026-31431的PoC代码,利用algif_aead加密接口的原地优化通过页面缓存修改setuid二进制实现无密码root提权。
Stars: 1 | Forks: 0
# CVE-2026-31431 — Copy Fail(Linux 内核本地提权)
Theori/Xint 概念验证漏洞的教育性重写版本,
这是 Linux 内核 `algif_aead` 加密套接字接口中的一个本地权限提升漏洞。影响从 4.14(2017年7月)
到 6.18.21 的所有主线内核,以及 6.19 稳定版分支到 6.19.11。
## 免责声明
**仅供教育和授权的安全研究使用。**
请勿在您不拥有或未获得明确书面测试许可的系统上运行。在有漏洞的主机上运行此漏洞可使任何无特权的本地用户立即获得 root 权限。作者对滥用不承担任何责任。
## 漏洞概述
自内核 3.2 以来,Linux 内核已通过 `AF_ALG` 套接字家族(``)向用户空间暴露了内核加密 API。用户空间打开一个 `SOCK_SEQPACKET` 套接字,将其绑定到算法模板(例如 `"aead"` 或 `"authencesn(hmac(sha256),cbc(aes))"`),然后发送数据进行加密或解密。
2017 年,一个性能优化被合并,允许 AEAD 算法在内核检测到源和目标共享相同的底层页面时*原地*加密或解密数据。这避免了每次操作的冗余内存复制。
`authencesn` 模板(为认证加密添加了扩展序列号支持)在解密过程中包含一个临时写入操作:它在认证检查运行之前,将 ESN 字节写入操作数据缓冲区的特定偏移位置。当操作的源页面是通过 `splice()` 从常规文件的*页面缓存*获取的,并且原地优化处于活动状态时,这个临时写入会直接写回那些缓存页面。
因为内核的页面缓存是一个共享映射——任何打开同一文件的进程都会看到相同的物理页面——无特权用户可以:
1. 以 `O_RDONLY` 方式打开任何可读文件(例如 `/usr/bin/su`)。
2. 将其页面通过 `splice()` 传入 `AF_ALG` 操作套接字。
3. 触发 `authencesn` 解密;ESN 临时写入会用攻击者控制的字节在受控偏移位置损坏页面。
4. *磁盘*从未被修改;只有内存中的页面缓存被修补。
离线完整性扫描器(AIDE、Tripwire、IMA/EVM)比较磁盘上文件的校验和,完全无法检测到这种攻击。写入在页面缓存清除或重启后消失,磁盘上不会留下任何取证痕迹。
通过瞄准 `/usr/bin/su`(一个 `setuid root` 二进制文件)并覆盖保护 PAM 认证检查的分支,攻击者获得无密码的 root shell。
## 受影响的内核
| 分支 | 首个受影响版本 | 最后受影响版本 | 修复版本 |
|--------------|-----------------|-----------------|-----------|
| mainline | 4.14 | 6.18.21 | 6.18.22 |
| 6.19 stable | 6.19.0 | 6.19.11 | 6.19.12 |
| 7.0-rc | 7.0-rc1 | 7.0-rc6 | 7.0-rc7 |
引入该漏洞的优化提交发生在 4.14 开发周期(2017年7月)。在上述范围内,任何使用 `CONFIG_CRYPTO_USER_API_AEAD=y` 和 `CONFIG_CRYPTO_AUTHENC=y`(两者都是常见默认值)编译的内核都存在漏洞。
## 受影响的发行版(非详尽)
| 发行版 | 随附内核(近似) | 已修补? |
|--------------------|-----------------------------|----------|
| Debian 12 (Bookworm) | 6.1.x | 是(反向移植) |
| Debian 13 (Trixie) | 6.12.x / 6.14.x | 是(反向移植) |
| Ubuntu 24.04 LTS | 6.8.x | 是(USN-7xxx) |
| Ubuntu 24.10 | 6.11.x | 是 |
| RHEL 9.x | 5.14.x(重新移植) | 是(RHSA) |
| Alpine 3.20 | 6.6.x | 是(反向移植) |
| Arch Linux | rolling(≥ 6.18.22 现在) | 是 |
| Kali Linux 2026.1 | 6.18.12 | 受影响 |
| Kali Linux 2026.2+ | 6.18.22+ | 已修复 |
| Linux Mint 22 | 6.8.x(Ubuntu 基础) | 是(Ubuntu USN)|
*请检查您的发行版的安全跟踪器以获取准确的安全公告状态。*
## 需求
- 处于受影响范围内的 Linux 内核(见上表)
- Python 3.10+(`os.splice` 在 Python 3.10 中添加)
- 对目标二进制文件的读取访问权限(默认:`/usr/bin/su`,因为是 setuid 所以全局可读)
- 无需特殊权限——这是一个**本地**权限提升漏洞
## 使用方法
```
# 显示在不接触内核的情况下会写入的内容(安全):
python3 copy_fail_exploit.py --dry-run
# 修补 /usr/bin/su 页面缓存(需要存在漏洞的内核):
# 警告:需要存在漏洞的内核 — 仅在您拥有的系统上使用
python3 copy_fail_exploit.py
# 修补并立即提权至 root:
python3 copy_fail_exploit.py --spawn-shell
# 使用自定义目标二进制文件和 payload:
python3 copy_fail_exploit.py --target /usr/bin/sudo --payload-file ./custom_patch.bin
# 详细输出(打印每次 4 字节写入):
python3 copy_fail_exploit.py --verbose --dry-run
```
默认情况下 `--spawn-shell` 是**关闭**的。修补后,脚本会打印:
```
[+] Patch applied to page cache of '/usr/bin/su' (disk unchanged).
Run `su` to escalate, or re-run with --spawn-shell.
To restore: echo 3 | sudo tee /proc/sys/vm/drop_caches
```
您必须使用 `--spawn-shell` 选择加入 shell 生成。这是故意的:它迫使您在执行结果之前了解漏洞利用的作用。
## 工作原理
**设置原语。**
漏洞利用打开一个 `AF_ALG` 套接字并将其绑定到带有全零虚拟密钥的 `authencesn(hmac(sha256),cbc(aes))` 模板。然后通过 `ALG_SET_AEAD_AEADTHSIZE` 将认证标签大小配置为 4 字节。在控制套接字上调用 `accept()` 会产生一个*操作套接字*,可以提交单个解密请求。
**触发页面缓存写入。**
对于每个 4 字节的修补有效载荷块,漏洞利用在操作套接字上调用 `sendmsg()` 并设置 `MSG_MORE`,传递 8 字节的关联数据(AAD):4 字节填充后跟 4 字节有效载荷。`MSG_MORE` 告诉内核等待更多数据到达。然后它创建一个管道并发出两个 `splice()` 调用——`file_fd → pipe → op_sock`——将文件自己的页面缓存页面作为解密操作的输入。当最终调用 `recv()` 时,内核运行 `authencesn` 解密。原地优化触发(源和目标是相同的页面),ESN 临时写入将我们的有效载荷字节复制到目标偏移位置的缓存页面中。`recv()` 返回 `EBADMSG` 因为认证标签无法验证——这是预期且无害的。写入已经发生。
**修补二进制文件。**
嵌入的有效载荷(直接从 Theori PoC 获取)覆盖了 `/usr/bin/su` 中来自标准 `util-linux` 构建的分支指令,将强制执行 PAM 认证的条件跳转转换为无条件 fall-through。修补后,无密码运行 `su` 会成功并产生一个 root shell。磁盘上的二进制文件未被修改;清除页面缓存条目(`echo 3 > /proc/sys/vm/drop_caches`)会立即恢复更改。
更深入的技术分析请参见下面的参考资料,特别是 Xint 博客文章和 Theori PoC 仓库。
## 检测
### Falco 规则
```
- rule: AF_ALG socket opened by unprivileged process
desc: >
CVE-2026-31431 — an unprivileged process opened an AF_ALG (family 38)
socket, which is the first step of the Copy Fail exploit.
condition: >
evt.type = socket and
evt.arg.domain = 38 and
not user.uid = 0
output: >
AF_ALG socket opened (user=%user.name uid=%user.uid
pid=%proc.pid comm=%proc.name)
priority: WARNING
tags: [host, network, privilege_escalation, CVE-2026-31431]
```
### YARA(内存扫描漏洞利用脚本)
```
rule CopyFail_CVE_2026_31431 {
meta:
description = "Detects Copy Fail exploit script in memory or on disk"
cve = "CVE-2026-31431"
strings:
$template = "authencesn(hmac(sha256),cbc(aes))" ascii
$splice = "os.splice" ascii
$aflag = "AF_ALG" ascii
condition:
all of them
}
```
### auditd — 检测 AF_ALG 套接字创建
添加到 `/etc/audit/rules.d/cve-2026-31431.rules`:
```
-a always,exit -F arch=b64 -S socket -F a0=38 -k cve_2026_31431_afalg
```
然后使用以下命令查看日志:
```
ausearch -k cve_2026_31431_afalg --interpret
```
## 缓解措施
**1. 应用内核补丁**(推荐)
升级到内核 6.18.22、6.19.12、7.0-rc7 或更高版本,或应用您的发行版的安全更新。
**2. 在构建时禁用 CONFIG_CRYPTO_USER_API_AEAD**
如果您构建自己的内核,请设置:
```
# CONFIG_CRYPTO_USER_API_AEAD 未设置
```
这将移除整个 `AF_ALG` AEAD 接口并消除攻击面。大多数嵌入式/强化部署不需要它。
**3. seccomp — 拒绝 AF_ALG 套接字家族**
为敏感进程添加 seccomp 过滤器(或通过 LSM 策略在系统范围内)拒绝 `socket(AF_AL, ...)`:
```
// Deny socket() when domain == AF_ALG (38)
BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])),
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 38, 0, 1),
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | EACCES),
```
**4. 通过内核强化降低页面缓存权限**
`vm.unprivileged_userfaultfd=0` 和类似的可调参数减少了用户可访问的内核内存接口的攻击面,尽管它们不能直接阻止此 CVE。
## 测试后清理
漏洞利用仅修改内存中的页面缓存;磁盘上的二进制文件从未被触及。要恢复内存中的原始文件内容,请清除内核的页面缓存:
```
echo 3 | sudo tee /proc/sys/vm/drop_caches
```
这会从缓存中清除所有干净页面。下次读取 `/usr/bin/su`(或任何被修补的二进制文件)将从磁盘重新加载原始字节。
**重启**也会完全清除页面缓存。
## 参考资料
- [原始 PoC — Theori](https://github.com/theori-io/copy-fail-CVE-2026-31431)
- [技术分析 — Xint](https://xint.io/blog/copy-fail-linux-distributions)
- [Sysdig 威胁分析](https://www.sysdig.com/blog/cve-2026-31431-copy-fail-linux-kernel-flaw-lets-local-users-gain-root-in-seconds)
- [Microsoft 安全博客](https://www.microsoft.com/en-us/security/blog/2026/05/01/cve-2026-31431-copy-fail-vulnerability-enables-linux-root-privilege-escalation/)
- [NVD 条目](https://nvd.nist.gov/vuln/detail/CVE-2026-31431)
- [Debian 安全跟踪器](https://security-tracker.debian.org/tracker/CVE-2026-31431)
## 致谢
- **原始发现和披露**:Theori(theori.io)和 Xint(xint.io)
- **教育性重写**:n0kk
## 许可证
MIT — 见 [LICENSE](LICENSE)。
选择 MIT 而不是自定义的"仅供教育使用"许可证,是因为不存在作为公认 OSI/SPDX 标识符的此类许可证。MIT 是宽松的、法律上易于理解的,并且与负责任的披露仓库兼容。教育意图在模块文档字符串、本 README 的免责声明部分和 `--help` 输出中表达——而不是在法律上可疑的自定义许可证条款中。
标签:0day挖掘, AF_ALG, algif_aead, CVE-2026-31431, Linux内核, Linux内核漏洞, PoC, splice, Web报告查看器, 内存损坏, 内核利用, 内核安全, 内核提权, 协议分析, 安全渗透, 密码学漏洞, 暴力破解, 本地提权, 权限提升, 漏洞复现, 竞态条件, 网络安全, 隐私保护, 页面缓存