criann/check-cve-2026-23111
GitHub: criann/check-cve-2026-23111
用于检测 Linux 系统是否受 CVE-2026-23111(nf_tables 本地提权)影响的防御性验证脚本,通过静态和动态检测输出面向操作的结论。
Stars: 0 | Forks: 0
# CVE-2026-23111 防御性验证脚本
## 概述
CVE-2026-23111 是 `nf_tables` 中的一个 Linux 内核漏洞,在启用了用户命名空间和 nftables 的系统上,可被无特权用户利用以进行本地权限提升。[1][2] 公开的供应商和政府公告将其描述为影响 Linux 发行版的本地问题,并强调补丁修复是主要的解决办法。[3][4]
本仓库包含一个**防御性验证脚本**,旨在帮助评估主机是否暴露了与此 CVE 相关的技术条件,而不提供权限提升漏洞利用。它会检查相关的内核和运行时条件,可选择加载 `nf_tables` 模块以进行全面的功能测试,尝试使用 `unshare` 和 `nft` 进行受控的非特权验证路径,收集本地诊断跟踪信息,并将主机分类为操作结论,例如可能是安全的、被本地策略阻止或存在暴露的可用路径。[1][5]
## 该 CVE 是什么
根据 NVD 的描述,CVE-2026-23111 是 Linux 内核 `nf_tables` 的一个漏洞,作为 netfilter 中的逻辑错误修复被解决,在受影响的配置中,可以通过用户命名空间和 nftables 被无特权用户利用以进行本地权限提升。[1] Ubuntu 的安全公告描述了相同的高层利用路径,并按发布版本跟踪受影响和已修复的软件包状态。[2]
Red Hat 指出,本地低权限用户可能会利用此问题导致拒绝服务或可能实现权限提升,并提供了一种基于在操作允许的情况下阻止加载 `nf_tables` 模块的缓解方案。[3] 来自加拿大网络安全中心的国家级指导也建议受影响的组织关注供应商更新,并提到在使用阻止模块加载的缓解措施时需重新生成 initramfs。[4]
## 脚本的功能
该脚本用于**防御性暴露评估**,而非漏洞利用。它旨在:
- 识别正在运行的内核、发行版系列以及相关的运行时强化设置。
- 检查是否存在 `CONFIG_USER_NS` 和 `CONFIG_NF_TABLES`。[1]
- 检查 `kernel.unprivileged_userns_clone` 和 `user.max_user_namespaces`,以评估无特权用户命名空间是否可用。
- 检测针对 `nf_tables` 模块是否存在严格的 modprobe 拒绝(`install nf_tables /bin/false`)或软黑名单。
- 检查供应商内核 RPM 更新日志中是否有 CVE-2026-23111 的向后移植条目(仅限 RHEL 系列)。
- 在进行任何模块交互之前,通过指纹识别 `/proc/kallsyms` 来查找易受攻击的符号(`nft_map_catchall_activate`)与修补后的符号(`nft_catchall_set_activate`)。
- 当指定了 `--allow-load-module` 时(见下文),可选择通过 `modprobe` 加载 `nf_tables`,并在退出时自动卸载。
- 当模块加载后,运行受限的 `unshare -U -n --map-root-user` + `nft` 验证步骤,并记录 stdout、stderr 和最近的内核日志。
- 验证 `unshare --user` 是否确实创建了命名空间,以及在其内部 `CAP_NET_ADMIN` 是否起作用,以确认 AppArmor 或 SELinux 限制是否真正有效。
- 突出显示 AppArmor 或 SELinux 等本地安全控制是否似乎阻止了被测试的路径。[6]
- 输出面向结论的结果,并提供可选的颜色高亮显示,以便于分类排查。
脚本将日志存储在脚本目录的子目录中,除非使用 `--keep-logs`,否则默认会将其删除。
## 模块加载策略
默认情况下,脚本**从不加载 `nf_tables`**。如果脚本启动时该模块尚未加载,将跳过所有 nft 功能测试,并且结论仅基于内核版本、kallsyms 指纹、modprobe 配置、RPM 更新日志以及 sysctl/LSM 策略证据得出。
这种保守的默认设置避免了在生产主机上无意中扩大攻击面。要在受控或带有监控工具的系统上进行全面的功能测试,请以 root 身份使用 `--allow-load-module`(见下文)。
## 用法
```
# 默认 — 不加载模块,仅基于 policy-evidence 的判定
./check_cve_2026_23111.sh
./check_cve_2026_23111.sh --color
./check_cve_2026_23111.sh --keep-logs
./check_cve_2026_23111.sh --color --keep-logs
# 完整功能测试 — 加载(并卸载) nf_tables,需要 root
sudo ./check_cve_2026_23111.sh --allow-load-module
sudo ./check_cve_2026_23111.sh --allow-load-module --color --keep-logs
```
### 选项
| 选项 | 描述 |
|---|---|
| `--allow-load-module` | 授权脚本在模块尚未加载时通过 `modprobe` 加载 `nf_tables`。启用完整的 `nft` catchall 路径测试和 `CAP_NET_ADMIN` 有效性测试。该模块在退出时会自动卸载。**需要 root 权限。** 如果已存在严格的 modprobe 拒绝规则,则将被拒绝执行。仅在非生产或带有监控工具的系统上使用。 |
| `--color` | 当终端支持时,启用带有颜色的 stdout 输出。 |
| `--keep-logs` | 将日志和跟踪信息保留在脚本目录下,而不是在退出时删除。 |
| `--help` | 打印用法信息并退出。 |
### 何时使用 `--allow-load-module`
当您需要在**隔离的、非生产环境的或专用的测试 VM**上获得最高可信度的结论时,请使用 `--allow-load-module`。典型场景包括:
- 在部署供应商修复程序之前,正在验证处于易受攻击范围内的内核。
- 测试系统启用了 KASAN 或其他监控工具,您希望观察内核跟踪记录。
- 目标主机上未使用该模块,并且审计证据需要完整的端到端路径检查。
请**不要**在生产主机上使用 `--allow-load-module`,因为这些环境中 `nf_tables` 被有意阻止,或者加载它将违反安全强化策略。
### `--allow-load-module` 的安全闸门
在尝试加载模块之前,脚本会强制执行以下检查,如果其中任何一项失败,则会报错退出:
1. `/etc/modprobe.d/` 中**不得**存在严格的 modprobe 拒绝(`install nf_tables /bin/false`)。
2. 系统上必须可用 `modprobe`。
3. 脚本必须以 `root`(uid 0)身份运行。
如果脚本成功加载了模块,无论脚本如何终止(成功、错误或 `CTRL+C`),都会在退出时通过 `cleanup()` trap 调用 `modprobe -r nf_tables`。
## 结论模型
脚本使用操作结论而非漏洞利用结果:
| 结论 | 含义 |
|---|---|
| `not-affected` | 内核版本低于 5.13;尚未引入 catchall 元素功能,不存在受漏洞影响的代码路径。 |
| `likely-patched-vendor-confirmed` | 在供应商内核 RPM 更新日志中发现了 CVE-2026-23111,确认存在向后移植的修复程序,与上游版本无关。 |
| `likely-patched-upstream-confirmed` | 内核版本处于上游已修复的范围内,**并且** nft 功能测试返回非零值且没有内核信号——这是安全状态的最强静态 + 动态证据。 |
| `likely-patched-upstream` | 内核版本处于上游已修复的范围内,但未运行功能测试(模块不存在或结果不确定)。仍应检查供应商公告状态。 |
| `likely-safe-or-patched` | 脚本未确认存在可利用的路径;原因可能是内核已修复、不存在受漏洞影响的代码或存在隐式的本地阻止,情况不明确。 |
| `blocked-by-local-policy` | 被测试的路径似乎被 AppArmor、SELinux、用户命名空间限制或 modprobe 拒绝所阻止。[6] 策略阻止不能替代供应商的修复。 |
| `exposed-path-available` | 主机暴露了与文档记录的利用前提条件兼容的 userns + nftables 路径。[1][5] |
| `strong-signal-lab-confirmation` | 观察到与 `nf_tables` 相关的内存损坏一致的内核日志信号。仅在一次性、带有监控工具的实验室环境中进行确认。 |
| `prerequisites-missing` | 缺少必需的诊断工具(`unshare`、`nft`);未完成有意义的运行时验证。 |
这些结论旨在支持补丁优先级排序和防御性分类排查,并不能替代供应商软件包状态验证。
## 内核版本覆盖范围
脚本将正在运行的内核与文档记录的上游修复点进行映射比对:
| 分支 | 修复于 | 上游 commit |
|---|---|---|
| 6.13.x+ | ≥ 6.13.1 | `f41c5d1` |
| 6.12.x | ≥ 6.12.12 | `8c760ba` |
| 6.6.x | ≥ 6.6.75 | `b9b6573` |
| 6.1.x | ≥ 6.1.128 | `8b68a45` |
| 6.2–6.5, 6.7–6.11 | 上游 EOL | 仅发行版向后移植 |
| 5.15.x | 取决于发行版 | Amazon Linux: ALAS2KERNEL-5.15-2026-098 |
| 5.10.x | 取决于发行版 | Amazon Linux 2: 截至 2026-03 待定 |
| 5.4.x | 取决于发行版 | Amazon Linux 2: 截至 2026-03 待定 |
| 5.13–5.14 | 上游 EOL | 仅发行版向后移植 |
| < 5.13 | 不受影响 | 未出现 catchall 功能 |
## 推荐的缓解措施
建议的主要措施是安装供应商修复后的内核更新,并重新启动进入已修复的内核。[2][3][4] 由于漏洞利用取决于本地内核攻击面,在安排或验证补丁修复期间,额外的强化措施可以降低暴露风险。[5][6]
### 优先操作
1. 使用官方发行版公告**修补内核**,并重新启动进入修复后的版本。[2][3][4]
2. 在业务需求允许的情况下,**限制无特权用户命名空间**,因为文档记录的攻击路径依赖于无特权用户是否可使用它们。[1][5][6]
3. 如果系统不需要 nftables 功能,并且已验证更改对操作的影响,则**禁用或阻止加载 `nf_tables`**。[3][4]
4. **限制特权网络功能**,例如涉及 `CAP_NET_ADMIN` 的访问路径,并减少可操纵防火墙状态的账户数量。[5]
### 强化步骤示例
限制无特权用户命名空间:
```
echo 'kernel.unprivileged_userns_clone=0' > /etc/sysctl.d/99-cve-2026-23111.conf
echo 'user.max_user_namespaces=0' >> /etc/sysctl.d/99-cve-2026-23111.conf
sysctl --load /etc/sysctl.d/99-cve-2026-23111.conf
```
在确保操作安全的情况下阻止加载 `nf_tables` 模块:
```
echo 'install nf_tables /bin/false' > /etc/modprobe.d/disable-nf_tables.conf
rmmod nf_tables 2>/dev/null || true
```
如果使用了阻止模块加载的缓解措施,一些指南建议重新生成 initramfs,以便在早期引导期间不会加载被阻止的模块。[4]
## Ubuntu 特定说明
Ubuntu 将基于 AppArmor 的无特权用户命名空间限制记录为一种减少攻击面的方法,而不是完全替代内核修复。[6] 在运行时测试中,主机可能看起来暴露程度较低,因为攻击路径在本地被阻止,而长期的修复仍需要安装供应商修复后的内核软件包。[2][6] 脚本通过尝试实际的 `unshare --user` 调用并检查 user+net 命名空间内的 `CAP_NET_ADMIN` 是否起作用,来验证 AppArmor 限制的有效性。
## Red Hat 特定说明
Red Hat 明确列出,当更改适合环境时,阻止加载 `nf_tables` 模块可作为 CVE-2026-23111 的缓解措施。[3] 脚本通过 `check_modprobe_deny()` 检测此配置,并区分严格拒绝(`install nf_tables /bin/false`,这会阻止按需加载)和软黑名单(不会阻止加载)。在 RHEL 系列系统上,脚本还会检查正在运行的内核的 RPM 更新日志,查找是否有 CVE-2026-23111 的向后移植条目,从而独立于上游版本号得出供应商确认的结论。
## 官方参考
- NVD:[CVE-2026-23111 详情](https://nvd.nist.gov/vuln/detail/CVE-2026-23111) [1]
- Ubuntu Security:[CVE-2026-23111](https://ubuntu.com/security/CVE-2026-23111) [2]
- Red Hat Security:[CVE-2026-23111](https://access.redhat.com/security/cve/cve-2026-23111) [3]
- 加拿大网络安全中心公告:[AL26-011](https://www.cyber.gc.ca/en/alerts-advisories/al26-011-vulnerabilities-affecting-linux-cve-2026-43284-cve-2026-43500) [4]
- Ubuntu AppArmor 用户命名空间限制概述:[了解 AppArmor 用户命名空间限制](https://discourse.ubuntu.com/t/understanding-apparmor-user-namespace-restriction/58007) [6]
## 范围与安全性
本 README 和配套脚本旨在用于防御性验证、资产清点和缓解计划。它们不能替代供应商指导、软件包级验证或标准的补丁管理流程,也不应作为应用链接公告中描述的官方修复程序的替代品。[2][3][4]
# 📚 教育性安全研究仓库
一个用于在受控环境中学习、测试和研究网络安全概念的仓库。
## ⚠️ 安全与法律免责声明
## 目的
本仓库仅用于**教育和授权的安全研究**。
它旨在帮助用户了解:
- 安全漏洞
- 沙箱和隔离概念
- 安全编码和防御实践
## 仅限授权使用
仅在您拥有权限的环境中使用此仓库,例如:
- 个人实验室或机
- Docker 或隔离环境
- 授权的渗透测试
- 网络安全培训或学术研究
严禁未经授权或非法使用。
## 免责声明
作者和贡献者对本项目造成的任何损坏、误用、法律问题或损失**不承担任何责任**。
使用本仓库即表示您同意:
- 您对自己的行为负责
- 您将合法且合乎道德地使用它
- 本项目按“原样”提供,**不提供任何保证**
## 道德使用
本项目旨在用于:
- 防御性安全研究
- 网络安全教育
- 漏洞感知
- 安全系统和软件研究
请遵循负责任的披露惯例并遵守所有适用法律。
## 联系方式
如需进行负责任的披露或合作,请通过 GitHub 联系仓库维护者。
标签:Maven, Shell, URL发现, Web报告查看器, 子域名枚举, 安全检测, 安全渗透, 应用安全, 本地提权, 漏洞验证, 系统安全