1. 引言
研究背景及现存问题:基于代码相似性比较的漏洞检测方法属于静态分析方法,不可避免地存在误报率高的问题,对静态检测方法得到的疑似漏洞代码进行人工分析存在工作量大, 效率低的问题。解决该问题的有效的方案之一是使用导向式模糊测试方法,生成能够执行到疑似漏洞代码位置的测试用例,实现对静态检测结果的动态验证。当前导向式模糊测试多针对源码已知的程序,且对代码在引导模糊测试执行到特定代码位置所起不同作用的考虑并不充分,导致模糊测试的导向式不强。论文研究基于导向式模糊测试的二进制程序漏洞验证方法,对导向式模糊测试技术进行优化,以实现对静态漏洞检测结果的动态验证。
模糊测试技术简介:当前的主流模糊测试方法包括基于覆盖率的模糊测试和导向式模糊测试两个主要方向。其中,将覆盖信息作为反馈指导生成新的测试用例,这种方法被称为基于代码覆盖的模糊测试方法,代表性工具有 AFL(american fuzzy lop)、Angora 和 FairFuzz。而导向式模糊测试方法以目标代码为导向,通过距离等执行反馈信息,生成到达目标区域的测试用例。导向式灰盒测试能够缓解基于覆盖率的方法存在的效率问题以及基于符号执行的模糊测试方法存在的扩展性问题,是发现漏洞的有效方法,已经成功应用于漏洞复现、补丁测试等场景, 是验证基于相似性比较得到的静态检测结果的有效手段。
导向式模糊测试技术存在的挑战:,导向式灰盒模糊测试技术面临两个主要挑战。第一个就是多是以源码已知的程序作为模糊测试的目标,对源码已知的程序在编译时插桩,得到充分的代码信息以提高模糊测试的导向性和有效性,如 AFLGo,而针对源码未知的二进制程序的研究相对较少;第二,对代码在进行导向目标漏洞所起的不同作用考虑并不充分。部分代码引导执行到漏洞代码所起的作用更大,因此在导向式灰盒模糊测试中需要考虑到代码的不均等性,这种代码不均等性已经得到了研究人员的关注,但是这种不均等性多是通过静态分析信息进行表征,如 Hawkeye 和 VUzzer 关注了边的不均等性。实际上动态执行信息更能够反映代码的不均等性,能够指引模糊测试向目标代码区域执行。此外,导向式模糊测试需要先确定目标代码区域。很多导向式模糊测试工具,如 AFLGo 和 Hawkeye 使用手工标记的方法确定目标代码区域。当前的自动化目标定位方法一般聚焦于特定漏洞类型的代码,如释放后重引用 (UAF) 漏洞或者内存访问错误相关的漏洞,通用性不强。因此,需要研究一种更加通用的对目标代码自动化定位的方法。
针对二进制程序的导向式模糊测试方法:为了提高导向式模糊测试的效率,论文考虑到代码在进行导向时的不均等性,基于遗传算法进行导向式模糊测试。将静态分析和动态执行过程中的与代码不均等性相关的反馈作用于新的测试用例的生成。其中,相似性比较的结果可以辅助导向式模糊测试方法对目标代码区域的自动定位,在训练好的语义学习模型基础上,利用代码相似性比较结果对函数进行不同权重的赋值,并结合函数权重和程序的控制流图对基本块进行初始权重赋值,基于遗传算法计算种子的权重并进行子代选择和新的测试用例生成,提高模糊测试的导向性。
2. 整体流程
论文研究的针对二进制程序的导向式模糊测试方法,解决了目标代码区域自动定位的通用方法,同时结合程序动态和静态信息,设计更加容易引导程序执行到目标代码区域的导向策略,并实现了原型系统 VDFuzz。原型系统主要包括目标识别器和导向式模糊测试器两个组成部分,如下图所示。
目标识别器:给定可能存在漏洞的二进制测试程序,论文设计目标识别器,使用代码相似性比较的方法,找到程序中的与已有漏洞相似的代码,从而确定可能存在漏洞的位置,达到目标代码区域自动定位的目的。因此,基于二进制语义学习模型中的特征提取方法,构建更精细的代码语义表征方法。对代码特征进行向量化之后,通过计算语义特征向量之间的距离,得到二进制测试程序与已有漏洞函数之间的相似性得分,相似性得分更高的函数存在漏洞的可能性更大,这些函数作为可能存在漏洞的重点代码片段,结合静态程序分析方法,再基本块和函数级别对不同代码再继续导向时的作用进行表示,作为导向模糊测试的执行目标位置。
导向式模糊测试器:基于代码再引导程