物联网模糊测试工具
使用基于移动应用的模糊测试挖掘物联网设备中的内存漏洞
背景
物联网技术迅速发展,物联网设备大多缺乏保护并广泛存在漏洞的情况为网络犯罪分子提供了广泛的平台。 物联网攻击的重要target是设备固件中的安全漏洞。由于一方面难以获取固件(大多供应商并没有公开提供固件映像),另一方面由于物联网设备大多较为简单,没有提供调试端口也无法从主板转储映像,导致进行系统的检测漏洞是十分困难的。此外,当获得固件后如何解密固件、解密固件后由于不同固件适用于不同的底层体系结构(内存布局、指令集等)使得无法获取NVRAM参数,这将导致在仿真器中运行的程序频繁崩溃。
解决思路
与传统嵌入式设备不同,大多数物联网设备都会提供给用户一个可以在手机上运行的移动应用APP来控制物联网设备。这样的APP可以认为是物联网设备的手机端控制面板,其内部包含丰富的设备信息,且可以与物联网设备固件直接(通过Wi-Fi、蓝牙等)或间接(通过云服务)通信。
文章提出IoT Fuzzer,运行协议指导的模糊测试,利用上述APP进行测试。通过执行动态分析识别应用中形成的将要传递给target设备的消息的内容,并自动在运行测试时改变这些内容,实现使用APP的程序逻辑来产生有意义的测试用例,进而对目标固件进行模糊测试。
挑战
- 自动更改协议字段
如果工具了解协议格式,则其可以将有效输入和容易被程序拒绝的无效输入区分开来,虽然用公开的协议格式模糊消息比较容易,但当面对未知协议时却非常困难。因此需要工具能够自动识别协议字段并对其进行模糊。 - 处理加密消息
如果物联网设备和应用程序之间的通信是加密的,则测试工具也要以相同的加密算法(使用相同的密钥)发送加密的测试消息。识别应用程序中使用的加密算法可能需要大量的逆向工作。因此,需要工具能够重用应用程序中的消息加密功能。 - 监控崩溃
由于无法在本地监视物联网设备系统中运行的进程,当测试消息导致程序崩溃时,我们无法知道物联网设备的实时状态,另一方面,物联网设备可能具有不同的应用层协议和不同的异常处理机制,导致难以根据错误消息的语义自动识别崩溃。另外,有的物联网设备可能内置看门狗程序能够在发生崩溃后恢复。因此,需要设计一种有效的机制来自动监控远程设备状态。
方案
- 在数据源处修改协议字段
由于对未知协议进行逆向工程是非常繁琐复杂且可能毫无收获的,论文提出可以在数据源处改变在协议消息中使用的数据,相应的,根据程序逻辑,可以断言,这些变异的字符串最终会变成协议字段。 - 运行时宠用加密函数
由于在数据源处修改数据,因此正常的程序将会对其进行正常加密并做其他的准备。因此,工具无需重新实现加密逻辑。 - 通过心跳机制监测状态
虽然无法在本地监控正在运行的设备状态,但可以通过发送心跳消息来推断程序或系统是否处于活动状态。
实现细节
IoT Fuzzer 分为两个阶段,APP分析阶段和模糊测试阶段。
APP 分析阶段
以物联网APP为输入,分析触发网络事件的UI操作,跟踪应用协议字段的传播过程,IoT Fuzzer记录了所有协议字段和对应的变异函数。
UI分析
执行静态分析,确定最终会导致发送消息的UI元素,将不同活动中的UI元素与目标网络API相关联。
首先使用 Androguard
构建应用程序调用图,从目标网络通信API开始,构造到UI事件处理程序的反向代码路径。由于存在隐式控制流,需要列出并添加由系统EdgeMiner
获得的隐式边。
然后构造活动转换图,使得在模糊测试过程中能触发特定活动发送消息。使用 Monkeyrunner
通过基于事件执行顺序的简单策略与每个活动中的UI元素进行交互,以此获得一系列UI事件以及触发顺序。同时记录将当前活动转化为另以活动的事件。对每个活动中的事件,根据调用路径过滤掉不会导致消息发送的事件。
数据流分析
由于物联网APP中的命令消息通常是使用硬编码字符串、用户输入或系统API构建的,所以采用修改版本的TaintDroid
动态污点跟踪技术识别这些数据。论文指出,只需在数据第一次被使用时修改他们,就可以达到改变发送消息字段的目的,于是可以记录受污染数据作为参数的函数,在这些函数处对字段进行变异。
模糊测试阶段
测试框架使用动态的插桩改变感兴趣的协议字段,并监视物联网设备的崩溃。
运行时变异
通过污点跟踪,识别处协议字段及其经过的相应函数,动态地hook记录的函数并在运行时改变协议字段参数以生成测试消息。具体方法是获得记录的函数的唯一集合,然后将其与Xposed框架动态hook,
为了调度模糊测试过程,使用如下算法将突变分配给函数参数。对于每条消息,一般无需变异所有字段,所以需要随机选择要变异的字段子集。首先确定消息中的字段数c,随机生成一个小于c的数s作为变异总数,然后找一组解满足$t_1+t_2+\dots+t_n=s$,其中$t_i$是给第$i$函数的变异量。
模糊规则,采用如下启发式突变规则来实现具有结构和类型信息的模糊策略。
- 更改基于栈或基于堆的溢出和出界访问的字符串长度。
- 更改整数溢出和越界访问的整数值、双精度值或浮点值。
- 更改数据类型,或提供空值来测试未初始化的变量漏洞。
响应监测
对于基于TCP的连接,通过查看连接状态来推断系统是否崩溃。
对于基于UDP的连接,如果程序崩溃,不会向APP发回响应,需要确定这个无响应是由崩溃引起的还是仅仅是内部系统对于错误的处理。论文采用心跳插入机制,区分这两种情况。
局限
测试范围,虽然IoT Fuzzer实现了很高的协议覆盖率,但对于固件的代码覆盖率和攻击面覆盖率是有限的。IoT Fuzzer主要关注点是内存漏洞,没有关注其他漏洞如绕过身份验证漏洞。
连接方式,论文中的实现只关注与手机APP有Wi-Fi连接的设备,论文指出将实现扩展到蓝牙、Zigbee等并没有技术障碍。
云中继,论文指出对于云作为消息中继、代理的物联网设备,APP请求消息将被发送到云端,然后再返回给物联网设备。这样的消息可能被云过滤从而影响IoT Fuzzer的运作。
结果判断,IoT Fuzzer 无法生成内存漏洞的类型和根本原因,需要一些人工的努力才能定位漏洞。
结果准确性,IoT Fuzzer存在假阳和假阴。
思考
工业受控系统大多有专业的控制软件,可以借鉴 IoT Fuzzer 的思想,对控制软件进行hook,进而生成测试消息。