📃01论文阅读——VUDENC: Vulnerability Detection with Deep Learning on a Natural Codebase for Python
00 分钟
2024-9-23
2024-9-23
type
status
date
slug
summary
tags
category
icon
password
Property
Sep 23, 2024 03:29 AM

文献基本信息

标题:VUDENC: Vulnerability Detection with Deep Learning on a Natural Codebase for Python
论文作者:Laura Wartschinski, Yannic Noller, Thomas Vogel, Timo Kehrer, Lars Grunske
发表会议/期刊:Information and Software Technology (IST)(CCFB 、SCIQ1
发布时间:2022年

Part1 研究方向

存在的问题

机器学习技术在代码脆弱特征学习中的现状
  • 简单的词袋和分类算法准确性较低,因其不能捕获源代码顺序性质和语义结构。
  • 复杂方法如不同类型深度神经网络在精度和召回率方面可达 80% 以上准确率,但存在局限性。
深度神经网络的局限性
  • 许多研究在合成代码示例上进行或仅适用于一小部分项目。
  • 提出的方法多对整个文件或API调用进行分类,过于粗粒度,无法指向易受攻击代码片段。
训练数据集标记的问题
  • 训练数据集的标记通常依赖手动干预,不能扩展到大型训练数据集。

Part2 思路和方法

深度学习的应用无外乎研究对象、数据来源、表征方式、预处理、模型选择这几个方面。因此本文在这几个方面进行了考量,最终确定了其主要研究方案。
研究对象
数据来源
表征方法
预处理
模型选择
Python代码中的漏洞类型
公开漏洞数据集
word2vec词嵌入
去除注释,分词器分类
LSTM
作者选择了长短期记忆网络(LSTM)作为模型。LSTM适合处理源代码这种顺序数据,能够表示代码的局部性,同时可以捕获比n-grams更长的上下文信息。作者认为使用 LSTM 能够更好地完成从代码令牌序列中学习漏洞特征的任务。
notion image
Vudenc处理代码token及其周围的token,以了解token出现的上下文。该代码使用word2vec模型嵌入到数值矢量中。之后,LSTM网络用于识别易受攻击代码的特征,并使用具有单个输出神经元的最终密集层将代码分类为易受攻击或不易受攻击。
  • 选择直接将源代码视为文本进行处理,而不依赖于抽象语法树(AST)等结构。
  • 使用 word2vec 模型将代码转换为数值向量,以保留代码的语义和句法信息。
  • 通过这种方式,将代码表示为适合机器学习模型处理的形式。
选择长短期记忆网络(LSTM)作为核心模型,因为 LSTM 能够很好地处理顺序数据,适合源代码中语句之间的依赖关系。使用标注好的数据集对 LSTM 进行训练,使其学习到易受攻击代码的特征。 使用颜色来突出显示源代码中不同置信水平的分类结果,以便开发人员能够直观地看到可能存在漏洞的位置。
notion image

数据源和标签

  • 基于GitHub提交:Vudenc通过分析GitHub的提交的漏洞修复信息来获取数据源和标签,而不是依赖传统的手动标注或特定的数据集。
  • 自动标签生成:利用提交中修复漏洞的信息,自动为代码片段标记标签,确定哪些代码是易受攻击的(标记为 “vulnerable”),以及哪些代码在修复后可能不再易受攻击(标记为 “(probably)not vulnerable”)。
为了正确处理数据并避免不平衡的数据集,脆弱和非脆弱部分必须在标记步骤中被同等对待并成比例。其思想是将数据分割成块,如果块与易受攻击的代码段重叠,则将其标记为易受攻击的代码段,否则,将其标记为干净。

Part3 实验方法

  • 数据集的构建:先获取仓库提交时的commit信息,并在此基础上过滤出满足漏洞关键字的仓库,进而获取到这些仓库commit时的差异代码,最终完成数据集构建
  • word2vec向量化:获取足够大的Python语料库后,进行代码预处理,将语法、缩进等错误进行修改;进一步地,在此基础上完成代码分词,从而完成模型的训练;随后在进行LSTM输入时,提供了代码的向量化功能。
  • LSTM模型:构建LSTM模型,并且实现Dataset和DataLoader的功能。在此基础上完成模型的训练、评估等。

漏洞的可视化检测标注

notion image
数据处理与分块:将代码分块,使用一个小的焦点区域和滑动的上下文窗口,以一定的步长(n)遍历整个源代码。焦点窗口在遍历源代码时,会根据Python中标记token结束的字符(如冒号、括号或空格)来确定起始和停止位置,以防止将token截断。对于焦点窗口,确定其周围上下文的长度(m),根据token的边界来确定。这样会产生许多重叠的块,如果整个块中包含部分易受攻击的代码,则将其标记为“vulnerable”,否则标记为“clean
模型预测与可视化:焦点区域遍历代码时,对于每一步,模型会根据周围上下文(几个token的范围)作为输入进行预测,并将预测结果作为焦点区域的漏洞分类。使用颜色来突出显示不同置信水平的分类结果,例如,红色部分表示怀疑存在漏洞的位置。这样,开发人员可以通过可视化的颜色标记直观地看到代码中可能存在漏洞的位置。

Part4 实验结果

数据集挖掘: 作者在GitHub上获取了一个包含 25,040 个漏洞修复提交的大型数据集,涵盖了14,686个不同的仓库。经过过滤和处理,最终得到了一个适合训练模型的数据集,包含七种常见的漏洞类型:SQL 注入、跨站脚本、命令注入、跨站请求伪造、路径泄露、远程代码执行和开放重定向漏洞。
notion image
word2vec模型训练结果: 实验表明,word2vec 模型的超参数对LSTM 模型的性能有显著影响。最佳和最差word2vec参数之间的LSTM F1得分差异约为25个百分点。因此,可以得出结论,仔细考虑超参数值是值得的,并且嵌入的质量对最终模型能够学习特征的程度有影响。总的来说,使用word2vec嵌入绝对可以被推荐为未来类似研究的可行方法。
notion image
LSTM模型训练结果:
notion image
测试集上模型性能评估: 为数据集中的每种漏洞类型训练了一个LSTM模型,同时优化器被设置为最大化F1分数。最后对模型的性能进行了评估。为了实现细粒度,每个代码文件被分成许多小片段,每个片段都是一个观察结果。
notion image
测试集上模型性能评估: 与相似方法的对比结果:
notion image

Part5 总结和展望

本文介绍了一种名为Vudenc的基于深度学习的Python代码漏洞检测系统,旨在解脱人工定义漏洞检测功能的繁琐和主观工作。
  • 利用LSTM模型直接在源代码上学习漏洞特征,作者挖掘了GitHub中的大型提交数据集,覆盖七种漏洞类型,包括SQL注入、跨站点脚本等。
  • 数据集公开,用于复制和进一步研究。通过word2vec模型训练,将源代码嵌入到LSTM网络中,以单个token级别检测易受攻击的代码
  • 实验表明,Vudenc召回率78%-87%,准确率82%-96%,F1得分80%-90%,鼓励进一步研究。
Vudenc突出显示可能包含漏洞的代码区域,并提供可信度。未来工作应提高可理解性和可操作性,改进标记数据、方法组合和提交上下文利用,扩展到其他编程语言和漏洞类型。
上一篇
02论文阅读——VulGAI: vulnerability detection based on graphs and images
下一篇
每一个答案都是下一个问题

评论
Loading...