Snap 包管理工具包中的 Root 漏洞

Qualys 在 snap-confine 实用程序中发现了今年的第三个危险漏洞 (CVE-2022-3328),该实用程序带有 SUID root 标志,由 snapd 进程调用,为独立包中分发的应用程序创建可执行环境以快照格式。 该漏洞允许本地非特权用户在默认 Ubuntu 配置中以 root 身份执行代码。 该问题已在 snapd 2.57.6 版本中修复。 所有受支持的 Ubuntu 分支的软件包更新均已发布。

有趣的是,该漏洞是在修复 22.04 月份的 snap-confine 中类似漏洞的过程中引入的。 研究人员能够准备一个有效的漏洞,提供对 Ubuntu Server 2022 的 root 访问权限,该漏洞除了 snap-confine 中的漏洞外,还涉及 multipathd 进程中的两个漏洞(CVE-41974-2022、CVE-41973-XNUMX) ,与传输特权命令时绕过权限检查以及使用符号链接进行不安全操作有关。

snap-confine 中的漏洞是由 Must_mkdir_and_open_with_perms() 函数中的竞争条件引起的,添加该函数是为了防止在检查所有者之后、调用挂载系统之前用符号链接替换 ​​/tmp/snap.$SNAP_NAME 目录调用将快照格式的包绑定安装到其中的目录。 添加的保护是将 /tmp/snap.$SNAP_NAME 目录重命名为 /tmp 中的另一个目录,并使用随机名称(如果该目录存在且不属于 root)。

在利用 /tmp/snap.$SNAP_NAME 目录重命名操作时,研究人员利用了 snap-confine 还为 snap 包内容的根目录创建 /tmp/snap.rootfs_XXXXXX 目录的事实。 名称的“XXXXXX”部分是由 mkdtemp() 随机选择的,但是可以在 sc_instance_name_validate 函数中验证名为“rootfs_XXXXXX”的包(即,想法是将 $SNAP_NAME 设置为“rootfs_XXXXXX”,然后进行重命名操作将导致用根快照覆盖 /tmp/snap.rootfs_XXXXXX 目录)。

为了实现同时使用/tmp/snap.rootfs_XXXXXX和重命名/tmp/snap.$SNAP_NAME,启动了两个snap-confine实例。 一旦第一个实例创建了 /tmp/snap.rootfs_XXXXXX,进程就会阻塞,第二个实例将以包名 rootfs_XXXXXX 启动,导致第二个实例的临时目录 /tmp/snap.$SNAP_NAME 成为根目录 /tmp/snap第一个的.rootfs_XXXXXX。 重命名完成后,第二个实例立即崩溃,/tmp/snap.rootfs_XXXXXX 被替换为竞争条件操作,就像利用 XNUMX 月份的漏洞时一样。 替换后,第一个实例的执行锁被删除,攻击者获得了对快照根目录的完全控制。

最后一步是创建一个符号链接 /tmp/snap.rootfs_XXXXXX/tmp,sc_bootstrap_mount_namespace() 函数使用该符号链接将可写真实目录 /tmp 绑定挂载到文件系统中的任何目录,因为 mount() 调用在安装之前遵循符号链接。 AppArmor 限制会阻止此类安装,但为了绕过此阻止,该漏洞利用了 multipathd 中的两个辅助漏洞。

来源: opennet.ru

添加评论