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

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

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

本文将继续研究如何仅通过Wi-Fi通信就实现远程内核代码执行。我们在上文中开发了一个远程代码执行利用方法,使我们能控制Broadcom的Wi-Fi SoC(系统级芯片)。现在我们的任务是,利用该优势将我们的权限进一步提升到内核。

图1
在本文中,我们将探讨攻击主机操作系统的两种不同的途径。在第1部分中,我们将发现并利用Wi-Fi固件和主机之间的通信协议中的漏洞,从而在内核中执行代码。期间,我们也将研究一个一直持续到最近的奇特漏洞,攻击者可利用该漏洞直接攻击内部通信协议,而无需先利用Wi-Fi SoC!在第2部分,我们将探讨使当前配置的Wi-Fi SoC无需漏洞即可完全控制主机的硬件设计选择。
在上一篇文章中讨论的漏洞已披露给Broadcom,并已得到修复,但硬件组件的利用依然如故,现在并无相应的缓解措施。我们希望通过发布这项研究来推动移动SoC制造商和驱动程序供应商打造更安全的设计,从而实现Wi-Fi SoC和应用处理器之间更高程度的分离。
第1部分——“较难”方式
通信通道
正如我们在上一篇博文中所确立的,Broadcom生产的Wi-Fi固件是一个FullMAC实现。因此其负责处理实施802.11标准(包括大多数MLME层)所需的大部分复杂性。
然而,虽然许多操作是封装在Wi-Fi芯片的固件中,但在主机操作系统中需要对Wi-Fi状态机进行一定程度的控制。某些事件不能单独由Wi-Fi SoC处理,必须传达给主机的操作系统。例如,必须向主机通知Wi-Fi扫描的结果,以便能将该信息呈现给用户。
为了方便主机和Wi-Fi SoC希望彼此通信的情况,需要一个特殊的通信通道。
但是别忘了,Broadcom生产可通过多种不同的接口(包括USB、SDIO甚或PCIe)连接到主机的各种Wi-Fi SoC。这意味着依靠底层通信接口可能需要为每个受支持的通道重新实现共享通信协议——这是一个非常繁琐的任务。

图2
或许有一个更简单的方法?我们一直可以确定的一件事是,无论使用哪个通信通道,芯片都必须能够将接收到的帧传送回主机。实际上,或许正是出于该原因,Broadcom选择搭载在该通道之上,以便在SoC和主机之间建立通信通道。
当固件希望通知主机事件时,其只要编码一个“特殊”帧并将其发送到主机即可。这些帧由“唯一的”EtherType值0x886C标记。其不包含实际接收到的数据,而是封装了有关必须由主机驱动程序处理的固件事件的信息。

图3
确保通道安全性
现在,让我们切换到主机侧。在主机上,可在逻辑上将驱动程序分为若干层。较低层处理通信接口本身(比如SDIO、PCIe,等等)和所绑定的任何传输协议。较高层然后处理帧的接收及其后续处理(如果需要)。

图4
首先,上层对接收到的帧执行一些初始处理,例如去除可能已经添加到其上的封装数据(比如由PHY模块添加的传输功率指示符)。然后必须作出一个重要的区分——这是一个只需转发到相关网络接口的常规帧,还是实际上是一个主机必须处理的编码事件?
正如我们刚刚看到的,这一区分很容易作出。只需查看ethertype,并检查其是否具有“特殊”值0x886C即可。如果有,则处理封装事件并丢弃帧。
或许是?事实上,不能保证该ethertype不在其他网络和设备中使用。HPNA芯片中使用的LARQ协议碰巧也使用相同的ethertype。
这将我们的第一个问题摆在了面前——Wi-Fi SoC和主机驱动程序如何对外部接收到的具有0x886C ethertype的帧(应该转发到网络接口)和内部生成的事件帧(不应该从外部来源收到)进行区分?
这是一个关键问题,内部事件通道极其强大,提供了一个巨大的、基本不受审查的攻击面。如果攻击者能通过无线方式注入随后可被驱动程序作为事件帧处理的帧,那么其很可能在主机的操作系统中实现代码执行。
直到本研究发表的几个月前(2016年中),固件并不过滤这些帧。作为数据RX路径的一部分接收的任何帧,无论其是何种ethertype,均只是被盲目转发到主机。因此,攻击者能够远程发送包含特殊0x886C ethertype的帧——随后被驱动程序当做固件本身创建的事件帧处理。
那么,这个问题是如何解决的?我们已经明确,仅仅过滤ethertype本身是不够的。观察打补丁前和打补丁后的固件版本可以得到答案:Broadcom采用的是针对Wi-Fi SoC的固件和主机驱动程序的组合补丁。
该补丁给固件的RX路径和驱动程序添加了验证方法(is_wlc_event_frame)。在芯片侧,在将接收到的帧发送到主机之前立即调用该验证方法。如果验证方法将该帧视为事件帧,则其被丢弃。否则,该帧被转发到驱动程序。然后,驱动程序对接收到的具有0x886C ethertype的帧调用完全相同的验证方法,并只在其通过相同的验证方法后才对其进行处理。以下是此流程的简短示意图:

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

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