【论文阅读笔记】VUDENC:基于深度学习的Python代码漏洞检测

论文阅读笔记,VUDENC:基于深度学习的Python代码漏洞检测

绪论

文献基本信息

论文题目: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)
发布时间:2022年
主题类型:漏洞检测、深度学习
通信作者主页:https://seg.inf.unibe.ch/people/timo/
Github项目地址:链接: 点击

研究背景

软件漏洞威胁复杂系统,可能导致信息泄露和系统崩溃,对企业、政府和个人带来巨大影响。例如,WannaCry和Heartbleed漏洞带来数亿美元损失。漏洞通常源于微小代码错误,如Heartbleed本可用两行代码避免。安全软件工程需要结合质量保证技术,自动检测源代码漏洞。随着软件规模扩大,软件漏洞不断增加,自动化漏洞检测成为关键研究领域。目前方法包括软件元特征、异常检测和误用检测,深度学习成为有希望的方法。本文探讨了如何自动化漏洞检测,以提升软件安全性。

相关研究综述

  1. 动态程序分析方法,特别是软件渗透测试,需要由安全专家定义的广泛的代表性测试用例,安全专家需要像攻击者一样了解攻击策略和被测软件的原因。
  2. 传统的静态分析工具是基于规则的系统,依赖于脆弱代码的特征定义。一方面,在人类专家的帮助下定义这些特征是一项繁琐的任务,容易产生错误,从而产生不完整的规则集。另一方面,通用特征的使用,如软件度量遭受高假阳性率,而基于代码克隆检测和相似性搜索的结构方法的实验暴露了假阴性率太高而不能被认为是可接受的。
  3. 随着开放源代码库的可用性越来越高,有人建议使用数据驱动的方法来检测漏洞。各种机器学习(ML)技术已经被应用于学习代码的脆弱特征,然而,取得了不同的成功。简单的词袋和分类算法导致相当令人失望的准确性,因为它们不能捕获源代码的顺序性质和语义结构。更复杂的方法获得的实验结果,包括不同类型的深度神经网络(DNN),在精度和召回率方面达到了80%以上的准确率。然而,许多研究工作在合成代码示例上或仅适用于一小部分项目。此外,许多提出的方法仅对整个文件或API调用进行分类,这更容易实现,但过于粗粒度,无法将开发人员直接指向易受攻击的代码片段。最后,训练数据集的标记通常不是完全自动化的,而是依赖于手动干预,这不能扩展到大型训练数据集。总之,现有的解决方案远未达到准确性、指导性、适用性、通用性和配置工作之间的最佳权衡。如何克服上述研究的局限性是本论文工作的总体研究目标。

主要思路及贡献

  1. 方法概述
    深度学习的应用无外乎研究对象、数据来源、表征方式、预处理、模型选择这几个方面。因此本文在这几个方面进行了考量,最终确定了其主要研究方案。
    在这里插入图片描述

  2. 主要思路
    Vudenc方法的原理图
    在这里插入图片描述

Vudenc处理代码token及其周围的token,以了解token出现的上下文。该代码使用word2vec模型嵌入到数值矢量中。之后,LSTM网络用于识别易受攻击代码的特征,并使用具有单个输出神经元的最终密集层将代码分类为易受攻击或不易受攻击。
3. 数据源和标签
完整的数据集是从GitHub上公开的项目中收集的,原因如下:首先,GitHub是世界上最大的源代码主机,因此对于这个应用程序来说,可用的有用数据量不太可能太少。其次,与合成代码库相比,GitHub上的几乎所有项目都包含“自然”源代码,因为它们是实际使用的实际项目。第三,数据是公开的,这使得重新检查和复制工作变得更加容易
为了正确处理数据并避免不平衡的数据集,脆弱和非脆弱部分必须在标记步骤中被同等对待并成比例。其思想是将数据分割成块,如果块与易受攻击的代码段重叠,则将其标记为易受攻击的代码段,否则,将其标记为干净。
4. 编程语言的选择
以前的工作主要集中在静态类型语言,如Java,C和C++ 。然而,编程语言Python并没有受到如此关注。根据几个在线排名,Python是最重要和最流行的编程语言之一,它是GitHub上仅次于JavaScript和Java的第三大使用语言。尽管Python以其在数据科学和统计学方面的实用性而闻名,但这并不是它唯一的应用领域。在Django和Flask等流行的Web框架中,Python被用来创建动态网站和Web应用程序,因此也会受到基于Web的系统中发生的各种安全问题的影响。为了填补这一空白,Vudenc专注于用Python编写的源代码。
5. 漏洞类型选择:一些漏洞类型被排除在外,因为GitHub上发现的与它们相关的不同提交只有50个或更少。其他一些关键词,如“劫持”,被用作比喻性的很多,或主要用于攻击性应用程序的代码。在排除这些漏洞之后,最后选择了七种典型且普遍存在的漏洞类型:SQL注入、跨站脚本、命令注入、跨站请求伪造、路径泄露、远程代码执行和开放重定向漏洞。对于每种漏洞类型,收集不同的数据集,并训练单独的模型以在源代码中识别它们。
6. 贡献

  • 贡献点1:论文针对当下Python代码漏洞检测研究较少的问题,提出了一种基于深度学习的漏洞检测方法,向开发人员直接指向潜在易受攻击的代码片段,实现了对Python代码中7种特定类型漏洞的检测,并且模型在构建的数据集上精度、召回和F1值分别达到了82%–96%、78%–87%以及80%-90%。
  • 贡献点2:一种完全自动化的标记方法,可以应用于非常大的真实世界软件语料库,而不需要人工干预。
  • 贡献点3:论文针对漏洞代码定位问题,提出了细粒度的分词与上下文捕获方法,在模型输入上选择对源代码分词粒度上进行分析,实现了能够在代码文本分词的基础上获取到模型的置信度输出,从而获取代码漏洞定位。

研究过程

关键步骤有三部分,分别为数据集构建、Word2vec向量化、LSTM模型
在这里插入图片描述

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

最后,需要使用经过训练的分类器的结果来可视化源代码中的漏洞。代码以与之前完全相同的方式被分割成块。焦点区域遍历代码,并且对于每个新步骤,获取几个token的周围上下文,模型基于作为输入的上下文进行预测,并且预测被用作焦点区域的脆弱性分类。颜色用于突出显示分类的不同置信水平。下图呈现了包含命令注入漏洞的代码片段的结果的示例。红色部分是疑似漏洞所在的位置。
在这里插入图片描述

研究结果

RQ-1:是否可以从Github中挖掘合适的Python源代码数据集,以获取常见的漏洞类型?
RQ-1的回答:是的,作者从GitHub获得了令人满意的数据集,其中涵盖了七种常见的漏洞类型:SQL注入、跨站脚本(XSS)、命令注入、跨站请求伪造(XSRF)、远程代码执行、路径公开和开放重定向。
最终的数据集包含源代码和有关提交的一些信息,以及代码中的易受攻击段和不易受攻击段。关于它们的基本信息总结在表1中。我们报告存储库的数量(# repo.)和提交(# commits)、具有漏洞的已更改文件的数量(# changed file)、它们的代码行(LOC)、其中的单独函数的数量(# separate functions)以及字符总数(# chars)。后面将通过在模型训练中使用该数据集来证明该数据集是合适的
在这里插入图片描述

RQ-2:word 2 vec模型有效吗?超参数如何影响整体结果?
对RQ-2的回答:是的,word 2 vec模型适合作为一个有效的嵌入。我们最终的word 2 vec模型将以200维的数字向量对代码标记进行编码,不替换任何字符串,需要包含标记的最小计数为10,并将进行100次迭代训练。
我们的实验表明,word2vec超参数确实会导致LSTM模型的性能显著不同,最佳和最差word2vec参数之间的LSTM F1得分差异约为25个百分点。因此,可以得出结论,仔细考虑超参数值是值得的,并且嵌入的质量对最终模型能够学习特征的程度有影响。总的来说,使用word2vec嵌入绝对可以被推荐为未来类似研究的可行方法。
在这里插入图片描述

RQ-3:LSTM模型是否有效,超参数如何影响整体结果?
RQ-3的回答:给定数据集以及计算能力和磁盘空间的限制,认为最佳的超参数设置是:· 100个神经元·训练100个epoch·20%的dropout和复发dropout·批量大小128 ·使用adam优化器进行优化
在这里插入图片描述

RQ-4:VUDENC在检测漏洞方面的有效性如何,以精确度、召回率和F1为衡量标准?
RQ-4的答案:精确度(所有阳性预测中的真阳性分数)范围为82%至96%,表明假阳性率非常低。召回率略低,在78%到87%之间,这意味着只有13-22%被标记为易受攻击的样本被遗漏。最后,整体F1得分,准确率和召回率的调和平均值,范围在80%-90%之间,这是一个非常令人满意的结果。
使用上一节中确定的理想超参数,我们为数据集中的每种漏洞类型训练了一个LSTM模型,同时优化器被设置为最大化F1分数。最后对模型的性能进行了评估。然而,这一次,在模型以前没有见过的最终测试数据集上。表3显示了每种漏洞类型的结果,以及关于样本大小和在我们的数据集中发现的易受攻击代码片段的比率的信息。为了实现细粒度,每个代码文件被分成许多小片段,每个片段都是一个观察结果。

每种漏洞类型的结果:
每种漏洞类型的结果

与相似方法的对比试验结果:
在这里插入图片描述

为了提供评估这项工作的参考框架,上表总结了Vudenc与其最密切相关的方法的比较。由于这些方法之间存在根本差异,因此无法在实验结果之间进行直接比较。因此,它们的比较涵盖以下几个方面:
语言:编程语言是分类工作的主题
数据基础:这些数据是来自现实项目还是来自数据库
标签:训练数据的标签最初是如何生成的
粒度:代码是在粗粒度(整个类或文件)上评估还是在细粒度(行或标记)上评估。
机器学习方法:使用哪类神经网络或机器学习方法(CNN、RNN、LSTM)。
漏洞类型:检测到哪些类型的漏洞。
数据集的大小:有多少个函数、项目、类等组成数据集。
范围和适用性:该模型是否在单个项目上训练过,并且它是否只能对该项目中的文件进行分类,或者它是否普遍适用于来自大量来源的任何代码。

总结及展望

总结

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

补一个框架图

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饭碗儿的碗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值