还没升级 iOS11?这个高危漏洞威胁近9成 iPhone 用户!
编者按:谷歌“Project Zero”团队近日发现一个严重的 Wi-Fi晶片漏洞,目前涉及到的机型包括iPhone7、三星S7edge等各大主流机型,这些手机搭载的博通Wi-Fi芯片存在的后门安全漏洞,非常容易被黑客入侵。考虑到这个漏洞对上亿部手机所产生的影响,美国国家标准和技术研究所为补丁严重性的评级高达9. 8 分(满分 10 分)。下面这篇文章就对 iOS 系统的 Wi-Fi 晶片漏洞细节进行了详细剖析,雷锋网做了不改变原意的整理。
作者:百度安全实验室
1. 摘要
随着iOS11 的发布,多个BroadCom WiFi 芯片的高危漏洞被公开[1]。这些漏洞对上亿台未来得及更新的iOS设备造成了严重的安全威胁。黑客可对同一WiFi网络下的设备发起攻击,远程控制受害设备的 WiFi 芯片,甚至进一步攻破 iOS 内核。本文对 iOS 设备 WiFI 芯片相关漏洞进行简要技术分析,然后根据 iOS设备的系统版本统计出受影响的规模。
截至 9 月 27 日,国内92.3%的iOS用户都受到相关高危漏洞的威胁。我们呼吁用户尽快升级iOS系统到最新版本,并号召手机厂商采用更有效的防护技术,避免用户受到已知高危漏洞的威胁。
2. BroadCom WiFi芯片漏洞技术分析
本文着重分析两个BroadCom WiFi芯片漏洞:CVE-2017- 11120 和CVE-2017-11121。这两个漏洞都是WiFi 芯片固件代码在处理数据帧时缺乏对特定字段的严格校验。攻击者可以利用它们制造内存破坏,实现任意代码执行,获得对设备的远程控制。
2.1 漏洞CVE-2017-11120
iOS设备搭载的BroadCom WiFi芯片采用了快速基本服务设置转换(Fast BSS Transition)和无线资源管理(Radio Resource Management)标准。在接入无线接入点(Access Point,简称AP)后,iOS设备会发送相邻接入点请求(Neighbor Report Request),AP则返回相邻接入点应答(Neighbor Report Response),包含当前无线局域网内的相邻AP以及各自的BSSID,Operating Class和Channel Number等信息。在处理Neighbor Report Response数据帧时,BroadCom WiFi芯片将每一种Operating Class和Neighbor Report信息保存在一个 456 字节的内存块中(如图 1 所示),并且将这些块通过指针串接起来。其中,Neighbor Count Array记录了各个Channel Number的Neighbor数量。Array长度为 450 字节,每 2 个字节记录一个Channel Number,所以最大可记录的Channel Number为224(0xE0)。
▲图1:BroadCom WiFi芯片记录Neighbor Report Response信息的内存块结构[2]
▲图2:BroadCom WiFi芯片处理Neighbor Report Response信息的函数[2]
如图 2 所示,WiFi 芯片固件里位于地址 0xAC0A8 的函数(简称function_AC0A8,下同)首先在串联的内存块中查找Operating Class对应的条目,如果没有找到,则会动态创建一个条目 ,然后从数据帧中读出Channel Number作为数组索引,定位到 Neighbor Count Array 中元素,将其值加一。此过程并没有对Channel Number做出校验,当伪造的数据帧中 Channel Number大于0xE0(如0xFF)时,上述过程将会造成内存越界写。攻击者可以通过内存越界写改变关键指针数据或者控制流元素,一步步接管代码执行。值得一提的是,BroadCom WiFi 芯片里没有 ASLR、DEP 等防护,攻击者可以很容易做代码改写,注入任意代码执行。
此漏洞影响 iOS 11.0 以前的设备。目前此漏洞的利用代码已公开[2],攻击者能直接复用这一利用代码攻击漏洞设备,在WiFi芯片中插入后门,并在用户无感知的情况下实现对设备的远程控制。
2.2 漏洞CVE-2017-11121
根据 Fast BSS Transition 标准,当设备在无线网络环境下进行快速漫游(fast roaming)时,会触发校验和重关联(reassociation)操作。Reassociation操作会对组临时秘钥(Group Temporal Key,简称GTK)进行解密和安装。这两个过程中存在多处 memcpy 调用,调用前都缺少对 copy 长度的校验,可能导致内存破坏。
▲图3:BroadCom WiFi芯片重关联操作时GTK解密和安装的相关函数[3]
如图 3 所示,reassociation 由 function_8462C 函数负责,它调用 function_6D8 对GTK 解密,然后会继续调用 function_C9C14 对GTK 进行安装。相关代码片段如下: