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

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

         Android SDK 中存在一些特殊 API,如果向这些 API 传入一个污染变量作为参数,运算后的返回值同样是一个污
         染变量,例如方法 java.lang.Integer  toString(int).为了节省开销,我们对于污染封装方法无需深入内部分析,而是
         将其作为污染传播的捷径.当识别出污染封装方法传入污染变量作为参数时,直接将其返回值判定为污染变量.
             表 1 展示了定义的污染传播规则:
             •   污染源规则归纳了污染源的检测方式,生成类似〈SC,x.*〉的关系;
             •   污染变量传播规则归纳了污染变量之间传播的各种方式,包括赋值、计算、参数传递、函数返回等,
                生成类似〈x.*,y.*〉的污染传播关系;
             •   别名规则归纳了污染变量之间别名关系,生成类似〈x.*,y.*〉的污染传播关系;
             •   方法调用和方法返回规则描述了污染变量跨函数传播的情况,得到 Param,Return,ReturnP 等谓词.这些
                谓词可以出现在污染变量传播规则的右部,作为污染传播关系产生的依据;
             •   污染泄露规则总结了泄露点的检测方式,生成类似〈x.*,SK〉的关系;
             •   清除规则表示某污染变量被赋值为空值、非污染变量或者常量时,生成 Clean 谓词.
                                       Table 1    Definition of our taint rules
                                          表 1   污染传播规则的定义
                                规则类型                     规则定义
                               污染源规则        R1:〈SC,x.*〉:-S(x.*=f(⋅)),f∈Source
                                            R2:〈x.*,y.*〉:-S(y.*=x.*),¬hp(x.*),IN(x.*)
                                            R3:〈x.*,y.*〉:-S(y=f(⋅)),Return(f,x.*)
                                            R4:〈x.*,p i.*〉:-S(p i=f.param i),Param(f,i,x i.*)
                             污染变量传播规则
                                            R5:〈p i.+,x i.+〉:-S(f(x 0,…,x n)),hp(x i),ReturnP(f,i,p i.+)
                                            R6:〈p i.+,x i.+〉:-S(y=f(x 0,…,x n)),hp(x i),ReturnP(f,i,p i.+)
                                            R7:〈x.*,y〉:-S(y.*=f(x.*)),f∈TW,IN(x.*)
                                            R8:〈x.*,y.*〉:-S(y.*=x.*),hp(x.*),IN(x.*)
                                别名规则
                                            R9:〈x.*,y.*〉:-S(x.*=y.*),hp(x.*),IN(x.*)
                                            R10:Param(f,i,x i.*):-S(f(x 0.*,…,x n.*)),IN(x i.*)
                              方法调用规则
                                            R11:Param(f,i,x i.*):-S(y=f(x 0.*,…,x n.*)),IN(x i.*)
                                            R12:Return(f,x.*):-S(return x),IN(x.*)
                              方法返回规则
                                            R13:ReturnP(f,i,p i.+):-S(p i=f.param i),hp(p i),IN(p i.+)
                                            R14:〈y.*,SK〉:-S(f(…,y.*,…)),IN(y.*),f∈Sink
                              污染泄露规则
                                            R15:〈y.*,SK〉:-S(x=f(…,y.*,…)),IN(y.*),f∈Sink
                                            R16:Clean(x.*):-S(x.*=y.*),IN(x.*),¬IN(y.*)
                                清除规则
                                            R17:Clean(x.*):-S(x.*=null),IN(x.*)

             另外存在一些未被定义的特殊规则针对一些特殊情况下的污染传播方式而定义,生成相应的特殊谓词或
         者污染传播关系.例如:为了方便分析,我们在特殊规则中定义了涉及数组类型变量的污染方式,当出现数组中
         一个元素被污染时,认定该数组的所有元素都被污染.这样的规则可能会造成一些误报(false positive),但是可以
         减少分析成本.以规则:〈x.*,y.*〉:-S(y.*=x.*),¬hp(x.*),IN(x.*).为例,当存在一个赋值语句 y.*=x.*,且 x.*是污染变量
         且不是堆变量时,则存在序偶关系〈x.*,y.*〉表示 x.*到 y.*有污染传播关系.x.*和 y.*是变量的访问路径,我们使用
                                             [6]
         变量的访问路径(access path)来明确污染变量 .访问路径的格式如 x.m.n,其中,x 表示局部变量名、函数参数或
         者类名,m 和 n 表示域名.访问路径的长度根据变量具体情况可变,因此,我们在规则中使用 x.*或 x.+的形式表
         示.*表示零个及以上的域,+表示大于零个域.当为零个域时,访问路径表示一个简单的局部变量或参数.
         2.4   TVG构建方法

             为了构建 TVG,我们根据污染传播规则分析程序中每条语句,从而判定是否产生新的污染变量或谓词.首先
         将程序的语句按照方法和类的归属关系抽象成一个树形结构,每个方法中的语句按默认顺序组成树的叶子节
         点并成为该方法的子节点,各个类则将所属的成员方法作为子节点并将应用的根节点作为父节点,从而得到一
         个树形结构.为了提升效率,TVG 构建算法被设计得尽可能简单.构建算法的过程如下:启动迭代检测污染变量,
         即逐一分析树形结构的所有叶子节点(语句),当语句满足任何规则的右部条件时,如果生成新的序偶关系,则构
         成新的污染变量和 TVG 边;如果生成新的谓词,则进行记录.另外,已加入 TVG 的污染变量节点不会重复添加,
   127   128   129   130   131   132   133   134   135   136   137