Baba01hacker666/CVE-2026-23111

GitHub: Baba01hacker666/CVE-2026-23111

针对Linux内核nf_tables的CVE-2026-23111 UAF漏洞,提供完整的本地权限提升(LPE)PoC利用代码及配套的系统脆弱性检测脚本。

Stars: 0 | Forks: 0

# CVE-2026-23111 PoC Linux Kernel nf_tables Use-After-Free(本地权限提升) PoC 作者:baba01hacker ## 漏洞概述 - **CVE**: CVE-2026-23111 - **类型**: Use-After-Free (CWE-416) - **CVSS**: 7.8 (HIGH) - **组件**: `net/netfilter/nf_tables_api.c` — `nft_map_catchall_activate()` - **根本原因**: 反向的 genmask 检查导致事务中止(abort)期间发生 chain 引用计数器泄漏 ### 受影响的内核版本 | 版本范围 | 修复版本 | |---|---| | 6.19-rc1 至 6.19-rc8 | 6.19-rc9+ | | 6.13 至 6.18.9 | 6.18.10 | | 6.7 至 6.12.69 | 6.12.70 | | 6.4.1 至 6.5.x | EOL(无稳定版修复) | | 6.3.10 至 6.3.x | EOL | | 6.0.x, 6.2.x | EOL | | 6.1.36 至 6.1.162 | 6.1.163 | | 5.15.121 至 5.15.199 | 5.15.200 | | 5.10.188+, 5.4.262+, 4.19.316+ | 各 LTS 版本 | ## 快速开始 ``` # 检查漏洞 python3 CVE-2026-23111-checker.py --detailed # 使用 JSON 输出检查(用于脚本) python3 CVE-2026-23111-checker.py --json # 构建 exploit(仅 PoC) make # 构建完整 LPE exploit make full # 运行 PoC 并输出 debug make run-d # 运行完整 LPE make run-full ``` ## 漏洞利用阶段 ### 阶段 1: UAF 触发 ✅ 正常工作 创建一个包含 catchall 元素(跳转至受害 chain)的 pipapo map set,然后在 DELSET 中止期间利用反向的 genmask bug 破坏 `chain->use`。在推进 generation counter 之后,尽管存在悬垂引用,`DELCHAIN` 依然会执行成功,从而释放该 chain。 ### 阶段 2: KASLR 泄漏 ✅ 正常工作 UAF 之后,`chain->name` 内存被释放。我们通过打开 `/proc/self/stat` 来喷射 `seq_operations` 结构体(32 字节),以重新占据被释放的 slab cache 槽位。通过 `NFT_MSG_GETRULE` 读回基础 chain 的 immediate verdict 规则,会导出被重新占据的 chain 名称,从而泄漏 kernel 函数指针。指针验证机制确保只接受规范的 kernel 文本地址。 ### 阶段 3: 堆地址泄漏 ✅ 正常工作 使用更长的 chain 名称(140 字节 → kmalloc-cg-192)再次触发 UAF,然后喷射 `nft_rule` 对象以重新占据内存。泄漏的 `list_head` 指针揭示了直接映射区(direct map region)中的堆地址。 ### 阶段 4: 控制流劫持与 ROP 🔧 框架已完成 - 喷射两条 192 字节且带有受控数据的规则,用于伪造 `nft_expr_ops` 和 `nft_rule_blob` - 使用阶段 3 获取的堆地址,将伪造的 blob 链接到伪造的 expr_ops 指针 - 喷射 128 字节的表 userdata 以覆盖已释放 chain 的 `blob_gen_0` - ROP chain:`commit_creds(&init_cred)` → `switch_task_namespaces` → `swapgs; iretq` - 从 `/proc/kcore` 自动扫描 ROP gadgets - 通过基础 chain 发送触发数据包,以调用被劫持的 `expr->ops->eval` ## 技术细节 ### 该 Bug 在 `nft_map_catchall_activate()` (`net/netfilter/nf_tables_api.c`) 中: ``` list_for_each_entry(catchall, &set->catchall_list, list) { ext = nft_set_elem_ext(set, catchall->elem); if (!nft_set_elem_active(ext, genmask)) // BUG: should be without '!' continue; nft_clear(ctx->net, ext); nft_setelem_data_activate(ctx->net, set, catchall->elem); break; } ``` `!` 导致该函数跳过了 INACTIVE 元素,而不是处理它们。在事务中止期间,catchall 元素(刚刚被 DELSET 停用)被跳过,因此永远不会调用 `nft_data_hold()` 来恢复 chain 引用计数器。 ### 漏洞利用机制 1. 创建带有 catchall 元素的 pipapo map set → 跳转至受害 chain 2. **Batch A**: DELSET + 无效操作 → 中止 → chain->use 保持为 0 3. **Batch B**: 有效事务 → 推进 genid 4. **Batch C**: DELSET → 成功 5. **Batch D**: DELCHAIN → chain 被释放(chain->use == 0,但存在悬垂引用) 6. Set 的 catchall 元素仍引用已释放的 chain 名称 → 喷射 + 读取 ## 文件 ``` ├── CVE-2026-23111-checker.py Vulnerability detection script (--detailed, --json) ├── exploit.c PoC exploit (UAF + KASLR leak + heap leak) ├── exploit_full.c Full LPE exploit (UAF + leaks + ROP chain) ├── exploit_full_aarch64 Pre-built aarch64 binary (static) ├── exploit_full.b64 Base64-encoded full exploit binary ├── Makefile Build configuration └── README.md This file ``` ## 构建要求 ``` apt-get install -y libmnl-dev libnftnl-dev gcc make python3 ``` ### 交叉编译 (aarch64) ``` apt-get install -y gcc-aarch64-linux-gnu make aarch64 ``` ### 调试构建 (启用 AddressSanitizer) ``` make debug # PoC with ASan make debug-full # Full exploit with ASan ``` ## 检查脚本 检查器执行多种检测方法: - **版本匹配**:检查内核版本是否符合所有已知的受影响范围(包括 rc 内核) - **模块检测**:检查是否加载了 `nf_tables` 内核模块 - **内核配置**:从 `/proc/config.gz` 或 `/boot/config-*` 读取 `CONFIG_NF_TABLES` - **符号检查**:在 `/proc/kallsyms` 中查找 `nft_map_catchall_activate` - **Namespace 设置**:检查 `kernel.unprivileged_userns_clone` sysctl - **风险评分**:结合所有指标生成 0-6 的风险分数 ``` python3 CVE-2026-23111-checker.py --detailed # Human-readable with mitigations python3 CVE-2026-23111-checker.py --json # Machine-readable JSON ``` ## 故障排除 | 问题 | 解决方案 | |---|---| | `mnl_socket_open: No such file or directory` | 确保已加载 `nf_tables` 模块:`modprobe nf_tables` | | `unshare: Operation not permitted` | 需要无特权用户命名空间。检查 `kernel.unprivileged_userns_clone=1` | | `Batch A did NOT abort` | Kernel 可能已打补丁或 genmask 行为不同 | | `No kernel pointer leaked` | 可能启用了 KASLR 强化或 SLAB_RANDOM;请尝试多次运行 | | `No heap pointer found` | Heap spray 碰撞率具有概率性;请重试或增加喷射次数 | | 编译错误:`nf_tables.h: No such file` | 安装内核头文件:`apt install linux-headers-$(uname -r)` | | 链接错误:undefined reference to `mnl_*` | 链接顺序很重要:`-lnftnl -lmnl`(nftnl 在前,mnl 在后) | ## 参考 - [Exodus Intel 博客 - 详细分析](https://blog.exodusintel.com/2026/06/08/off-by-exploiting-a-use-after-free-in-the-linux-kernel/) - [NVD 条目](https://nvd.nist.gov/vuln/detail/CVE-2026-23111) - [Kernel 补丁 1](https://git.kernel.org/stable/c/1444ff890b4653add12f734ffeffc173d42862dd) - [Kernel 补丁 2](https://git.kernel.org/stable/c/42c574c1504aa089a0a142e4c13859327570473d) ## 缓解措施 1. 将 Kernel 更新至已修复版本(6.18.10+, 6.12.70+, 6.6.124+ 等) 2. 禁用无特权用户命名空间:`sysctl kernel.unprivileged_userns_clone=0` 3. 如果不需要,将 `nf_tables` 模块加入黑名单: echo 'install nf_tables /bin/true' >> /etc/modprobe.d/nf_tables.conf
标签:Linux内核, PoC, UAF, Web报告查看器, 客户端加密, 暴力破解, 本地提权, 逆向工具