欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

漏洞挖掘之利用Broadcom的Wi-Fi栈(一)

来源:本站整理 作者:佚名 时间:2017-04-19 TAG: 我要投稿

众所周知,平台安全性是复杂系统安全性的一个不可或缺的组成部分,移动设备更是如此。现代移动平台包括多个处理单元,全都精巧地彼此通信。在应用处理器(AP)上运行的代码已得到广泛研究,但对其他组件的审查却很少。

图1
多年来,由于安全人士的持续关注,在应用处理器上运行的代码的防御力得到了加强。但是,攻击者往往会另辟蹊径。提高一个组件的安全性将不可避免地导致一些攻击者开始在别处寻找更容易的进入点。
该博客系列分两部分,我们将探讨由在移动设备上使用的Broadcom Wi-Fi SoC(系统级芯片)引入的暴露的攻击面。我们将专注于运行安卓的设备(本研究基本上也适用于包括相同的Wi-Fi SoC的其他系统)。第一篇博文将专注于利用Wi-Fi SoC本身,我们将发现和利用能让我们在芯片上远程执行代码的漏洞。在第二篇博文中,我们将进一步将我们的权限从SoC提升到操作系统的内核。通过这两篇文章,我们将展示如何在无需用户交互的情况下仅通过Wi-Fi邻近就完全接管设备。
我们将专注于Broadcom(博通)的Wi-Fi SoC,因为其是移动设备上最常见的Wi-Fi芯片组。使用该平台的设备很多,出于本文目的,我们将展示运行安卓7.1.1版NUF26K的完全更新(当时,现已修复)的Nexus 6P的一个远程代码执行漏洞。
为什么是Wi-Fi?
在过去十年中,Wi-Fi在移动设备上的使用已变得很普遍。Wi-Fi已渐渐演变为一套强大的规范——一些注重物理层,另一些则侧重于MAC层。为了应对日益增加的复杂性,供应商已经开始生产“FullMAC”Wi-Fi SoC。
本质上,这些是独立执行所有的物理层、MAC层及MAC子层管理实体(MLME)处理,从而使操作系统可以从与Wi-Fi有关的复杂(有时是芯片特定的)功能抽离的小型SoC。Wi-Fi FullMAC芯片的推出也改善了移动设备的功耗,因为大部分处理是在低功耗SoC而不是耗电量较大的应用处理器上完成的。也许最重要的是,FullMAC芯片更容易集成,原因是其在固件中实施MLME,从而降低了主机端的复杂性。
但Wi-Fi FullMAC芯片的推出也有代价。引入这些新的硬件、运行专有和复杂的代码库可能会削弱设备的整体安全性,并引入可能危及整个系统的漏洞。

图2
探索平台
为了开始研究,我们需要找到一些方法来探索Wi-Fi芯片。 幸运的是,赛普拉斯最近收购了Broadcom的无线物联网业务,并发布了许多与Broadcom Wi-Fi芯片组相关的数据手册。 通过阅读数据手册,我们深入了解了Wi-Fi芯片组背后的硬件架构。

图3
具体而言,我们可以看到使用的是ARM Cortex R4内核,其运行处理帧的所有逻辑。此外,该数据手册显示,ARM内核具有用于保存固件代码的640KB ROM,以及用于数据处理(例如堆)和存储固件代码补丁的768KB RAM。
要开始分析在ARM内核上运行的代码,我们需要提取ROM的内容,并定位加载到RAM中的数据。
我们先来解决第二个问题——加载到ARM内核的RAM中的数据位于何处?由于该数据不存在于ROM中,因此必须在芯片首次上电时从外部加载。因此,通过读取主机驱动程序中的初始化代码,我们应该可以找到包含RAM内容的文件。实际上,通过驱动程序的代码,我们找到了BCMDHD_FW_PATH配置,其用于表示驱动程序将内容上传到RAM的文件的位置。
那么ROM的内容呢?提取ROM的一种方法是使用主机驱动程序的芯片存储器访问功能(通过SDIO或PCIe上的PIO)直接读取ROM的内容。但是,这样做将需要修改驱动程序,以使我们能够发出转储ROM所需的命令。检索ROM的另一种方法是将我们自己修改的固件文件加载到RAM中,我们将插入一个可用于转储ROM内存范围的小型存根。幸运的是,本文的情况实际上并不需要这些方法,Broadcom提供了一个非常强大的命令行实用程序dhdutil,可用于通过bcmdhd驱动程序与芯片进行交互。
在该实用程序支持的各种功能中,其还允许我们通过发出特殊命令“membytes”直接读取和写入适配器上的内存。由于我们已经知道了ROM的大小(从数据手册中),我们可以直接使用membytes命令来读取ROM的内容。但是,我们还需要先回答最后一个问题——ROM位于哪里?根据有关人员的研究,ROM被加载到地址0x0,RAM被加载到地址0x180000。
最后,把所有这一切放在一起,我们可以从固件文件获取RAM的内容,使用dhdutil转储ROM,并将这两个文件合并成一个文件,然后便可在IDA中开始分析。

图4
分析固件
由于可用内存(ROM和RAM)相对较小,Broadcom为了节省内存而进行了极大的努力。首先,他们从二进制文件中删除了符号和大部分字符串。这样做的额外好处是使固件代码的逆向工程稍微更麻烦。他们还专门选择了Thumb-2指令集,这样可以实现更好的代码密度。因此,BCM4358上的ROM镜像的封装非常紧凑,仅包含不到300个未使用的字节。
但是,这还不够。别忘了,RAM必须容纳堆、栈、全局数据结构及ROM功能的所有补丁或修改。这对少得可怜的768KB而言是一个相当高的要求。为了解决这个问题,Broadcom决定将固件初始化期间使用的所有功能放在两个特殊区域。初始化完成后,这些区域被“回收”,随后转换为堆块。此外,堆块散布在RAM中的代码和数据结构之间,因为后者有时有对齐要求(或直接从ROM引用,因此无法移动)。最终的结果是RAM是一堆混乱的堆块、代码及数据结构。

[1] [2] [3] [4] [5] [6] [7]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载