LinuxFUSE漏洞允许非特权用户获取rootshell

admin 2026-07-22 07:52:39 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: Linux内核FUSE子系统存在CVE-2026-31694漏洞,允许非特权用户通过破坏页面缓存并劫持SUID二进制文件(如/usr/bin/su)来提升权限至root。问题源于fuseadddirenttocache()函数在处理过大目录条目时发生24字节堆溢出。该漏洞影响Linuxv6.16-rc1及更高版本且仅影响4KiB页面大小的系统。建议立即应用补丁或升级内核以修复此漏洞。 综合评分: 88 文章分类: 漏洞分析,渗透测试,红队,内网渗透


cover_image

Linux FUSE漏洞允许非特权用户获取root shell

ZM ZM

暗镜

2026年7月16日 08:00 北京

在小说阅读器读本章

去阅读

Linux 内核 FUSE 子系统中新披露的一个漏洞允许非特权本地用户通过破坏页面缓存并劫持 SUID 二进制文件(例如 Ubuntu 26.04 上的 /usr/bin/su)的执行来提升权限至 root。

该漏洞编号为 CVE-2026-31694,影响 FUSE 目录缓存逻辑。当与非特权 FUSE 挂载结合使用时,攻击者可以利用此漏洞在内核版本 v6.16-rc1 及更高版本上实现可靠的本地权限提升 (LPE)。

问题出在 fs/fuse/readdir.c 中的 fuse_add_dirent_to_cache() 函数。当启用 FOPEN_CACHE_DIR 标志时,此函数会将 FUSE 目录条目复制到内核页面缓存中。

FUSE 目录条目表示为 struct fuse_dirent,其中总记录大小 (reclen) 通过 FUSE_DIRENT_SIZE() 宏从攻击者控制的 namelen 字段派生而来。

虽然 namelen 的上限为 4095 字节,但这仍然允许最大序列化记录大小为 4120 字节,超过了 x86_64 系统上的标准 4 KiB 页面大小。

存在漏洞的逻辑仅检查 dirent 是否适合当前页面的剩余空间,如果不适合,则跳转到新页面并将 reclen 字节复制到其中,而不验证 dirent 本身是否超过 PAGE_SIZE,从而导致页面缓存页末尾发生 24 字节的堆溢出。

Bynario团队通过将这个受控的 24 字节溢出链接到缓存的 SUID 二进制文件中的代码执行,验证了可利用性。

由于可执行文件也由页面缓存支持,因此破坏 SUID 二进制文件的缓存内容可以让攻击者修改下次调用时将以 root 权限执行的指令。

在 Ubuntu 26.04 上,由于 7.0 内核存在漏洞,该漏洞利用的目标是 /usr/bin/su 的 .init 部分,该部分在 main() 之前和正常的身份验证流程之前运行。

通过精心控制内存分配,利用“牺牲”文件池和重复的缓存故障/驱逐周期,该漏洞利用程序安排将过大的 FUSE 目录项页分配到 su 的 .init 页之前,因此 24 字节的溢出会替换该页中的第一条指令。

注入的有效载荷是一段极简的 x86_64 shellcode,它调用 setuid(0) 和 setgid(0) 后返回,使得 su 命令可以像往常一样继续执行,但此时它使用的是 root 权限,无需输入密码。当执行被篡改的 /usr/bin/su 时,进程会打印 uid=0(root)。这会将攻击者置于 root shell 中,从而确认 LPE 攻击成功。

易受攻击的目录缓存逻辑是在 2018 年通过提交 69e34551152a(“fuse:允许缓存 readdir”)引入的,但直到后来的更改增加了 FUSE readdir 缓冲区大小,才使其实际上可行。

在提交 dabb90391028(“fuse:增加 readdir 缓冲区大小”)之前,内核仅为 FUSE readdir 回复分配了 PAGE_SIZE 缓冲区,从而阻止了 4120 字节恶意 dirent 的传递;因此,实际利用从 Linux v6.16-rc1 及更高版本开始。

只有页面大小为 4 KiB 的系统才会受到影响,因为更大的页面大小可以容纳 4120 字节的记录而不会溢出。

攻击者必须能够挂载 FUSE 文件系统,无论是通过非特权用户命名空间还是通过 fusermount3,然后从 FUSE 服务器返回一个过大的目录条目,并通过对精心构造的目录调用 getdents64() 来触发易受攻击的路径。

上游开发人员接受了一个补丁,该补丁增加了一个简单但有效的保护措施:如果序列化的 dirent 大小 reclen 超过 PAGE_SIZE,内核将跳过缓存该条目,而不是将其复制到页面缓存中。

这项更改已合并为提交 51a8de6c50bf947c8f534cd73da4c8f0a13e7bed,通过确保没有单个缓存 dirent 可以溢出页面边界,从而完全防止溢出。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:暗镜 ZM ZM《Linux FUSE漏洞允许非特权用户获取root shell》

评论:0   参与:  0