基于混合代码表示的源代码脆弱性检测.pdf
《基于混合代码表示的源代码脆弱性检测.pdf》由会员分享,可在线阅读,更多相关《基于混合代码表示的源代码脆弱性检测.pdf(10页珍藏版)》请在咨信网上搜索。
1、2023 08 10计算机应用,Journal of Computer Applications2023,43(8):2517-2526ISSN 10019081CODEN JYIIDUhttp:/基于混合代码表示的源代码脆弱性检测张琨,杨丰玉*,钟发,曾广东,周世健(南昌航空大学 软件学院,南昌 330063)(通信作者电子邮箱)摘要:软件脆弱性对网络与信息安全产生了极大的威胁,而脆弱性的根源在于软件源代码。因为现有的传统静态检测工具和基于深度学习的检测方法没有完整地表示代码特征,并且简单地使用词嵌入方法转换代码表示,所以检测结果准确率低,误报率高或漏报率高。因此,提出了一种基于混合代码表示
2、的源代码脆弱性检测方法来解决代码表示不完整的问题,并提升检测性能。首先将源代码编译为中间表示(IR),并提取程序依赖图;然后基于数据流和控制流分析进行程序切片来得到结构化的特征,同时使用doc2vec嵌入节点语句得到非结构化的特征;接着使用图神经网络(GNN)对混合特征进行学习;最后使用训练好的GNN进行预测和分类。为了验证所提方法的有效性,在软件保证参考数据集(SARD)和真实世界数据集上进行了实验评估,检测结果的F1值分别达到了95.3%和89.6%。实验结果表明,所提方法有较好的脆弱性检测能力。关键词:脆弱性检测;中间表示;表示学习;图神经网络;深度学习中图分类号:TP311 文献标志码
3、:ASource code vulnerability detection based on hybrid code representationZHANG Kun,YANG Fengyu*,ZHONG Fa,ZENG Guangdong,ZHOU Shijian(School of Software,Nanchang Hangkong University,Nanchang Jiangxi 330063,China)Abstract:Software vulnerabilities pose a great threat to network and information security
4、,and the root of vulnerabilities lies in software source code.Existing traditional static detection tools and deep learning based detection methods do not fully represent code features,and simply use word embedding method to transform code representation,so that their detection results have low accu
5、racy and high false positive rate or high false negative rate.Therefore,a source code vulnerability detection method based on hybrid code representation was proposed to solve the problem of incomplete code representation and improve detection performance.Firstly,source code was compiled into Interme
6、diate Representation(IR),and the program dependency graph was extracted.Then,structural features were obtained through program slicing based on data flow and control flow analysis.At the same time,unstructural features were obtained by embedding node statements using doc2vec.Next,Graph Neural Networ
7、k(GNN)was used to learn the hybrid features.Finally,the trained GNN was used for prediction and classification.In order to verify the effectiveness of the proposed method,experimental evaluation was performed on Software Assurance Reference Dataset(SARD)and real-world datasets,and the F1 score of de
8、tection results reached 95.3%and 89.6%respectively.Experimental results show that the proposed method has good vulnerability detection ability.Key words:vulnerability detection;Intermediate Representation(IR);representation learning;Graph Neural Network(GNN);deep learning0 引言 随着信息技术的发展,社会智能化程度越来越高,数
9、字服务和软件产品成为人们生活与工作的必需品。与此同时,软件安全问题成为当今社会的一个热点。不安全的软件来源于代码中的脆弱性,脆弱性又称软件安全漏洞1,是指在软件生命周期中,软件设计者在需求、设计、编码、配置和运行等阶段产生的软件缺陷,从而使得攻击者在未经授权的情况下访问计算机资源2。根据美国国家脆弱性数据库的统计,近五年来脆弱性报告数量呈逐年增长趋势,2016年报告的脆弱性数量为6 454,在2017年急速增长至14 714,并且2017年到2021年报告的脆弱性数量为87 089,超过了近22年报告的数量总数(166 893)的一半。为了应对挑战,许多软件源代码脆弱性(下文简称脆弱性)检测方
10、法被提出以解决脆弱性快速增长的问题,其中最主要的一种方法是基于静态分析3的检测。静态分析是指不运行被测程序本身,在源代码中查找导致错误的代码片段,所以文章编号:1001-9081(2023)08-2517-10DOI:10.11772/j.issn.1001-9081.2022071135收稿日期:20220731;修回日期:20221107;录用日期:20221107。基金项目:江西省自然科学基金资助项目(20212BAB212009)。作者简介:张琨(1998),男,江西新余人,硕士研究生,CCF会员,主要研究方向:源代码脆弱性检测;杨丰玉(1980),男,江西九江人,副教授,硕士,CCF
11、会员,主要研究方向:软件测试、大数据分析;钟发(1999),男,江西宜春人,硕士研究生,主要研究方向:软件缺陷预测;曾广东(1998),男,江西赣州人,硕士研究生,主要研究方向:软件缺陷预测;周世健(1966),男,江西吉安人,教授,博士,CCF会员,主要研究方向:智能系统。第 43 卷计算机应用静态分析可以显著减少检测时间。静态分析常用于软件开发初期,能够很大程度地节省软件开发和测试的成本。静态分析方法有污点分析、符号执行、指针分析等。传统的静态分析工具有 RATS(Regression Analysis of Time Series)、Flawfinder、Carraybound等,这些工
12、具通过扫描待检测程序预定义检测规则,然后报告代码中存在的缺陷。虽然检测速度快,但是这些工具过于依赖人工定义的检测规则,且由于检测规则数量有限无法实现高质量检测,同时还具有很高的误报率或漏报率。近年来,基于机器学习的静态分析方法2被应用于源代码脆弱性检测领域,成为该领域的热点,同时深度学习技术因在分类任务中的巨大优势,逐渐被脆弱性检测领域研究者青睐。为了提高检测准确率,深度学习方法需要合适的样本特征作为输入,该特征除了要包含源代码的脆弱性信息,还要是神经网络模型可以接受的格式。脆弱程序的敏感语句通常表现为各种不同类型的代码特征,比如代码文本、函数/应用程序编程接口(Application Pro
13、gramming Interface,API)调用、控制流和数据流等,这些特征可以被用来区分包含脆弱性的代码,因为它们能表示代码的结构或语义特性,比如程序的执行顺序关系、各行代码之间的依赖关系等。目前有很多研究结合深度学习和代码特征来进行静态的源代码脆弱性检测4-6,它们从不同的粒度(例如包、文件、函数、切片、图等)出发,基本思路是先将源代码转化为某种表示形式,然后将表示输入到神经网络模型中进行训练,最后使用训练好的模型实现预测和分类。目前这些研究存在两个局限性:一方面,有些研究7-8仅仅关注某些特定类型的脆弱性进行检测,无法应用到其他更广泛的脆弱性类型上;另一方面,大部分工作使用的代码表示不
14、够完善,比如只是简单地分析部分代码特征(例如VulDeePecker9仅使用数据流分析),它们未对代码的结构信息进行全面分析,忽略了代码中丰富的结构信息,所以检测结果未得到有效提升。综上,源代码脆弱性检测面临的挑战包括以下两点:1)使用的代码表示方法不能完整地提取脆弱性特征;2)脆弱性检测的粒度不够细致。鉴于目前脆弱性检测领域存在的问题,本文提出了一种基于混合代码表示的脆弱性检测方法,实现了一个自动化的脆弱性检测工具VulSaviour。本文首先将源代码编译为中间表示(Intermediate Representation,IR),得到包含结构化信息和非结构化信息的混合特征;然后使用图神经网络
15、(Graph Neural Network,GNN)学习混合特征;最后,在软件保证参考数据集(Software Assurance Reference Dataset,SARD)和真实世界数据集上进行了实验验证,脆弱性检测结果的F1值分别达到了95.3%和89.6%。与传统静态检测工具以及4种最先进的方法进行比较,实验结果表明,本文方法有较好的脆弱性检测能力。1 相关工作 本章分别介绍基于传统静态分析方法和基于深度学习的脆弱性检测方法。1.1传统静态分析方法传 统 静 态 检 测 工 具 有 Clang Static Analyzer、Coverity、Checkmarx、RATS和Flawf
16、inder等,这些工具根据预定义的脆弱性规则,通过污点分析或指针分析等方法扫描源程序,然后根据匹配到的模式来报告代码中可能存在的脆弱性。除此之外,一些学术研究也关注于内存错误和信息泄露检测,提出了许多有效性检测方法。高凤娟等10提出了一种流敏感、上下文敏感的按需指针分析方法来检测数组越界问题;梁娟娟等11提出了一种基于符号执行的静态分析方法实现了高效率C语言代码扫描。上述这些工具和研究都需要人类安全专家或研究者预先定义代码检测规则,但是人的主观性会影响规则的定义;同时人工定义的规则有限,无法检测到所有的脆弱性。因此,这些检测工具都有很高的误报率或漏报率,在检测结束后依然需要重新进行确认,如此下
17、来耗时耗力,这就需要一种改进的方法来减少对人类专家的依赖,同时可以自动学习代码中的脆弱性特征。1.2基于深度学习的脆弱性检测方法Li等9提出的脆弱性检测工具VulDeePecker通过对敏感API语句的上下文进行程序切片得到code gadget,向量化后使用双向长短期记忆(Bidirectional Long Short-Term Memory,BiLSTM)网络训练和分类;但是BiLSTM只能操作线性序列,无法学习到程序中更全面的结构和语义。VulDeeLocator7通过提取源代码的语法特征和基于IR的语义特征,实现更细粒度的检测,并且能够定位到有问题的代码行。VulDeeLocator
18、考虑了更深层的代码表示,但忽略了代码中上下文的结构特征。上述研究都是将源代码视为线性序列的自然语言文本,先处理源代码得到代码表示,接着采用嵌入技术(例如word2vec)将表示转换为固定长度的向量,最后使用神经网络模型(例如BiLSTM)进行特征学习和预测。这些方法忽略了代码中丰富的结构化信息,还会在向量化的过程中因为截断token造成一定的语义损失。与挖掘源代码中的扁平信息相比,一些研究提取代码中的结构信息作为特征。Zhow8提出了一种联合图的代码表示Devign,首 先 使 用 静 态 分 析 工 具 Joern 提 取 抽 象 语 法 树(Abstract Syntax Tree,AST
19、)和控制流图(Control Flow Graph,CFG),再加入数据流图(Data Flow Graph,DFG)联合作为新表示,最后输入到神经网络模型中进行学习。虽然Zhow等考虑了代码的结构信息,但是他们提出的方法只能检测函数级别的脆弱性,并且没有考虑具体的脆弱性类型。VGDetector12在源代码的CFG上进行控制流分析和程序切片,得到了子图切片,再使用图卷积神经网络(Graph Convolutional neural Network,GCN)学习图上的节点与边的信息并进行后续的检测任务,但是它只考虑了控制流信息,忽略了其他重要的信息。使用图表示代码可以减少重要信息的丢失,但上述
20、方法并没有将结构化的特征考虑完整。综上,有必要考虑一种更有效的脆弱性特征学习方案,自动地学习代码中的脆弱性模式,同时结合多种类型的代码特征,完整考虑代码的结构化和非结构化信息,以捕获脆弱性和非脆弱性语句之间的语义和语法差距,从而学习更多的脆弱性类型和模式。本文使用了中间代码表示方法,以提取隐藏的结构信息,同时结合了代码的数据流、控制流和依赖流信息,再利用切片技术聚集了脆弱性代码,切片之后获得了具有结构化和非结构化的混合特征,最后使用图神经网络模型对提取到图形式和向量形式的特征进行学习以识别脆弱性。2 方法介绍 本文方法的框架如图1所示,此方法主要包括4个阶段:2518第 8 期张琨等:基于混合
21、代码表示的源代码脆弱性检测1)预处理源代码;2)提取控制流和数据流,构建程序依赖图(Program Dependency Graph,PDG),基于程序兴趣点进行程序切片;3)对切片进行嵌入,生成混合特征;4)使用图神经网络学习特征后,对数据集进行检测。2.1源代码预处理程序语言具有丰富的语义信息和依赖关系,这些特征对于代码表示是至关重要的。源代码中的依赖关系可能是隐式的,例如,一个变量可以在多个地方被定义和使用,而且它们可能共享一个名称,在使用自动检测方法来扫描代码时,这个问题可能会引起混淆。本文采用中间表示的方法,使用LLVM IR表示源代码。转换后的LLVM IR具有显式的数据依赖和控制
22、依赖关系,去除了不相关的信息,同时减少了噪声的干扰。本文使用Clang编译器将源代码转换为LLVM IR,LLVM IR以静态单赋值(Static Single Assignment,SSA)形式给出,确保每个变量只定义一次。变量的每次使用都被分配一个新的标识符,并且所有这些标识符都连接到一个公共寄存器,这种形式让深度学习模型很容易理解程序中的依赖关系。如程序 1所示,源代码中的一个样本被转化为 LLVM IR 形式。在LLVM IR中,自定义的变量被重命名为统一的“%number”格式。这种命名方法确保了一个固定的词汇表,缓解了词汇不足问题。此外,控制流在LLVM IR中由“br”和“lab
23、el”指定,这些特征有助于深度学习模型的理解。程序1 程序源代码样本及LLVM IR。程序源代码:void CWE190_Integer_Overflow_char_fscanf_multiply_01_bad()char data;data=;/*POTENTIAL FLAW:Use a value input from the console*/fscanf(stdin,%c,&data);if(data 0)/*ensure we won t have an underflow*/*POTENTIAL FLAW:if(data*2)CHAR_MAX,this will overflow*
24、/char result=data*2;printHexCharLine(result);LLVM IR:;Function Attrs:noinline nounwind optnone uwtabledefine void CWE190_Integer_Overflow_char_fscanf_multiply_01_bad()#0%1=alloca i8,align 1%2=alloca i8,align 1store i8 32,i8*%1,align 1%3=load%struct._IO_FILE*,%struct._IO_FILE*stdin,align 8%4=call i32
25、(%struct._IO_FILE*,i8*,)_isoc99_fscanf(%struct._IO_FILE*%3,i8*getelementptr inbounds(3 x i8,3 x i8*.str,i32 0,i32 0),i8*%1)%5=load i8,i8*%1,align 1%6=sext i8%5 to i32%7=icmp sgt i32%6,0br i1%7,label%8,label%14;:8:;preds=%0%9=load i8,i8*%1,align 1%10=sext i8%9 to i32%11=mul nsw i32%10,2%12=trunc i32%
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 混合 代码 表示 源代码 脆弱 检测
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【自信****多点】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【自信****多点】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。