DroidFuzzer阅读笔记

论文DroidFuzzer: Fuzzing the Android Apps with Intent-Filter Tag阅读笔记

DroidFuzzer: Fuzzing the Android Apps with Intent-Filter Tag
In Proceedings of International Conference on Advances in Mobile Computing & Multimedia (pp. 68-74).

文章提出了一种借助Intent-filter的fuzz安卓应用的框架,主要面向接收外来MIME数据的Activity,也即注册了相应的intent-filter的Activity。

1 相关框架介绍

Monkey:运行在模拟器或者设备上的压力测试工具,可以模拟用户事件(点击、滑动、按压)和一些系统级事件。

MonkeyRunner:提供API,可以通过编写脚本控制设备和测试过程,常用于功能测试和回归测试,但是也只能模拟用户事件。

DroidPilot:通过模拟器或者设备,可以获取UI对象,支持脚本化测试,支持同时在大量的设备上进行测试,常用于UI测试。

iTestin:可以记录在一台设备上的脚本测试,然后部署到其他的设备上,用于大规模的设备测试和回归测试。

Robotium:基于Android Instrumentation,该测试框架使得编写强大而鲁棒的自动化UI测试脚本更加容易。

上述框架都聚焦于UI测试

Dynodroid:通过生成相关的用户事件输入给App来进行fuzz,同时可以以一种轻量的方法监控App对输入用户事件的反应。

还有一些其他的fuzz切入点,例如SMS、NFC、binder。

2 DroidFuzzer设计

Android有四大组件:Activity、Broadcast Receiver、Service、Content Provider。

Activity自然是App与用户交互的主要接口,同时Intent又是Activity之间交互的主要方式,所以选择通过Fuzz Intent的手段来测试App。
按照作者的表述,Activity是App的“核心”,Intent是Activity接收的输入数据,那么Intent也就可以视作App的输入,于是就通过Fuzz Intent的方式来测试整个App。

DroidFuzzer是灰盒的,除了确定哪些Activity接收Intent之外,不再关心更为具体的内部信息。可以分为预处理、变异和动态检测三个模块,

image-20211214145729111

2.1 预处理模块

在预处理阶段,需要确定哪些Activity会处理外来的输入数据,也即确定哪些Activity注册了监听事件。
这里通过解析AndroidManifest.xml文件来确定静态注册的intent-filter,包括action、category和data这三个字段。
因为主要是考虑接收外来MIME数据的Activity,所以对于data字段,包括了常见的video、audio、text、image、application等数据类型。

对于动态注册的intent-filter暂时没有考虑。

2.2 变异模块

在这个模块主要有三个问题需要解决:

  1. 如何提供不同种类的正常的数据作为输入
  2. 如何构造正常数据
  3. 如何生成异常数据

解决方法:

  1. 搜集各种严格遵循格式的MIME数据作为seed data
  2. 人工构造包含各种MIME格式文件的数据库,用于指导MIME数据的生成
  3. 如何设计变异功能,需要建立在对MIME数据格式的理解之上。
    文章首先总结了MIME格式的大致结构:一般来说,MIME数据流会被分成多个chunk,每个chunk内部会包含一些field来完成一些描述,这些field长度一般为若干byte,存储着不同类型的数据。
    因此,变异策略聚焦于这些field来进行。
    文章考虑了4中主要的field类型,包括Integer,Flag,String,ByteArray,并制订了对应的变异方案(但是都比较基础)。

2.3 动态检测模块

Android App的运行可以分为Java和Native两个层面。
对于Java层,DroidFuzzer通过覆写ActivityController来进行crash检测。
对于Native层,通过监控tombstone文件来进行crash检测(tombstone文件会包含已crash进程的相关信息)。

3 评估

文章对Bug的定义:

  1. 造成crash或者exit
  2. 造成ANR(Application Not Responding)
  3. 造成无限制的资源占用

完成了两类文件的测试,分析了一些具体的crash原因。

特别提出的是,文章声称DroidFuzzer以App的形式进行工作,非常方便展开测试。

3.1 视频测试

测试对象:MX Player,QQ Player,Mobo Player。
测试格式:AVI PM4 RM

QQ Player的鲁棒性要差一些;MP4因为格式最为复杂,所以造成的bug多一些。

image-20211214202701442

3.2 音频测试

测试对象:TTPod BaiduMusic
测试格式:WMA MP3

image-20211214203102569

4 一些问题

性能问题没有提及:没有进行源码分析,没有说明硬件参数,App本身的运行速度就不高,而且DroidFuzzer也以App形式存在,令人很难相信DroidFuzzer在测试方面具有较好的性能。

变异策略:不具有很强的针对性,效率问题值得讨论,当然,这也属于黑盒或者灰盒分析的自身的问题。

没有开源

Welcome to my other publishing channels