CVE-2026-23111 是 Linux 内核 nf_tables 中的一个漏洞,在启用了用户命名空间和 nftables 的系统上,非特权用户可利用该漏洞实现本地权限提升。[1][2] 公开的厂商和政府公告将其描述为一个影响 Linux 发行版的本地问题,并强调修补是首要修复措施。[3][4]
本仓库包含一个防御性验证脚本,旨在帮助评估主机是否暴露了与该 CVE 相关的技术条件,而无需提供权限提升漏洞利用程序。它会检查相关的内核和运行时条件,可选地加载 nf_tables 模块以进行完整的功能测试,尝试使用 unshare 和 nft 进行受限的非特权验证路径,收集本地诊断跟踪,并将主机分类为诸如可能安全、被本地策略阻止或暴露路径可用等操作判定。[1][5]
根据 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)或弱黑名单。/proc/kallsyms 指纹识别易受攻击的符号(nft_map_catchall_activate)与补丁后的符号(nft_catchall_set_activate)。modprobe 加载 nf_tables(需指定 --allow-load-module,见下文),并在退出时自动卸载。unshare -U -n --map-root-user + 验证步骤,并记录标准输出、标准错误和最近的内核日志。脚本将日志存储在脚本目录的子目录中,默认情况下会删除它们,除非使用了 --keep-logs。
默认情况下,脚本从不加载 nf_tables。如果脚本启动时模块尚未加载,则跳过所有功能性 nft 测试,判定仅基于内核版本、kallsyms 指纹、modprobe 配置、RPM 变更日志以及 sysctl/LSM 策略证据。
这种保守的默认设置避免了在生产主机上无意中扩大攻击面。要在受控或仪表化的系统上启用完整的功能测试,请以 root 身份使用 --allow-load-module(见下文)。
# 默认 — 不加载模块,仅基于策略证据进行判定
./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当你需要在隔离的、非生产的或专用测试虚拟机上获得最高置信度的判定时,使用 --allow-load-module。典型场景:
不要在生产主机上使用 --allow-load-module,如果这些主机上已故意阻止了 nf_tables,或者加载它会违反加固策略。
--allow-load-module 的安全门控在尝试加载模块之前,脚本会执行以下检查,如果其中任何一项失败,则会退出并报错:
/etc/modprobe.d/ 中必须不存在硬性 modprobe 拒绝(install nf_tables /bin/false)。modprobe 命令。root(UID 0)身份运行。如果脚本成功加载了模块,则在退出时通过 cleanup() 陷阱调用 modprobe -r nf_tables,无论脚本如何终止(成功、错误或 CTRL+C)。
该脚本使用操作判定而非漏洞利用结果:
这些判定旨在支持修补优先级排序和防御性分类,而非替代供应商软件包状态验证。
该脚本将正在运行的内核与记录的上游修复点进行映射:
主要推荐的操作是安装供应商修复的内核更新,并重启到修正后的内核。[2][3][4] 由于利用依赖于本地内核攻击面,额外的加固可以在安排或验证修补期间减少暴露。[5][6]
nf_tables 加载:如果系统不需要 nftables 功能,并且该更改已针对操作影响进行了验证。[3][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 记录了对非特权用户命名空间的基于 AppArmor 的限制,作为减少攻击面的一种方式,而不是作为内核修复的完整替代。[6] 主机在运行时测试中可能显得暴露较少,因为攻击路径在本地被阻止,但长期修复仍然需要安装供应商修复的内核软件包。[2][6] 该脚本通过尝试实际的 unshare --user 调用并检查用户+网络命名空间内的 CAP_NET_ADMIN 是否功能正常来验证 AppArmor 限制的有效性。
Red Hat 明确将阻止加载 nf_tables 模块列为 CVE-2026-23111 的缓解措施(当该更改适用于环境时)。[3] 该脚本通过 check_modprobe_deny() 检测此配置,并区分硬性拒绝(install nf_tables /bin/false,阻止按需加载)和弱黑名单(不阻止)。在 RHEL 系列系统上,脚本还会检查正在运行的内核的 RPM 变更日志中是否有 CVE-2026-23111 的回传条目,从而能够独立于上游版本号获得供应商确认的判定。
本 README 和附带的脚本旨在用于防御性验证、清单编制和缓解计划。它们不能替代供应商指南、软件包级验证或标准补丁管理流程,也不应作为应用链接公告中描述的官方修复的替代品。[2][3][4]
一个用于在受控环境中学习、测试和研究网络安全概念的仓库。
本仓库仅供教育和授权的安全研究使用。
其设计目的是帮助用户了解:
仅在对您有权限的环境中使用本仓库,例如:
严禁未经授权或非法使用。
作者和贡献者概不负责因本项目造成的任何损害、误用、法律问题或损失。
使用本仓库即表示您同意:
本项目旨在用于:
请遵循负责任的披露实践,并遵守所有适用法律。
如需负责披露或合作,请通过 GitHub 联系仓库维护者。
nftunshare --user 是否确实创建了命名空间,并且 CAP_NET_ADMIN 在其中是否正常运行,以确认 AppArmor 或 SELinux 限制是否真正有效。| 选项 | 描述 |
|---|
--allow-load-module | 授权脚本在模块尚未加载时通过 modprobe 加载 nf_tables。启用完整的 nft catchall 路径测试器和 CAP_NET_ADMIN 有效性测试。模块会在退出时自动卸载。需要 root 权限。 如果已存在硬性 modprobe 拒绝,则拒绝执行。仅用于非生产或仪表化系统。 |
--color | 当终端支持时,启用彩色标准输出。 |
--keep-logs | 保留脚本目录下的日志和跟踪,而不是在退出时删除。 |
--help | 打印使用信息并退出。 |
| 判定 | 含义 |
|---|
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);未完成有意义的运行时验证。 |
| 分支 | 修复版本 | 上游提交 |
|---|
| 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 | 上游已停止支持 | 仅发行版回传 |
| 5.15.x | 取决于发行版 | Amazon Linux: ALAS2KERNEL-5.15-2026-098 |
| 5.10.x | 取决于发行版 | Amazon Linux 2: 截至2026年3月待定 |
| 5.4.x | 取决于发行版 | Amazon Linux 2: 截至2026年3月待定 |
| 5.13–5.14 | 上游已停止支持 | 仅发行版回传 |
| < 5.13 | 不受影响 | catchall 功能不存在 |