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 不是单点漏洞,而是两条路径的组合:
rxrpc.ko 是否存在或加载 |
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 侧的问题在 RXKAD 安全校验。校验数据包时,内核会对 skb payload 做 in-place pcbc(fcrypt) 解密。
如果 payload 仍然挂着来自 splice() 的文件页缓存,解密结果就可能落到 page cache。和 ESP 路径不同,RxRPC 的写入值不是直接可控,需要经过密码函数约束;但它不需要创建 user namespace。
这也是 DirtyFrag 要把两条路径串起来的原因:ESP 路径覆盖面广,但有 namespace 条件;RxRPC 路径对 namespace 要求低,但模块覆盖面没有 ESP 广。两者组合后,盲区互补。
README 明确写到,Copy Fail 是这项研究的动机之一。DirtyFrag 和 Copy Fail 共享同一个大方向:把只读文件页缓存引入会发生原地写入的内核路径。
差别在触发面。
struct pipe_buffer | |||
algif_aead | |||
struct sk_buff |
仓库特别强调:即使系统已经按 Copy Fail 的公开建议禁用了 algif_aead,仍然可能受 DirtyFrag 影响。因为 DirtyFrag 的 xfrm-ESP 路径不依赖 algif_aead。
DirtyFrag 的新,不只是仓库发布时间新。更麻烦的是披露窗口也很近:write-up 里记录,相关细节在 2026 年 5 月 7 日提交给 linux-distros,随后因为第三方公开导致 embargo 被打破,作者当天公开完整文档。
README 中列出的测试发行版包括:
仓库没有给出完整 Benchmark 数字。它给出的判断是:这是确定性的逻辑漏洞,不依赖时间窗口,失败时不容易造成内核崩溃,成功率很高。
补丁状态要分开看:
所以它更像一个“刚进入应急窗口”的漏洞:上游补丁、发行版回补、企业内核更新、临时缓解策略,可能不会在同一天完成。
git clone https://github.com/V4bel/dirtyfrag.gitcd dirtyfragsed -n '1,120p' README.mdassets/write-up.md 是技术细节,exp.c 是 PoC。生产环境里不要编译运行 PoC;需要验证时,推荐隔离虚拟机或授权靶场。
uname -alsmod | grep -E '^(esp4|esp6|rxrpc)\b' || true如果业务依赖 IPsec、RxRPC、AFS 相关能力,先确认影响,再做模块禁用。别在不了解业务的机器上直接改内核模块策略。
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 或依赖这些模块的业务。更稳妥的做法是先在测试机验证,再批量下发。
# Debian / Ubuntusudo apt updatesudo apt full-upgrade# RHEL / Fedora / CentOS Streamsudo dnf update kernel更新后重启,再确认运行中的内核版本。
往期推荐 📚
Copy Fail:一个几乎影响所有主流 Linux 发行版的提权漏洞
欢迎关注“攻防录”✨