白帽故事 · 2024年4月23日

CVE-2024-0333,针对Chrome扩展的ZIP嵌入攻击

背景介绍

近期,安全研究人员 Malcolm Stagg 讲述了他发现的 CVE-2024-0333漏洞,该漏洞可能会被用来安装Chrome恶意扩展程序。

众所周知,Google Chrome 是世界上使用最广泛的浏览器,它具有多层保护措施,可以缓解大多数漏洞,并且这些保护措施都经过仔细审查,以确保其有效性。

其中一项保护措施要求组件更新中使用的任何互联网协议,即使拥有强大的加密功能,也不应绝对信任。否则,控制设备根证书的政府或雇主可能会在安装组件或扩展之前对其进行篡改,这将对浏览器用户构成重大威胁。

Chromium 通过验证每个已安装文件的加密签名来防止此类攻击,所有扩展和大多数浏览器组件更新都使用 CRX 文件格式,它实际上是一个 ZIP 文件,前面带有包含签名和其他元数据的标头,以保证文件完整性。

漏洞发现

研究人员 Malcolm Stagg 在参与 Synack 特殊项目后,开始研究 CRX 文件格式,2022年他在类似的目标上进行了二进制静态分析,在三个不同的后台服务上发现了3处0day漏洞,包括 CVE-2022-32427 和 CVE-2022-32972。

这些漏洞的起因和利用的复杂程度各不相同,但它们都有一个共同点:当数据从低权限可执行文件发送到高权限服务时,输入验证不足,导致低权限用户可以控制计算机。

查看虚拟机上运行的服务,其中一项引起了研究人员的注意:Google Chrome Elevation Service。

该服务的名称意味着它的设计目的是获取低权限可执行文件,并以较高权限运行,这可能是安装某些更新所必需的。

虽然像 Chromium 这种经过严格审查的代码中很难找到漏洞,但研究人员还是很好奇该服务是如何设计的,以确保只有受信任的可执行文件才能被提升。

不出所料,该服务采用了精心设计的程序来防止篡改:它首先会将用户指定的 CRX 文件复制到可信位置,对文件执行签名验证,解压缩,最后运行提取的可执行文件。

低权限用户无权将任何其它文件注入到受信任位置,任何篡改压缩可执行文件的尝试都会使签名无效并阻止其运行。

使用此服务来提升恶意可执行文件似乎是不可能的——除非可以以某种方式绕过 CRX 签名验证,在研究了 CRX 文件格式之后,研究人员意识到向文件头注入额外数据也许是可行的,文件头包含文件其它部分的签名,因此文件头本身包含的大部分数据都不需要经过任何验证。

研究人员首先尝试将完整的 ZIP 存档注入到 CRX 标头中,什么也没发生。为了找出原因,研究人员开始研究 ZIP 文件格式,特别是 ZIP 文件末尾的 EOCD(end of central directory),有趣的是,这是 ZIP 文件跨越软盘时代留下的‘残留物’。

通过将此标记放在存档的末尾,可以将文件添加到存档中,而无需修改以前的软盘。

由于 ZIP 文件格式要求从文件末尾开始向后搜索 EOCD 标记,因此可以在文件中预置 CRX 文件头而不影响其内容。

Chromium 使用 Minizip 库来解压缩 ZIP 存档,研究人员开始查看它的unzOpenInternal 函数,该函数将首先打开 ZIP 存档并查找任何 EOCD 令牌。在查看此代码时,研究人员注意到一些有趣的事情:Minizip 使用两个单独的函数 unz64local_SearchCentralDir64 unz64local_SearchCentralDir 来查找 EOCD 令牌。

在对 ZIP 文件格式的研究中,研究人员发现 ZIP64 (它是 ZIP 格式的扩展,支持 4GB 以上的文件大小)使用不同的 EOCD 令牌(称为 EOCD64),看起来 Minizip 会首先尝试查找 EOCD64 令牌,然后仅在失败时才查找 EOCD 令牌作为候选方案。

这就让研究人员萌生了一种想法:也许可以将 EOCD64 令牌注入到 CRX 文件头中,当 Minizip 解压缩文件时,它可能首先找到恶意的 EOCD64 令牌,而不是预期的 EOCD 令牌。

但是有一个限制,那就是它只在存档文件的最后 64kB 中搜索任一令牌,因此攻击只能在小于 64kB 的存档上进行。

file
恶意 Chrome 扩展程序可以注入到有效的 Chrome 扩展程序(左)中,以创建具有有效签名的恶意扩展程序(右)

利用

尽管如此,研究人员已然有了一个计划,他创建了一个 Python 脚本,将包含有效 EOCD64 令牌的Payload注入到 CRX 文件头中,并创建了一个小型 Chrome 扩展来进行攻击,该扩展会在访问的任何页面上显示一个横幅。

接着再创建一个显示不同横幅的恶意扩展,攻击成功!可以将Payload嵌入到 CRX 文件中并更改横幅显示。

那么该漏洞可以用于本地权限提升吗?能攻击 Chrome Web Store 扩展程序吗?还是仅限于 Chrome 内部组件?

对于本地权限提升,需要一个有效签名的 CRX 文件,并且包含 64kB 以下的 ZIP 存档,通过在互联网上搜索使用该特定密钥签名的文件,但是能找到最小的文件是 73kB,7000 字节对于漏洞攻击来说还是太大了。

研究人员发现了一个基本上没有受到保护的区域, Chrome 允许公司为其企业扩展定义策略,这些扩展可以从公司内部更新服务器自动安装和更新,于是研究人员设想了一种攻击场景:

一名员工带着笔记本电脑前往一家咖啡店,同样在这家咖啡店中的本地攻击者设置其 IP 或主机名以与公司内部更新服务器一致,当 Chrome 在员工的设备上运行扩展程序更新时,它将从攻击者的设备下载恶意修改的扩展程序,由于包含有效签名,该员工的笔记本电脑将升级为恶意扩展。

攻击者可以使用该恶意扩展执行各种攻击,包括监视员工的网络活动和修改访问的页面以窃取密码和会话 Cookie,从而可能获得对公司内部网络上的私人服务器和设备的访问权限。

视频演示:

在证明可以使用本地 HTTP 更新服务器来利用此场景后,研究人员向 Google 提交了该漏洞报告。在 24 小时内,Google 便修补了该问题,并很快在 120.0.6099.216 浏览器版本中公开发布了修复程序,尽管未能实现提权,但却让研究人员找到了一个非常有趣的 Chromium 漏洞,并且该漏洞被忽视了六年多。

以上内容由骨哥翻译并整理。

原文:https://readme.synack.com/exploits-explained-zip-embedding-attack-on-google-chrome-extensions