3

前言

说到Android的污点分析框架,网上的搜索结果大多指向静态的FlowDroid与动态的TaintDroid。尽管由于加固、混淆等技术使得针对Android的静态分析越来越困难,但静态分析的无先验分析能力无法被动态分析取代,使得静态分析仍有发挥空间。后文将围绕FlowDroid做一些介绍。
值得注意的是,虽然FlowDroid还在被Secure Software Engineering Group维护更新,但其核心算法仍然是2014的版本。在各大会议上已经提出了数十种新的静态污点分析算法,相比FlowDroid在一些数据集或是DroidBench上有着更快的运行速度以及更优的精准度。但FlowDroid仍然是公共资源中可获取的静态污点分析工具的唯一选择,因为很多paper提供的源代码几乎没有注释与文档,导致使用极其困难;另外科研人员往往仅在有限的测试集上进行了运行,所以去使用这样的程序不可避免的会遇到Bug。相比之下,FlowDroid作为被持续维护的一款框架,其稳定性上具备了一定的保证,同时其底层的Soot框架强大的功能与较为完善的文档,使得FlowDroid上手难度相对较低。
尽管如此,FlowDroid的使用对新手而言仍然充满了困难。网络上FlowDroid的教程大多是一些cmd命令的说明,而我需要将其作为程序的一部分,甚至还需要对源代码进行一些修改,导致我不得不花费大量的时间去阅读源代码以知悉其中的一些细节以及一些未被文档直接提及的自定义接口。因此,我希望将阅读过程中看到的东西做记录与分享,以便有需要的人可以省去一些功夫。
本系列文章基本为个人见解,难免有错误与误解,如有客观错误欢迎提出。

简介

FlowDroid是一款使用Java实现的针对Android的静态污点分析框架,发表于PLDI'2014(论文链接),截止撰文时间在Google Scholar上显示已有1200+的引用,目前为Android静态污点分析的主流框架,代码开源并提供于GitHub(仓库链接)。
FlowDroid在数据流分析部分并无太大的创新,主要基于发表在POPL'1995上的IFDS算法(论文链接)实现,其主要贡献在于针对Android程序的LifeCycle、Callback等特点做了各种各样的处理,感兴趣的可以去阅读论文进行查阅。

基本使用

环境配置

首先自然是Java的配置,如果没有配置并且不会配置,请查找网上其他教程,本文不再赘述。
FlowDroid的配置方法有两种,可以直接下载相关jar包,也可以使用maven配置依赖。jar包可以去FlowDroid的GitHub上release页面进行下载,仅需soot-infoflow-android-classes.jar和soot-infoflow-classes.jar两个文件即可,另外去Soot的仓库下载包含了heros与jasmin的sootclasses-trunk-jar-with-dependencies.jar,将上述三个包加入项目依赖便完成了FlowDroid的配置。关于如何将jar包加入依赖,如有困惑请根据Java编程环境自行查询。

运行

整个FlowDroid最顶层的类便是soot.jimple.infoflow.android.SetupApplication,大部分的设置与运行都可以通过操作这个类的实例进行。SetupApplication既可以在调用runInfoflow()时传入配置参数,也可以在初始化SetupApplication时或初始化后传入配置参数。SetupApplication的初始化函数以及runInfoflow函数有多种不同参数类型的实现,可以查阅源码后根据情况选择,这里仅提供我自己使用的一种方式:

InfoflowAndroidConfiguration conf = new InfoflowAndroidConfiguration();
// androidDirPath是你的android sdk中platforms目录的路径
conf.getAnalysisFileConfig().setAndroidPlatformDir(androidDirPath);
// apkFilePath是你要分析的apk的文件路径
conf.getAnalysisFileConfig().setTargetAPKFile(apkFilePath);
// sourceSinkFilePath是source点与sink点的声明文件,后文会作说明
conf.getAnalysisFileConfig().setSourceSinkFile(sourceSinkFilePath);
// apk中的dex文件有对方法数量的限制导致实际app中往往是多dex,不作设置将仅分析classes.dex
conf.setMergeDexFiles(true);
// 设置AccessPath长度限制,默认为5,设置负数表示不作限制,AccessPath会在后文解释
conf.getAccessPathConfiguration().setAccessPathLength(-1);
// 设置Abstraction的path长度限制,设置负数表示不作限制,Abstraction会在后文解释
conf.getSolverConfiguration().setMaxAbstractionPathLength(-1);
SetupApplication setup = new SetupApplication(conf);
// 设置Callback的声明文件(不显式地设置好像FlowDroid会找不到)
setup.setCallbackFile("res/AndroidCallbacks.txt");
setup.runInfoflow();

关于Source、Sink

污点分析中的source点表示污点分析的起始点,而sink点表示污点分析的结束点。换言之,FlowDroid在“扫描”这个apk后,会从source点开始分析数据流,当数据流“流到”sink点时将其标注。FlowDroid中的source与sink均为类方法,在soot-infoflow-android下有提供一份SourcesAndSinks.txt的文件,是FlowDroid当时使用的一些可能涉及到访问隐私数据的api,从里面很容易看出声明文件的格式:
图片描述
每一行作为独立的声明,%开头的表示注释,可以根据应用需求自行添加删减Source与Sink的声明。

关于代码中的一些其他说明

Callback

因为Android中系统级的Callback并不会出现显式地进行回调方法的调用,所以如果需要分析Callback方法需要在声明文件中将其声明,同样在soot-infoflow-android下有提供一份AndroidCallbacks.txt文件,里面是一些常见的原生回调接口或类,如需添加参照格式即可。

AccessPath与Abstraction

AccessPath是数据流分析中一个专用术语,而Abstraction是FlowDroid用来表示污点分析在一个代码语句的结果的类。关于它们的具体说明会在后面的文章中展开,这里仅需一个宏观的了解,那两个设置的数值越小,分析可能越快但效果可能越差,反之同理。


losingle
35 声望7 粉丝