针对 Linux 内核 proc 文件系统中一个本地权限提升漏洞的概念验证(PoC)。该漏洞是 proc_readdir_de() 中的释放后使用(UAF),由 rb_erase() 未调用 RB_CLEAR_NODE() 所致,残留的红黑树链接在目录枚举期间可被竞态利用。
作者: MadExploits
原始漏洞研究与 C 语言 PoC 由 Aviral Srivastava(N-DAY RESEARCH)完成。本仓库包含一个 shell 移植版(
exploit.sh),适用于不便编译的环境。
| 字段 | 详情 |
|---|---|
| CVE | CVE-2025-40271 |
| 组件 | fs/proc — proc_readdir_de() / remove_proc_entry() |
| 类型 | 释放后使用(红黑树残留链接) |
| 影响 | 本地权限提升(LPE) |
| 架构 | x86_64 |
| 受影响版本 | 直至 6.18-rc5 的 Linux 内核 |
当 proc 目录项被移除时,会在该项的 rb 节点上调用 rb_erase(),但未调用 RB_CLEAR_NODE()。被释放的节点仍可通过残留的树链接访问。如果 getdents64() 与 /proc/self/net/dev_snmp6/ 下的接口删除发生竞态,内核可能会读取已释放的内存——这些内存通常已被喷洒的 msg_msg 对象回收——并返回异常的 d_ino 值,从而泄露内核堆指针。
该 PoC 会检查当前运行的内核版本,并在已修补的构建上退出:
| 分支 |
|---|
| 文件 | 描述 |
|---|---|
exploit.c | 完整的 C PoC — netlink veth 管理、pthread 竞态、msg_msg 喷洒 |
exploit.sh | 免编译 shell 移植版 — unshare、ip、内嵌 Python 3 用于系统调用/竞态 |
两种实现遵循相同的利用流程:
CAP_NET_ADMIN)/proc/self/net/dev_snmp6/getdents64() 与快速 veth 删除 + 堆喷洒进行竞态d_ino 值检测 UAFcat /proc/sys/kernel/unprivileged_userns_clone
# must be 1
exploit.cgcclinux/netlink.h 等)gcc -o exploit exploit.c -lpthread
exploit.shbashpython3ip(iproute2)unshare(util-linux,支持 --map-root-user)无需编译器。
chmod +x exploit.sh
./exploit.sh
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。modprobe_path 需要泄露的堆地址与内核文本基址之间的偏移——这是特定于构建的(KASLR)。该 PoC 演示了 UAF 与泄露;完整的利用链需要针对目标内核镜像的偏移。sysctl -w kernel.unprivileged_userns_clone=0
本项目仅供授权的安全研究、教育与防御性测试使用。
| 角色 | 姓名 |
|---|---|
| 仓库作者 | MadExploits |
| 原始 CVE 研究与 C PoC | Aviral Srivastava — N-DAY RESEARCH |
自行承担使用风险。不提供任何担保。
| 修复版本 |
|---|
| 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+ | 已修补 |