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报告查看器, 客户端加密, 暴力破解, 本地提权, 逆向工具