该仓库包含最近发现的、影响 XFS 上 COW 的竞态条件漏洞的概念验证(PoC),该漏洞由优秀的 Qualys 安全团队报告。[1] [2]
根据 Qualys 公告中出色的分析手工编写。该脚本将 /etc/passwd 文件的前 4KB 重写为其原始内容,
并将 root 用户行:root:x:0:0:root:/root:/bin/bash 替换为 root::0:0:root:/root:/bin/bash。注意到区别了吗?现在 root 用户没有密码,你可以直接执行 su -。
这是一个为满足自身需求而写的粗糙 PoC,错误处理很糟糕,也不会对原始文件做任何花哨的备份。已在 Rocky Linux 9.7 虚拟机上测试,该虚拟机运行 XFS / 挂载,内核为 2026 年 2 月版本。它还会粗糙地填充对 /etc/passwd 的写入,所以如果你在乎正在运行它的机器……请在运行前备份该文件。我做这个 PoC 是为了检查我自己的机器,本来打算先捂一段时间,但昨天看到另一个 PoC 已经放出,所以……
如果 /home 与 /etc/passwd 不在同一分区,你可能需要调整 PoC 中的 CLONE_FILE 变量,使其指向一个你可写的路径。/var/tmp 可能会帮到你;你应该能够使用
find / -writable 来寻找暴露面。使用 gcc refluxfs.c -o refluxfs -lpthread 编译。
该 PoC 不会留下任何日志或 dmesg 记录。依我之见,捕获此漏洞的最佳方式是设置 SIEM 规则,监控 XFS 文件系统上带有 FICLONE 的 ioctl 调用。
文件完整性监控工具或许也能发现它。
如果可以,请更新内核。另外,Red Hat 使用 SystemTap 的缓解方案也可行:
probe begin {
printf("refluxfs mitigation loaded\n")
}
probe module("xfs").function("xfs_file_remap_range").call {
$remap_flags = 0xffff
}
probe module("xfs").function("xfs_file_remap_range").return {
$return = -95
}
probe end {
printf("refluxfs mitigation unloaded\n")
}
$ xfs_info / | grep reflink=1 和 mount -l | grep xfs 进行检查。XFS 代码中的一个 bug 意味着可以为文件请求写时复制(Copy-On-Write),但 COW 没有被正确撤销。当写入我们的副本文件时,COW 理应被撤销,磁盘上应存在两个不同的文件。利用线程,你可以……因为竞态条件而同时对两个文件进行写入。
如果你能读取目标文件,并对其执行 ioctl(fd, FICLONE),你就能得到一个启用 COW 的副本。必须位于同一分区。

然后,你只需……使用 O_DIRECT 对副本执行 write(),就能修改原始文件。

1: https://openwall.com/lists/oss-security/2026/07/22/14
我的文章里可能有些错误之处,但我总得从某个地方开始,尤其是在这 令人惊叹 的几个月里。
"宁为太平犬,莫作乱离人。"
- 冯梦龙,《醒世恒言》