Page 135 - 《软件学报》2021年第6期
P. 135

张捷  等:基于污染变量关系图的 Android 应用污点分析工具                                                1709


         了大约 600 个污染封装 API 形成列表文件,每个 API 同样以所属类、方法名、参数值、返回值这 4 项信息进行
         描述.配置文件读取模块将这两个 API 列表文件读入程序中,解析 API 的描述信息并生成唯一的方法特征签名.
         3.3   App解析及建模模块
             该模块主要利用 FlowDroid 的 app 解析和建模相关模块对输入的 APK 文件进行解析和反编译,生成 Jimple
         中间表示    [17] ,并进行 Android 应用系统环境的模拟.同时,我们需要运行 IC3 工具分析应用中的组件间通信信息,
         生成 ICC-model 文件作为模块的另一个输入.整个模块运行步骤如下:首先,使用 Dexpler                   [26] 插件将 app 中的 dex
         文件转换为 Jimple 码;然后,调用 FlowDroid 的 constructCallgraph 接口为每一个组件生成 dummyMain 虚拟主函
         数;接着,根据 ICC-model 文件的组件间通信信息,运行集成的 IccTA 模块生成分析组件间通信的辅助对象和函
         数,用于模拟组件间显式和隐式通信的函数调用关系.至此,我们就可以根据以上信息生成完整的函数调用图
         (call graph)及过程间控制流图(inter-procedural control-flow graph,简称 ICFG).
             在对 app 解析后,工具通过 Soot 提供的接口在 Jimple 中间表示上获取程序分析所需的各类信息.Jimple 语
         言作为 Soot 最主要的中间表示,是一种基于语句的类型化和三地址的中间表示                         [17] ,相比 Java 字节码的 200 多种
         语句,Jimple 仅定义了 15 种核心语句,使得分析更加简便,包括赋值语句 AssignStmt、声明语句 IdentityStmt、方
         法调用语句 InvokeStmt 等等.Jimple 的每条语句最多涉及 3 个变量或常量,所以 Java 源码中的一条语句可能对
         应多条 Jimple 语句.Soot 作为一个成熟的 Java 分析框架,为程序静态分析提供了多种数据结构和接口.常见的类
         包括 Scene,SootClass,SootMethod,SootField,Stmt,Value 等:通过 Scene 可获取整个程序的基本信息;SootClass 包
         含类的基本信息,从中可以获得类的域和方法,分别用 SootField,SootMethod 封装;SootMethod 描述类的方法,并
         可获取方法中 Jimple 语句集合,每条 Jimple 语句由 Stmt 描述,Stmt 是语句类型的父类,根据类型的不同可分成
         多种子类;而 Stmt 语句操作的常量、变量等信息封装在 Value 中.如图 5 所示:FastDroid 工具基于 Soot 提供的
         数据结构,将整个应用抽象为一个树型结构.树的叶子节点为 Stmt 类型的对象用于表示语句,其父节点为
         SootMethod 类型的对象用于表示成员方法.方法的父节点为 SootClass 类型的对象表示类,类的父节点为整个应
         用.在分析各语句时,我们可以通过向上追溯父节点来获取分析需要的方法、类及应用的相关信息.

                                                    Scene


                                 SootClass        SootClass         SootClass

                       SootMethod   SootMethod         SootMethod       SootMethod

                     Stmt  …  Stmt  Stmt   …  Stmt     Stmt  …  Stmt    Stmt  …  Stmt
                                         Fig.5    Tree structure of the app
                                            图 5   应用的树形结构
         3.4   TVG构建模块

             TVG 构建模块主要功能是根据污染传播规则分析所有语句,当发现符合规则的语句时生成污染变量或谓
         词,最后构建出 TVG.为了提高分析速度,FastDroid 遍历树形结构中的叶子节点(语句),在此过程中不依赖于函数
         调用图和控制流图,不考虑语句的执行顺序,仅根据污染传播规则对语句及包含的变量进行轻量级分析,分析时
         没有类似数据流框架中的复杂控制和流方程的运算.当语句满足规则并发现新的污染变量时,工具生成新的顶
         点和边,并将其加入到 TVG 中,TVG 在各语句的分析过程中不断扩充.当语句满足规则并发现新的谓词时,算法
         根据谓词情况生成相应的方法或者变量的标记.如前所述,一个应用可能包含多个污点源,并生成多个 TVG,在
         构建时,每个 TVG 中涉及的污染变量和谓词等数据都是独立的,而分析一条语句时会考虑每一个 TVG 的更新
         和扩展,所以多个 TVG 的构建实际上是同步进行的,这区别于 FlowDroid 使用多线程来追踪不同污染流.另外,
         构建 TVG 可能需要经过多次迭代才能完整.在实现中,当本轮迭代得到新的污染变量加入 TVG 或新的标记时,
   130   131   132   133   134   135   136   137   138   139   140