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报告查看器, 客户端加密, 应用安全, 暴力破解, 本地提权