欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

影响62亿台设备:解读我是如何发现Marvell Avastar Wi-Fi远程代码执行漏洞的

来源:本站整理 作者:佚名 时间:2019-01-25 TAG: 我要投稿

一、概述
在本次研究中,我将主要分析Marvell WiFi FullMAC SoC的安全性。由于我们尚未完成对该产品中带有芯片的无线设备的研究,因此其中可能包含大量未经审计的代码,这可能会出现严重的安全问题。本文是基于我在ZeroNights 2018演讲整理而成,演讲的展示幻灯片请参见这里。此外,很多安全团队都针对无线SoC安全这一话题开展了研究。例如,Google Project Zero在2017年4月发布了一系列博客文章,描述了如何在智能手机上利用Broadcom Wi-Fi栈。这一话题同样也在2017年BlackHat大会上进行了讨论。一些智能手机基带漏洞利用的文章,可能有助于各位读者理解用于逆向无线SoC固件的技术。
二、无线设备工作原理
一般来说,Wi-Fi的加密狗可以分为两大类:FullMAC和SoftMAC。二者都需要固件映像,在每次设备启动时都应该上传。设备制造商会提供适当的固件映像和操作系统设备驱动程序,所以在启动期间,驱动程序可以上载固件,从而使其主要功能可以被Wi-Fi SoC使用。下图说明了这一过程。

启动SoftMAC和FullMAC加密狗之间的主要区别在于其固件功能。此外,FullMAC加密狗的固件具有MLME(MAC层管理实体,MAC Layer Management Entity)。换而言之,它能够在没有操作系统驱动程序任何支持的情况下,处理一些Wi-Fi管理帧和事件实体。显然,FullMAC加密狗的攻击面会更大,所以我们也倾向于寻找这些设备上潜在的漏洞。

三、Wi-Fi SoC与驱动程序之间的交互
在Linux内核中,有两个版本的驱动程序用于处理Marvell Wi-Fi:
1、mwifiex驱动程序(可以在官方的Linux repo中找到);
2、mlan和mlinux驱动程序(可以在官方的steamlink-sdk repo中找到)。
二者都具有一些调试功能,可以允许我们读写SoC内存。驱动程序使用内部格式,将信息发送到Wi-Fi SoC,并从SoC接收事件或响应。Wi-Fi SoC有如下几种特定类型的数据:
· COMMAND(命令)
· EVENT(事件)
· DATA(数据)
· SINGLE PORT AGGREGATED DATA(单端口汇总数据)
Wi-Fi SoC和设备驱动程序之间的交互模式如下所示:

我更倾向于考虑由固件实现的API命令。这些命令可分为以下几组:
1、SoC存储器的读/写命令;
2、来自固件的扩展版本信息(例如:适用于SteamLink的15.68.7.p206、w8897o-B0、RF8XXX、FP68)
3、与Wi-Fi相关的内容(例如:协作、扫描等)
其中的一些命令,可以通过驱动程序实现的IOCTL或者一些特殊的debugfs文件,从用户模式(Usermode)访问。驱动程序最有用的功能之一就是它可以进行固件内存转储。这将有助于调试我们的动态检测方法或漏洞利用方法。根据分析,超时机制似乎是在操作系统驱动程序中实现的。因此,当命令响应超时时,驱动程序将尝试转储Wi-Fi SoC内存,并将其存储在主文件系统中。在mwifiex和mlan+mlinx驱动程序中,内存转储具有不同的格式。经过对mwifiex PCI驱动程序进行研究,我发现它是以类似固件映像的格式存储了完整的Wi-Fi SoC内存转储。SDIO版本的mlan+mlinx驱动程序仅以二进制格式存储了ITCM、DTCM和SQRAM区域。
四、固件分析
如前所述,Marvell Avastar Wi-Fi芯片组系列使用了固件文件,并在这些文件中承载了大部分设备的功能。ROM中包含启动代码,并在将主固件加载到芯片RAM之前负责与主机进行交互。官方linux-firmware git repo提供了几个版本的固件。因此,我们首先需要研究驱动程序初始化Wi-Fi SoC所使用的固件映像。
4.1 静态固件文件分析
为了获得与固件RAM映像结构相关的信息,我们可以查看Marvell Wi-Fi驱动程序代码,该代码将固件加载到Wi-Fi SoC(drivers/net/wireless/marvell/mwifiex/fw.h)。
...
 
struct mwifiex_fw_header {
    __le32 dnld_cmd;
    __le32 base_addr;
    __le32 data_length;
    __le32 crc;
} __packed;
 
struct mwifiex_fw_data {
    struct mwifiex_fw_header header;
    __le32 seq_num;
    u8 data[1];
} __packed;
 
...
各位读者可能会注意到,固件文件中包含一些带有头部和校验和(Checksum)的内存块。在块的头部,还包含SoC中的地址,该内存即将被加载。掌握了这些知识以后,我们可以在IDA Pro中查看Marvell Avastar的固件文件,从而进行进一步研究。

在初步逆向之后,我们可以发现88W8897是具有8个MPU区域的ARM946微控制器。所有内存都是RWX权限。固件文件中,还包含对ROM功能的引用。因此,为了进一步研究,我们需要一个ROM转储。下图展示了88W8897 Wi-Fi芯片的内存映射,未知的内存区域似乎是内存映射的寄存器区域。

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载