首页
社区
课程
招聘
[原创]在Linux上使用AFL对Stagefright进行模糊测试
发表于: 2017-3-12 15:56 12537

[原创]在Linux上使用AFL对Stagefright进行模糊测试

2017-3-12 15:56
12537

模糊测试是一种自动向程序传递输入数据并监控其输出的自动化测试技术。通过这种技术,安全人员可以测试程序的可靠性以及识别潜在的安全漏洞。

我们(360成都安全响应中心)将对Stagefright Media Framework进行模糊测试。它是Android系统上用于解析多媒体文件的逻辑算法库,其中包含了大量的安全漏洞,攻击者通过构造特殊的多媒体文件导致拒绝服务或特权升级甚至远程执行代码。

我们将要使用的模糊测试工具为Michał Zalewski开发的一款最为流行的基于代码覆盖率的开源测试工具:AFL(American Fuzzy Lop)。 借助于其高效的策略,AFL已经在真实产品中发现了大量的漏洞。

在本文中,我们将指导你如何在Linux上使用AFL对stagefright进行模糊测试,从而更高效的复现已知漏洞或发掘新漏洞。 另外,本文不仅适用于stagefright,其中的一些经验同样适用于其它由C/C++编写的Android本地程序。

在本节中,我们将首先向你介绍本文接下来使用的环境要求以及软件版本。为了避免出现其他未遇见的错误,我们建议你和我们保持完全一致。

我们假设你已经完成了下载并且编译AOSP的工作。另外,如果你想要使用ASAN,我们建议你编译AOSP为x86版本。

官方AFL只支持在Linux上进行模糊测试,而stagefright是在Android多媒体框架下工作的,因此我们无法直接使用AFL对stagefright进行模糊测试。为了解决这个问题,我们提出了下面两种方案。

其中,我们已经实现了方案A–android-afl,并且公布了源代码,你可以从仓库得到更多信息。

方案A的主要流程图如下图所示。

方案B的主要流程图如下图所示。

显而易见,相比于方案A,方案B更加简洁,其效率也更好(通常来说,PC的性能远高于任何Android手机或者Android模拟器);另一方面,由于stagefright本身的复杂性,其实现也更加困难。

在后续的文章中,我们将一步一步向你介绍如何实现方案B。通过它,我们已经发现了两个漏洞。

显而易见,我们首先要让stagefright在Linux上正常工作。

stagefright需要通过ashmem驱动来共享内存,然而默认情况下Linux内核并不包含ashmem驱动。幸运的是,我们可以通过修改Linux内核配置,并重新编译安装新内核,从而激活ashmem驱动。

我们也许还有更好的解决方案,例如:使用shm代替ashmem或者完全去掉ashmem相关的代码;
注意,本文并未使用binder驱动,这里移植binder只是顺便而已。

使用以下命令下载内核源码。

转到你要保存内核源码的目录并提取压缩文件。

拷贝旧的.config文件到源码根目录并开始配置。

接着使用下面的命令来激活ashmem驱动。

转到Device Drivers->Android,选中Andoid DriversAndroid Binder IPC Driver

转到Device Drivers->Staging drivers->Android,选中Enable the Anonymous Shared Memory Subsystem

现在你可以开始编译安装内核了,执行下面的命令。

你还需要配置udev规则,从而使得任何用户均可访问binder和ashmem。

最后,重启你的电脑以启用新内核。

注意,变量ANDROID_BUILD_TOP为AOSP的根目录,ANDROID_PRODUCT_OUT为AOSP的输出目录。

在这一节,你需要对stagefright源码(包括libstagefright和 stagefright命令行工具)进行改动,原因主要为以下两点。

平台性:stagefright使用了binder驱动进行进程间通信,然而默认情况下Linux内核并不包含binder驱动(实际上,我们可以通过修改Linux内核配置,并重新编译安装新内核,从而激活binder驱动);

依赖性:stagefright命令行工具无法独立的对多媒体文件进行解析,它依赖于其他服务进程(如:servicemanager,mediaserver等)。

我们将不会阐述解决上诉两个问题的具体细节,你可以直接使用我们提供的适用于7.1.1_r25版本的补丁文件。如果你使用的版本和我们不同,你可能需要参照补丁文件,手动修改代码。

点击这里下载补丁文件stagefright.diff,转到$ANDROID_BUILD_TOP/aosp/master/frameworks/av目录并应用补丁。

编译好x86版本的AOSP后,转到stagefright源码目录,并编译。

编译结束后,你可以在$ANDROID_PRODUCT_OUT/system/bin目录找到stagefright可执行程序。

为了让系统能正确找到加载器以及依赖库的位置,你需要做以下软连接。

拷贝解码器配置文件到/etc目录。

另外,如果需要在后续使用ASAN,你还需要做以下软连接。

现在,你可以尝试在Linux上运行stagefright了。例如,解析一个MP4文件,运行结果如下。

很好,你已经完成了最为困难也最为重要的工作!

首先,你需要从官网下载最新的AFL源码并解压。

接着,对AFL源码进行修改以修复下面几个错误。

error: undefined reference to '__fprintf_chk'
error: undefined reference to 'shmat'
error: undefined reference 'afl-area_prev'

同样,我们直接给出适用于2.39b版本(此时的最新版本)的AFL的补丁文件。如果你使用的版本和我们不同,你可能需要参照补丁文件,手动修改代码。

这里下载补丁文件afl-2.39b.diff到你的电脑,转到AFL源码根目录并安装补丁。

使用以下命令编译安装AFL。

首先,进入你想要进行模糊测试的模块目录。

其次,在其Android.mk文件中添加以下代码。

注意,由于unsupported reloc这个错误,我们不推荐使用afl-gcc/afl-g++。另一方面,根据AFL官方的资料,afl-clang-fast/afl-clang-fast++也是更高效的。

接着,如果你想使用ASAN,你需要添加下面一行代码

或者

最后,重新编译stagefright。

对于复杂的模块来说,你需要重复上面步骤数次,以对多个感兴趣的模块进行插桩。例如,你也许想要对以下模块进行插桩。

恭喜你,所有准备工作都已经完成了,让我们开始模糊测试吧!

首先,你需要为AFL创建两个目录,一个为in,用于存放预先准备的输入样本;另一个为out,用于存放AFL模糊测试过程中生产的一些有用信息以及自动生成的会让程序挂起或者崩溃的样本。

其次,你需要以root用户修改/proc/sys/kernel/core_pattern,以修复Pipe at the beginning of ‘core_pattern’这个错误。

接着,你还需要设置CPU的工作模式为performance,以此来提高AFL的效率。

如果使用了ASAN,你可能需要执行以下命令。

最后,执行以下命令开始模糊测试。

如果一切顺利,你将看到类似的AFL的工作屏幕。

在这一节,我们将给你一些额外的建议,以帮助你更快的发现程序中的漏洞。

本文还有许多可以改进的地方,但是我们不会在stagefright花费过多的精力了。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 8
支持
分享
最新回复 (17)
雪    币: 148
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,支持
2017-3-12 19:23
0
雪    币: 506
活跃值: (185)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
666,支持一下
2017-3-13 11:05
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
好文
2017-3-13 11:09
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
棒棒棒
2017-3-13 11:37
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
6
github上的android-afl是楼主维护的吧?移植afl确实需要很多工作~那~~为啥不用libfuzzer呢~ =。=
2017-3-13 11:52
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
QEver github上的android-afl是楼主维护的吧?移植afl确实需要很多工作~那~~为啥不用libfuzzer呢~ =。=
哈哈,可能是情怀~
2017-3-13 11:58
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
ele7enxxh 哈哈,可能是情怀~
另外这里主要是移植stagefright
2017-3-13 11:59
0
雪    币: 1746
活跃值: (227)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
9
大神,对于fuzz php有啥好的方法没。
2017-3-14 17:30
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
hackyzh 大神,对于fuzz php有啥好的方法没。
没搞过
2017-3-15 08:58
0
雪    币: 1746
活跃值: (227)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
11
ele7enxxh 没搞过
好吧,那这些样本案例,可以直接从testcases里面拷到in文件夹里面直接用吗?
2017-3-15 09:10
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
hackyzh 好吧,那这些样本案例,可以直接从testcases里面拷到in文件夹里面直接用吗?
嗯,你要fuzz什么格式,你就自己找这些样本
2017-3-15 09:46
0
雪    币: 1746
活跃值: (227)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
13
好的,多谢
2017-3-15 09:52
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
14
方便直接分享编译好的bin吗
2017-3-16 12:28
0
雪    币: 3549
活跃值: (941)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
15
厉害厉害
2017-5-25 09:21
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
大牛,如果是测试其他软件比如sqlite,这个输入应该怎么给呢?
还有就是status  screen上的各个参数的含义看不懂,您有相关资料么?
2017-8-25 10:54
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
你好,请问有没有对安卓apk的模糊测试实例。想参考下,谢谢!
2019-10-18 11:10
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
18
牛逼
2021-9-22 17:42
0
游客
登录 | 注册 方可回帖
返回
//