揭秘ChromeOS远程内存破坏漏洞
作者:Sec-Labs | 发布时间:
微软在ChromeOS组件中发现了一个可以远程触发的内存损坏漏洞,允许攻击者进行拒绝服务(DoS),或者在极端情况下进行远程代码执行(RCE)。在我们的D-Bus博文发布后,我们通过审计D-Bus服务及其处理程序代码,在其他平台上寻找类似的D-Bus模式。在找到一个本地内存损坏问题后,我们发现该漏洞可以通过操纵音频元数据来远程触发。攻击者可能诱使用户满足这些条件,例如在浏览器中简单地播放一首新歌或从配对的蓝牙设备中播放,或利用中间人(AiTM)的能力来远程利用该漏洞。
在仔细审查其影响后,一名微软安全研究员于2022年4月与谷歌分享了该漏洞,并向Chromium错误跟踪系统报告了该漏洞。对该漏洞的修复,现在被确定为CVE-2022-2587,很快被发布,并已成功部署到终端用户。我们要感谢谷歌团队和Chromium社区的专业解决和协作努力。
这项研究加上最近发布的ChromeOS Flex,可以将各种传统PC和Mac转换为Chromebook,强调了分析和监控运行ChromeOS的设备的安全性的重要性。此外,由于即使是最强硬的操作系统也可能包含安全漏洞,我们强调需要对所有跨平台设备和操作系统进行强有力的监控。保护无人管理设备的最佳方法是使用微软端点卫士的设备发现功能来监控可疑的流量,并帮助检测此类设备上的攻击者活动。
在这篇博文中,我们分享了有关该漏洞的一些信息,并研究了该漏洞如何被触发以及可能产生的影响。我们展示了我们的跨领域专业知识如何帮助我们发现新的和未知的威胁,以努力不断提高所有人的安全,我们还与更大的安全社区分享了我们研究的细节,以强调合作对确保平台和设备安全的重要性。
对ChromeOS安全性的概述
一个使用D-Bus的著名操作系统是ChromeOS。ChromeOS是一个谷歌专有的基于Linux的操作系统,在Chromebooks、Chromeboxes、Chromebits和Chromebases上运行。ChromeOS是一个闭源系统,其开源组件来自ChromiumOS,该操作系统使用谷歌自己的Chrome浏览器作为其主要用户界面。
在安全方面,ChromeOS经过了很好的加固;ChromeOS上的一些安全特性包括。
- 硬化的沙箱(称为minijail)
- 核实的启动
- 锁定的文件系统(用noexec、nosuid、nodev安装)和dm-verity
- 根用户限制(SECURE_NOROOT)
- 当进入开发模式时,所有本地存储的数据都被擦除
与其他现代浏览器一样,利用ChromeOS通常需要将漏洞连在一起。由于ChromeOS的加固措施,发现漏洞成为一个特殊的利基,因此,与其他操作系统相比,公开的漏洞数量相当少。ChromeOS的漏洞一般分为三个不同的类别之一。
- 针对ChromeOS的逻辑漏洞
- 针对ChromeOS的内存破坏漏洞
- 更广泛的威胁,如Chrome浏览器的漏洞
在本案例中,所发现的漏洞属于第二类,即ChromeOS特有的内存破坏漏洞。
寻觅错误
在讨论并广泛研究了D-Bus之后,我们继续分析,列举了ChromeOS上提供的D-Bus服务。一般来说,D-Bus是一种进程间通信(IPC)机制,在桌面平台上很流行,特别是Linux。
ChromeOS的开发者模式提供了dbus-send工具来通过D-bus发送消息。由于ChromeOS上提供了许多D-Bus服务(通常以 "org.chromium "为前缀),我们将这一过程自动化,并使用dbus-send工具来获取完整的服务树以及它们导出的方法和信号。
因为大多数D-Bus服务都支持org.freedesktop.DBus.Introspectable接口,所以可以动态地获取导出的方法和信号,而无需阅读源代码或反向工程二进制文件。
获取所有导出的服务名称可以使用以下命令进行
dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames
以org.chromium.ResourceManager为例,然后可以通过以下命令枚举每个服务的声明方法和信号
dbus-send --system --dest=org.chromium.ResourceManager --type=method_call --print-reply /org/chromium/ResourceManager org.freedesktop.DBus.Introspectable.Introspect
考虑到一个方法收到的输入越多,发现安全问题的概率就越高,我们就把重点放在了输出任意大的输入的方法上,比如字符串或数组。没过多久,我们就发现了一个有趣的服务:org.chromium.cras。
漏洞
org.chromium.cras D-Bus的名字是由CRAS(ChromiumOS音频服务器)拥有的,它在ChromiumOS的维基页面上有很好的架构记录。从本质上讲,CRAS是一个驻扎在操作系统和ALSA(高级Linux声音架构)之间的服务器,作为将音频路由到新连接的支持音频的外围设备,如USB扬声器和蓝牙耳机的手段。
在查看导出的方法时,发现有一个方法的处理功能特别有趣。SetPlayerIdentity,它得到一个字符串(一个叫做身份的参数)作为输入。由于ChromiumOS是开源的,追踪这些调用是很简单的。
- 在cras_dbus_control.c中,SetPlayerIdentity的处理函数是handle_set_player_identity,它从D-Bus消息中提取身份参数并调用cras_bt_player_update_identity函数。
- 在cras_bt_player.c中,被调用的函数cras_bt_player_update_identity检查身份输入值是否为空,是否与当前玩家身份字符串(保存在player.ident下)不同。如果是这样,它使用C库函数strcpy将身份变量复制到player.identity。值得注意的是,"player "是cras_bt_player模块中的一个全局变量,其中包括一个身份字段,等等。
对于有经验的安全工程师来说,一提到strcpy函数,就会立即引起警觉。众所周知,strcpy函数会导致各种内存损坏的漏洞,因为它不执行任何边界检查,因此被认为是不安全的。由于在调用strcpy之前没有对用户提供的身份参数进行边界检查(除了D-Bus消息的默认消息长度限制),我们确信我们可以触发基于堆的缓冲区溢出,因此引发了内存损坏漏洞。
基于堆的缓冲区溢出可能是多个漏洞的原因,最臭名昭著的是通过各种手段导致任意代码执行。这可能包括重写分配对象中的函数回调或重写块元数据,这可能在程序的生命周期中触发其他意外行为。
检查player.identity字符串的初始化方式显示,它在cras_bt_player_init函数中被设置为malloc(128)的结果,这意味着它在用户的堆上分配了128字节。

因此,通过发送超过128字节的身份用户控制的D-Bus参数,可以使用单个命令行触发该漏洞,正如我们下面的示例代码所显示的那样。
dbus-send --system --dest=org.chromium.cras --type=method_call --print-reply /org/chromium/cras org.chromium.cras.Control.SetPlayerIdentity string:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
由于大多数用户不需要启用ChromeOS的开发者模式,因此无法使用dbus-send工具,我们的下一个任务是找到一种不使用开发者模式就能触发该错误的方法。
远程触发该错误
考虑到我们发现了一个本地内存损坏的问题,我们想更好地了解如何触发这个错误。由于涉及的函数完全由D-Bus触发,我们寻找了触发SetPlayerIdentity D-Bus方法的函数--如果这些函数的参数没有边界检查,那么这些函数就可能被用来触发这个漏洞。
检查开源的ChromiumOS软件库发现,CRAS音频客户端调用了SetPlayerIdentity方法(并输出了一个同名的函数)。反过来,它被CRAS音频处理组件的MediaSessionMetadataChanged方法调用,该方法从代表歌曲标题的元数据结构中提取身份。

在这一点上,很明显,该漏洞可以通过对音频元数据的改变来触发。寻找MediaSessionMetadataChanged的调用,发现了两种有趣的情况,都可以通过远程触发。
- 从浏览器:当元数据发生变化时,浏览器的媒体组件会调用该函数,例如在浏览器中播放一首新歌时。
- 来自蓝牙:当歌曲的元数据发生变化时,操作系统中的媒体会话服务会调用该函数,这可能发生在从配对的蓝牙设备中播放一首新歌时。

影响和报告
我们在2022年4月向谷歌报告了这个漏洞,作为Chromium漏洞跟踪系统的一部分,并被分配到第1320917号问题,该问题立即被分配为第一优先级安全漏洞。同时,我们在微软安全漏洞研究(MSVR)内部跟踪了这个问题,同时使用OSINT寻找该漏洞在野外被使用的迹象。我们没有发现任何野外利用的迹象。
基于堆的缓冲区溢出的影响范围从简单的DoS到全面的RCE。虽然有可能通过媒体元数据操作来分配和释放块,但在这种情况下,执行精确的堆梳理并非易事,攻击者需要将该漏洞与其他漏洞连在一起,才能成功执行任何任意代码。鉴于该漏洞的潜在影响,再加上它可以被远程触发,这是一个安全风险,证明了该漏洞的优先级和修复的速度。
我们对修复的速度和整个过程的有效性印象深刻。在不到一周的时间里,代码被提交,并在几次合并之后,普遍提供给了用户。我们感谢谷歌团队和Chromium社区为解决这个问题所做的努力。
通过研究和威胁情报共享提高所有人的安全性
随着威胁和计算环境的不断演变,微软努力通过研究驱动的保护措施以及与客户、合作伙伴和行业专家的合作,不断提高所有人的安全,而不管使用的是何种设备或平台。
为了抵御不断变化的威胁,企业必须密切监测各平台的所有设备和操作系统,包括未受管理的设备。未被管理的设备有时会被安全团队在加入时忽略或遗漏,这使得它们成为有吸引力的目标,可以妥协,悄悄地进行横向移动,跳过网络边界,并实现持久性,以便发动更广泛的攻击。Microsoft Defender for Endpoint的设备发现功能可以帮助企业找到某些未被管理的设备,包括那些运行ChromeOS的设备,并可以在它们开始与服务器和其他被管理的设备进行网络互动时检测它们是否被攻击者操作。
微软安全研究人员不断努力发现新的漏洞和威胁,将各种影响广泛的问题的知识转化为改进的解决方案,每天都在保护各平台的用户和组织。这个案例显示了漏洞披露和威胁情报共享对于有效缓解问题和保护用户免受当前和未来的威胁是多么重要。此外,通过扩大我们之前的研究,我们还可以继续为全球设备的整体安全做出积极贡献,即使是在我们目前不直接支持的平台上。
Jonathan Bar Or
微软365卫士研究团队