本发明专利技术公开了一种基于静态分析和动态分析的软件漏洞检测方法,涉及软件漏洞挖掘技术领域,包括步骤1:对目标程序源代码进行预处理;步骤2:对函数进行切分并进行向量化;步骤3:使用向量化的程序语句语料库训练神经网络;步骤4:对源代码使用训练阶段获取的模型进行漏洞检测;步骤5:定向模糊测试框架提取代码依赖关系,并结合控制流图和函数调用图计算目标程序中各基本块到达可疑代码区域的距离;步骤6:编译源代码并记录基本块到可疑代码区域的距离;步骤7:对可执行文件进行动态测试,并使用路径搜索算法优化的符号执行技术辅助模糊测试执行;步骤8:分析程序崩溃,判断是否为软件漏洞。本发明专利技术可提升漏洞检测效率和准确性。本发明专利技术可提升漏洞检测效率和准确性。本发明专利技术可提升漏洞检测效率和准确性。
【技术实现步骤摘要】
一种基于静态分析和动态分析的软件漏洞检测方法
[0001]本专利技术涉及软件漏洞挖掘
,更具体地说,涉及一种基于静态分析和动态分析的软件漏洞检测方法。
技术介绍
[0002]目前,漏洞检测技术可分为静态检测技术和动态检测技术两类。静态检测技术主要通过代码相似性、模式匹配以及深度学习的方法识别代码中存在的漏洞;动态检测技术主要通过灰盒模糊测试、动态符号执行和动态污点分析技术进行软件漏洞检测。当前这些技术仍然面临以下几个问题:
[0003]深度学习方法中存在的不足:
[0004]1)代码表征不恰当导致信息丢失。
[0005]深度学习中通常使用自然语言处理技术对程序源代码进行处理和表征,然后学习代码特征并进行分类。常见的处理方法有两类:a)将源代码直接当作自然语言进行处理。b)将中间表示转换成序列。直接当作自然语言忽视了源代码中包含的逻辑结构的特征,会损失代码的结构信息;中间表示转换成序列,如直接使用token序列,虽然利用了源代码的词法和语法结构信息,但是序列化的中间表示缺少了源代码的结构化信息。
[0006]2)深度学习检测到的漏洞存在较高的误报率。
[0007]近年来,对源代码的静态检测大多采用深度学习的方法,但是这些方法相较于动态检测技术中的模糊测试、符号执行等技术误报率较高。深度学习模型易造成过拟合或欠拟合导致模型在训练集和测试集上效果较好,但在真实应用程序源代码中漏洞检测查准率较低。
[0008]下面两个是定向模糊测试中存在的不足:
[0009]3)不能自动标记目标区域(可能存在漏洞的代码行)。
[0010]定向模糊测试需要先对目标区域进行手动标记。常见方式是依赖目标区域的先验知识进行标记,比如Git提交日志信息、bug跟踪报告信息或CVE漏洞描述中的语义信息,来帮助识别代码中可能存在漏洞的函数、关键代码,然后将这些位置设为目标区域。对于代码复杂度高的应用程序,此类需要人工进行标记的方法将耗费大量时间。
[0011]4)定向模糊测试中,随机变异难以生成通过复杂校验的测试用例。
[0012]模糊测试采用随机变异的方式生成种子,但在程序代码中通常存在大量的校验语句,如魔术字节、复杂嵌套校验等。随机变异能够快速生成到达浅层代码区域的种子,但是到达深层代码区域的种子难以在短时间内生成。当前对模糊测试变异策略的优化方法主要有启发式算法选择变异算子、识别输入数据的字段类型、污点分析确定关键突变位置、优化变异算子的执行时间等。这些方法虽然较原有方法都降低了部分突变的随机性,但仍然使用变异方式生成测试用例,相较于约束求解方式生成能通过复杂校验条件的测试用例的效率较低。
技术实现思路
[0013]本专利技术要解决的技术问题是提供一种基于静态分析和动态分析的软件漏洞检测方法,用于弥补源代码静态漏洞检测误报率较高以及定向模糊测试需人工指定可疑代码区域和难以通过复杂校验语句的不足。当获取到目标程序的源代码之后,本方法能够通过神经网络确定可能存在漏洞的可疑代码区域,获取到可疑代码区域后,定向模糊测试使用动态执行的方式对可疑代码区域进行漏洞检测,提升漏洞检测效率和准确性。
[0014]为了达到上述目的,本专利技术采取以下技术方案:
[0015]一种基于静态分析和动态分析的软件漏洞检测方法,包括以下步骤:
[0016]步骤1:对目标程序源代码进行预处理;
[0017]步骤2:对函数进行切分并进行向量化;
[0018]步骤3:使用向量化的程序语句语料库训练神经网络;
[0019]步骤4:对源代码使用训练阶段获取的模型进行漏洞检测;
[0020]步骤5:定向模糊测试框架提取代码依赖关系,并结合控制流图和函数调用图计算目标程序中各基本块到达可疑代码区域的距离;
[0021]步骤6:编译源代码并记录基本块到可疑代码区域的距离;
[0022]步骤7:对可执行文件进行动态测试,并使用路径搜索算法优化的符号执行技术辅助模糊测试执行;
[0023]步骤8:分析程序崩溃,判断是否为软件漏洞。
[0024]进一步的,步骤1中,使用源代码分析工具提取训练集中的函数,然后根据函数构建包含程序控制流关系和数据流关系的程序依赖图。
[0025]进一步的,步骤2中,获取到训练集中的函数后,将函数当作自然语言中的一个语句,对函数进一步分词,获取神经网络训练语料库;使用分词构建程序代码关系图,通过Word2Vec模型将图中的节点内容映射成数值向量,得到关系图中节点的初始表示。
[0026]进一步的,步骤3中,给向量化的程序代码关系图打标签,然后输入到神经网络进行训练,训练结束后将模型保存到本地,便于检测阶段使用。
[0027]进一步的,步骤4中,对于目标程序的待测源代码,先通过预处理进行函数切分,然后提取程序依赖图并进行向量化,最后将向量化后的代码图输入到测试阶段训练好的模型中进行测试,模型输出目标程序源代码中可能存在漏洞的代码位置。
[0028]进一步的,步骤6中,使用LLVM Pass进行编译插桩,插桩代码用于记录程序运行过程中基本块之间的跳转关系,并在基本块中插入各个基本块到达可疑代码区域的距离值。
[0029]进一步的,步骤7中,生成可执行文件后,通过初始种子集进行测试;测试时使用遗传算法,对于突变后能够发现程序崩溃的种子进行进一步测试,同时使用符号执行技术辅助模糊测试运行;符号执行技术使用未执行路径优先排序算法进行优化,该算法首先需要计算分支概率、然后计算路径概率。
[0030]进一步的,分支概率的计算方式如下:
[0031][0032]其中,br
i
和br
j
表示具有相同起始基本块的分支;hitCounts(br
i
)和hitCounts(br
j
)分别表示分支br
i
和br
j
被执行的次数;该执行次数通过对模糊测试运行时信息进行采样获取。
[0033]进一步的,路径概率计算方式如下:
[0034][0035]其中,path表示某条执行路径,p(br
i
)代表执行路径上每条分支的概率;路径path被执行的概率probability(path)使用执行路径上分支概率的乘积表示;
[0036]未执行路径进行优先级计算方式如下:
[0037][0038]其中priorityScore(p)表示路径p的优先级分数,length(p)表示路径p的长度,probability(p)表示路径p被模糊测试所执行的概率,k表示路径长度调节因子,默认值为1,m表示路径概率调节因子,默认值为1。
[0039]进一步的,步骤8中,将生成的能够触发程序崩溃的测试用例重新运行,并跟踪堆栈信息以检测目标程序中存在的漏洞;若为软件漏洞,则记录该漏洞的代码位置、堆栈信息、能够触发漏洞的PoC信息。
[0040]本专利技术相对于现有本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种基于静态分析和动态分析的软件漏洞检测方法,其特征在于,包括以下步骤:步骤1:对目标程序源代码进行预处理;步骤2:对函数进行切分并进行向量化;步骤3:使用向量化的程序语句语料库训练神经网络;步骤4:对源代码使用训练阶段获取的模型进行漏洞检测;步骤5:定向模糊测试框架提取代码依赖关系,并结合控制流图和函数调用图计算目标程序中各基本块到达可疑代码区域的距离;步骤6:编译源代码并记录基本块到可疑代码区域的距离;步骤7:对可执行文件进行动态测试,并使用路径搜索算法优化的符号执行技术辅助模糊测试执行;步骤8:分析程序崩溃,判断是否为软件漏洞。2.根据权利要求1所述基于静态分析和动态分析的软件漏洞检测方法,其特征在于,步骤1中,使用源代码分析工具提取训练集中的函数,然后根据函数构建包含程序控制流关系和数据流关系的程序依赖图。3.根据权利要求2所述基于静态分析和动态分析的软件漏洞检测方法,其特征在于,步骤2中,获取到训练集中的函数后,将函数当作自然语言中的一个语句,对函数进一步分词,获取神经网络训练语料库;使用分词构建程序代码关系图,通过Word2Vec模型将图中的节点内容映射成数值向量,得到关系图中节点的初始表示。4.根据权利要求3所述基于静态分析和动态分析的软件漏洞检测方法,其特征在于,步骤3中,给向量化的程序代码关系图打标签,然后输入到神经网络进行训练,训练结束后将模型保存到本地,便于检测阶段使用。5.根据权利要求4所述基于静态分析和动态分析的软件漏洞检测方法,其特征在于,步骤4中,对于目标程序的待测源代码,先通过预处理进行函数切分,然后提取程序依赖图并进行向量化,最后将向量化后的代码图输入到测试阶段训练好的模型中进行测试,模型输出目标程序源代码中可能存在漏洞的代码位置。6.根据权利要求5所述基于静态分析和动态分析的软件漏洞检测方法,其特征在于,步骤6中,使用LLVM Pass进行编译插桩,插桩代码用于记录程序运行过程中基本块之间的跳转关系,并在...
【专利技术属性】
技术研发人员:范永陈,许少年,陈坚利,王炎,潘艺宁,王晓楠,
申请(专利权)人:天翼云科技有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。