Page 94 - 《软件学报》2020年第11期
P. 94
3410 Journal of Software 软件学报 Vol.31, No.11, November 2020
2.2 程序切片
本文以函数为单位进行过程内分析(intra-procedural analysis),从而检测程序中存在的漏洞.在对函数作为
输入之前,需要对其进行预处理,裁剪掉与敏感操作无关的语句.对函数语句进行裁剪的原因有两点.
• 第一,敏感操作是漏洞存在的必要条件,例如缓冲区错误漏洞的必要条件是存在对内存进行分配的操
作,因此对于该类漏洞,内存分配语句就是其存在的必要条件;反之,与敏感语句不具有依赖关系的语句
很大程度上是与漏洞无关的,这些语句会在代码属性图中引入冗余的节点,使真正有价值的特征信息
变得稀疏,进而导致模型难以训练.
• 第二,神经网络模型要求输入的张量具有固定的形状,而真实环境下函数的代码行数是不可控的.如果
函数的代码行数过多,那么在调整特征张量形状时会导致大量有价值的信息丢失,因此需要在特征张
量编码之前对节点集进行裁剪,裁减掉与敏感操作不具有依赖关系的节点,可以很大程度上避免有价
值的信息的丢失.
具体地,裁剪与敏感操作无关的语句的实现方式如下.
(1) 查找敏感语句
通过正则匹配等词法分析技术查找函数中的敏感操作语句,其在代码属性图中体现为控制流图节点.将该
节点进行记录,并作为后续对程序进行切片的切片准则(slicing criterion).此外,由于敏感操作与漏洞具有密切关
联,本方法会输出敏感操作所在的位置,辅助开发人员进行漏洞定位.
(2) 对函数代码进行静态切片
静态切片以程序的静态信息为依据,通过语句之间的数据和控制依赖对代码进行裁剪,从而保留与特定语
句具有依赖关系的代码,并剔除无关代码.目前,程序静态切片方法可分为两类 [41] :一类是基于数据流方程的程
序切片技术,另一类是基于图可达性分析的程序切片技术.本文所使用的是基于程序依赖图进行图可达性分析
的程序切片技术 [42] ,其在程序依赖图上使用图可达性算法,计算可能影响切片准则处语句的语句和谓词,进而获
得程序切片.由于代码属性图是抽象语法树、控制流图和程序依赖图组成的联合数据结构,因此本文根据代码
属性图中的程序依赖图进行切片,在上一步获得与敏感操作语句对应的节点后,根据程序依赖图中的控制依赖
边和数据依赖边,找到与该敏感语句节点具有依赖关系的节点集,并删除该节点集之外的节点,将剩余节点所构
成的生成子图作为切片后的代码属性图.经过切片之后,图 1 虚线框中的冗余语句在图 3 中所对应的节点被剔
除,进而降低无关语句对特征建模的负面影响.
2.3 特征张量编码
深度学习中的神经网络模型要求输入为固定形状的张量形式数据,因此需要实现一种对代码进行表示及
编码的算法作为程序抽象图结构和神经网络之间的桥梁.为此,本文提出了代码属性图的特征张量的概念,并实
现了一种基于代码属性图的特征张量编码技术,极大地保留了代码属性图中的语义信息.
2.3.1 特征张量设计
本文根据设计好的编码规则对函数的切片并简化后的代码属性图进行编码,生成三阶特征张量,以便输入
到神经网络中进行处理.该张量与图的邻接矩阵类似,行和列均代表节点,但不同点在于其衍生出第三维,即使
用一个固定长度的向量描述节点之间的关系,而不是邻接矩阵中使用 0 或 1 描述是否临接.在输出的张量中,前
两维对应简化的代码属性图中的节点,第三维为描述节点之间关系的 144 维向量,其为对节点关系的编码.其中,
代码属性图的特征张量的定义如下:
定义 1(特征张量). 设 G=(V,E,λ,μ)为一个代码属性图,它包含 n 个节点 V={v 1 ,v 2 ,…,v n },则定义三阶张量
T(G)=(t ijk )称为 G 的特征张量,其中,T(G)∈R n×n×144 ,且满足:
v
⎧ ⎪ 1, v 和 的关系具有 k所描述的特征
j
i
t = ⎨ (1)
ijk
v
⎪ ⎩ 0, v 和 的关系不具有 k所描述的特征
j
i
为了更加便于描述 144 维向量中所描述的特征,将 144 维向量称为关系特征向量,并给出如下定义.