当前位置:首页>Linux>Linux 新提权漏洞 DirtyFrag

Linux 新提权漏洞 DirtyFrag

  • 2026-10-11 17:13:31
Linux 新提权漏洞 DirtyFrag

简介

DirtyFrag 是刚公开的 Linux 本地提权漏洞链。它把 splice()、page cache、struct sk_buff 的 frag,以及内核里的 in-place crypto 路径串在一起,最终让普通用户影响本来只能读的文件页缓存。

项目地址: https://github.com/V4bel/dirtyfrag

技术原理

DirtyFrag 属于 Dirty Pipe、Copy Fail 这一类问题:内核为了少拷贝、快传输,把文件页缓存通过零拷贝路径挂到另一个数据结构里;后续代码又把这块数据当成“自己可以原地修改”的缓冲区。

问题就出在这个所有权判断上。

在正常路径里,struct sk_buff 的 frag 可以指向外部页。splice() 把只读文件的 page cache 页面挂进 skb frag 后,如果后续网络或加密代码执行 in-place 写入,就可能把写操作落到 page cache 上。

DirtyFrag 不是单点漏洞,而是两条路径的组合:

路径
触发位置
写入特征
环境盲区
修复思路
xfrm-ESP Page-Cache Write
ESP 输入解密路径
4 字节 STORE
需要能创建 user/net namespace
标记 shared frag,强制走 COW
RxRPC Page-Cache Write
RXKAD 校验解密路径
8 字节 in-place 写
依赖 rxrpc.ko 是否存在或加载
非线性 skb 先复制,再解密

xfrm-ESP 路径

ESP 侧的问题在 esp_input()。当 skb 是非线性的,但没有 frag_list 时,代码可能跳过 skb_cow_data(),直接在 frag 上做 in-place AEAD 解密。

如果这个 frag 来自 splice() 挂进去的文件页缓存,那么加密预处理里的 STORE 就不再只是写网络包缓冲区,而是写到了文件 page cache。

仓库说明里提到,这条路径的影响范围从 2017 年 1 月 17 日的相关提交开始,一直覆盖到当时的 upstream 状态。它不依赖 race condition,失败时也不会直接让内核 panic,所以稳定性比传统竞争类漏洞更高。

RxRPC 路径

RxRPC 侧的问题在 RXKAD 安全校验。校验数据包时,内核会对 skb payload 做 in-place pcbc(fcrypt) 解密。

如果 payload 仍然挂着来自 splice() 的文件页缓存,解密结果就可能落到 page cache。和 ESP 路径不同,RxRPC 的写入值不是直接可控,需要经过密码函数约束;但它不需要创建 user namespace。

这也是 DirtyFrag 要把两条路径串起来的原因:ESP 路径覆盖面广,但有 namespace 条件;RxRPC 路径对 namespace 要求低,但模块覆盖面没有 ESP 广。两者组合后,盲区互补。

DirtyFrag 与 Copy Fail 的关系

README 明确写到,Copy Fail 是这项研究的动机之一。DirtyFrag 和 Copy Fail 共享同一个大方向:把只读文件页缓存引入会发生原地写入的内核路径。

差别在触发面。

项目
主要对象
触发模块
公开缓解是否覆盖 DirtyFrag
Dirty Pipe
struct pipe_buffer
pipe 相关路径
不覆盖
Copy Fail
AF_ALG / AEAD 路径
algif_aead
不完全覆盖
DirtyFrag
struct sk_buff
 frag
xfrm-ESP + RxRPC
需要单独处理

仓库特别强调:即使系统已经按 Copy Fail 的公开建议禁用了 algif_aead,仍然可能受 DirtyFrag 影响。因为 DirtyFrag 的 xfrm-ESP 路径不依赖 algif_aead。

影响范围

DirtyFrag 的新,不只是仓库发布时间新。更麻烦的是披露窗口也很近:write-up 里记录,相关细节在 2026 年 5 月 7 日提交给 linux-distros,随后因为第三方公开导致 embargo 被打破,作者当天公开完整文档。

README 中列出的测试发行版包括:

发行版
README 中的测试内核
Ubuntu 24.04.4
6.17.0-23-generic
RHEL 10.1
6.12.0-124.49.1.el10_1.x86_64
openSUSE Tumbleweed
7.0.2-1-default
CentOS Stream 10
6.12.0-224.el10.x86_64
AlmaLinux 10
6.12.0-124.52.3.el10_1.x86_64
Fedora 44
6.19.14-300.fc44.x86_64

仓库没有给出完整 Benchmark 数字。它给出的判断是:这是确定性的逻辑漏洞,不依赖时间窗口,失败时不容易造成内核崩溃,成功率很高。

补丁状态要分开看:

位置
仓库记录的状态
xfrm-ESP
2026 年 5 月 7 日,shared-frag 思路的修复进入 netdev tree
RxRPC
write-up 中写明,当时 upstream 还没有合入补丁
发行版内核
README 发布时提到尚无发行版补丁,实际以各发行版安全公告为准

所以它更像一个“刚进入应急窗口”的漏洞:上游补丁、发行版回补、企业内核更新、临时缓解策略,可能不会在同一天完成。

快速上手

  1. 克隆仓库,先读文档。
git clone https://github.com/V4bel/dirtyfrag.gitcd dirtyfragsed -n '1,120p' README.md

assets/write-up.md 是技术细节,exp.c 是 PoC。生产环境里不要编译运行 PoC;需要验证时,推荐隔离虚拟机或授权靶场。

  1. 看当前内核和相关模块。
uname -alsmod | grep -E '^(esp4|esp6|rxrpc)\b' || true

如果业务依赖 IPsec、RxRPC、AFS 相关能力,先确认影响,再做模块禁用。别在不了解业务的机器上直接改内核模块策略。

  1. 按 README 做临时缓解。
sudo sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf"sudo rmmod esp4 esp6 rxrpc 2>/dev/null || true

这会阻止相关模块加载,可能影响 IPsec、RxRPC 或依赖这些模块的业务。更稳妥的做法是先在测试机验证,再批量下发。

  1. 等发行版内核更新。
# Debian / Ubuntusudo apt updatesudo apt full-upgrade# RHEL / Fedora / CentOS Streamsudo dnf update kernel

更新后重启,再确认运行中的内核版本。

往期推荐 📚

anything-analyzer:AI抓包分析器

让 JADX 接上 AI

Copy Fail:一个几乎影响所有主流 Linux 发行版的提权漏洞

欢迎关注“攻防录”✨

最新文章

随机文章