近日,安全研究人员在 Linux 内核文件系统中发现了一个 size_t-to-int 类型转换漏洞,并认为 2014 年以来的所有 Linux 内核版本均有可能受到影响。该漏洞被命名为 Sequoia(编号 CVE-2021-33909),是一个权限提升漏洞,可使低权限用户获得 root 权限。
Sequoia 漏洞的原理
Linux 内核文件系统接口是一个层级架构,包括用户接口层、文件系统实现和存储设备驱动程序,是操作系统最重要的功能,在大多数 Linux 操作系统中极为普遍。
Linux 内核的 seq_file 接口产生包含记录序列的虚拟文件,每个记录必须适合 seq_file 缓冲区。当空间耗尽时,它只需将其体积翻倍即可扩大空间。然而,如果 size_t 变量被传递给 size 参数为 32 位整数而不是 size_t 的函数时,会发生什么呢?这正是 Sequoia 漏洞的攻击原理。
来自 Qualys 的安全研究人员表示:通过创建、挂载和删除一个总路径长度超过 1GB 的深层目录结构,并 open()s 和 read()s /proc/self/mountinfo,无特权的本地攻击者可以通过一系列其他操作实现内存越界写入。攻击者可以借此破坏数据,使系统崩溃,甚至执行未经授权的代码。
Qualys 研究人员成功利用该漏洞,在 Ubuntu 20.04、Ubuntu 20.10、Ubuntu 21.04、Debian 11 和 Fedora 34 工作站的默认安装设置下获得了完全的 root 权限。其他 Linux 发行版也有可能存在该漏洞并被利用。
解决方案
Qualys 团队于 6 月初发现该漏洞,目前红帽已经发布了补丁。7 月 20 日,Linux 内核维护者 Greg Kroah-Hartman 发布了 Linux 内核 5.13.4 版本针对 Sequoia 的内核补丁。
如果无法升级内核,用户仍然可以通过将 /proc/sys/kernel/unprivileged_userns_clone 设置为 0 来缓解问题,这可以防止攻击者在用户命名空间中挂载长目录。但是,攻击者仍然可以通过用户空间文件系统 (FUSE) 挂载长目录。当该长目录超过 8MB,systemd 会耗尽其堆栈,崩溃,导致整个操作系统崩溃。
用户还可以将 /proc/sys/kernel/unprivileged_bpf_disabled 设置为 1,以防止攻击者将 eBPF 程序加载到内核。
然而以上缓解措施只阻止了 Qualys 的特定漏洞利用方法,可能还存在其他攻击方式。要完全修复该漏洞,必须给内核打上补丁。
参考链接: