Page 93 - 《软件学报》2020年第11期
P. 93
段旭 等:基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法 3409
示,从而为后续的节点分类、图分类等任务提供支持.Ryu 等人 [35] 利用 GAT 模型学习节点的向量表示,并在模型
的末端添加全连接层,实现对特征的整合,进而得到图的向量表示,并基于该向量表示实现对分子性质的预测,
为材料分子工程和药物发现提供帮助.
2 基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法
为了解决现有的静态漏洞挖掘方法无法有效地对代码特征进行建模,并且在挖掘漏洞特征不明显的漏洞
时准确率普遍下降的问题,研究并实现了一种基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法.如图 2 所
示为本方法的整体框架示意图,本方法通过以下 4 个步骤对目标程序源代码进行漏洞挖掘.
Fig.2 General framework of vulnerability mining method based on code property graph and attention BiLSTM
图 2 基于代码属性图及注意力双向 LSTM 的漏洞挖掘方法整体框架
2.1 代码属性图生成
程序源代码的语义信息在代码特征表示中尤为重要,直接决定了模型进行特征学习的难易程度.在程序分
析任务中,代码的抽象图结构是对程序语义信息进行表示的一种有效方法,其将顺序的代码文本按照语义结构
转换为图,从而直观地表示代码中不同元素之间的语义关系.代码属性图 [24] 是一种综合了抽象语法树、控制流
图和程序依赖图的联合数据结构,其包含了代码的控制依赖、数据依赖以及语法结构等语义信息,是目前语义
信息最为全面的抽象图结构之一,可以有效地表征多种类型的漏洞.本文利用代码属性图中的抽象语法树和控
制流图构成的子结构对程序的语义进行表示,利用程序依赖图对程序进行切片.其中,使用抽象语法树和控制流
图构成的子结构对程序进行表示的原因在于,在切片后程序依赖图信息已经被包含在切片后的代码属性图中,
并且在后续的编码步骤中,程序依赖图中的依赖关系可以通过在编码时对前两者的组合间接表示.因此,本文使
用该子结构对程序进行表示.为了更好理解,本文对图 1(b)中的代码生成代码属性图,并提取出抽象语法树和控
制流图构成的子结构,其结果如图 3 所示,将其称为简化后的代码属性图.
Fig.3 Simplified code property graph
图 3 简化后的代码属性图
本文利用开源的静态分析工具 Joern [40] 对 C/C++源代码进行分析,并生成代码属性图,将其存储在 Neo4J 图
数据库中,以便后续通过图中包含的信息进行查询,从而编码成为张量形式的数据.需要注意的是,Joern 使用模
糊解析器对代码进行解析,即使无法提供有效地构建环境,或者源代码无法通过编译,也能够使用 Joern 进行解
析,其大大地降低了待测试代码的门槛.相对地,其无法进行过程间分析,也无法对函数之间的调用关系进行建
模;同时,其无法识别指针所指向的信息,而是直接将指针变量作为抽象语法树节点存储在图中.