一、评价
- 在性能提升难以判断是否显著时,可以使用McNemar 显著性检验来判断
- 本文的实验设置很值得学习:不仅从有效性、效率、泛化能力上进行评估,针对其中每一个层面,又单独设置了多组,比如有效性上,对比按照是否为Transformer模型展开;效率上,既针对计算资源,又衡量训练数据规模的影响;泛化能力也在标注漏洞数据集和真实漏洞数据集分别开展。
- 本文提出的方法能够同时应用于大模型,在其表现不佳时能够考虑到将其得到的数据流结果提供给大模型并带来性能提升,很有巧思
- 本文在评估泛化能力时,跨项目实验设置充分考虑了随机性影响,进行了5折交叉验证,严谨性值得学习
- 通过论文了解到DbgBench这个数据集
- 论文的消融实验,一共有8组,非常充分验证了每一种配置可能性的影响
二、总结
简单总结:
当前基于深度学习的漏洞检测模型,特别是大语言模型(LLM),存在显著缺陷;
本文考虑用经典的程序分析技术,如数据流分析 (DFA),进行改进;
现有的基于数据流+深度学习的已有研究都各自存在一些缺点,可改进;
图学习和DFA天生相似,本文结合的同时改进现有研究的问题;
本文创新提出抽象数据流嵌入,分析训练集的API调用、数据类型、常量、操作符,根据频率构建字典;对CFG做嵌入后,交由图学习模块迭代学习漏洞成因表示。图学习模块中,AGGREGATE用MLP,UPDATE用GRU;
通过实验,发现提出的DeepDFA:
有效性上,碾压非Transformer模型,不如部分Transformer模型,但可以进一步辅助提升Transformer模型;
效率上,需要的计算资源比别SOTA方法少、受训练数据规模的影响也小,很不错;
泛化能力上,DeepDFA在业内常用数据集BigVul、真实世界数据集DbgBench上,表现得比其他SOTA方法强,还能提高其他SOTA方法的检测效果,不过在DbgBench上还是单纯DeepDFA更优
(一)研究现状
简单概括:
当前基于深度学习的漏洞检测模型,特别是大语言模型(LLM),存在显著缺陷;
考虑用经典的程序分析技术,如数据流分析 (DFA),进行改进;
基于数据流+深度学习的已有研究都各自存在一些缺点,可改进
1. 基于大模型的漏洞检测
- pros:LineVul拿到91的F1-Score
- cons:
- ① 效率低下: 需要巨大的计算资源和极长的训练时间(例如超过10小时)
- ② 数据依赖:大模型训练推理所需的高质量数据集难获取;
- ③ 泛化能力弱:LineVul和UniXcoder对训练集外漏洞(如DbfBench数据集)检测失效;
- ④ 真实世界表现不佳:仅依赖文本标记的大模型可能无法有效学习程序语义特征
2. 基于数据流+深度学习的漏洞检测
(1)Devign
- 思路:使用数据依赖图作为程序表示的一部分,并在此之上进行深度学习
- 缺点:嵌入根据代码的非结构化文本内容(如变量名、函数名等)来给代码语句生成一个向量表示,这种编码方式即使在数据依赖图上传播,也无法直接捕捉到数据流动的具体模式
例如
strcpy(buffer, input)
,Devign 能识别出strcpy
这个危险函数和buffer
这个变量,但它的编码方式无法直接体现出input
这个变量携带的数据流向了buffer
这个变量
(2)ProGraML
- 思路:修改CFG,分别创建指令节点和数据节点 ;在指令节点之间添加控制流边,在数据节点之间添加数据流边
- 缺点:只分析代码中的操作符(如 +, -)和变量类型(如 int, char*),粒度太粗,无法区分具体数值和变量来源导致的本质差异,因此无法直接捕捉到数据流模式
简单来说,就是没考虑变量的具体值,无法识别例如空指针、缓冲区溢出等
3. 其他研究
- Devign 、ReVeal 、IVDetect 、LineVD
- CodeBERT 、LineVul 、UniXcoder
- ContraFlow
- VulDeePecker、SySeVR、Draper
(二)动机逻辑
简单概括:
图学习和DFA天生相似,结合的同时改进现有研究的问题
1. 逻辑
- 融合领域知识与算法,能提高性能+泛化能力
- 数据流分析DFA 依据 控制流图CFG 判断漏洞根本成因
- 图学习能以类似DFA的方式实现信息聚合与传播
因此可以结合
2. 目标
将经典DFA的严谨性与图学习的信息聚合、传播能力相结合,创建一个高效、有效且泛化能力强的漏洞检测框架 DeepDFA
(三)算法结构
简单概括:
创新提出抽象数据流嵌入,分析训练集的API调用、数据类型、常量、操作符,根据频率构建字典,CFG做嵌入后,交由图学习模块迭代学习漏洞成因表示。图学习模块中,AGGREGATE用MLP,UPDATE用GRU
1. 原理
- DFA 使用交汇操作从前驱节点聚合信息,使用传递函数更新当前节点的信息集,如此迭代直至达到“不动点”
- GNN 使用 AGGREGATE 函数从邻居节点收集信息,使用 UPDATE 函数更新节点的嵌入向量,迭代一个预设的固定步数 t
因此,DeepDFA 框架在程序的CFG上,通过GNN的 AGGREGATE 和 UPDATE 函数来模拟“到达定义分析”这一具体的DFA过程
2. 技术路线图
其中:
- DeepDFA创建了一种“全局”的、统一的表示法,即抽象数据流嵌入,分析整个训练集,找出 k 个最常出现的关键语义特征(API 调用、数据类型、常量、操作符 ),构建一个固定的全局字典
- DeepDFA的图神经网络中,AGGREGATE函数是一个多层感知机MLP,UPDATE函数是一个门控循环单元GRU
上图是一个过程示例
(四)实验设置
简单概括:
提出的DeepDFA有效性上碾压非Transformer模型,不如部分Transformer模型,但可以进一步辅助提升Transformer模型;效率上需要的计算资源比别SOTA方法少、受训练数据规模的影响也少,很不错;泛化能力上,DeepDFA在业内常用数据集BigVul、真实世界数据集DbgBench上,表现得比其他SOTA方法强,还能提高其他SOTA方法的检测效果,不过在DbgBench上还是单纯DeepDFA更优
1. 数据集
BigVul评估一般漏洞检测性能
DbgBench评估真实世界漏洞检测性能
2. 探究有效性的实验
用BigVul
训练集80%;测试集10%;验证集10%
(1)和非Transformer比
结论:碾压非Transformer模型
结果如图
(2)和Transformer比
结论:
- 被部分Transformer模型碾压
- 不过,这里虽然DeepDFA表现没这些大模型好,但是把它的结果提供给大模型,发现性能有提升,使用McNemar 显著性检验来确认性能差异在统计上是显著的
结果如图
3. 探究效率的实验
用BigVul
(1)计算资源层面
结论:DeepDFA所需计算资源远少于其他
结果如图
(2)训练数据规模层面
结论:
- 随训练数据规模减小,DeepDFA性能降低的程度较少
- DeepDFA可以缓解大模型因训练数据减小导致的性能降低
结果如图
4. 探究泛化能力的实验
(1)在BigVul上检验
① 混合项目实验
实验设置:
- 随机10000个样本做测试集、验证集,剩下的做训练集
- 训练集和测试集可以包含来自同一项目的样本
② 跨项目实验
实验设置:
- 随机10000个样本做测试集、验证集,剩下的做训练集
- 训练集和测试集的项目是完全不同,且用不同项目选择重复5次选取,进行5折交叉验证
③ 结果结论
结论:
- DeepDFA的在BigVul上的泛化能力最好
- DeepDFA可以提升大模型在BigVul上的泛化能力
结果如图:
(2)在DbgBench上检验
结论:
- DeepDFA在DbgBench上的泛化能力最好
- 单纯大模型在DbgBench上完全失败
- DeepDFA可以提升大模型在DbgBench上的泛化能力,但仍不如单纯DeepDFA
结果如图:
5. 探究每个语义特征贡献的消融实验
结论:每个都很有用,单用的时候数据类型稍微更重要一点
结果如图:
在DbgBench上的结果
在BigVul上的结果