作者:启明星辰ADLab
2017年10月,比利时安全研究员Mathy Vanhoef披露了无线网络协议WPA2存在高危漏洞,漏洞允许攻击者监听AP和接入点STA之间传输的Wi-Fi数据流量。作者公布了漏洞验证演示视频[1][2]。由于漏洞存在于WiFi协议层,理论上所有支持WPA2的客户端(桌面操作系统、移动OS、路由器、物联网设备等)都将受到“KRACK”攻击的影响(其透过WiFi传输的数据存在被篡改、嗅探的风险,诸如被攻击者的支付、财产账号、用户名、密码、邮件、照片等敏感信息可被截获,危害大影响范围广)。
启明星辰ADLab通过对全零密钥漏洞的分析成功重现“KRACK”攻击。
802.11i是IEEE工作组为无线网络802.11协议组定义的安全标准。WPA实现了IEEE 802.11i标准的大部分,是在802.11i完备之前替代WEP的过渡方案,后被WPA2取代[3]。WPA和WPA2都是基于802.11i,区别在于WPA2要求支持更安全的CCMP。WPA和WPA2均使用802.11i中定义的四次握手。
下图是客户端(Station, STA)连接接入点(Access Point, AP)的消息交互过程。
STA和AP在四次握手中协商会话密钥PTK(Pairwise Transient Key),PTK是由PMK和PKE计算生成,而PMK由ANonce、SNonce和双方MAC地址等计算生成。PTK分为KCK,KEK和TK三部分,其中,KCK用于MIC校验,KEK用于加密GTK,TK为数据加密密钥。四次握手完成后,传输数据使用TK进行加密。
wpa_supplicant
是linux系统下WiFi客户端,用于连接无线网络,Android WiFi系统引入了wpa_supplicant
,它的整个WiFi系统是以wpa_supplicant
为核心来定义上层用户接口和下层驱动接口。
下图为wpa_supplicant
版本发布时间线。Android 6.0 WiFi系统是基于v2.5,Android 6.0+ WiFi系统是基于v2.6。
v2.4版本引入了一个全零密钥漏洞。这个漏洞是由802.11标准中的一句话引起的,该标准间接建议在安装了TK之后从内存清除TK;2016年10月发布的V2.6对这个漏洞进行了一次修复,由于考虑不全面,代码仍然存在漏洞;在2017年10月发布的补丁中,最终修复了这个漏洞。下面结合代码对漏洞进行详细分析。
wpa_supplicant
2.4(2.5) 四次握手中的状态转移如下图所示:
由于无线网络存在干扰,可能会造成数据帧的丢失,因此在802.11i规定如果AP没有收到Msg2和Msg4,会相应的重传Msg1和Msg3。从图中可以看出,当完成PTK安装后,如果收到重传的Msg3,会重新安装PTK。
当wpa_supplicant
收到Msg3后,会调用wpa_supplicant_install_ptk
函数安装PTK,其中wpa_sm_set_key
函数负责将密钥PTK.TK安装到驱动。在supplicant v2.4(v2.5)中,在调用wpa_sm_set_key
函数完成PTK的安装后,执行os_memset(sm->ptk.tk, 0, WPA_TK_MAX_LEN)
,对PTK.TK进行清零操作。
如果攻击者劫持Msg3或Msg4,造成Msg3的重传,根据状态转移图,STA会重新安装PTK,而PTK.TK之前已经被清零,导致STA安装全零加密密钥。
……… ………
下面结合V2.5和V2.6的源代码进行分析。
(1)V2.6在wpa_sm结构体中添加了一个标志位tk_to_set
。
(2)V2.6修改了wpa_supplicant_install_ptk
函数。在安装完PTK后,将tk_to_set
赋值为0,当再次进入该函数时,如果tk_to_set==0
,直接return,不再重装PTK。
(3)V2.6修改wpa_supplicant_process_1_of_4
函数。当每次收到Msg1时,计算tptk,并将tk_to_set
重置为1。
………………………….
针对V2.6,攻击者通过在重传的Msg3之前插入一个伪造的Msg1,仍然可以实现全零密钥的安装。虽然STA首次安装PTK后对tk_to_set
进行清零,但是紧接处理伪造的 Msg1时,将tk_to_set
重置为1,因此在最后处理重传Msg3时,成功绕过wpa_supplicant_install_ptk
函数的tk_to_set
条件判断代码。
在2017年10月发布的补丁中,删除了wpa_supplicant_process_1_of_4
函数中的sm->tk_to_set = 1;
语句,修复了全零密钥漏洞。
启明星辰ADLab “KRACK”重现视频地址为:https://v.qq.com/x/page/m0538vcwqbb.html 。
视频中出现的步骤及提示字幕:
a. wireshark显示了建立连接的数据包。
b. 攻击成功,Nexus连接到克隆wap,频率2422。
c. 访问uk.match.com 显示当前连接为http连接,输入测试用户名和密码。
d. wireshark可以成功捕获用户名和密码。
e. 关闭Hostapd(频率2422)。
f. 重新连接到真实wap(频率2457),再次访问uk.match.com 显示连接为https连接。
下表中列出了重现视频中使用的设备:
“KRACK”涉及的相关漏洞编号:
修复情况:
2017年10月2日,Linux的hostapd和wpa_supplicant 补丁已公布,详见 https://w1.fi/security/2017-1/。
2017年10月10日,微软在Windows 10 操作系统中发布补丁 KB4041676。
苹果在最新的 beta 版本iOS、macOS、 tvOS和 watchOS中修复了无线网络安全漏洞。
[1] https://www.krackattacks.com/
[2] https://papers.mathyvanhoef.com/ccs2017.pdf
[3] https://zh.wikipedia.org/wiki/WPA
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员。截止目前,ADLab通过CVE发布Windows、Linux、Unix等操作系统安全或软件漏洞近400个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。