隐私泄露检测
利用静态污点分析技术辅助进行自动化隐私泄露分析
实验目标
- 熟悉和理解通过逆向工程技术进行污点源、污点汇的识别;
- 了解移动应用的隐私泄露流程,利用静态污点分析技术辅助进行自动化分析;
- 深入认识开源安卓应用静态分析工具 FlowDroid,具有初步的定制化 FlowDroid 能力。
前置准备
1. 理论知识学习
进行本 Lab 前请先完成教材第5章和第9章的学习,主要包括 5.1.1 节熟悉 Jadx 逆向工具使用,9.2 节污点分析技术的相关概念和隐私泄露检测的基本方法。此外,请参考附件1学习静态程序分析引擎 Soot 的框架和基础数据结构。
2. Soot
Soot 是一款 Java 和 Dalvik 字节码应用程序分析框架,提供了将应用转换为中间表示的反编译器以及一系列开箱即用的程序分析工具,例如指针分析、调用图构建等。Soot 向用户提供了一系列数据结构用于分析应用中的类、属性、方法、基本块等基本结构,例如 SootClass、SootField、SootMethod 等。有关 Soot 的更多细节,请读者参考附件1深入了解。
3. FlowDroid
FlowDroid 是一款开源安卓应用静态污点分析工具,基于静态程序分析框架 Soot 增加了针对分析 Android 应用的分析功能以实现更加精确的污点分析。具体而言,FlowDroid 精确建模了安卓应用生命周期、事件回调等特性,以此构建一个虚拟的应用入口方法用于程序分析。在此基础上,FlowDroid 开发了调用图构建、污点分析等重要功能。在本次实验中将会使用 FlowDroid 完成对示例应用的入口方法创建、调用图构建和污点分析。
4. 实验环境
- Jadx 逆向工程工具
- Java 开发环境:安装 IDEA Community 并且使用 Java 18 SDK 完成实验
- 定制化 FlowDroid:本次实验中提供了一个经过修改的 Flowdroid jar 包,请通过 gradle 工具导入这一软件包后完成实验
任务描述
本实验提供了一个目标 apk 文件,其中包括不同类型的三条隐私泄露数据流。在实验过程中,需要逆向分析并基于 FlowDroid 自动化检测隐私数据流。
具体而言,本实验分为三个任务:
- 基于教材第九章对隐私泄露的介绍,使用 Jadx 通过逆向工程分析应用中的隐私泄露数据流
- 熟悉安卓应用静态污点分析框架 FlowDroid,利用 FlowDroid 实现对安卓应用的调用图构建并进行遍历
- 补全定制化 FlowDroid 污点源、汇识别功能以完成污点分析
本实验在附件4中提供了待补全的示例代码框架 lab9_demo.zip,读者需要补全示例代码框架完成本次实验的第2、3项任务
任务1 使用Burp Suite进行流量分析
1. 任务说明
本次实验提供的目标应用存在 3 条隐私泄露数据流。在附件4中提供了污点源、汇配置文件(MySourcesAndSinks.txt)用于污点分析,读者需要通过逆向工程提取隐私泄露数据流的污点源、汇并写入配置文件。泄露数据流提示信息如下:
- 数据流1:用户通过文本输入的密码经由 SMS 短信发送泄露
- 数据流2:用户设备识别码 IMEI 过组件间通信被泄露到日志记录中
- 数据流3:用户地理位置通过 LocationListener 的回调函数被泄露到日志记录
2. 逆向分析任务
使用此前学习到的逆向工程技术提取污点源、污点汇、隐私泄露数据流。需要注意的是,对于基于组件间通信的隐私泄露数据流,需要以获取 Intent 以及启动组件间通信的关键 API 作为污点源、汇分析,才能正确分析到隐私泄露。请在实验报告中按照此样例结构组织:
任务2 实现Burp Suite扩展
1. 任务说明
本任务的目的是熟悉安卓应用调用图结构以及学习相关 SootMethod 接口。本任务的目标是构建并遍历目标应用的调用图。目标应用由 3 个活动(Activity)、1 个广播接收器(Broadcast Listener)和 3 个数据类构成。请读者参考附件2中的文档实现本任务
2. 编码任务
编写 FlowDroid 分析程序完成附件3提供的示例应用 evilApp.apk 的分析,实现以下功能:
- 利用 FlowDroid 的接口 构建目标应用的调用图
- 基于 Soot 的接口和 CallGraph 对象,补全 Runner.java 中的 traverseCFG 方法实现 广度优先遍历 全部方法调用(SootMethod 类)。下图所示是 MainActivity 组件的部分调用图
MainActivity组件的部分调用图
任务3 FlowDroid 污点源汇补全与隐私泄露分析
1. 任务说明
本次实验中所提供的 FlowDroid 缺失了污点源、汇的识别功能,因此本任务的核心即 补全 FlowDroid 中污点源、汇识别模块,这一任务的目的是通过参与污点分析的部分实现加深对污点分析技术进行隐私泄露检测的理解。这一任务包括 3 步:
- 请根据任务1逆向所得到的三条隐私数据流的污点源、汇正确完善污点源、汇配置文件(MySourcesAndSinks.txt)。请各位读者学习附件2了解污点源、汇的格式后进行实验
- 请读者补全 MySourceSinkProvider 实现污点源、汇的加载和解析。代码框架中提供了一个待补全的模板类代码(MySourceSinkProvider.java)用于实现 FlowDroid 对污点源、汇的实现和加载
- 由于 FlowDroid 自身分析能力的限制,将会导致过污染现象,在本次实验中请在实验报告中进行对应的验证和分析
2. 编码任务
补全代码使 MySourceSinkProvider 类能够根据提供的配置文件正确地加载和识别污点源和污点汇,分别完成以下三部分
- 参考附件2中污点源、汇格式补全配置文件 lab7/res/MySourcesAndSinks.txt
- 请补全 MySourceSinkProvider 类的 parseMethod 和 parseField 方法实现对污点源、汇的加载和解析
- 对污点分析结果进行验证和分析,并在实验报告给出你的分析结果
结果提交形式
- lab8_code.zip:本次实验中的实验代码,包括实现任务2和任务3的功能代码
- lab8_result.zip:本次实验中的实验结果,包括任务2和任务3的输出结果
- lab8.docx:本次实验的实验报告,包括实验环境配置、实验步骤、实验结果和实验心得等内容
评分标准
1. 完成任务1(15%)
每个隐私数据流5%评分
2. 完成任务2(25%)
- 正确构建示例应用 evilApp.apk 的调用图(10%)
- 广度优先遍历 Apk 中的全部方法调用,遍历结果与参考答案一致(15%)
3. 完成任务3(30%)
- 从配置文件中正确读取污点源、汇信息(5%)
- 正确补全 parseMethod 和 parseField 函数,需要正确识别并加载所有的 隐私泄露数据流(20%)
- 对示例应用敏感数据流进行人工验证和误报分析(5%)
4. 实验报告(30%)
内容完整性和原创性(20%)
- 报告包含实验目的、详细步骤、结果、总结思考等关键部分
- 代码设计遵循代码规范,有必要的解释说明
报告撰写和表达(10%)
- 报告格式规范,语言表达清晰
- 能够适当使用图表等辅助说明报告内容
实验资源
Lab8 实验资源包
包含本次实验所需的全部资源文件
资源包内容
soot_survivors_guide.pdf
Soot 框架的介绍文档
FlowdroidTips.zip
基于代码使用 Flowdroid 的参考文档
resource.zip
本次实验中使用到的资源、示例输出和示例代码