MFFA—Android多媒体文件漏洞Fuzzing框架分析与测试

1

本文首发www.droidsec.cn | 安卓安全中文站 转载请注明出处

0x01.MFFA简介

MFFA(项目地址:https://github.com/fuzzing/MFFA 作者Alexandru Blanda来自Intel)是一个基于Python开发的通过对Android平台多媒体文件解码功能进行模糊测试从而发现可能的安全漏洞的安全测试框架,主要原理是通过指定一些畸型但在结构上是有效的媒体文件发送到Android设备中的组件进行解码或者是播放,与此同时监测系统发生的一些可能导致可利用漏洞的潜在问题(如Crash),最后对fuzzing结果进行自动整理过滤掉大部分重复问题和误报,研究者可以通过手工分析来确定最终的结果。 通过对此框架的分析,我们可以复现最近热门的Android Stagefright组件漏洞的挖掘方法,甚至可以对框架进行二次开发,用于Android系统0day挖掘,移动App客户端产品安全测试。

 

0x02.使用方法

(1)环境要求

支持Linux环境(修改后支持Mac/Win平台),Python 2.7及以上版本本,Android SDK工具包。同时需修改Android源码并重新编绎以启用Stagefright命令行界面工具。(可使用Genymotion中的Android4.1.1版模拟器代替)

(2)开始测试

python test.py stagefright <video|audio><play|noplay><index>

<video|audio>选择测试的文件是视频/音频类文件

<play|noplay>在音频测试中,选择是否启用播放功能以检测某可能的漏洞

<index>如果中途中止测试,指定断点处重新启动测试

(3)结果分类

python triage.py <SIGSEGV|SIGILL|SIGFPE|all><video|audio>

<SIGSEGV|SIGILL|SIGFPE|all>过滤的信号种类

<video|audio>测试的文件种类

0x03.原理分析

(1)目标

发掘那些能引起Crash,进程挂起,拒绝服务,缓存溢出,空指针引用错误,整数溢出的安全漏洞

(2)流程图

2

 

(3)测试数据生成

  • Basic Fuzzing Framework (BFF)
  • FuzzBox
  • Radamsa
  • American Fuzzy Lop (AFL) (推荐)
  • Seed gathering (利用Google语法收集视频链接并下载/利用现成的视频文件库如http://samples.mplayerhq.hu/)

(4)Fuzzing测试流程

<1>后端布署服务器运行测试文件生成工具保存测试数据

<2>服务发送大量测试cases到本地主机

<3>主机自动分配测试文件到连接的Android设备上

<4>每个Android设备以分布式方式接收测试文件并分别记录结果

(5)结果整理模块

<1>第一次运行阶段

>在设备中运行测试case

>记录每次运行过程中创建的log日志

<2>分类阶段

>生成的日志被用于分析标记发生Crash的测试case

>重新测试发生了Crash的case

>之前没有检测到的Crash将存储在独立的issues pool

<3>筛选阶段

保存异常信息的目录主要位于data/tombstones和data/system/dropbox,通过分析这些日志可以定位相关存在问题的Native层so文件的问题代码大概位置。

1.解析log日志文件确认该case造成了Crash

2.重新发送文件以测试Infrastructure

3.对于发送的每个文件:

a.获取生成的tombstone文件

b.解析tombstone文件然后获取PC值

c.检测PC值是否之前遇到过

d.如果是新的PC寄存器值,保存相应的tombstone日志文件

4.最后每个issues保存在独立编号的文件夹

如下图是某次Crash日志截图, signal 11( SIGSEGV)是在Linux信号中表示无效的内存引用,如下是存在问题的PC寄存器值及详情:

3

0x04关键代码

整个框架的实现其实比较简洁,关键代码都是使用python的subprocess模块实现子进程管理,获取从adb接口返回的管道信息。这里仅列出相关adb命令:

1.adb logat -c

在开始测试清除设备之前生成的logcat日志

2.adb logcat -v time *:F >logs/测试文件名+_stagefright+设备名

保存当前case运行过程中的log日志到指定文件夹

3.adb shell stagefright -s -a /data/Music/

adb shell stagefright -r /data/Movies/

调用stagefright的命令行工具对/data/Music文件夹的测试文件进行解码

-s参数是优先使用software软解码

-r参数是强制使用Hardware硬解码

-a参数表示解码的是audio音频文件

4.adb shell stagefright -p

列出当前的解码器配置

5.adb shell stagefright -l

列出当前的组件

6.adb push /batch/file1 /data/Music/

Push测试⽂件到设备指定目录

7.adb shell log -p F -t Stagefright -sp_stagefright ‘****”+当前任务序号+”- Filename:’”+

当前测试文件名

在测试设备的log日志中以指定格式插入一条log日志用于标识当前任务序号开始位置

8.adb pull /data/tombstones/tombstone_00+tombname

抓取发生异常的日志

0x05测试运用

1.在对ZIMPERIUM(Stagefright漏洞发现者所在公司)公布的POC视频进行测试后发现,所有测试视频都能被检测出存在问题。

4

2.使用框架的筛选功能

5

0x06二次开发

1.目标与用途:

打造高效智能的自动化Fuzzer工具,用于对Android系统自带组件,及种各种应用进行安全测试,以发掘潜在的安全漏洞。

2.案例:

对Android市场中的浏览器视频解码功能进行fuzzing测试发掘可能导致的crash,对Google ANDROID系统自带的短信应用进行fuzzing测试发掘可能导致远程拒绝服务的漏洞。