软件漏洞对日常软件系统的影响令人担忧。尽管已经提出了基于深度学习模型的漏洞检测方法,但这些模型的可靠性仍然是一个重大问题。先前的评估报告这些模型具有高达99%的召回率/F1分数,但研究发现,这些模型在实际应用场景下的表现并不佳,特别是在评估整个代码库而不仅仅是修复提交时,性能会显著下降。
1 现有评估方法的局限性
- 合成数据集: 例如 SARD,这些数据集是人工生成的,无法完全反映真实漏洞的复杂性和多样性。
- 基于漏洞的实时数据集: 例如 Big-Vul 和 ReVeal,这些数据集只包含漏洞修复提交中的代码片段,无法反映真实场景中漏洞检测模型对整个代码库的扫描。
- 标签不一致: 一些数据集中存在标签不一致的问题,例如同一个代码片段被标记为漏洞和不确定。
2 Real-Vul数据集
Real-Vul 是一个针对深度学习漏洞检测模型的新型数据集,旨在解决现有数据集的局限性,并更准确地反映现实场景。
2.1 数据集来源
- Real-Vul 数据集基于 Big-Vul 数据集构建,Big-Vul 数据集包含来自 348 个开源项目的真实漏洞 C/C++ 函数。
- 从 Big-Vul 数据集中选择了漏洞数量最多的 10 个项目,这些项目涵盖了 73% 的漏洞样本,具有代表性。
2.2 数据集构建方法
2.2.1 时间序列策略
- Real-Vul 数据集分为训练集和测试集,模拟了模型在历史数据上进行训练,并随着时间的推移识别漏洞的过程。
- 训练集包含漏洞修复提交日期最早的 80% 的漏洞函数,测试集包含剩余 20% 的漏洞函数。
- 这种策略确保了训练集和测试集在时间上的连续性,更符合现实场景。
2.2.2 不确定样本的创建
- 通过克隆每个项目的远程代码库并创建两个快照(一个用于训练集,一个用于测试集),从每个快照中提取所有函数。
- 计算每个函数的哈希值,并与训练集中漏洞函数的哈希值进行比较。
- 如果哈希值不匹配,则将该函数标记为不确定。
2.3 数据集特点
- 真实性和多样性: 包含来自真实软件系统的漏洞代码,具有更高的多样性和复杂性。
- 现实场景: 模拟了漏洞检测模型在实际应用中对整个代码库进行扫描的场景,更符合现实需求。
- 标签一致性: 通过比较哈希值来解决标签不一致的问题,确保了数据的可靠性。
- 规模: 包含 5,528 个漏洞函数和 1,682,713 个不确定函数,规模较大,有利于模型的训练和评估。
2.4 数据集的优势
- 更准确的评估: 可以更准确地评估深度学习漏洞检测模型的性能,发现现有模型的局限性。
- 促进研究: 可以促进漏洞检测领域的研究,推动模型设计和评估方法的改进。
- 应用价值: 可以用于开发漏洞检测工具,帮助开发者识别和修复软件漏洞,提高软件的安全性。
3 实验
3.1 模型选择
- DeepWukong: 使用图神经网络 (GNN) 分析代码依赖关系,从代码中提取 XFG (子图) 进行漏洞检测。
链接: https://github.com/jumormt/DeepWukong
- LineVul: 基于 CodeBERT 的序列模型,将代码块作为输入,并使用 CodeBERT 模型对其进行分类。
链接:https://github.com/awsm-research/LineVul
- ReVeal: 使用图神经网络 (GNN) 检测漏洞,将控制流、数据流、语法树和依赖图整合到代码属性图 (CPG) 中进行综合代码分析。
- IVDetect: 结合表示学习和基于图的解释模型,分析控制流、数据流、抽象语法树和程序依赖图,创建统一的代码结构以高效检测漏洞。
3.2 数据集
- Real-Vul: 本研究提出的新数据集,包含 10 个开源项目的完整代码库,并使用时间策略创建漏洞和不确定样本,确保数据集的真实性和多样性。
- 其他数据集: DeepWukong 使用 SARD 数据集,LineVul 使用 Big-Vul 数据集,ReVeal 使用 ReVeal 数据集,IVDetect 使用 IVDetect 数据集。
3.3 研究问题
- 真实场景评估 (RQ1): 深度学习模型在真实场景下的表现与原始研究中的表现有何不同?
- 数据集平衡 (RQ2): 深度学习模型在类似真实场景的训练数据集上进行训练后的表现如何?
3.4 评估指标
- 准确率: 模型预测正确的样本比例。
- 精确率: 模型预测为漏洞的样本中,实际为漏洞的比例。
- 召回率: 模型实际检测到的漏洞样本中,被正确预测的比例。
- F1 分数: 精确率和召回率的调和平均值,综合评估模型性能。
- AUC: 模型区分漏洞和非漏洞样本的能力。
3.5 研究方法
- 初步分析: 在原始数据集上评估模型性能,确保结果可靠性并建立基线。
- 真实场景评估 (RQ1): 在 Real-Vul 测试数据集上评估模型性能,并与原始数据集上的表现进行比较。
- 数据集平衡 (RQ2): 使用 Real-Vul 数据集进行训练和评估,并探讨数据集平衡对模型性能的影响。
- 代码复杂性分析: 分析代码复杂性对模型性能的影响。
- 过拟合评估: 使用 LIME 工具分析模型决策的特征,并探讨过拟合问题。
- 数据增强: 使用死代码增强技术提高数据集多样性,并评估其对模型性能的影响。
- 漏洞类型分析: 分析模型对不同漏洞类型的检测能力。
- 漏洞严重性分析: 分析模型对不同严重性漏洞的检测能力。
- 大型语言模型评估: 使用 CodeLlama 和 Mixtral 等大型语言模型进行漏洞检测,并评估其性能。
3.6 实验结果
3.6.1 现实场景下的模型性能下降
原模型测试结果
基于Real-Vul 数据集测试结果
- 使用 Real-Vul 数据集对 DeepWukong、LineVul、ReVeal 和 IVDetect 模型进行评估,发现这些模型在现实场景下的性能显著下降。
- 精确度和 F1 分数分别下降了高达 95% 和 91%,这意味着模型产生了大量的误报。
- t-SNE 可视化结果显示,模型无法清晰地区分漏洞样本和不确定样本,导致误报率上升。
3.6.2过拟合是导致性能下降的主要原因
- 通过手动分析误报样本,发现模型存在过拟合现象,即模型过度依赖于特定的代码片段进行预测。
- 为了解决这个问题,提出了数据增强技术,通过在训练数据集中添加死代码来增加样本的多样性,从而降低过拟合的风险。
3.6.3 数据增强技术提高了模型性能
- 使用增强后的数据集重新训练模型,并发现模型的性能得到了显著提升,AUC 分数提高了 8% 到 32%。
- 虽然数据增强技术提高了模型的精确度,但召回率有所下降。这说明数据增强技术在提高模型泛化能力的同时,也牺牲了一部分对真实漏洞的识别能力。
3.6.4 模型对不同类型漏洞的检测能力不同
本文分析了模型对不同类型漏洞的检测能力,发现模型在检测信息泄露和代码注入等类型的漏洞时表现较好,而在检测路径遍历和可预测返回值等类型的漏洞时表现较差。
这说明模型对不同类型漏洞的检测能力存在差异,需要针对不同类型的漏洞进行针对性的改进。
3.6.5 模型对高严重性漏洞的检测能力较差
本文分析了模型对不同严重性漏洞的检测能力,发现模型在检测高严重性漏洞时表现较差。这说明模型需要进一步提高对高严重性漏洞的检测能力,以更好地保障软件安全。
3.6.6 大型语言模型在漏洞检测中的应用:
使用 CodeLlama 和 Mixtral 等大型语言模型进行漏洞检测,发现这些模型在 AUC 分数方面优于其他模型,但仍然低于 LineVul 模型。
这说明大型语言模型在漏洞检测方面具有潜力,但需要进一步提高其针对性和效率。