LFZ 的技术笔记

🔥 一个!符号让攻击者获得 root 权限 — CVE-2026-23111 Linux 内核漏洞深度解析

Linux kernel nf_tables use-after-free vulnerability CVE-2026-23111

2026 年 6 月,安全研究人员披露了一个令人瞠目结舌的 Linux 内核漏洞:代码中一个多余的感叹号”!”,让任意普通用户可以直接提权到 root。更震撼的是,PoC 现已公开,稳定率超过 99%。本文将深入分析 CVE-2026-23111 的技术细节与应急方案。


🔍 漏洞概览

CVE-2026-23111 位于 Linux 内核的 nf_tables 子系统——这是现代 Linux 的包过滤框架,替代了传统的 iptables。漏洞类型为 Use-After-Free(UAF),CVSS 评分 7.8(High)

  • CVE 编号:CVE-2026-23111
  • 漏洞类型:Use-After-Free(释放后使用)→ 本地权限提升
  • 影响组件:Linux kernel nf_tables 包过滤子系统
  • 攻击前提:需要本地普通用户权限 + unprivileged user namespaces(默认开启)
  • 影响范围:Ubuntu 22.04/24.04/25.10、Debian Bookworm/Trixie、RHEL 10、SUSE、Amazon Linux 等主流发行版

⚙️ 技术根因:一个感叹号引发的”血案”

漏洞函数是 nft_map_catchall_activate(),它在 nf_tables 事务回滚阶段(Abort Phase)负责重新激活 catchall 元素。问题出在一行代码的逻辑取反上:

/* ❌ 错误的代码 - nft_map_catchall_activate() */
if (!nft_set_elem_active(ext, genmask))
    continue;  /* 跳过非活跃的,处理活跃的 → 刚好反了!*/

/* ✅ 修复后的代码 - 删掉那个 "!" */
if (nft_set_elem_active(ext, genmask))
    continue;  /* 跳过活跃的,只处理非活跃的 → 正确!*/

这个反逻辑导致了什么后果?当一条 nft 事务(比如删除一个规则集)失败触发回滚时:

  1. 引用计数不增反减:本该增加的 chain->use 引用计数未被正确恢复
  2. 每次回滚都扣一次:每触发一次 abort 周期,引用计数就永久减少 1
  3. 引用计数归零:当 chain->use 变为 0 时,DELCHAIN 操作可以成功删除这个 chain
  4. 释放后使用:chain 虽已被释放,但 catchall verdict 元素仍然指向它——UAF 条件达成

攻击者随后通过 seq_operations spray、msg_msg 堆风水等经典内核利用技术,完成内核基址泄露 → 堆地址泄露 → ROP 链执行 → 禁用 SELinux → 替换 modprobe_path → 提权到 root 的完整攻击链。


🎯 攻击场景:不止是本地提权

虽然漏洞需要本地访问权限,但在以下场景中威胁尤为严峻:

  • 共享主机 / 跳板机 / CI 构建服务器:任意有 shell 的用户 → 直接 root
  • Kubernetes 容器逃逸:攻击者从被攻陷的 pod 内部突破到宿主机
  • 云 VM 横向移动:获得低权限账户后迅速提权控制整台实例

据 Exodus Intelligence 的测试,该漏洞在空闲系统上的利用稳定率超过 99%——内核常见的 KASLR、SMEP/SMAP 等防护机制均被绕过。


🛡️ 检测你的系统是否受影响

立刻检查当前内核版本:

# 查看内核版本和构建日期
uname -r    # 如 6.8.0-50-generic
uname -v    # 编译日期信息

# 检查 nf_tables 模块是否加载
lsmod | grep nf_tables

# 检查 unprivileged user namespaces 是否启用(默认开启)
sysctl kernel.unprivileged_userns_clone
# 返回 1 表示开启

各发行版已修复版本参考

  • Ubuntu:22.04 LTS → 5.15.0-134+ / 24.04 LTS → 6.8.0-52+
  • Debian:Bookworm → 6.1.129+ / Trixie → 6.12.20+
  • RHEL 10:kernel-10.0.0-55+
  • 上游主线:6.14+ 已包含修复(2026 年 2 月 5 日合入)

更新后必须重启系统,内核热补丁需要重启才能生效:

# Ubuntu/Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot

# RHEL/CentOS
sudo yum update kernel && sudo reboot

🔒 无法立即更新?试试缓解措施

如果因为业务连续性无法立刻重启,可以通过限制 user namespaces 阻断攻击路径:

# 临时禁用 unprivileged user namespaces(立即生效)
sudo sysctl -w kernel.unprivileged_userns_clone=0

# 写入 sysctl 配置使其持久化
echo "kernel.unprivileged_userns_clone=0" | sudo tee /etc/sysctl.d/99-disable-userns.conf

# 注意:Docker/Podman 容器需要该特性,禁用后容器可能无法正常运行

替代方案:如果必须保留容器能力,可以使用 apparmorseccomp 策略限制 nf_tables 的调用,但有效性不如直接修补内核。


⏱️ 时间线回顾

  • 2026 年 2 月 5 日:上游内核合入修复补丁(删掉一个”!”)
  • 2026 年 4 月 16 日:FuzzingLabs 发布独立 PoC
  • 2026 年 6 月 8 日:Exodus Intelligence 发布完整技术分析
  • 2026 年 6 月 10 日:Ars Technica / The Hacker News 等媒体报道,引起广泛关注

💡 快速参考

操作命令
检查内核版本uname -r && uname -v
检查 nf_tables 模块lsmod | grep nf_tables
检查 user namespace 状态sysctl kernel.unprivileged_userns_clone
临时禁用提权路径sudo sysctl -w kernel.unprivileged_userns_clone=0
Ubuntu 更新内核sudo apt update && sudo apt upgrade linux-image-$(uname -r)
Debian 更新内核sudo apt update && sudo apt upgrade linux-image-$(uname -r)
RHEL 更新内核sudo yum update kernel
查看 CVE 详情https://nvd.nist.gov/vuln/detail/CVE-2026-23111

📝 结语

CVE-2026-23111 再次印证了“差之毫厘,谬以千里”——一个字符的错误让 Linux 内核的防御体系形同虚设。所幸上游修复已在 2 月合入,所有主流发行版也已跟进。建议所有运维人员立即检查内核版本并安排重启。安全无小事,更何况只是一个”!”的距离。

参考来源Ars Technica | The Hacker News | FuzzingLabs

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注