[论文笔记] FlowDroid: Precise Context, Flow, Field, Object-sensitive and Lifecycle-aware Taint Analysis for Android Apps

大名鼎鼎的 FlowDroid。而且作者之一 Steven Arzt 是个挺热心的哥们

Introduction

传统的 Java 静态分析工具面对 Android 应用有多个挑战:1. Android 的组件、生命周期和回调函数;2. 某些函数可能使用 XML 文件进行配置;3. 别名和虚调用(virtualInvoke)。过去的分析工具使用的欠近似或者过近似手段使得分析结果几乎不可用。

本文提出了:

  1. FlowDroid:上下文、字段和流敏感的静态分析工具,并且使用按需别名分析提高效率
  2. DroidBench:针对 Android 静态分析的基准测试

Background and example

image

sendMessage() 和 app 中的某个按钮的点击事件相绑定,静态分析应当能够识别这个回调函数以避免漏报。当 onRestart() 执行后,用户的密码会被写入 userpwd 字段,此时用户点击按钮会导致数据泄露。为了避免误报,分析必须对生命周期有清晰的建模,同时是字段敏感的。

Attacker model

FlowDroid 假设攻击者可能向 app 提供任意恶意的字节码。攻击者无法绕过 Android 平台的安全措施或利用侧信道。

Precise modeling of lifecycle

FlowDroid 生成一个虚拟的 Main 方法来模拟生命周期。

  1. FlowDroid 假设所有的 Android 组件可能以任意的顺序运行。FlowDroid 的静态分析基于 IFDS 框架,是天然路径不敏感的。
  2. Android 中回调可以通过调用 Android API 注册,也可以通过 XML 注册。FlowDroid 把所有的组件及其注册的回调关联起来,即回调会在组件的生命周期中执行分析。对于第一种注册方式,FlowDroid 首先为每个组件计算一个调用图,然后在调用图上发现新的回调,直到达到不动点为止。对于第二种注册方式,FlowDroid 分析每个 Activity,查看它注册了 XML 文件中的哪些标识符。

image

Precise flow-sensitive analysis

FlowDroid 使用 IFDS 处理污点分析。

image

Taint analysis

FlowDroid 使用访问路径(Access Path)处理字段敏感性,这意味着 AP 实际上是数据流分析的抽象域,污点会在 AP 上传播。具体的 flow function 要看 FlowDroid 的源代码实现。

On-demand alias analysis

image

taintIt() 的第一次调用使得 p.f 被污染了,这导致第二个 sink() 操作实际上是一个危险操作。FlowDroid 会对 x.f 启动一个反向查询,来查找 x.f 的所有别名,然后把 x.f 的所有别名标记为被污染的并重新启动正向污点分析(这可以通过往 worklist 里面添加一个新的 work 来实现)。

image

image

一个问题是,如果在反向分析中单纯的只查找 x.f 的所有别名而不考虑调用上下文会导致不精确性,因此 FlowDroid 把正向分析的上下文注入到反向分析中。在 Algorithm 1 的 16 行,把 \(\langle s_p, d_1 \rangle \rightarrow \langle n, d_3 \rangle\) 插入到反向分析的 worklist 中体现了这一点:\(langle s_p, d_1 \rangle\) 保存了这次函数调用上下文的状态。

image

另外的问题是,需要防止反向分析返回到未被正向分析分析的上下文,因此 FlowDroid 保证反向分析不会返回到调用位置。Algorithm 2 的 11 ~ 14 行:当反向分析到达一个方法的头部时,会启动一个新的正向分析并注入上下文,当正向分析运行到函数的最后一条 exit 语句时,会把污点带回返回值。

此外,反向分析可能引入流不敏感的结果。比如例子:

image

显然只有第二个 sink() 才是真正危险的。但是反向查询会在第 1 行查询到 p2 被定义,然后正向分析会认为所有位置的 p2.f 都是污染的,第一个 sink() 也是危险的。为了解决这个问题,在触发反向分析时把语句标记为激活语句,每当反向分析再次生成正向分析,并且正向分析在其激活语句上传播别名污点时,该污点才会被激活。

Implementation

实现依赖 Soot 和 Heros(IFDS 框架)

Lifecycle

soot/jimple/infoflow/entryPointCreators/BaseEntryPointCreator.java 下的 createDummyMain 方法

Taint analysis

soot/jimple/infoflow/AbstractInfoflow.java

Backward alias analysis

soot/jimple/infoflow/BackwardsInfoflow.java

posted @ 2025-11-30 19:27  sysss  阅读(2)  评论(0)    收藏  举报