上周,在内华达州拉斯维加斯举行的著名 DEF CON 安全大会上,Mac 网络安全研究员 Patrick Wardle 发现 一个“根” 特权提升 Zoom for Mac 中的 (EoP) 错误:
Mahalo 致所有来我这里的人 @defcon 谈论“你是 M̶u̶t̶e̶d̶ Rooted”🙏🏽
很兴奋地谈论(和现场演示😅)Zoom(针对 macOS)中的本地 priv-esc 漏洞。
目前没有补丁👀😱
包含完整细节和 PoC 漏洞利用的幻灯片: https://t.co/viee0Yd5o2 #0day pic.twitter.com/9dW7DdUm7P
— 帕特里克·沃德尔 (@patrickwardle) 2022 年 8 月 12 日
在他的演讲 [2022-08-12] 之后的推文中,Wardle 指出:
目前没有补丁 [:FRIED-EGG EYES DEPICTING ALARM EMOJI:] [:EDVARD MUNCH SCREAM EMOJI:]
Zoom 立即为该漏洞开发了一个补丁,该补丁于第二天在 Zoom 安全公告 ZSB-22018, 获得祝贺 一个回复 来自 Wardle 在此过程中:
Mahalos 到 @Zoom 进行(令人难以置信的)快速修复! [:庆祝时举起双手并为 EMOJI 摆动:] [:手掌按在一起表示精神上的善意 EMOJI:]
零日披露
鉴于 Zoom 能够以明显的速度和轻松的速度为该漏洞发布补丁,被称为 CVE-2022-28756,你可能想知道为什么 Wardle 没有提前告诉 Zoom 漏洞,将他的演讲日期设置为透露细节的最后期限。
这将使 Zoom 有时间向其众多 Mac 用户推出更新(或至少让那些相信 尽早打补丁/经常打补丁),从而消除了 Wardle 向世界解释如何滥用漏洞和修补漏洞之间的差距。
事实上,几个月前,Wardle 似乎已经尽力警告 Zoom 这个错误,以及 Zoom 自动更新过程中的一系列相互关联的缺陷。
Wardle 在 来自他的 DEF CON 演讲的幻灯片,并列出了与他发现的缺陷相关的 Zoom 更新流。
一把双刃剑
Wardle 讨论的错误通常与 Zoom 的自动更新机制有关,它是任何软件生态系统的一部分,有点像一把双刃剑——一种比普通剑更强大的武器,但相应地更难安全处理。
自动更新是任何现代客户端应用程序中必不可少的组件,因为它使关键补丁更容易和更快地分发,从而帮助用户可靠地关闭网络安全漏洞。
但是自动更新带来了很多风险,尤其是因为更新工具本身通常需要根级系统访问权限。
这是因为更新程序的工作是覆盖应用程序软件(这是普通用户不应该做的事情),并且可能会启动特权操作系统命令来进行配置或其他系统级别的更改。
换句话说,如果开发人员不小心,帮助他们保持底层应用程序最新和更安全的工具可能会成为攻击者通过欺骗更新程序以系统权限运行未经授权的命令来破坏安全性的平台.
值得注意的是,自动更新程序需要注意验证 真实性 他们下载的更新包,以阻止攻击者简单地向他们提供虚假更新包,并添加恶意软件。
他们还需要维护 诚信 他们最终使用的更新文件,因此本地攻击者无法在获取和激活之间的短暂时间内偷偷修改刚刚下载的“经过验证的安全”更新包。
回避真实性检查
正如沃德尔在他的 纸,他发现并披露的其中一个错误是上面列出的第一步中的一个缺陷,当时 Zoom 的自动更新程序试图验证它刚刚下载的更新包的真实性。
Zoom 开发人员没有使用官方 macOS API 直接验证下载的数字签名,而是决定通过运行 macOS 实用程序间接进行身份验证 pkgutil --check-signature
在后台并检查输出。
这是一个例子 pkgutil
输出,使用旧版本的 Zoom.pkg
软件包:
$ pkgutil --check-signature Zoom.pkg 包“Zoom.pkg”:状态:由 Apple 颁发的用于分发的开发者证书签名 使用可信时间戳签名:2022-06-27 01:26:22 +0000 证书链: 1. Developer ID 安装程序: Zoom Video Communications, Inc. (BJ4HAAB9B3) 过期时间: 2027-02-01 22:12:15 +0000 SHA256 指纹: 6D 70 1A 84 F0 5A D4 C1 C1 B3 AE 01 C2 EF 1F 2E AE FB 9F 5C A6 80 48 A4 76 60 FF B5 F0 57 BB 8C ----------------------------------- ------------------------------------- 2. Developer ID 证书颁发机构过期:2027-02-01 22:12:15 +0000 SHA256 指纹:7A FC 9D 01 A6 2F 03 A2 DE 96 37 93 6D 4A FE 68 09 0D 2D E1 8D 03 F2 9C 88 CF B0 B1 BA 63 58 7F -------- -------------------------------------------------- -------------- 3. Apple Root CA 过期:2035-02-09 21:40:36 +0000 SHA256 指纹:B0 B1 73 0E CB C7 FF 45 05 14 2C 49 F1 29 5E 6E DA 6B CA ED 7E 2C 68 C5 BE 91 B5 A1 10 01 F0 24
不幸的是,正如 Wardle 在反编译 Zoom 的签名验证码时发现的那样,Zoom 更新程序没有处理 pkgutil
以与人类观察者相同的方式获取数据。
我们将按照输出中有用的视觉顺序检查输出。
首先,我们首先寻找所需的状态,例如 signed by a developer certificate issued by Apple for distribution
.
然后我们会找到副标题 Certificate Chain:
.
最后,我们将交叉检查链是否由这三个签名者组成,顺序正确:
1. Zoom Video Communications, Inc. 2. 开发者 ID 证书颁发机构 3. Apple 根 CA
令人惊讶的是,Zoom 的代码简单地验证了上述三个字符串中的每一个(甚至没有检查 Zoom 自己的唯一 ID BJ4HAAB9B3
) 出现了 某处 在输出中 pkgutil
.
因此,创建一个具有荒谬但有效名称的包,例如 Zoom Video Communications, Inc. Developer ID Certification Authority Apple Root CA.pkg
会欺骗包验证器找到它正在寻找的“身份字符串”。
完整的包名称回显到 pkgutil
第一行的输出标头,其中 Zoom 倒霉的“验证器”将匹配输出错误部分中的所有三个文本字符串。
因此,可以轻松绕过“安全”检查。
部分修复
Wardle 说,Zoom 最终修复了这个错误,在他报告这个问题七个多月后,及时赶上了 DEF CON……
…但在应用补丁后,他注意到更新过程中仍然存在一个漏洞。
更新程序试图做正确的事情:
- 1.将下载的包移动到root拥有的目录, 因此理论上禁止任何普通用户使用。
- 2.验证下载包的加密签名, 使用官方 API,而不是通过文本匹配来对抗
pkgutil
输出。 - 3.解压下载的包文件, 以验证其版本号,防止降级攻击。
- 4.安装下载的包文件,使用自动更新过程的root权限。
不幸的是,即使用于存储更新包的目录归根用户所有,但为了防止用户在使用更新文件时试图破坏更新文件,它的安全性……
…新下载的包文件在其新位置“全局可写”(通过普通帐户而不是 root 下载的副作用)。
这给了本地攻击者修改更新包的漏洞 after 其数字签名已经过验证(步骤 2), 不影响 版本检查详细信息(步骤 3),但是 前 安装程序控制了包文件,以便以 root 权限处理它(步骤 4)。
这种错误被称为 比赛条件,因为攻击者需要确定完成时间,以便他们在安装程序启动之前回到家,因此要在安装程序之前偷偷地进行恶意更改。
您还会听到听起来很奇特的首字母缩略词所指的这种类型的漏洞 托克托, 短缺 检查时间到使用时间,这个名称清楚地提醒您,如果您过早地检查您的事实,那么当您依赖它们时,它们可能已经过时了。
TOCTOU 的问题是为什么英国的汽车租赁公司不再简单地要求查看您的驾驶执照,因为驾驶执照可能在 10 年前就已经颁发,并且从那时起可能由于各种原因被暂停或取消,很可能是因为不安全或非法驾驶。 除了您的实体驾照外,您还需要出示在过去 21 天内签发的一次性字母数字“近期有效性证明”代码,以将潜在的 TOCTOU 差距从 10 年减少到仅 XNUMX 周。
修复程序现在在
根据 Wardle 的说法,Zoom 现在通过更改在上述步骤 1 中复制的更新包文件的访问权限来防止此错误。
用于签名检查、版本验证和最终根级别安装的文件现在始终仅限于根帐户访问。
这消除了竞争条件,因为非特权攻击者无法在第 2 步结束之间修改文件(验证成功) 和第 4 步的开始 (安装开始).
要修改软件包文件以诱使系统为您提供 root 访问权限,您需要已经具有 root 访问权限,因此您首先不需要此类 EoP 错误。
TOCTOU 问题不适用,因为步骤 2 中的检查在开始使用文件之前一直有效,没有机会让检查变为无效。
怎么办呢?
如果您在 Mac 上使用 Zoom,请打开应用程序,然后在菜单栏中转到 zoom.us
> Check for Updates...
如果有可用更新,将显示新版本,您可以单击 [Install]
应用补丁:
你想要的版本是 5.11.5(9788) 或更高版本。