基于可执行程序的二进制漏洞检测方法、系统及存储介质与流程

文档序号:21695997发布日期:2020-07-31 22:36阅读:5337来源:国知局
基于可执行程序的二进制漏洞检测方法、系统及存储介质与流程

本发明涉及漏洞检测领域,具体涉及一种基于可执行程序的二进制漏洞检测方法及系统。



背景技术:

漏洞检测技术是提高软件质量安全性、减少软件安全漏洞的重要方法和基本手段,受到学术界和工业界的广泛关注和高度重视。为了实现漏洞发现的自动化,基于机器学习(machinelearning,ml)的漏洞发现技术引起了广泛的关注。

针对利用漏洞挖掘方面的研究,按照针对漏洞挖掘层面的不同可以划分为源代码层面和二进制层面两类。

针对源代码层面的漏洞挖掘技术主要有控制流分析和符号执行等。

控制流分析技术不需要运行程序,通过直接从程序代码中收集程序的语义信息,并通过代数的相关算法确定变量的定义和使用,推测程序的可能执行路径,进而实现漏洞的发现,khaledyakdan等在ndsssymposium2015提出了一种独立于模式的独立控制流结构算法—dream,可以将非结构化控制流图转换为结构化图的语义保留转换。在此基础上,zhaod提出了一种基于knn-svm的新方案,在现有基础上提高了精度,能够有效地搜索二进制代码中的类似函数并查找漏洞。

符号执行技术使用抽象符号代替程序变量,遍历代码执行空间,王铁磊等人在2011年设计的symreplayer系统已经形成了不完全依靠源代码的符号执行技术。最近,北京大学孙基男等人进一步开发出了基于符号执行的注入类安全漏洞的分析技术,进一步发展了符号执行技术的应用。当然,由于程序的执行路径随程序规模指数型增长,对于较大型的程序而言,穷举所有运行路径终究是很难实现的。另外,还有fabianyamaguchi等提出的一种通过在代码中提取抽象语法树来协助安全分析人员发现漏洞的新方向。从总体趋势上说近些年的很多软件开发者不愿提供程序的源代码,针对源代码的漏洞挖掘可能渐渐落后于潮流。

针对二进制层面的漏洞挖掘技术主要有二进制比对,动态污点跟踪,fuzzing(模糊检测)等。

二进制比对技术主要依赖软件开发方发布的补丁信息进而定位和恢复被修补的漏洞信息,这种方法对于经过高级优化编译的程序而言缺乏准确度和效率。debiangao等人在2008年提出了较为完善的binhunt二进制比对技术,但该技术依然不具备足够的分析性能,只在非常小的范围内得到应用。

相较于传统的漏洞挖掘方式,利用机器学习(ml)的新型漏洞挖掘技术不仅在效率、准确性、应用范围上都具有十分突出的优势,而且机器学习技术的使用能够节约大量的人工劳动力。目前机器学习的主要分支有:经验性归纳学习(empiricalinductivelearning)、分析学习(analyticlearning)、遗传学习(geneticlearning)、联结学习(connectedlearning)、增强学习(reinforcementlearning)。

机器学习用于漏洞挖掘的技术已经有很多,如在2008年zulkemine等将基于随机森林(rf)方法的机器学习应用到了漏洞挖掘中,2014年w.li等使用了基于邻近算法(knn)的机器学习技术,2015年ingre等将人工神经树方法(ann)和漏洞挖掘结合,2016年reddy等改良了基于监督式学习的支持向量机技术(svm)在漏洞挖掘中的应用,2019年dongdongzhao等提出了一种基于knn-svm和属性控制流图的固件跨体系结构漏洞搜索的方法。通过基于软件度量的脆弱性预测、异常检测、易受攻击代码模式识别等思路,机器学习方法已经被证明在许多应用场景都有显著的效果。

时至今日基于各种深度学习方法在计算机安全方面已经有了许多成果。gustavogrieco等提出了一种使用轻量级静态和动态特性来预测测试用例是否包含能被机器学习技术所检测的软件漏洞的方法,并开发了一个在大规模可执行程序中检测漏洞的机器学习工具,使机器学习能应用于大规模可执行程序。可执行程序缺少函数、变量、变量类型等语义信息,导致在对可执行程序进行漏洞挖掘时,基于源码的漏洞挖掘技术将不能直接使用。另一方面,基于静态分析的漏洞挖掘误报率高,需要大量的人工参与,严重制约着静态漏洞挖掘技术的应用范围。。



技术实现要素:

发明目的:为了克服现有技术的不足,本发明提供一种基于可执行程序的二进制漏洞检测方法,该方法可以解决现有技术中依赖于代码审计的漏洞挖掘工具误报率和漏报率高、无法精确定位漏洞的问题。

技术方案:本发明所述的基于可执行程序的漏洞检测方法,该方法包括:

(1)采集具有已知漏洞的二进制可执行程序,采用支持vex中间语言的angr框架的将二进制可执行程序执行流遍历并转译为vex文本;

(2)将所述vex文本切割成若干个文本片段,并提取所述文本片段的关键字,并将所有文本片段进行序列化;

(3)使用word2vec将序列化后的文本片段的关键字转化为具有上下文语义的文本向量;

(4)将所述文本向量转化为数字向量,并保存相关文件作为bi-lstm网络模型的输入,分别设置训练数据集和验证数据集对bi-lstm网络模型进行训练和验证,返回训练集与验证集上的误差率和相关记录字典;

(5)设置检验指标,利用预测数据集检验bi-lstm网络的泛化性。

进一步地,包括:

所述步骤(1)中,所述已知漏洞包括危险函数导致的栈溢出漏洞、格式化字符串漏洞或释放后利用类堆溢出漏洞。

进一步地,包括:

所述步骤(2)中,将所述vex文本切割成若干个文本片段,具体为:以ir块为单位切割所述vex文本,形成较小的可输入文本序列,所述ir块包括1到50条指令,这些指令描述了变量类型、状态值和跳转地址。

进一步地,包括:

所述步骤(3)具体包括:

(31)将vex语法定义及大量文本片段作为word2vec要学习的语料库;

(32)通过无监督的学习建立词嵌入模型,经过词嵌入模型的转化,文本元素将变为具有语义的矢量表示,在vex中具有相似上下文的元素通常位于矢量空间的相邻位置;

(33)对word2vec的嵌入学习进行可视化,并使用主成分分析方法将嵌入投影到二维平面。

进一步地,包括:

所述步骤(4)中,将所述文本向量转化为数字向量,包括将各个所述文本向量的关键字映射到整数上,并将对应的文本向量采用csv文件进行保存。

进一步地,包括:

所述bi-lstm网络模型包括五层,分别为:第一层为嵌入层,第二层为前向的lstm,第三层为后向的lstm,第四层为全连接层,第五层为输出层,其中,第二层和第三层构成bi-lstm层,所述输出层最终输出漏洞类型概率。

进一步地,包括:

所述步骤(4)中,对bi-lstm网络模型进行训练和验证的过程包括:

(41)初始化模型,进入模型编译阶段,设置训练数据集中的训练样本数、验证数据集中的验证样本数和迭代次数,并选择损失函数和优化器;

(42)根据设置的迭代次数对bi-lstm网络模型迭代训练,并观察检验指标的提升程度,若检验指标的大小趋于不再变化,则认为达到最优点停止训练,得到训练后的bi-lstm网络模型;

(43)采用设置的验证样本数对训练后的bi-lstm网络模型进行验证。

另一方面,本发明还提供一种基于可执行程序的漏洞检测系统,包括:

文本转换模块,用于采集具有已知漏洞的二进制可执行程序,采用支持vex中间语言的angr框架的将二进制可执行程序执行流遍历并转译为vex文本;

文本切割模块,用于将所述vex文本切割成若干个文本片段,并提取所述文本片段的关键字,并将所有文本片段进行序列化;

文本语义转化模块,用于使用word2vec将序列化后的文本片段的关键字转化为具有上下文语义的文本向量;

向量转化模块,用于将所述文本向量转化为数字向量,并保存相关文件作为bi-lstm网络模型的输入,

模型训练模块,用于分别设置训练数据集和验证数据集对bi-lstm网络模型进行训练和验证,返回训练集与验证集上的误差率和相关记录字典;

测试模块,用于设置检验指标,利用预测数据集检验bi-lstm网络的泛化性。

另一方面,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述的基于可执行程序的漏洞检测方法。

有益效果:本发明与现有技术相比,其显著优点是:1、本发明在漏洞检测中引入中间语言vexir,vexir自身实现了嵌套的二进制控制流图,一定程度上恢复了程序的执行流,有利于后续算法理解程序逻辑语义和上下文信息并建立相应的漏洞模型;2、本发明对vex中间语言引入angr框架,可以进行跨平台的二进制代码分析,提升代码的表示层面,实现目的性更强的分析;3、本发明采用双向长短时记忆循环神经网络,其可帮助检测序列前向和后向的长期依赖性,并有效地捕获易受攻击的编程模式,提高漏洞检测的准确率;4、本发明对序列化的vex文本使用word2vec转化词向量进行语义保留,相对常见基于程序和函数级别的检测方法能以更细的粒度来进行基于深度学习的检测,并更精确地确定漏洞的位置,提高漏洞识别的准确性,最终实现将二进制可执行程序作为输入,以返回函数漏洞概率作为结果。

附图说明

图1为本发明实施例所述的检测方法流程图;

图2为本发明实施例所述的向量投影示意图;

图3本发明实施例所述的可执行文件原始vexir;

图4本发明实施例所述的vex关键字与整数映射关系的示意图;

图5本发明实施例所述的深度学习框架结构图;

图6本发明实施例所述的输入向量示意图;

图7本发明实施例所述的函数vexir关键字序列化的示意图;

图8本发明实施例所述的运行过程截图1;

图9本发明实施例所述的运行过程截图2;

图10本发明实施例所述的针对sqlite3的对溢出漏洞检测结果示意图。

具体实施方式

下面结合说明书附图对本发明的实施方式进行描述。

如图1所示,本发明所述的基于可执行程序的漏洞检测方法,该方法包括以下步骤:

s1采集具有已知漏洞的二进制可执行程序,采用支持vex中间语言的angr框架的将二进制可执行程序执行流遍历并转译为vex文本;

vex不是一种新的语言,它是从机器码转化而来的一种中间表达式,vexir是一种隔离不同架构的中间表达式而不是一种语言,它更像是编译器运行的ir。

angr是一个用于分析二进制文件的python框架。它结合了静态和动态符号(“concolic”)分析,以达到最大化代码覆盖率,适用于各种任务。通过对vex中间语言引入angr,可以进行跨平台的二进制代码分析。angr使用valgrind的libvex库来提升代码的表示层面,通过pyvex中间语言为生成的ir对象提供pythonic接口,可以实现目的性更强的分析,如函数列表忽略和自定义钩子函数进行跨架构的二进制转换。

其中,已知漏洞包括危险函数导致的栈溢出漏洞、格式化字符串漏洞或释放后利用类堆溢出漏洞,本发明针对三种漏洞分别进行检测,建立了具有各自特征的漏洞模型,进而得到对应的检测系统,具体的:

(1)危险函数导致的栈溢出漏洞

几种栈溢出漏洞的本质是一样的,但是源程序使用经典的危险函数会在函数名上明确地体现出来,于是将其作为单独的一种分类来探讨。但并非所有的危险函数都会触发栈溢出漏洞,于是基于危险函数的定义(即对于传递参数没有进行长度验证),从函数名和函数所传递的参数两方面入手,建立对应的漏洞模式。

危险函数造成漏洞的前提条件具特定的共同性,简化地说就是函数堆栈行为中的源参数对应的缓冲区大小大于目的参数。以输入函数scanf和字符串处理函数strcpy函数举例。使用scanf函数对一个字符串数组进行赋值,假设数组长度为arrylen,用户输入的字符串长度为inputlen,一旦用户输入的字符串长度比数组本身长度大,即arrylen>inputlen,就会造成溢出。而对于strcpy函数,假设被复制数组长度为srclen,复制数组长度为dstlen,如果srclen>dstlen,那么如果该函数被调用就有溢出的可能。所以针对每种不同的危险函数,建立了具有各自特征的漏洞模型。

(2)格式化字符串漏洞

格式化字符串漏洞能够精准控制栈溢出的点,造成极大的危害。其判定方法较为简单,即用户输入中能否不受限地使用格式化字符%,若能,则攻击者可以构建不同的格式化字符串实现获取堆栈区内存信息甚至将特定内容写入内存。而用户能不受限输入有效的格式化字符。在c语言源码中出现该类漏洞的重要条件是需要printf族函数,而且在该函数对应代码的参数中不带有预置的格式化字符。

(3)释放后利用类堆溢出漏洞

堆溢出漏洞相对比较复杂,各种环境堆的实现都不完全相同,利用过程也较为复杂。useafterfree类堆溢出原理如下:一块内存区域被分配,并且有一个指针指向它;内存区域被释放,但是指针是可用的;指针被使用,并访问之前释放掉的内存。在源码层面中,当一类不指向任何合法的或者有效的(与指针的含义不符)的对象的指针即悬空指针出现时,有很大概率出现该类堆溢出漏洞。一个很明显的特征就是指针有没有置空操作。

vex是valgrind的核心jit,它取消了机器代码块,将其交给工具进行检测并重新编译结果,然后将检测版本链接到正在运行的映像中。通过使用目标独立的中间表示,它将工具与底层指令集的复杂性隔离开来。vexir是一种与架构无关的中间表示式(intermediaterepresentation)。与某些系统中类似vex的irs不同,vex不像汇编语言,相反,它可能更像在编译器中使用的ir。

代码转译为vex后被分成许多小的代码块即“irsb”(superblocks)。每个代码块通常表示为1到50条指令,这些指令描述了变量类型、状态值和跳转地址的信息。根据指令含义的不同,vex指令具有语句(statements)和表达式(expressions)两种类型,语句指令伴随副作用,一般有从寄存器写入、缓存和变量赋值等操作。表达式语句没有副作用,包括算术操作、读取内存和常量表示等操作。要操作寄存器的值,必须先将从寄存器的状态值读取(get)到一个临时变量中去,然后,可以将它们写回(put)从寄存器状态去。为了理解vex的转译过程和指令含义,以一条x86指令addl%eax,%ebx为例,其转译的irsb如表1所示:

表1一条x86指令的vex转译结果

从表1例子中的语句可以看出,ir是一串序列化的指令,包括以下几点:

·put/get

·arithmetic

·exit(nowunconditional)

实际上还包括形如if(cond){statements}else{statements}#withhint的控制流语句。因此,由vex进行的内存读写和算术运算等指令能够建立起可执行程序数据流的静态分析,确定函数输入与输出之间的联系,实现函数功能的静态表述。同时,vexir自身实现了嵌套的二进制控制流图,一定程度上恢复了程序的执行流,有利于后续算法理解程序逻辑语义和上下文信息并建立相应的漏洞模型。

s2将所述vex文本切割成若干个文本片段,并提取所述文本片段的关键字,并将所有文本片段进行序列化;

为了进一步处理并提供统一长度的输入向量,需要对各种长度的向量进行填充和截断。由于原始数据是一个巨大的文本文件,需要将其切割成较小的可输入文本序列,为保证序列与程序段的对应,以ir块为单位切割比较合理,这样形成的文本向量有一定的长度差异。为了平衡向量的长度和过度稀疏度,应该选择合适的长度进行填充和截断处理,对于短向量使用零来进行序列结束填充,如图3所示,定位粒度为superblock。

对由有漏洞的源代码经过vexcompiler转译形成的vexir,其中,包含了各种类似于寄存器写入、内存存储和赋值到临时变量的操作,为了从其中抽象出恶意行为的操作过程并将其表述出来,参考了gascon等学者关于使用函数调用图进行机器学习分类的算法研究,该算法通过判定运行时刻的函数调用逻辑结构以及大量行为特征图之间的相似之处,来识别出恶意行为。考虑到危险函数的调用及恶意程序的跳转必然会发生函数调用,以简化vexir为目的,从中提取对程序控制流有实际影响的操作,同时还需要保留一些关键的算术和逻辑操作,以表示函数调用时发生的运行堆栈环境变化。

参考valgrin及相关文档,最终选取了1100个相关操作的指令作为vexir的过程描述,它们保留了必要的vexir结构信息和语义信息,为此必须遍历vexir从中寻找这些指令并允许它们的ir块以某种顺序组合成序列化的形式。首先,由于转译后vexir保留了程序执行过程中的所有操作信息,需要过滤掉如库函数等与研究无关的的程序段,即把重点放在漏洞更为集中的原始代码块中。在剩下的ir块中使用dft(深度优先遍历)将相关的指令提取出来,并从上到下以深度优先搜索的顺序排列,这其实包含了关于指令序列的上下文顺序包含了一定的漏洞信息的假设。

对于一个ir块,提取其关键指令并将其序列化,如图7所示,会形成如:

[imark,wrtmp,16uto32,wrtmp,get:i32,wrtmp,get:i32,put,…]的形式。

将这个文本向量视为具有语义含义的“句子”,其语义意义由向量的元素及其序列组成。以表2为例,一条x86指令addl%eax,%ebx转译形成的vexir如左边所示,将其中的ir语句及ir指令关键字剔选出来,产生如右边的序列化关键字(keyword)。

表2vexir关键字抽取示意

s3使用word2vec将序列化后的文本片段的关键字转化为具有上下文语义的文本向量;

除了结构信息之外,还需要通过字嵌入来保留vex语义。词嵌入将输入序列的每个“单词”表示为固定维度的密集向量。为了允许算法充分利用节点之间的上下文依赖信息,word2vec使用连续词袋(cbow)模型将文本序列中的每个元素转化为多维的词向量。

对序列化的vex使用word2vec,首先要将vex语法定义及大量vex原始文本作为word2vec要学习的语料库,通过无监督的学习建立词嵌入模型。经过词嵌入模型的转化,文本元素将变为具有语义的矢量表示,在vex中具有相似上下文的元素通常位于矢量空间的相邻位置。对word2vec的嵌入学习进行可视化,并使用主成分分析(pca)将嵌入投影到二维平面。从图2中可以看到不同类型的元素被形成了彼此分离的集群。

word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。

s4将所述文本向量转化为数字向量,并保存相关文件作为bi-lstm网络模型的输入,分别设置训练数据集和验证数据集对bi-lstm网络模型进行训练和验证,返回训练集与验证集上的误差率和相关记录字典;

显然,不同的文本序列能唯一地标识出各种机器指令,扩而概之,将这些序列的组合隐含着程序原有的逻辑语义和上下文信息。以这些文本向量为基础,还需要构建能够作为随后ml算法输入的数字向量,做法是将这些文本向量的元素唯一地映射到一个整数,为此,构建了一个映射对象,将这些整数充当“标记”,唯一地标识每个文本元素。这个映射对象的关键在于如何安排关键字的顺序使之能够合理的表示出程序的语义信息,做法是将逻辑相近的操作映射到间距较小的整数上,比如add、sub一类的算术操作或是get、put之类的存储操作,具体的,将各个关键字映射到1-1100的整数,保存为csv文件,得到作为长短期记忆网络的输入向量,如图4和6所示。

将上下文的概念引入vex中间语言设置中,观察到程序函数调用的参数经常是受到程序中较早操作的影响,也可能受到程序中较晚操作的影响。一行代码是否包含漏洞取决于上下文,考虑到上下文在自然语言处理中的重要性,用于自然语言处理的神经网络同样适用于漏洞检测。

循环神经网络(rnn)在时序上处理序列上,通常是在输入和目标之间添加延迟给网络加入未来的上下文信息,使得上下文信息不能得到较好利用。为了捕捉输入序列中每一个点的完整的过去和未来的上下文信息,对时间序列分别向前和向后训练两个循环神经网络的双向循环神经网络(bi-rnn)。作为bi-rnn的变体的双向长短时记忆循环神经网络(bi-lstm[31])本质上类似但捕获更长的依赖性。

设计好的bi-lstm将用于捕捉vex操作指令之间的长期依赖关系,即程序逻辑和语义结构形成的上下文联系,这层关系对漏洞检测至关重要,因为易受攻击的代码片段的出现通常与先前或后续代码有关,甚至同时与两者有关。这些代码片段通常包含多行代码,而这些代码可以分布于多个函数中,在许多情况下,很难确定是哪一行代码实质上导致了漏洞。双向长短时记忆循环神经网络可帮助检测序列前向和后向的长期依赖性,并有效地捕获易受攻击的编程模式。整个框架的运行流程如图5。

其具体步骤如下:

(1)从可执行程序转译形成的vex序列化为文本向量,其中,65%的文本向量作为训练集,20%的文本向量作为验证集,15%的文本向量作为测试集。

(2)在keras框架下搭建bi-lstm模型。模型由多个网络层通过add()堆叠,其中第一层为嵌入层,其作用为正整数(下标)转换为具有固定大小的向量;第二层和第三层共同构成bi-lstm层;第四层为全连接层,使用的激活函数为tanh函数,最后一层是输出层,即输出漏洞类型概率。

(3)完成模型的搭建后,编译模型,同时使用callback(回调)参数实时保存训练模型和训练参数。编译完成后,用vex文本向量训练模型,返回值包括:训练集与验证集上的误差率、记录字典。

(4)预测15%的文本向量,以混淆矩阵、准确度、召回率、f1值来检验bi-lstm的泛化性能。

(5)设置检验指标,利用预测数据集检验bi-lstm网络的泛化性。

预测15%的测试文本向量,以混淆矩阵、准确度、召回率、f1值来检验bi-lstm的泛化性能。

进一步的,本发明还采用软件sqlite3的源码进行可执行程序转译,提取vex关键字,序列化映射到整数后对其进行测试。

sqlite,是一款轻型的数据库,是遵守acid的关系型数据库管理系统,它包含在一个相对小的c库中。它是d.richardhipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百k的内存就够了。它能够支持windows/linux/unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如tcl、c#、php、java等,还有odbc接口,同样比起mysql、postgresql这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。sqlite第一个alpha版本诞生于2000年5月。至2019年已经有19个年头,sqlite也迎来了一个版本sqlite3已经发布。

在上述方法的基础上,本发明做出的实验结果和分析的具体步骤为:

首先,数据集处理:实验针对数量多,进程流种类广泛的,由gcc编译器编译得到的二进制文件进行漏洞特征抽取,并建立深度学习样本集采用bi-lstm算法进行训练,最终选用代码量20万行的sqlite3进行模拟漏洞挖掘测试,并得到结果。

收集代码量中等,具备已知漏洞的可执行程序进行valgrind转译,获得转译后的vexir文本,将文本文件分割成txt片段转换成csv格式的数据集,最后将csv数据集按照有漏洞特征和无漏洞特征进行分类,分别作为bi-lstm算法的样本输入。

vex的产生也是带有一定导向的,它可以表示出每一条机器指令对机器产生的影响,程序都走过了哪些路径等等,这样对于在测试中帮助程序改变所走路径,到达程序的高的覆盖率很有帮助。代码被分解成多个小的代码块(“superblock”,type:irsb)。irsb是单入口多出口的。

由于不仅需要检测程序是否易受攻击,而且还需要确定漏洞的位置,因此需要更细的粒度来进行基于深度学习的漏洞检测。这意味着漏洞检测不应该在程序或函数级别进行,这是非常粗粒度的,因为程序或函数可能有很多行代码,确定其漏洞位置本身就是一项困难的任务。这里粒度为superblock。

删除掉vexir中的无用信息,并在头部添加函数名,将获得的关键字序列化,形成具有上下文语意的文本向量,如图7所示。

这些文本向量由[imark,wrtmp,16uto32,wrtmp,get:i32,wrtmp,get:i32,put,…],imark为关键字,这样的顺序上下文组成,这些元素的顺序唯一地表述了程序的逻辑语义,更重要的是,元素之间存在着依赖关系,利用bi-lstm学习这些元素逻辑语序和相互依赖关系,实现漏洞预测。

双向lstm的输入向量一般为数字向量,将各个关键字映射到1-1100的整数,保存为csv文件,得到作为长短期记忆网络的输入向量。

为了避免在不同的二进制可执行程序中,危险函数地址的变化对检测结果带来干扰,即地址被识别为漏洞特征而不是危险函数的调用被识别为漏洞特征,编写工具制作出危险函数和函数地址的映射表。

(2)训练bi-lstm神经树

向量表示标志数目设置为294,batch_size设置为64,epochs设置为55;损失函数采用binary_crossentropy,模型训练的优化器为rmsprop;verbose=2,即为每个epoch输出一行记录。

batchsize定义:一次训练所选取的样本数。batchsize的大小影响模型的优化程度和速度。同时其直接影响到gpu内存的使用情况,假如你gpu内存不大,该数值最好设置小一点;

epoch:1个epoch表示过了1遍训练集中的所有样本。

rmsprop全称rootmeansquareprop算法,和动量方法一样都可以加快梯度下降速度。

本实施例中,数据集大小为1923,向量维度填充为294维,其中1249个作为训练集(65%),384个作为验证集(20%),290个作为测试集(15%)。

如图8所示:模型初始化后,进入模型编译阶段,用来训练的样本数为1249,用来验证的样本数为384。接下来开始55轮迭代训练,当精度等指标提升过小,认为到达最优点停止训练加快速度。

如图9,模型的细节显示:模型一共5层,前两层输出3d张量,后3层输出2d张量,第三列的param代表训练数量。经过每一层后的数据维度分别为(1093,294,64),(1093,294,128),(1093,128),(1093,64),(1093,1)。

(3)泛化性能检验将sqlite3的可执行文件用valgrind处理出vex中间语言,将关键字序列化后映射到整数,作为bi-lstm的输入,对于sqlite3漏洞检测得到最后的结果如图10所示。

运行出来的结果显示出,一共预测了254个数据,其中,198个为non-vulnerable,56个为vulnerable数据,混淆矩阵表示:准确预测出196个non-vulnerable(无漏洞),误报了2个;43分vulnerable(有漏洞)数据被准确预测,有13个漏报。non-vulnerable数据预测的准确率为0.94,recall是指新的一轮对相关内容的预测中预测正确率占比,non-vulnerable的recall值高达100%。f1-score值为精确率和召回率的调和均值,在对non-vulnerable的预测中占0.99,说明non-vulnerable数据预测效果好。vulnerable数据预测的准确率较高,但召回率较低。考虑到vulnerable数据量较小,总体预测准确率高。在更大的漏洞数据下,模型能获得更好的效果。

其中,datasetratio(non-vul:vul)表示放入的训练数据中没有漏洞的函数和有漏洞的函数的总量比值,precision(non-vul)表示系统在预测测试集中没有漏洞的函数是否有漏洞的准确率,precision(vul)表示系统在预测测试集中有漏洞的函数是否有漏洞的准确率。数据证明,在不同数据集的训练下,测量系统的测量结果在一定误差允许下较准确。

因此,本发明针对软件二进制漏洞提出了一种基于深度学习的跨平台并能遍历执行流的检测方法,该方法通过对vrigrind软件中vexir中间语言的进一步探索和使用,利用bi-lstm神经网络,并引入angr与word2vec框架,相对常见基于程序和函数级别的检测方法能以更细的粒度来进行基于深度学习的检测,并更精确地确定漏洞的位置,提高漏洞识别的准确性。最终实现将二进制可执行程序作为输入,以返回函数漏洞概率作为结果。

另一方面,本发明还提供一种基于可执行程序的漏洞检测方法实现的检测系统,包括:

文本转换模块,用于采集具有已知漏洞的二进制可执行程序,采用支持angr框架的vex中间语言将二进制可执行程序转译为vex文本;

文本切割模块,用于将所述vex文本切割成若干个文本片段,并提取所述文本片段的关键字,并将所有文本片段进行序列化;

文本语义转化模块,用于使用word2vec将序列化后的文本片段的关键字转化为具有上下文语义的文本向量;

向量转化模块,用于将所述文本向量转化为数字向量,并保存相关文件作为bi-lstm网络模型的输入,

模型训练模块,用于分别设置训练数据集和验证数据集对bi-lstm网络模型进行训练和验证,返回训练集与验证集上的误差率和相关记录字典;

测试模块,用于设置检验指标,利用预测数据集检验bi-lstm网络的泛化性。

另一方面,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述的基于可执行程序的漏洞检测方法。

对于系统/装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者一个操作与另一个实体或者另一个操作区分开来,而不一定要求或者暗示这些实体或者操作之间存在任何这种实际的关系或者顺序。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全应用实施例、或结合应用和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1