又一个 Linux 内核本地提权漏洞曝光。安全研究人员发现了 CVE-2026-68138,这是存在于 Linux 流量控制(traffic-control)子系统中 qdisc rate-table 代码的一个竞态条件漏洞。攻击者只需一个普通用户权限,即可在数秒内获得 root shell。目前公开了可用 POC,影响范围覆盖 Linux 5.1 至 7.1.5 版本。
一、漏洞概述
CVE-2026-68138 是一个存在于 Linux 内核 qdisc rate-table 代码中的竞态条件(Race Condition)本地权限提升漏洞。漏洞发现者为 Aldo Ariel Panzardo,由安全研究员 A. Ramos(@aramosf)于 2026 年 8 月 12 日公开了完整 POC。
该漏洞的核心问题在于:qdisc_get_rtab() 和 qdisc_put_rtab() 函数管理着一个全局单链表 qdisc_rtab_list 和一个普通非原子整数引用计数器 refcnt。在历史版本中,调用者持有 RTNL(Runtime Netlink Lock)互斥锁,这保证了对链表的访问是串行化的。
然而,花分类过滤器(flower classifier)设置了 TCF_PROTO_OPS_DOIT_UNLOCKED 标志。当收到 RTM_NEWTFILTER 请求时,flower 规则可以到达 police 动作,在没有持有 RTNL 锁的情况下调用 qdisc rate-table helpers:
fl_change()
→ tcf_exts_validate_ex()
→ tcf_action_init()
→ tcf_police_init()
→ qdisc_get_rtab() / qdisc_put_rtab()
来自不同网络命名空间的并发请求会竞争同一个对象,导致 struct qdisc_rate_table(在 x86-64 内核上为 1056 字节,从 kmalloc-2k 分配)的 Use-After-Free 或 Double-Free。

二、影响版本
该漏洞的引入 commit 为 470502de5bdb,在 Linux 5.1 版本中正式合入。
| Linux 版本 |
状态 |
| Linux 5.1 之前 |
不受影响 |
| Linux 5.1 ~ 7.1.5 |
受影响(无 vendor backport 情况下) |
| Linux 7.1.6 |
已修复(commit fb29e1b41052) |
| Linux 7.2-rc1 ~ rc4 |
受影响 |
| Linux 7.2-rc5 及以上 |
已修复(commit f43ee0c0730d) |
Ubuntu 发行版受影响情况(截至 2026-08-12):
| Ubuntu 版本 |
内核 |
状态 |
| Ubuntu 22.04 GA |
5.15.0-187.197 |
受影响的代码存在 |
| Ubuntu 22.04 HWE |
6.8.0-136.136 |
受影响的代码存在 |
| Ubuntu 24.04 HWE |
7.0.0-28.28 |
受影响的代码存在(allocator hardening 导致 exploit 链不兼容) |
| Ubuntu 26.04 |
7.0.0-28.28 |
受影响的代码存在(allocator hardening 导致 exploit 链不兼容) |
三、漏洞利用条件
PoC 在以下测试环境中成功验证:
- 架构:x86-64 Linux,4 个虚拟 CPU
- 命名空间:启用非特权用户命名空间和网络命名空间(
CONFIG_USER_NS=y、CONFIG_NET_NS=y)
- 流量控制模块:需启用
CONFIG_NET_CLS=y、CONFIG_NET_CLS_FLOWER=y、CONFIG_NET_CLS_ACT=y、CONFIG_NET_ACT_POLICE=y
- BPF 支持:需要经典 BPF socket 过滤器和 BPF JIT 支持
- 文件系统:
CONFIG_TMPFS_XATTR=y(用于 simple_xattr 堆喷洒)
- 模块支持:
CONFIG_MODULES=y,可用的 /sbin/modprobe
- 内存:建议至少 5 GiB RAM 的隔离 disposable VM
- 文件描述符限制:至少 4096
关键约束:
- 启用了 memory-cgroup accounting 的内核需要不同的回收策略,当前 PoC 不适用
- Ubuntu 24.04/26.04 HWE 版本因 allocator hardening,当前 exploit 链不兼容
四、PoC 分析
4.1 攻击原理
该漏洞的利用依赖于精心设计的多线程竞态攻击。PoC 创建 4 个工作线程,每个线程进入不同的网络命名空间,创建带有 police 动作的 flower 过滤器。
攻击流程:
- 三个 worker 走成功路径:创建 flower 过滤器并获取 rate-table 引用
- 一个 worker(worker 0)走错误路径:在获取 R_tab 和 P_tab 后,提供一个故意无效的 estimator,触发错误路径,释放两个表
- 竞态触发:在表被释放但指针仍被持有期间,其他 worker 的 BPF 分配可以喷射到同一内存槽
- Use-After-Free 利用:通过 SO_GET_FILTER 检测 socket 的 orig_prog->filter 指针是否被重定向到另一个 live BPF 分配
- 权限提升:关闭一个 owner 会通过
sk_filter_release_rcu() 延迟释放,grace period 后 PoC 接管该内存,完成提权
4.2 核心代码片段
// 构建filter请求,关键在于故意提供无效estimator触发错误路径
if (slow_holder) {
// interval=5 是故意无效的(有效最大值是3)
struct tc_estimator estimator = {.interval = 5, .ewma_log = 1};
addattr(nh, cap, TCA_RATE, &estimator, sizeof(estimator));
}
// 关键:act_police在验证estimator失败后,已经获取了R_tab和P_tab
// 然后在错误路径中释放它们,此时其他worker仍持有对同一对象的引用
4.3 关键数据结构
struct leaked_pipe_buffer {
uint64_t page;
uint32_t offset;
uint32_t len;
uint64_t ops;
uint32_t flags;
uint32_t padding;
uint64_t private;
};
通过管道 buffer 泄露内核指针,获取绕过 KASLR 所需的 page 和 ops 指针。
五、修复方案
上游官方修复:
- Mainline 修复 commit:f43ee0c0730d(7.2-rc5)
- Stable 修复 commit:fb29e1b41052(7.1.6)
修复方案为在 qdisc_rtab_list 和 refcnt 访问处增加 qdisc_rtab_lock 自旋锁保护。
临时缓解措施:
- 如果内核支持,禁用非特权用户命名空间:
sysctl -w kernel.unprivileged_user_ns=0
- 禁用网络命名空间:如果不需要,可以考虑限制
CONFIG_NET_NS
- 在容器环境中,限制 CAP_NET_ADMIN 能力
六、检测与响应
IoC 指标:
- 内核版本为 Linux 5.1 ~ 7.1.5 或对应 Ubuntu 版本
- 系统存在大量
RTM_NEWTFILTER 网络链接消息
- 进程尝试访问
/proc/self/ns/net
检测脚本(检查是否在受影响范围内):
# 检查内核版本
uname -r
# 检查是否应用了修复
grep -q "qdisc_rtab_lock" /proc/kallsyms && echo "已修复" || echo "可能受影响"
七、总结
CVE-2026-68138 再次证明了 Linux 内核网络子系统的并发安全性问题。竞态条件漏洞虽然利用难度较高,但一旦成功即可获得系统最高权限,危害极大。
本次漏洞的特殊之处在于:
- 攻击面广:qdisc rate-table 是内核流量控制的核心组件
- 影响周期长:自 Linux 5.1 引入,长达 6 年才修复
- 跨命名空间攻击:即使在不同的网络命名空间中也能竞争同一个全局对象
- 公开 POC:已发布完整可用的 exploit 代码
建议所有使用 Linux 5.1~7.1.5 版本的用户尽快升级内核,或采取临时缓解措施。云栈社区也会持续关注此类内核安全动态,欢迎前往 知识库 交流讨论。