资讯专栏INFORMATION COLUMN

浅入浅出FlowDroid(一): 简介&基本使用

wqj97 / 2540人阅读

摘要:后文将围绕做一些介绍。尽管如此,的使用对新手而言仍然充满了困难。本系列文章基本为个人见解,难免有错误与误解,如有客观错误欢迎提出。

前言

说到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用来表示污点分析在一个代码语句的结果的类。关于它们的具体说明会在后面的文章中展开,这里仅需一个宏观的了解,那两个设置的数值越小,分析可能越快但效果可能越差,反之同理。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75836.html

相关文章

  • SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程

    摘要:函数式编程,一看这个词,简直就是学院派的典范。所以这期周刊,我们就重点引入的函数式编程,浅入浅出,一窥函数式编程的思想,可能让你对编程语言的理解更加融会贯通一些。但从根本上来说,函数式编程就是关于如使用通用的可复用函数进行组合编程。 showImg(https://segmentfault.com/img/bVGQuc); 函数式编程(Functional Programming),一...

    csRyan 评论0 收藏0
  • vuex浅入浅出

    摘要:来自不同视图的行为需要变更同一状态。图解后端的行为,响应在上的用户输入导致的状态变化。中的非常类似于事件每个都有一个字符串的事件类型和一个回调函数。 什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 Vuex采用和Redux类似的单向数据流的方式来管理数据。用户...

    琛h。 评论0 收藏0
  • 端到端测试神器 cypress 浅入浅出

    摘要:我之前写过关于的文章,,最近在工作中用到比较多了,顿时觉得确实是比较优秀的一个。 我之前写过关于cypress的文章,https://segmentfault.com/a/11...,最近在工作中用到cypress比较多了,顿时觉得cypress确实是比较优秀的一个。 1. 软件安装. 2. 安装cypress 安装cypress客户端:http://download.cypress...

    CarlBenjamin 评论0 收藏0
  • [译]浅入浅出Monads

    摘要:接受另一个函数作为参数,然后用接受的这个新函数处理,将结果再次传给,最后将实例化的新对象返回。空值检查就是个不错的例子这个实现里,只在为合法值非空时,传入。但不论怎么变化,她们也都和一样遵守上面提到的规则。 大多数关于monad的教程都和老太太的裹脚布一样,又臭、又长,说不清、道不明。当然我也不伟大,没法保证我写的一定更明了,更生动,甚至更屌?不过我至少可以确定,我这篇更简洁。浪费不了...

    philadelphia 评论0 收藏0
  • Web Session 浅入浅出

    摘要:通过浏览器的,可以看到此次会话的请求内容和响应内容。是协议的一部分。真实的产品,一般是创建一个保证唯一的,不易猜测出来的字符串。因此需要数据持久化的多提供者的方案。 使用过几种Web App开发语言和框架,都会接触到Session的概念。即使是一个简单站点访问计数的功能,也常常使用Session来实现的。其他常用的领域还有购物车,登录用户等。但是,对Session一直是一知半解,知其然...

    李昌杰 评论0 收藏0

发表评论

0条评论

wqj97

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<