论文部分内容阅读
随着信息技术的发展,软件已成为与世界经济、文化、科技、教育和军事发展息息相关的重要元素,广泛地应用于通信、金融、医疗等众多领域。无论是商业软件还是程序员自行开发的小程序,开源代码/组件的使用已经变得越来越普遍,开源已经成为了一种趋势。源代码软件漏洞的影响越来越大,基于开源软件漏洞的网络攻击活动数量在逐年增长。源代码软件漏洞挖掘技术能够针对性的对开源软件进行挖掘,掌握开源软件的漏洞挖掘技术对我国、我军的信息安全具有重大战略意义。论文围绕源代码软件漏洞挖掘中的关键技术展开研究。通过梳理发现,现有的源代码漏洞挖掘方法还不够完善。在静态分析方面,现有方法存在支持的漏洞类型少、挖掘精度低的问题。在动态测试方面,符号执行和模糊测试技术虽然都能挖掘漏洞,但是符号执行存在路径爆炸问题,模糊测试存在覆盖率低、不具备导向性等问题。据此,结合源代码的直接或者间接信息、形式化方法,论文在漏洞静态分析、符号执行以及模糊测试方面展开了研究,主要工作和创新如下:针对多种类源代码软件漏洞静态挖掘问题,论文提出了一种基于程序性质图的源代码软件漏洞挖掘方法。首先利用语法解析器解析源代码,依次生成语法分析树、抽象语法树、控制流图、数据流图;然后聚合抽象语法树、控制流图以及数据流图形成程序性质图,并定义程序性质图的基本遍历方式;最后,根据多种源代码漏洞的描述,在组合程序性质图遍历方式的基础上挖掘漏洞。实验结果表明,该方法能有效的检测各种类型的源代码漏洞。针对缓冲区溢出漏洞挖掘精度问题,论文提出了一种基于机器学习的缓冲区溢出漏洞挖掘方法。该方法首先总结了7类缓冲区溢出漏洞静态特征,分别为sink类型、缓冲区位置、容器、索引/地址/长度复杂度、边界检测、循环/条件/函数调用深度以及是否输入可控;然后,通过扩展的程序性质图检测缓冲区溢出漏洞的各类性质并将其向量化;然后利用有监督机器学习算法在已标记的训练集上训练分类器;最后利用此分类器在新的源代码程序中挖掘缓冲区溢出漏洞。实验结果表明,相对于其他静态分析工具,该方法能在较低误报的情况下挖掘漏洞。针对模糊测试导向问题,论文提出了一种基于细粒度变异的导向模糊测试方法。该方法首先利用导向模糊测试收集测试用例;然后利用时间递归神经网络训练出一个模型,用于判断对靠近目标区域起关键作用的字段,同时收集每个字段的权重;最后,通过上述模型判断当前测试用例的关键字段,并利用关键字段权重进行细粒度的变异生成测试用例。实验结果表明,相对于导向模糊测试以及普通的模糊测试,该方法能更有效的导向目标区域并发现漏洞。针对符号执行循环程序时出现的路径爆炸问题,论文提出了一种结合静态程序分析的高效符号执行技术。首先,该技术通过静态程序分析方法,从程序的控制流图中计算出循环程序的不变式;然后,对程序进行插桩,用循环不变式代替循环形成新的控制流图;最后,在新的控制流图上进行符号执行。对比实验表明,该方法比单纯的符号执行以及对循环进行定长展开的符号执行发现更多的漏洞,并且耗费的时间更少。