Intel 无线 AP Windows Wi-Fi驱动 RCE 漏洞的分析(CVE-2020-0558)
2020-05-22 15:01:26 Author: www.4hou.com(查看原文) 阅读量:488 收藏

导语:本月初,ZDI发布了三个内存损坏漏洞ZDI-20-494,ZDI-20-495和ZDI-20-496,,影响了两个适用于各种英特尔的Windows Wi-Fi驱动程序双频无线适配器。

0x01  漏洞描述

本月初,ZDI发布了三个内存损坏漏洞(ZDI-20-494ZDI-20-495ZDI-20-496-统称为CVE-2020-0558),影响了两个适用于各种英特尔的Windows Wi-Fi驱动程序双频无线适配器。根据供应商文档描述,这些驱动程序适用于AC 7265 Rev D,AC 3168,AC 8265和AC8260无线适配器。ZDI-20-494和ZDI-20-496都是具有共同根源的越界写入漏洞,并且位于两个驱动程序(即Netwtw04.sys和Netwtw06.sys)中。ZDI-20-495是一个堆栈缓冲区溢出漏洞,仅影响Netwtw06.sys驱动程序。这些漏洞是由百度安全实验室的谢海阔和王颖发现的,最初于2019年11月底向ZDI报告。

可以在GitHub上找到这三个漏洞的PoC,PoC已使用基于Qualcomm Atheros AR9271的USB网络适配器针对AC 3168和AC 8260适配器进行了测试。

 https://github.com/thezdi/PoC/tree/master/CVE-2020-0558

所有这三个漏洞都要求受害者启用“移动热点”函数,攻击者可以通过简单地使用恶意802.11 MAC帧连接到无线网络而无需知道移动热点的密码来利用这些漏洞。

0x02  ZDI-20-495

Netwtw06.sys驱动程序中存在堆栈缓冲区溢出漏洞。PoC向受害移动热点发送四个802.11 MAC帧,从而在受害机器上触发BSOD。漏洞的原因很简单,过长的SSID通过位于802.11关联请求帧主体内的标记长度值编码的信息元素的标记参数传递给存在漏洞的函数。以下是由Scapy实用程序生成的恶意框架的剖析:

图1-恶意802.11帧的数据包分解

在上图中,我们可以看到ID为0x00的信息元素,它对应于SSID,长度为55个字节,长SSID字符串如下。

存在漏洞的函数prvhPanClientSaveAssocResp()通过memcpy_s()漏洞的DstSize参数将SSID复制到固定长度的堆栈缓冲区中。它提供了攻击者提供的SSID长度,而不是目标缓冲区的大小。下面是prvhPanClientSaveAssocResp()从驱动程序20.70.13.2版中获取的函数的反汇编代码段。

图2-存在漏洞的函数prvhPanClientSaveAssocResp()的反汇编

在0x1403A7F5C,r8指向SSID信息元素的开始。在0x1403A7F66,攻击者将提供的SSID长度(55)传递给DstSize,然后将该值也传递给MaxCount。以这种方式传递SSID长度会破坏memcpy_s()的安全性,这就是此漏洞的根本原因。如果进一步查看反汇编,我们可以看到堆栈缓冲区var_4C只有36个字节长:

图3-堆栈缓冲区var_4C

当memcpy_s()继续将攻击者控制的缓冲区复制到大小不足的堆栈缓冲区变量中时,就会发生缓冲区溢出情况。

0x03  ZDI-20-494和ZDI-20-496

由于这两个漏洞具有相同的原因,因此我们仅讨论ZDI-20-494。关联请求帧的处理中存在越界写漏洞,为了到达存在漏洞的代码路径,攻击者必须先发送身份验证请求[1],然后再发送恶意关联请求。攻击者发送一个关联请求帧,其中包含一个ID为59(0x3B)的信息元素,该信息元素对应于支持的操作类别,信息元素的值包含221个空字节。请求的框架剖析如下:

图4-PoC发送的恶意关联请求的数据包分解

驱动程序调用两个函数来处理信息元素:prvPanCnctProcessAssocSupportedChannelList()和utilRegulatoryClassToChannelList()。在处理恶意请求时,prvPanCnctProcessAssocSupportedChannelList()尝试调用函数utilRegulatoryClassToChannelList()221次,对应于信息元素的长度。以下是prvPanCnctProcessAssocSupportedChannelList()从Netwtw04.sys驱动程序的19.51.23.1版中获取的函数的反汇编代码段:

图5-prvPanCnctProcessAssocSupportedChannelList()的反汇编片段

在0x140388500,ebx循环索引被初始化为0。在0x1403885AF处的循环退出条件将循环索引ebx与eax来自四个指令Prior [2] 的信息元长度进行比较。该utilRegulatoryClassToChannelList()函数在循环体内的0x140388559处调用。该函数的第三个参数是通过r8寄存器传递的内存缓冲区地址,该地址是受此越界写漏洞影响的缓冲区的地址。另请注意,在缓冲区0x14088502的第一个DWORD被初始化为零。

utilRegulatoryClassToChannelList()函数从存在漏洞的缓冲区中读取缓冲区的第一个DWORD缓冲区作为索引,并将其用作偏移量,以将0xFF字节的数据写入。每次调用函数时都会发生这种情况,由于缺少边界检查,因此当重复调用此函数时,索引可能指向超出缓冲区末尾的内存区域。

图6-utilRegulatoryClassToChannelList()的反汇编

在0x1400D06A8,来自第三个参数的存在漏洞的缓冲区被传输到rbx寄存器。在0x140D068F,在edi进入循环主体之前,将循环索引初始化为0。将迭代0xFF次,在从0x140D0718开始的基本块中,读取缓冲区中的第一个DWORD并将其存储在eax寄存器中。此值立即用作存在漏洞缓冲区的偏移量,并向其中写入一个字节。在0x1004D0729,第一个DWORD存在漏洞的缓冲区增加。当utilRegulatoryClassToChannelList()函数被调用两次以上时,发生越界写。

0x04  分析总结

尽管这些漏洞的触发条件非常少见,但是数据链路层中的漏洞还是很有趣的,基于Wi-Fi的漏洞的分析和发现还是比较少的。IEEE 802.11系列无线技术标准提供了广泛的攻击面,并且漏洞研究者社区才刚刚开始挖掘该协议。来自此攻击媒介的良好驱动程序漏洞可以直接访问内核,与需要多个漏洞和沙箱逃逸的基于Web浏览器的攻击相比,Wi-Fi攻击媒介可能是攻击者考虑的一种有趣的替代媒介。对于那些有兴趣进一步了解IEEE 802.11系列标准的人,802.11无线网络: Matthew S. Gast撰写的权威指南是开始学习的绝佳资源。

本文翻译自:https://www.thezdi.com/blog/2020/5/4/analyzing-a-trio-of-remote-code-execution-bugs-in-intel-wireless-adapters如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/rX0w
如有侵权请联系:admin#unsafe.sh