论文部分内容阅读
传统的软件漏洞挖掘技术是包括模糊测试、符号执行、模型检测和污点分析等在内的技术。近年来,大数据和机器学习的兴起又引导了新一轮的软件漏洞挖掘技术研究。目前,使用机器学习或数据挖掘进行软件漏洞挖掘的研究主要分为三大类:基于软件度量的漏洞预测技术、基于异常检测的漏洞预测技术及基于漏洞代码模式识别的漏洞预测技术等。但是,先前的大多数研究都是针对源代码的,只有很少一部分是针对二进制软件的。并且,大多数的研究都是基于粗粒度的,以软件组件为粒度的漏洞挖掘不利于精确定位到漏洞的具体位置,以函数为粒度的漏洞挖掘将漏洞模式局限在函数内部。本文主要研究了以下内容:(1)分析当前主流的软件漏洞的产生原因,总结缓冲区溢出、整数溢出、释放后重用漏洞在汇编层面上的特点,了解程序运行时可能接收到的信号以及部分软件保护机制,通过静态分析和动态分析的常用手段实现对程序进行跟踪和自动化分析。(2)在样本收集方面,本文认为函数调用序列不足以刻画漏洞,因而提出一种基于代码块粒度的样本收集方法,创新性地以汇编代码块为粒度,对于漏洞程序,提取从数据引入到程序崩溃之间的代码片段;对于正常程序,提取从数据引入点到程序退出之间的代码片段。在提取的过程中,解决由程序开启所有安全保护而导致无法提取PLT表的问题,并提出基于代码块分簇的降循环算法来降低相同代码片段的循环次数。针对样本收集不平衡的问题,本文提出了一种针对汇编代码块的过采样技术。(3)针对汇编代码块序列,本文设计了基于Block2Vec的机器学习模型。先前的工作是以每条汇编指令为单位作为Doc2Vec模型的输入,而本文以基本块为单位作为Doc2Vec模型的输入,因此称为Block2Vec。在Doc2Vec模型的训练上,本文将收集到的所有程序的所有汇编代码块的去重集合作为训练数据。训练完成之后对样本中的每个代码块进行向量表示,相同模式的代码块在经过Doc2Vec模型表示之后的结果是相近的,最后通过级联和统一维度处理得到该样本的向量表示。为了测试汇编代码块序列样本的效果,本文构建了LSTM网络和Text-CNN网络,将汇编代码块序列样本和函数调用序列样本经过上述相同的处理,分别训练LSTM分类模型和TextCNN分类模型,结果表明使用汇编代码块序列作为样本的Text-CNN模型效果较好,准确率达到96.3%。