MadExploits/CVE-2025-40271
GitHub: MadExploits/CVE-2025-40271
针对 Linux 内核 proc 文件系统 use-after-free 漏洞(CVE-2025-40271)的本地提权概念验证工具,提供 C 和 Shell 两种实现版本。
Stars: 1 | Forks: 0
# CVE-2025-40271 — proc_readdir_de() rb-tree UAF LPE
Linux 内核 `proc` 文件系统中本地提权漏洞的概念验证。该漏洞是 `proc_readdir_de()` 中的 use-after-free,由执行 `rb_erase()` 时未调用 `RB_CLEAR_NODE()` 引起,残留的红黑树链接在枚举目录时可能引发竞态条件。
**作者:** [MadExploits](https://github.com/MadExploits)
## 概述
| 字段 | 详情 |
|-------|--------|
| **CVE** | CVE-2025-40271 |
| **组件** | `fs/proc` — `proc_readdir_de()` / `remove_proc_entry()` |
| **类型** | Use-after-free(rb-tree 残留链接) |
| **影响** | 本地提权 (LPE) |
| **架构** | x86_64 |
| **受影响版本** | Linux 内核至 **6.18-rc5** |
### 根本原因
当移除 `proc` 目录条目时,会对该条目的 rb-node 调用 `rb_erase()`,但**没有**执行 `RB_CLEAR_NODE()`。释放的节点可能仍可通过残留的树链接访问。如果 `getdents64()` 与 `/proc/self/net/dev_snmp6/` 下的接口移除操作发生竞态,内核可能会读取已释放的内存——这些内存通常被喷洒的 `msg_msg` 对象重新占用——并返回异常的 `d_ino` 值,从而泄露内核堆指针。
## 受影响与已修复的内核
该 PoC 会检查当前运行的内核版本,并在已修复的构建上退出:
| 分支 | 修复版本 |
|--------|----------|
| 5.10.x | 5.10.247+ |
| 6.1.x | 6.1.159+ |
| 6.6.x | 6.6.123+ |
| 6.12.x | 6.12.73+ |
| 6.18+ | 6.18-rc6+ |
| 7.x+ | 已修复 |
## 仓库内容
| 文件 | 描述 |
|------|-------------|
| `exploit.c` | 完整的 C PoC — netlink veth 管理、pthread 竞态、`msg_msg` 喷洒 |
| `exploit.sh` | 免编译的 shell 移植版 — `unshare`、`ip`、内嵌 Python 3 用于系统调用/竞态 |
这两个实现遵循相同的利用流程:
1. 进入用户 + 网络 namespace(在网络 ns 中获取 `CAP_NET_ADMIN`)
2. 创建 veth 对 → 填充 `/proc/self/net/dev_snmp6/`
3. 使 `getdents64()` 与快速删除 veth 及堆喷洒产生竞态
4. 通过类似内核指针的 `d_ino` 值检测 UAF
5. 尝试提权(完整的 LPE 需要特定于内核的 KASLR 偏移量)
## 环境要求
### 通用
- Linux x86_64
- 启用非特权用户 namespace:
cat /proc/sys/kernel/unprivileged_userns_clone
# 必须为 1
- 非 root 用户(如果已经是 root,PoC 将退出)
### `exploit.c`
- 带有 pthreads 的 `gcc`
- Linux 头文件(`linux/netlink.h` 等)
```
gcc -o exploit exploit.c -lpthread
```
### `exploit.sh`
- `bash`
- `python3`
- `ip` (iproute2)
- `unshare`(带有 `--map-root-user` 支持的 util-linux)
无需编译器。
## 用法
### Shell 版本(推荐用于快速测试)
```
chmod +x exploit.sh
./exploit.sh
```
### C 版本
```
gcc -o exploit exploit.c -lpthread
./exploit
```
### 预期输出
**存在漏洞的内核 — UAF 触发(部分成功):**
```
[+] Kernel X.Y.Z — VULNERABLE
[+] Namespace ready...
[+] Created 32 veth pairs (/proc/self/net/dev_snmp6 populated)
[+] UAF HIT! d_ino=0xffff8880........ (kernel heap pointer)
[+] Kernel heap leak: 0xffff8880........
[*] PARTIAL SUCCESS: UAF + heap leak DEMONSTRATED
```
**已修复的内核:**
```
[-] Kernel X.Y.Z — PATCHED
[*] Kernel is patched. Nothing to do.
```
## 利用说明
- **堆泄露:** 当竞态成功时,`d_ino` 包含一个与 x86_64 内核指针模式(`0xffff000000000000`)匹配的值,通常来自与已释放的 `proc_dir_entry` 数据重叠的 `msg_msg` 头部 `m_list`。
- **完整 LPE:** 覆盖 `modprobe_path` 需要泄露的堆地址与内核文本基地址之间的偏移量——这是**特定于构建的** (KASLR)。该 PoC 演示了 UAF 和泄露;完整的利用链需要目标内核镜像的偏移量。
- **可靠性:** 成功取决于调度程序时序。默认情况下,PoC 最多重试 **30** 次竞态尝试。
## 缓解措施
- 升级到已修复的内核(见上表)。
- 如果不需要用户 namespace,请禁用非特权创建:
sysctl -w kernel.unprivileged_userns_clone=0
- 应用针对 CVE-2025-40271 的供应商安全更新。
## 免责声明
本项目仅用于**授权的安全研究、教育和防御性测试**。
- 仅在您拥有或获得明确书面测试许可的系统上运行。
- 未经授权对第三方系统使用可能违反相关法律。
- 作者和贡献者不对滥用本代码负责。
## 致谢
| 角色 | 姓名 |
|------|------|
| **仓库作者** | MadExploits |
| **原始 CVE 研究与 C PoC** | Aviral Srivastava — N-DAY RESEARCH |
## 许可证
使用风险自负。不提供任何担保。
标签:Linux内核, PoC, UAF, Web报告查看器, 客户端加密, 应用安全, 暴力破解, 本地提权