CVE-2026-68138.gif

一个概念验证的本地权限升级漏洞利用 针对 CVE-2026-68138,这是 Linux 流量控制速率表代码中的一场竞赛。在 在测试的QEMU环境中,PoC从普通进程升级为 外部 UID 1000 映射到初始用户命名空间中 UID 为 0 的 shell。

警告

该代码故意破坏内核堆状态。只在 你拥有的隔离、一次性虚拟机。错过比赛或过早清理可能会 让客人惊慌失措。不要在工作站、服务器或第三方设备上运行 系统。

漏洞摘要

qdisc_get_rtab()并管理一个全局单链进程 列表,以及一个纯非原子的。从历史上看, 呼叫者持有RTNL互斥,对列表和引用进行序列化访问 数。qdisc_put_rtab()qdisc_rtab_listint refcnt

花卉分类器集合为 。因此,申请花卉规则可能会被警方报警 操作并调用没有RTNL的qdisc速率表辅助工具:TCF_PROTO_OPS_DOIT_UNLOCKEDRTM_NEWTFILTER

tc_new_tfilter()
  -> fl_change()
     -> tcf_exts_validate_ex()
        -> tcf_action_init()
           -> tcf_police_init()
              -> qdisc_get_rtab()/qdisc_put_rtab()

使用相同速率表的并发请求可以竞速全局列表及其 参考数量。结果是一个自由后使用(use-after-free)或双重自由(double-free),一个从上方分配的1056字节对象 测试的x86-64内核。struct qdisc_rate_tablekmalloc-2k

由于列表是全局的,而非每个网络命名空间,请求从 不同的网络命名空间仍然会与同一对象竞争。

受影响和修复版本

Linux CNA 记录识别了引入提交 470502de5bdb, 发布于 Linux 5.1。

线路

现状

提交/版本

Linux 5.1 之前的版本

不受影响

引入的变革缺失

Linux 5.1 到 7.1.5

除非有供应商回溯端口,否则会受到影响

470502de5bdb在稳定修复之前通过提交

Linux 7.1.y

固定

7.1.6, fb29e1b41052

Linux 7.2 开发系列

RC5之前受影响

RC1至RC4

主线

固定

7.2-RC5,F43EE0c0730d

分发内核经常在不更改 上游版本如上所示。检查是否修复提交——或者 等效的QDISC速率表旋锁变化——存在于精确核中 系统使用的来源。

该漏洞利用针对易受攻击的提交进行了验证,该提交是主线的直接父程序 修复。固定核控制所用。92d3817649df2b0b6a008a686c8275c88d7ef594f43ee0c0730d6191629b5ee1ceae27b1ebfdc047

Ubuntu 发行现状

截至2026年8月12日,Ubuntu CVE追踪器搜索未返回该CVE的条目。因此,下表是一个直接的 源检验,而非规范安全状态的判定。每条链接 Ubuntu 标签仍然是解锁状态,且没有修复。qdisc_rtab_listqdisc_rtab_lock

Ubuntu系列

检查过的包裹/标签

来源结果

Ubuntu 22.04 GA

5.15.0-187.197

存在易受攻击的代码;完整任务在QEMU中重现

Ubuntu 22.04 HWE

6.8.0-136.136~22.04.1

存在易受攻击的代码;未测试的利用链

Ubuntu 24.04 HWE

7.0.0-28.28~24.04.1

存在易受攻击的代码;该利用链与其分配器加固不兼容

Ubuntu 26.04

7.0.0-28.28

存在易受攻击的代码;该利用链与其分配器加固不兼容

在那次检查日期,没有发现任何更正的Ubuntu包。未来 Ubuntu包应检查是否有类似链接的回移植 上游修复,而非仅凭版本号来判断。

针对特定构建的Ubuntu 22.04漏洞利用、QEMU实验室、精确镜像校验和,以及 条件记录在 ubuntu/README.md. 中。确实如此 通过与官方内核进行验证,使用 启用内存-Cgroup计费。5.15.0-187-generic #197-Ubuntu

主要PoC要求的条件

底层的漏洞和这条特定的漏洞链是不同的 要求。PoC通过以下方式验证:

  • x86-64 Linux 和四个虚拟 CPU;

  • 启用非特权用户命名空间和网络命名空间;

  • CONFIG_USER_NS=y以及CONFIG_NET_NS=y;

  • CONFIG_NET_CLS=y, , , ,CONFIG_NET_CLS_FLOWER=yCONFIG_NET_CLS_ACT=yCONFIG_NET_ACT_POLICE=y;

  • 经典的BPF套接字滤波器和BPF的JIT支持;

  • CONFIG_TMPFS_XATTR=y用于堆积喷雾;simple_xattr

  • CONFIG_MODULES=y以及作为最终根辅助工具的可用对象;/sbin/modprobe

  • CONFIG_MEMCG=n,因此该链中使用的qdisc/BPF/pipe/xattr分配 共享预期缓存;kmalloc-2k

  • 每个进程文件描述符的限制至少为4096;以及

  • 一个一次性虚拟机,约有5 GiB内存。

CONFIG_SLAB_BUCKETS=y、自由列表随机化和自由列表硬化分别是 在成功的测试内核中启用。KASLR本身并不被 硬编码地址:PoC 获取所需的页面和操作指针 从管道泄漏处。提供的实验室用于简化调试。nokaslr

启用内存-cgroup 计费或不同配置器/缓存的内核 布局需要不同的回收策略。有色人种故意拒绝 声称跨任意分布配置的可携带性。

独立的Ubuntu版本实现了不同的回收策略;它的 需求是有意更窄的,并列在 ubuntu/README.md 中。

开发过程

1. 触发q盘竞赛

四个工作线程进入不同的网络命名空间并生成花朵 通过警察行动进行过滤。三名工人选择了成功的行动路径; 在获得两个汇率表后,提供一个故意无效的估计量 引用,强制清理路径。这种组合使得并行 引用计数和列表操作可重复而无需共享花朵 工者之间的分类器状态。

2. 用经典BPF回收qdisc_rate_table

每次网链请求后,同一CPU都会立即附加一条133条指令 经典BPF滤波器。其1064字节指令阵列分配自并设计使字节重叠且初始有效。kmalloc-2kqdisc_rate_table.nextqdisc_rate_table.refcnt

最后一条指令包含每个插槽的标记。 设 PoC 检测某个套接字的指针是否被重定向到 另一场现场BPF分配。这产生了两个套接字对象,分别指向 相同的指令缓冲区。SO_GET_FILTERorig_prog->filter

3. 将别名转换成管道泄漏

关闭一个房东会推迟实际的免费贷款。 宽限期过后,PoC分配32槽管环:sk_filter_release_rcu()

32 * sizeof(struct pipe_buffer) = 32 * 40 = 1280 bytes -> kmalloc-2k

一个环回收了混叠的BPF缓冲区。读取另一个套接字会显示一个活跃的 ,包括其和指针以及页面缓存条目的偏移量。SO_GET_FILTERpipe_bufferpageops/sbin/modprobe

4. 锻造可合并的管道缓冲器

关闭第二个插座后,在另一个RCU加宽后释放带电管环 句号,而对应的对应者仍然引用它。喷涂会回收1280字节环,并将泄漏的部分放置在预期的槽位并设置。pipe_inode_infosimple_xattrpipe_bufferPIPE_BUF_FLAG_CAN_MERGE

写入每个候选管道最终会附加攻击者控制的字节 支持ELF入口点的页面缓存页。有色人种 读取文件后,确认准确覆盖后才继续。/sbin/modprobe

5. 在初始命名空间执行

近期内核不再使用历史上的无效-binfmt module-autoload 在 中退回。但这种 PoC 反而产生了AF_INET 数据报套接字,协议253不支持。 请求 缺少模块,导致内核执行 被覆盖为初始命名空间根。search_binary_handler()inet_create()net-pf-2-proto-253-type-2/sbin/modprobe

注入的入点有效载荷会写入校样文件并打开根壳 QEMU串口控制台。

建设PoC

访客二进制是静态链接的:

./build.sh

等效命令:

gcc -O2 -static -pthread -Wall -Wextra -Werror \
  -o build/exploit exploit.c

所得的二进制必须在客体内暴露为 。测试实验室使用了QEMU的读写9便士份额。该 根助手期望初始挂载时有这个份额 命名空间;如果实验室用别的,调整一下 布局。/exploit/CVE-2026-68138/chroot/exploithelper_commandexploit.c

相关的测试内核选项记录在 config.fragment 中。它们是片段,而非完整的 生产内核配置。

跑步

来自非特权嘉宾的空壳:

id
/exploit/CVE-2026-68138

这场比赛是概率性的。关于失误的PoC打印:

[-] no BPF alias found in this attempt

重启虚拟机后再尝试。不要在同一个客串:全球范围内重复播放 QDISC列表可能已经损坏了。

成功的执行达到:

[+] confirmed dangling orig_prog->filter pointer
[+] pipe leak: page=<kernel pointer> ops=<kernel pointer> off=0x60f len=1 flags=0
[+] page-cache overwrite via dangling pipe
[+] controlled page-cache write confirmed; triggering helper
[+] CVE-2026-68138 initial-namespace root shell
uid=0(root) gid=0(root) groups=0(root)
[+] ROOT PROOF: uid=0(root) gid=0(root) groups=0(root)

完整的润色后成绩单在文档/example-output.txt中。

重现结果

完整链条从新鲜且易受攻击的虚拟机启动中完成了三次。该 最终二进制产品:

outer identity: uid=1000(user)
alias:          classic-BPF orig_prog->filter overlap
leak:           live pipe_buffer page and ops pointers
write:          verified /sbin/modprobe page-cache modification
final identity: uid=0(root) gid=0(root) groups=0(root)

同一二进制文件对固定提交运行,且使用相同的四vCPU。 拓扑学。约有126,000个比赛请求在未使用BPF别名的情况下完成, 且未达到管道或页缓存阶段。

Ubuntu 22.04.5 QEMU result

Ubuntu专用版本也运行在与官方通用内核完全相同的基础上。访客启动时装有四个vCPU,正常 内存-Cgroup计费,并且是唯一针对漏洞利用的内核 争论。5.15.0-187.197nokaslr

Ubuntu 内核没有被重新编译:测试使用了发行版的 保持不变且匹配的官方模块。Ubuntu 前置表将原生内核特性与运行时及 QEMU 实验室调整分开。vmlinuz-5.15.0-187-generic

起始账户没有sudo访问权限或补充组:

uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu)

从一个新的快照中,漏洞利用获得了BPF别名,并通过以下方式夺回了它 cgroup-v2对象和阻塞位图,验证包含,并达到:simple_xattrselect()/proc/sys/kernel/modprobe/tmp/x

[+] CVE-2026-68138 Ubuntu initial-namespace root shell
uid=0(root) gid=0(root) groups=0(root)
root@cve-2026-68138-jammy:/# id
uid=0(root) gid=0(root) groups=0(root)

查看真实的QEMU成绩单Ubuntu实验说明。变体对该包的地址进行了硬编码,因此需要;它 不宣称能绕过KASLR或与其他Ubuntu版本兼容。modprobe_pathnokaslr