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

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

         算法将启动下一次迭代,直到 TVG 不再更新或不产生新的标记时,算法终止.
             我们设计了一些重要的类用于构建 TVG,包括 TVG 类、TaintedValue 类和 Context 类.如图 6 所示:
         TaintedValue 类描述一个具体的污染变量,其成员分别表示名称、类型、所属类、所属方法、变量种类(静态变
         量、动态变量或者成员变量等)、上下文信息、污染传播方式、清除标记及位置等,TaintedValue 类的名称为变
         量的访问路径;Context 类记录了污染变量产生语句的上下文信息,包含 SootClass 对象、SootMethod 对象以及
         用于唯一标识语句位置的 StmtTag 类型的成员;TVG 类用于存储一个 TVG,该类包含了唯一的 ID 值、一个有向
         图 graph 和一个 TaintedValue 对象的集合.有向图 graph 是以 TaintedValue 对象为顶点,以污染传播关系为边的
         有向图结构,是 TVG 图形的具体实现.












                                        Fig.6    Class diagram of the TVG
                                             图 6  TVG 的类图

             下面介绍构建 TVG 时分析语句的一些基本操作:1)  发现污染源时,创建新的 TVG 并进行初始化,生成一个
         特殊的 TaintedValue 对象 Source 加入到 TVG 中;2)  当判定某变量为污染变量时,生成一个新的 TaintedValue 对
         象,将其加入所属的 TVG 中,并添加连接该对象与产生它的已知污染变量的有向边;3)  发现污染变量被泄露时,
         生成一个特殊的 TaintedValue 对象 Sink,并添加连接该污染变量和 Sink 的有向边;4)  当标记某方法时,生成方法
         的标记对象(包括 Param,Retrun,ReturnP 这 3 种类型的标记),标记对象包含方法调用点、污染变量和参数或者
         返回值等信息;5)  当污染变量被清除时,生成清除污染变量的标记,标记对象为 stmtTag 类型描述的语句位置,添
         加标记对象到该污染变量的 TaintedValue 对象中的 cleanStmts 成员中.下面具体说明不同污染传播规则下基于
         基本操作执行的详细操作.
             •   污染源规则:对于赋值语句,如果其右值是方法调用表达式且方法满足污点源方法特征签名,则发现污
                染源并判定左值为污染变量;
             •   污染变量传播规则:
                 ¾   对于赋值语句,当出现以下情况时,判定左值为污染变量:1)  右值是污染变量且不是堆变量;
                     2)  右值是带 Return 标记的方法调用表达式;3)  右值是满足污染封装方法特征签名的方法调用
                     表达式且参数是污染变量;
                 ¾   对于声明语句,当声明的变量是带 Param 标记方法的相应形参时,该变量被判定是污染变量;
                 ¾   对于赋值语句或者方法调用语句,如果语句中包含方法调用表达式且方法带 ReturnP 标记,则相
                     应实参被判定为污染变量;
             •   别名规则:对于赋值语句,当左值是堆变量且左值是污染变量时,则右值被判定为污染变量;当右值是堆
                变量且右值是污染变量时,则左值被判定为污染变量;
             •   方法调用规则:对于赋值语句或方法调用语句,如果语句中包含方法调用表达式且方法的实参为污染
                变量时,生成该方法的 Param 标记;
             •   方法返回规则:对于返回语句,如果返回值是污染变量,生成该方法的 Return 标记;对于声明语句,如果
                该方法声明的形参为污染变量且是堆变量时,生成该方法的 ReturnP 标记;
             •   污染泄露规则:对于赋值语句或者方法调用语句,如果语句中包含方法调用表达式,方法满足泄露点方
                法特征签名且相应参数是污染变量,则该变量被泄露;
   131   132   133   134   135   136   137   138   139   140   141