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 标记;
• 污染泄露规则:对于赋值语句或者方法调用语句,如果语句中包含方法调用表达式,方法满足泄露点方
法特征签名且相应参数是污染变量,则该变量被泄露;