【原创漏洞】Linux内核Marvell WI-FI芯片驱动漏洞(CVE-2019-3846/CVE-2019-10126)

发布时间 2019-06-10

漏洞概述



Marvell Avastar802.11ac低功耗无线芯片系列主要应用于笔记本电脑、智能手机、游戏设备、路由器和物联网设备等,如Surface Pro、Surface laptop、Samsung Chromebook、Galaxy J1、Sony PlayStation 4、Xbox One。


Linux内核Marvell Avastar系列芯片(88W8766/88W8797/88W8897/88W8997)驱动存在远程溢出漏洞CVE-2019-3846和本地溢出漏洞CVE-2019-10126,可导致拒绝服务(系统崩溃)或任意代码执行,启明星辰ADLab已第一时间提交厂商进行修复。


漏洞影响范围



Linux kernel 3.2~Linux kernel 5.1


漏洞分析



信息元素(Information Element,IE)是IEEE 802.11管理帧的组成部分。AP和STA通过IE交换信道,速率以及加密算法等信息。除Vendor Specific外,其他IE均使用TLV数据结构表示。



其中,Type字段长度为1个字节,常见的IE类型以及取值如下:


CVE-2019-3846远程堆溢出漏洞


该漏洞位于drivers/net/wireless/marvell/mwifiex/scan.c中的mwifiex_update_bss_desc_with_ie函数中。补丁代码添加对WLAN_EID_SSID和WLAN_EID_SUPP_RATES的长度校验。



漏洞触发的函数调用链:


->mwifiex_cfg80211_connect [mwifiex]
->mwifiex_cfg80211_assoc [mwifiex]
->mwifiex_bss_start [mwifiex]
->mwifiex_fill_new_bss_desc [mwifiex]

->mwifiex_update_bss_desc_with_ie [mwifiex]


可以看出,漏洞发生在Association阶段,无需经过四次握手认证。



攻击者无需真实AP密码,只需使victim STA断开原有连接,尝试连接FakeAP时,即可触发该漏洞。


CVE-2019-10126本地堆溢出漏洞


该漏洞位于drivers/net/wireless/marvell/mwifiex/ie.c中的mwifiex_uap_parse_tail_ies函数,该函数用于解析用户层传递的beacon数据并将其传递给固件。在while循环的switch default分支中,当处理WLAN_EID_SSID和WLAN_EID_SUPP_RATES等之外的信息元素IE,则会调用拷贝函数。补丁在拷贝函数前添加了对TLV的长度校验代码。



用户态应用程序(如wpa_suppliant,hostapd)通过netlink接口与内核模块进行通信。在初始化过程中注册消息命令和回调函数。



内核收到NL80211_CMD_START_AP消息时,函数调用链:


->nl80211_start_ap [cfg80211]
->rdev_start_ap [cfg80211]
->mwifiex_cfg80211_start_ap  [mwifiex]
->mwifiex_set_mgmt_ies [mwifiex]

->mwifiex_uap_parse_tail_ies [mwifiex]


如果构造特殊的beacon数据包含多个特殊类型的IE(例如WLAN_EID_SUPPORTED_OPERATING_CLASSES),将使得mwifiex_uap_parse_tail_ies循环调用memcpy,导致本地溢出。


安全建议



Linux各发行版漏洞公告:


https://security-tracker.debian.org/tracker/CVE-2019-3846
https://access.redhat.com/security/cve/cve-2019-3846

https://security-tracker.debian.org/tracker/CVE-2019-10126


补丁链接:


https://patchwork.kernel.org/patch/10967049/
https://patchwork.kernel.org/patch/10970141/