Page 216 - 《软件学报》2025年第7期
P. 216
邱少健 等: 基于函数间结构特征关联的软件漏洞检测方法 3137
检测方法 CSFF-VD, 在代码函数内独立结构特征提取的基础上, 构建函数间的相似关联, 并使用具有降噪机制的
图注意力网络挖掘函数间的所蕴含的关联信息 [27] , 从而提升漏洞检测模型的性能.
2 技术背景
2.1 代码属性图表示
在程序分析领域, 目前已有多种代码表示方法用于推理程序中的特征. 其中, 代码属性图 (code property graph,
CPG) 作为一种新颖的源代码表示方法 [21] , 结合了抽象语法树 (abstract syntax tree, AST)、控制流图 (control flow
graph, CFG) 和程序依赖图 (program dependence graph, PDG) 等经典程序表示, 形成一种联合的代码表示结构.
CPG 的设计可有效辅助源代码中漏洞的发现, 其构建过程包括以下几个步骤.
(1) 代码 AST 表示解析
AST 通常是编译器生成的一种中间表示, 它为其他代码表示方法提供了基础架构. AST 精确编码了语句和表
达式的嵌套结构, 以生成程序. AST 是一种有序树, 其中, 非叶子节点表示操作符 (例如加法或赋值), 叶子节点表示
操作数 (例如常量或标识符). 尽管 AST 适用于简单的代码表示, 并被广泛用于代码语义相似度计算, 但由于其不
能显式表示控制流和程序依赖关系, AST 并不适用于更复杂的代码分析, 例如检测死代码或未初始化的变量.
(2) 代码 CFG 表示解析
CFG 描述了代码语句的执行顺序及特定执行路径所需的条件. CFG 中的节点被称为基本块, 代表代码中在分
支出现前的一段连续语句, 基本块之间通过有向边连接, 以表示控制的转移. CFG 广泛应用于安全领域, 例如检测
已知恶意应用的变种和指导模糊测试工具. 此外, CFG 已成为逆向工程中的标准代码表示方法, 有助于程序理解.
然而, CFG 只揭示了程序的控制流, 未提供数据依赖相关的信息, 因此其无法有效挖掘因数据交互产生的漏洞.
(3) 代码 PDG 表示解析
PDG 显式表示了语句之间的依赖关系, 其中节点代表程序中的语句, 边则表示这些节点之间的依赖关系.
PDG 中有两种类型的边: 数据依赖边和控制依赖边. 数据依赖边表示一个语句中定义的变量如何影响后续语句中
使用的变量; 控制依赖边表示某个语句的执行依赖于前面的条件. PDG 的主要优势在于它能够同时捕捉程序的控
制流和数据流信息, 这使得它在程序分析和优化中具有广泛的应用.
(4) 代码 CPG 表示生成
通过将 AST、CFG 和 PDG 整合为一个联合的数据结构, 形成代码属性图 CPG. 合并的关键思想是, AST、
CFG 和 PDG 中的每个节点都对应源代码中的一个语句或谓词, 因此这些表示可以自然地连接在一起. 具体地,
CPG 中的节点集 V 等于 AST 中的节点集合 V AST , 边集合 E 等于 AST 中的边集合 E AST 、CFG 中的边集合 E CFG 以
及 PDG 中的边集合 E PDG 的并集, 即 E = E AST ∪ E CFG ∪ E PDG . 通过这种方式, 代码属性图能够综合利用抽象语法树、
控制流图和程序依赖图的优势, 为高效分析和发现代码中的漏洞提供了支持.
2.2 图注意力网络
图注意力网络 (graph attention network, GAT) 是一种用于处理图数据的深度学习模型, 通过注意力机制自适
应地捕捉节点之间的关系, 从而在图数据上实现高效的特征提取 [28] . GAT 的核心思想是引入多头注意力机制, 以
在节点邻居 N u 之间分配不同的重要性权重. 具体来说, 对于图 G(V,E), 注意力层接收一组节点特征 H = {h 1 ,h 2 ,...,h N },
{ }
F
*
*
*
*
其中 h i ∈ R , F 表示特征维度, N 表示节点的个数. 输出特征为表示 H = h ,h ,...,h , 计算过程如下.
1
N
2
u
GAT 首先计算图 G 中每一个节点 与其邻居节点 v ∈ N u 之间的注意力分数 e uv = f (Wh u ,Wh v ), 随后通过
v
Softmax 函数对注意力分数进行归一化得到注意力系数 a uv , 该结果反映了节点 对节点 u 的重要性:
exp(e uv )
a uv = ∑ (1)
exp(e uk )
k∈N u
根据注意力系数对邻居节点的特征进行加权求和, 获得更新后的节点 u 表示:

