Dirty Frag 是一个刚刚公开的 Linux 内核本地权限提升(Local Privilege Escalation, LPE)漏洞,由韩国安全研究员 Hyunwoo Kim(@v4bel)发现并报告。它允许普通用户在多数主流 Linux 发行版上稳定获得 root 权限。
核心特点
漏洞本质:属于“Dirty”系列漏洞(Dirty Pipe、Copy Fail 等)。攻击者通过 splice() 将仅拥有读权限的页缓存(page cache)页面“种植”到 struct sk_buff 的 frag(分片)中,随后内核在零拷贝路径上对该页面进行 原地写操作,从而永久修改页缓存内容。
确定性高:无需竞态条件(race condition),失败也不会导致内核 panic,成功率极高。
影响范围广:几乎覆盖所有主流发行版(Ubuntu、RHEL、Fedora、openSUSE 等),其中 xfrm-ESP 变体影响时间长达约 9 年。
两个漏洞链Dirty Frag 通过链式利用两个独立的 “Page-Cache Write” 漏洞实现全覆盖:
xfrm-ESP Page-Cache Write(主要变体)
利用 IPsec ESP 输入路径(esp_input / esp6_input)绕过 skb_cow_data(),直接在来自 splice() 的 frag 页面上执行 AEAD 解密/crypto 操作。
提供 任意 4 字节写(STORE)原语,攻击者可精准控制写入的文件偏移和值。
需要 CAP_NET_ADMIN 权限(通常可通过 unprivileged user namespace 获得)。
RxRPC Page-Cache Write
两者互补:ESP 变体覆盖面广但需 namespace;RxRPC 变体无需 namespace 但模块加载受限。链式使用后,几乎所有主流发行版均受影响。即使已应用 Copy Fail 的缓解措施,仍可能被绕过。利用方式(概念)攻击者通常针对 /usr/bin/su(setuid-root)等文件的页缓存进行修改,注入精心构造的 root shell ELF。二进制在内存中映射后,执行 execve("/usr/bin/su") 即可完成提权。整个过程确定性强,修改后的页缓存会持久存在,直到执行 drop_caches 或系统重启。GitHub 上已公开 PoC(exp.c),可一行命令编译运行(仅供授权测试使用)。受影响版本
缓解措施(当前)由于 embargo 被第三方打破,目前尚未有官方 CVE 和 patch。建议立即执行以下缓解命令:
bash
sudo 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"
参考资源:
这是一个典型的 Linux 内核页缓存与网络栈零拷贝路径逻辑漏洞,提醒我们在复杂场景下仍需持续进行代码审计。生产环境建议尽快应用缓解措施并关注官方补丁发布。