Linux 内核中的 Root 漏洞和 systemd 中的拒绝服务

Qualys 的安全研究人员披露了影响 Linux 内核和 systemd 系统管理器的两个漏洞的详细信息。 内核中的漏洞 (CVE-2021-33909) 允许本地用户通过操纵高度嵌套的目录以 root 权限实现代码执行。

由于研究人员能够准备在默认配置下的 Ubuntu 20.04/20.10/21.04、Debian 11 和 Fedora 34 上运行的有效漏洞,这一事实加剧了该漏洞的危险。 值得注意的是,其他发行版尚未经过测试,但理论上也容易受到该问题的影响并可能受到攻击。 承诺在问题全部消除后会发布漏洞利用的完整代码,但目前只有功能有限的原型可用,导致系统崩溃。 该问题自 2014 年 3.16 月以来一直存在,并影响从 19 开始的内核版本。 该漏洞修复已与社区协调并于 XNUMX 月 XNUMX 日被接受到内核中。 主要发行版已经生成了其内核软件包的更新(Debian、Ubuntu、Fedora、RHEL、SUSE、Arch)。

该漏洞是由于在 seq_file 代码中执行操作之前未能检查 size_t 到 int 转换的结果而导致的,该代码根据记录序列创建文件。 在创建、安装和删除非常嵌套的目录结构(路径大小大于 1 GB)时,不进行检查可能会导致缓冲区写入越界。 结果,攻击者可以获得在“-10 GB - 2 字节”偏移处写入的 10 字节字符串“//deleted”,指向紧邻分配的缓冲区之前的区域。

准备好的漏洞需要 5 GB 内存和 1 万个空闲 inode 才能运行。 该漏洞通过调用 mkdir() 创建约一百万个子目录的层次结构来实现超过 1 GB 的文件路径大小。 该目录通过 bind-mount 挂载到单独的用户命名空间中,然后运行 ​​rmdir() 函数将其删除。 同时,创建一个线程来加载一个小型 eBPF 程序,该线程在检查 eBPF 伪代码之后、JIT 编译之前的阶段被阻塞。

在非特权用户 ID 命名空间中,打开文件 /proc/self/mountinfo 并读取绑定安装目录的长路径名,导致字符串“//deleted”被写入缓冲区开始之前的区域。 选择写入该行的位置,以便它覆盖已测试但尚未编译的 eBPF 程序中的指令。

接下来,在 eBPF 程序级别,通过操作 btf 和 map_push_elem 结构,不受控制的缓冲区外写入​​转化为对其他内核结构进行读写的受控能力。 因此,该漏洞利用程序确定了 modprobe_path[] 缓冲区在内核内存中的位置,并覆盖其中的“/sbin/modprobe”路径,这样您就可以在发生 root 权限时启动任何具有 root 权限的可执行文件。 request_module() 调用,例如在创建 netlink 套接字时执行。

研究人员提供了几种仅对特定漏洞有效的解决方法,但并不能消除问题本身。 建议将“/proc/sys/kernel/unprivileged_userns_clone”设置为 0 以禁用单独用户 ID 命名空间中的挂载目录,并将“/proc/sys/kernel/unprivileged_bpf_disabled”设置为 1 以禁用将 eBPF 程序加载到内核中。

值得注意的是,在分析涉及使用 FUSE 机制而不是 bind-mound 挂载大目录的替代攻击时,研究人员发现了另一个影响 systemd 系统管理器的漏洞 (CVE-2021-33910)。 事实证明,当尝试通过 FUSE 挂载路径大小超过 8 MB 的目录时,控制初始化进程 (PID1) 会耗尽堆栈内存并崩溃,从而使系统处于“恐慌”状态。

问题是systemd跟踪并解析/proc/self/mountinfo的内容,并处理unit_name_path_escape()函数中的每个挂载点,该函数执行strdupa()操作,将数据放置在堆栈上而不是动态分配的内存中。 由于最大堆栈大小通过 RLIMIT_STACK 进行限制,因此处理到挂载点的路径太大会导致 PID1 进程崩溃并停止系统。 对于攻击,可以使用最简单的FUSE模块,结合高度嵌套的目录作为挂载点,路径大小超过8MB。

该问题自 systemd 220(2015 年 248 月)以来一直出现,已在主 systemd 存储库中修复,并在发行版(Debian、Ubuntu、Fedora、RHEL、SUSE、Arch)中修复。 值得注意的是,在 systemd 版本 2018 中,由于 systemd 代码中的错误导致 /proc/self/mountinfo 的处理失败,因此该漏洞无法发挥作用。 同样有趣的是,在 2018 年,出现了类似的情况,当试图编写 Linux 内核中的 CVE-14634-XNUMX 漏洞的漏洞利用时,Qualys 研究人员发现了 systemd 中的三个严重漏洞。

来源: opennet.ru

添加评论