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

1704                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

             (3)  污点源和泄露点的识别
             Android 应用中存在许多污点源和泄露点的方法,污点分析需要准确识别出程序中的污点源和泄露点.常见
         的污点源可通过调用 Android SDK 中相关 API 获取隐私数据,有些隐私数据可通过 Android 组件内容提供器
         (content provider)获取,例如通讯录数据,但最终访问数据时仍需调用相应的 API.研究初期的检测方法主要从
         Android 的 SDK 中手工筛选出与污点源和泄露点相关的 API,但这种方式收集的 API 并不完整.Rasthofer 等人                    [20]
         针对这个问题提出了一个较全面的方案,基于对污点源和泄露点的规范定义开发了工具 SUSI,利用机器学习的
         方法找出 Android 所有 API 中存在的符合定义的大量污点源和泄露点并进行归类.
             (4)  污染传播规则的定义
             污点分析需要根据污染变量传播的特征归纳出污染传播规则,并依据规则设计相应算法追踪污染变量.一
         般来说,污染传播规则包括污点源和泄露点的识别规则、污染变量的数据流规则和别名规则等.例如:FlowDroid
         工具  [21] 定义了基于污染传播规则的流方程,并为别名分析专门设计了独立的流方程.在 IFDS 框架下,流方程实
                                                        [5]
         际上实现了分析语句时所采用的规则.同样,Apposcopy 工具 的静态污点分析模块专门定义了污点源、泄露点
         和污染传播的谓词和规则,并基于此规则进行污点分析.如果从污染变量的传播关系上看,隐私数据在污染变量
         之间的常见传播方式可包括赋值、参数传递、计算、别名等.需要注意的是:别名分析是污点分析中需要解决
         的重要问题,当某变量被污染后(即被传入隐私数据),它的别名变量同样会被污染,因为在 Java 中,堆变量的所有
         别名都指向同一块内存.另外,工具的实现需要考虑 Android 或 Java 平台的一些特殊污染方式,并单独设计对应
         的污染传播规则,比如应用中存在涉及线程、隐式污染流、native 代码、组件间通信、反射机制等特殊的传播
         方式,这些方式无法归纳到通常的规则当中,需要根据具体特征来定义规则.总之,为了识别不同污染传播方式
         所产生的污染变量,污点分析应尽可能全面地定义污染传播规则以提高分析精度.
             (5)  敏感性的支持
             静态分析方法,对不同敏感性的支持直接影响分析的精度和速度,例如流敏感、对象敏感、域敏感、上下
         文敏感、路径敏感等敏感性           [10] .具体来说,支持流敏感需要在分析中考虑各语句的执行顺序,一般要求工具获得
         准确的控制流图.支持对象敏感的方法能够准确识别某个对象,在分析该对象的域或者方法时,不会与相同类的
         其他对象混淆,即工具需要区分同一类的不同对象.支持域敏感的方法在分析中能够区分对象中的每个域,工具
         需记录域的信息.支持上下文敏感需要分析函数在不同位置调用所产生的影响,工具需记录函数调用点相关信
         息.支持路径敏感需要分析程序各执行路径不同所导致的不同结果,工具需考虑程序分支等细节.静态分析方法
         对敏感性的支持在设计和实现中的精度和复杂性差异很大,一般来说,敏感性支持得越多,分析精度越高,但随
         之,工具实现越复杂、分析成本越大、速度越慢.精度与速度之间往往存在矛盾,需要在二者间进行平衡                                    [13] .

         2    基于污染变量关系图的污点分析方法

         2.1   研究动机
             目前,精确的静态污点分析方法大多基于数据流分析框架,在控制流图上对隐私数据进行追踪和分析,另外
                                               [8]
         单独对污染变量进行别名分析.例如:Amandroid 提前对所有变量进行大规模的别名分析之后,再进行污点分
                      [6]
         析;而 FlowDroid 则是在发现污染变量是堆变量后,才按需进行反向的别名搜索.虽然 FlowDroid 仅针对污染变
         量进行别名分析,开销相对 Amandroid 小一些,但在实验中我们发现:FlowDroid 在分析大规模复杂的应用时,一
         个应用花费的时间常常达到几分钟至几十分钟,甚至出现超时或运行失败的情况.所以我们认为,目前的方法在
         运行效率上仍存在提升空间:一方面,当程序中污染变量的别名较多时,独立运行的别名分析将不可避免地产生
         很大的开销;另一方面,传统的数据流分析框架不是专门为污点分析定制的,框架本身的运行开销很大.
             为了提高工具效率,我们提出一种新的污点分析方法,该方法摒弃了传统数据流分析框架,采用一种轻量级
         的算法构建出污染变量关系图,将别名分析和污点分析同步进行,也就是在追踪污染变量的同时识别污染变量
         的别名.方法的大致步骤如下:首先,从一个应用的程序中抽象出一个树形结构,扫描所有树形结构的叶子节点
         (即语句),基于污染传播规则检测所有可能的污染变量及其别名变量;然后,根据变量关系生成污染变量关系图,
   125   126   127   128   129   130   131   132   133   134   135