Snap 包管理工具包中的本地根漏洞

Qualys 在 snap-confine 实用程序中发现了两个漏洞(CVE-2021-44731、CVE-2021-44730),这些漏洞随 SUID 根标志一起提供,并由 snapd 进程调用,以便为独立包中交付的应用程序创建可执行环境以快照格式。 这些漏洞允许本地非特权用户在系统上以 root 权限执行代码。 这些问题已在今天的 Ubuntu 21.10、20.04 和 18.04 的 snapd 软件包更新中得到解决。

第一个漏洞 (CVE-2021-44730) 允许通过硬链接操作进行攻击,但需要禁用系统硬链接保护(将 sysctl fs.protected_hardlinks 设置为 0)。 该问题是由于对以 root 身份运行的 snap-update-ns 和 snap-discard-ns 帮助程序的可执行文件位置验证不正确而导致的。 这些文件的路径是在 sc_open_snapd_tool() 函数中根据其自己的 /proc/self/exe 路径计算的,这允许您创建一个硬链接以将 snap-confine 放在您的目录中,并放置您自己版本的 snap-此目录中的 update-ns 和 snap-utilities 位于discard-ns 中。 通过硬链接运行后,具有root权限的snap-confine将从当前目录启动snap-update-ns和snap-discard-ns文件,并由攻击者替换。

第二个漏洞是由竞争条件引起的,可以在默认的 Ubuntu 桌面配置中被利用。 为了使该漏洞在 Ubuntu Server 中成功运行,您必须在安装时从“特色服务器快照”部分选择其中一个软件包。 在为 snap 包准备挂载点命名空间期间调用的 setup_private_mount() 函数中,竞争条件很明显。 此函数创建一个临时目录“/tmp/snap.$SNAP_NAME/tmp”,或使用现有目录将 snap 包绑定挂载到其中。

由于临时目录的名称是可预测的,因此攻击者可以在检查所有者之后、调用 mount 系统调用之前用符号链接替换其内容。 例如,您可以在 /tmp/snap.lxd 目录中创建指向任意目录的符号链接“/tmp/snap.lxd/tmp”,对 mount() 的调用将遵循该符号链接并将该目录挂载到快照命名空间。 以类似的方式,您可以将内容挂载到 /var/lib 中,并通过替换 /var/lib/snapd/mount/snap.snap-store.user-fstab 来组织 /etc 目录在命名空间中的挂载通过替换 /etc/ld.so.preload 来组织使用 root 权限加载库的 snap 包。

值得注意的是,创建漏洞利用程序并不是一项简单的任务,因为 snap-confine 实用程序是使用安全编程技术用 Go 编写的,具有基于 AppArmor 配置文件的保护,基于 seccomp 机制过滤系统调用,并使用用于隔离的挂载命名空间。 然而,研究人员能够准备一个有效的漏洞来获得系统的 root 权限。 漏洞代码将在用户安装提供的更新后几周内发布。

来源: opennet.ru

添加评论