ikow/CVE-2026-31431-live-code-corruption

GitHub: ikow/CVE-2026-31431-live-code-corruption

针对 CVE-2026-31431 的创新型本地提权利用工具,通过 Linux 页缓存机制直接破坏运行中进程的 libc 可执行代码实现 root 权限获取,全程不修改磁盘文件,对文件完整性监控不可见。

Stars: 0 | Forks: 0

# CVE-2026-31431 — 通过页缓存破坏实时代码 CVE-2026-31431 ("Copy Fail") 的一种新型利用技术,通过 Linux 内核的页缓存破坏运行中进程的**可执行代码**,从而实现 root 权限提升。 ## 不同之处 针对该 CVE 所有已公开的利用方式都是破坏**数据文件**——例如修改 `/etc/passwd` 来更改 root 的 UID,或者修补磁盘上的 setuid 二进制文件。本利用程序采取了根本不同的方法:通过内核的页缓存机制破坏内存中的**实时可执行代码**。 | | 已公开的利用程序 | 本利用程序 | |---|---|---| | **目标** | 数据文件 (`/etc/passwd`、`/usr/bin/su`) | 可执行代码 (libc `.text` 节) | | **机制** | 由程序解析的文件内容 | 由 CPU 直接执行的代码页 | | **作用范围** | 单个文件 | 所有映射了 libc 的进程 | | **磁盘更改** | 是 (文件内容被修改) | 否 (仅内存中的页缓存) | | **检测** | 文件完整性监控 | 对文件系统检查不可见 | ## 工作原理 ### 页缓存洞察 当 Linux 使用 `MAP_PRIVATE` 映射共享库时,它不会立即复制文件页。相反,进程的页表项会直接指向**页缓存**的物理页。只有在写入时才会进行复制(写时复制)。对于代码页 (`.text`),进程永远不会向其写入数据——因此它们会**永远**与页缓存保持共享。 ``` Process A (bash) Process B (su) Page Cache (libc) ┌──────┐ ┌──────┐ ┌──────────┐ │ PTE │───────────>│ │ │ exit(): │ │ │ │ PTE │───────────>│ endbr64 │ └──────┘ └──────┘ │ push rax │ MAP_PRIVATE MAP_PRIVATE │ ... │ (clean page) (clean page) └──────────┘ ↑ Copy Fail writes here! ``` CVE-2026-31431 允许我们对任何可读文件的页缓存进行可控的 4 字节写入。通过破坏 libc 的代码页,我们修改了**每个进程**都会执行的指令。 ### 利用过程 1. **写入 shellcode** (39 字节) 到 libc 页缓存中 `on_exit()` 函数的位置——进行 10 次 4 字节的写入 2. **修补 `exit()`** 使其跳转到我们的 shellcode——进行 1 次 4 字节的写入 3. **触发**:任何调用 `exit()` 的程序(几乎所有程序)都会执行我们的 shellcode 该 shellcode 会执行 `setuid(0)` → `setgid(0)` → `execve("/bin/sh")`,从而提供一个 root shell。 ## CVE-2026-31431 概述 - **缺陷**:`crypto/algif_aead.c` 中的逻辑错误——2017 年的就地优化 (`72548b093ee3`) 允许 `splice()` 将页缓存页输入到 AEAD 解密中。`authencesn` 算法的 ESN 重排会将 4 个临时字节写回源 scatterlist,从而破坏拼接文件的页缓存。 - **原语**:向任何可读文件的页缓存进行确定性的 4 字节写入 - **前提条件**:无——无特权的用户也可以使用 AF_ALG 套接字 - **修复**:在加密操作之前复制到带外缓冲区(内核 6.12.85+、6.15+ 版本) ## 用法 ``` # Compile gcc -o exploit exploit.c # 以非特权用户运行 ./exploit /lib/x86_64-linux-gnu/libc-2.31.so # Trigger — 运行任意程序(它调用 exit()) su -c id # uid=0(root) gid=0(root) groups=0(root) ``` ## 测试环境 - **内核**:6.12.79 (Ubuntu/Debian,在 6.12.85 修复之前) - **glibc**:2.31-0ubuntu9.7 - **结果**:完整的 root shell,经内核日志验证:`process 'id' launched '/bin/sh'` ## 文件 - [`exploit.c`](exploit.c) — 包含 shellcode 注入的完整利用程序 - [`copyfail_test.c`](copyfail_test.c) — 原语验证 (测试 4 字节写入) ## 时间线 - **2017**:引入就地优化 (`72548b093ee3`) - **2026-04-29**:CVE-2026-31431 被披露 - **2026-04-30**:内核 6.12.85 中发布修复程序 - **2026-05-06**:开发出此利用程序(新型实时代码破坏技术) ## 参考资料 - [NVD — CVE-2026-31431](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) - [修复提交](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a664bf3d603d) - [Copy Fail 分析 (Xint)](https://xint.io/blog/copy-fail-linux-distributions) ## 免责声明 本工具仅供授权的安全研究和教育目的使用。请勿用于您不拥有或未获得明确测试许可的系统。 ## 相关:Dirty Frag (2026 年 5 月 7 日) [Dirty Frag](https://github.com/V4bel/dirtyfrag) 披露了同一漏洞类型中的另外两个页缓存写入变体: - **ESP 路径** (`esp4/esp6`):与 Copy Fail 相同的 `authencesn` 汇点,通过 IPsec ESP-in-UDP 触发。需要 user namespace。4 字节写入。 - **RxRPC 路径** (`rxrpc/rxkad`)):在 splice 固定的页上进行 `pcbc(fcrypt)` 就地解密。不需要 namespace。8 字节写入。 本仓库中的实时代码破坏技术适用于**任何**此类页缓存写入原语——只需将 `write4()` 函数替换为 ESP 或 RxRPC 触发器即可。该技术与具体原语无关。
标签:0day挖掘, 0day漏洞, API接口, Copy Fail, CVE-2026-31431, libc攻击, Linux漏洞利用, Live Code Corruption, MAP_PRIVATE, Root提权, Web报告查看器, 代理, 共享库劫持, 内存安全, 内存损坏, 内核安全, 协议分析, 处理器执行劫持, 安全渗透, 实时代码篡改, 客户端加密, 操作系统安全, 无文件攻击, 权限提升, 页缓存攻击