2026 年 5 月 8 日,安全研究员 Hyunwoo Kim 在 oss-sec 邮件列表公开了一个名为 Dirty Frag 的 Linux 通用本地提权漏洞(LPE)。影响范围覆盖所有主流发行版,普通用户可直接提权到 root。
| 更炸裂的是:因为禁令被打破,目前没有任何补丁和 CVE。完整 exploit 已公开。 |
这是什么漏洞?
Dirty Frag 和之前的 Copy Fail 一样,都是利用 Linux 内核 page cache 原地修改 实现任意文件覆写。攻击者可以让内核在内存中修改一个只读文件的内容,而这个修改对后续所有读取该文件的进程都生效。
漏洞链式利用了两个独立的内核 bug:
●XFRM/ESP 子系统的 page cache 污染 — 通过 IPsec ESP 协议的解密路径,让内核对文件的 page cache 执行原地解密操作
●rxrpc/rxkad 子系统的 page cache 污染 — 通过 AFS/RxRPC 协议的包验证路径,对文件 page cache 执行 pcbc(fcrypt) 原地解密
| 核心机制:内核以为自己在解密网络数据包,实际上是在修改文件的内存页面。 |
漏洞原理深度解析
核心原语:Page Cache 原地修改
Linux 的 page cache 是文件在内存中的缓存。正常情况下,读取文件会先查 page cache,如果命中就直接返回缓存数据。
Dirty Frag 的攻击原语是:在不触发写回(writeback)的前提下,修改 page cache 中的数据。这意味着:
● 修改只存在于内存中,磁盘上的文件不变
● 但所有后续的 read() 调用都会读到被篡改的数据
● 对 setuid 程序特别有效:内核从 page cache 加载 ELF 时,加载的就是被篡改的版本
漏洞一:XFRM/ESP 路径
利用 vmsplice() + splice() 系统调用,将文件页面注入 ESP(IPsec Encapsulating Security Payload)的解密路径。
关键步骤:
❶ 创建 user namespace + net namespace(无需特权)
❷ 在 netns 内建立 48 个 XFRM SA,每个控制 4 字节的解密输出
❸ 通过 splice() 将 /usr/bin/su 的对应偏移注入 ESP 处理管道
❹ 内核执行 XFRM 解密 → 原地覆写 page cache
❺ /usr/bin/su 的 page cache 被替换为 192 字节的 root-shell ELF
❻ 执行 su → 实际运行 shellcode → setgid(0); setuid(0); execve("/bin/sh")
| 关键点:整个过程不需要写磁盘,只修改内存中的 page cache。传统的文件完整性检查(如 IMA/EVM)无法检测到这种攻击。 |
漏洞二:rxrpc/rxkad 路径(Ubuntu 备用方案)
当 ESP 路径受 sandbox 限制时,rxrpc 路径作为备用:
❶mmap 只读打开 /etc/passwd,固定其 page cache
❷ 离线暴力搜索 fcrypt 密钥 K_A, K_B, K_C — 使得解密后 root 行变成 "root::0:0:..."
❸ 三次内核触发(rxrpc splice trick),按 last-write-wins 顺序覆写
❹ PAM pam_unix.so 的 nullok 选项接受空密码 → su - 获得 root shell
暴力搜索的概率看起来很低,但 fcrypt 是 8 字节密钥,在现代 CPU 上暴力搜索速度可达 ~2M/s,几分钟内就能找到合适的密钥。
192 字节的 Root Shell
ESP 路径注入的 payload 是一个 192 字节的极简 x86_64 ELF:
| // _start at 0x400078: xor edi, edi // setgid(0) xor esi, esi xor eax, eax mov al, 0x6a // __NR_setgid syscall mov al, 0x69 // __NR_setgid syscall mov al, 0x74 // __NR_setgroups syscall // ... execve("/bin/sh", NULL, ["TERM=xterm", NULL]) |
整个 ELF 只有 192 字节,包含一个 PT_LOAD 段。先 setgid(0); setuid(0); setgroups(0, NULL) 提权,再 execve("/bin/sh") 获得 root shell。
Exploit 整体流程
DirtyFrag Chain (uid=1000 → root) 1. unshare(NEWUSER | NEWNET) → 获得 namespace 2. ESP 路径: 48个 SA + splice → su 被覆写 3. rxrpc 路径: 暴力搜索密钥 → passwd 被覆写 4. 任一目标被篡改 → spawn PTY → root shell |
受影响范围
所有主流 Linux 发行版均受影响,因为漏洞存在于内核主线代码中:
● Ubuntu / Debian
● RHEL / CentOS / Fedora
● Arch Linux
● SUSE / openSUSE
● Android(部分内核配置)
| 前置条件:需要 unprivileged user namespace 支持(大多数发行版默认开启)。 |
临时缓解措施
由于目前没有补丁,唯一的办法是禁用相关内核模块:
| sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true" |
这条命令做了三件事:创建 dirtyfrag.conf 配置文件,让 esp4/esp6/rxrpc 模块无法加载,立即卸载已加载的模块。
| 注意:禁用 esp4/esp6 会影响 IPsec ESP 功能,禁用 rxrpc 会影响 AFS 文件系统。如果生产环境依赖这些功能,需要评估影响。 |
与 Copy Fail 的对比
Dirty Frag 的危险程度比 Copy Fail 更高:双路径利用 + 无补丁 + 完整 exploit 已公开。
技术启示
1. Page Cache 一致性是老大难问题
Linux 的 page cache 设计假设是:文件内容在 mmap/read 期间不会被意外修改。但内核中存在多个子系统可以原地修改 page cache 页面(XFRM 解密、rxrpc 验证等),这些修改路径没有经过正确的权限检查。
2. Namespace 是双刃剑
User namespace 让非特权用户可以创建网络命名空间并操作 XFRM/rxrpc 子系统。这大大扩展了攻击面。禁用 unprivileged user namespace(sysctl user.max_user_namespaces=0)可以阻断利用链,但会影响容器运行时。
3. Setuid 程序的安全假设被打破
传统安全模型假设 setuid 程序的二进制文件在磁盘上是可信的。但 Dirty Frag 不修改磁盘文件,只修改内存中的 page cache,绕过了文件完整性检查(如 IMA/EVM)。
4. 负责人披露的困境
这次事件中,禁令被打破导致漏洞在没有补丁的情况下公开。攻击者现在有了完整的 exploit,而防御者只能靠禁用模块来临时缓解。
检测建议
虽然目前没有补丁,但可以通过以下方式检测潜在利用:
●监控 modprobe 日志:关注 esp4、esp6、rxrpc 模块的加载事件
●审计 user namespace 使用:auditd 规则监控 unshare 系统调用
●检查 modprobe.d 目录:确认是否有 dirtyfrag.conf 缓解措施
●HIDS 文件完整性:虽然无法阻止 page cache 攻击,但可以检测异常进程树
写在最后
Dirty Frag 再次证明了 Linux 内核安全的复杂性。一个看似无害的网络协议处理路径,结合 page cache 的设计缺陷,就能实现可靠的本地提权。
目前唯一能做的就是立即应用缓解措施,禁用 esp4/esp6/rxrpc 模块。等待内核开发者发布正式补丁后,再评估是否重新启用这些功能。
| 参考链接: ● oss-sec 原始披露 ● DirtyFrag.io 技术详情 ● XFRM 内核 commit ● rxrpc 内核补丁讨论 |