0018](3)在测试用例集合中保存所有生成的测试用例,每生成一个新用例,需要通过用例选择模块为其打分,选取测试用例执行时,选择出得分最高的用例;
[0019](4)将得分最高的用例继续传递给污点分析过程模块,循环进行后续工作,直到所有生成的测试用例都执行完成。
[0020]基于模式的动态漏洞挖据集成方法,实现步骤如下:
[0021](I)首先,将可执行的二进制程序以及种子测试用例作为参数选项传递给整个集成系统。二进制程序作为被测试的目标,种子测试用例作为初始测试用例,为后续生成新的用例提供基础数据。
[0022](2)动态污点分析模块对被测试二进制程序进行操作:将测试用例标记为污点数据,针对二进制程序做插粧操作,跟踪污点数据在程序中的传播路径。由于此模块是基于特定的漏洞模式设计的,在动态跟踪的过程中,可以标记出与漏洞类型相关的危险操作,最终得到符号化的污点数据传播踪迹,最终将结果传递回管理模块。
[0023](3)管理模块将符号化的污点数据传播踪迹传递给约束求解模块,进行约束求解操作,并通过对分支路径进行取反操作,生成新的测试用例。同时管理模块会将新生成的测试用例保存下来。
[0024](4)路径选择模块会计算所有测试用例在执行时会覆盖二进制程序中还未被覆盖的代码块的代码覆盖率,管理模块会选择出得分最高的测试用例优先执行,将此测试用例传递给动态污点分析模块。
[0025](5)重复步骤(2),直到所有的测试用例都执行完。
[0026]本发明与现有技术相比的优点在于:
[0027](I)采用灰盒测试技术。本发明采用灰盒测试技术,结合了白盒测试和黑盒测试的优点。白盒测试是针对源程序进行静态漏洞检测,它能检测到代码中的每条路径和分支,但是检测到的缺陷可能在运行中不能触发。黑盒测试主要针对二进制程序,它是一种动态漏洞挖掘方法,它不需要了解程序内部细节,测试过程有很大的盲目性。灰盒测试既考虑程序结构,又在动态运行中检测漏洞。
[0028](2)支持自动化模糊测试,能够提高测试覆盖率。本发明在对被测试程序进行漏洞挖掘的过程中结合了模糊测试的思想,通过将种子用例变异生成大量有效的测试用例,实现对二进制程序的自动化测试。
[0029](3)能够结合多种漏洞挖掘技术的优点。现有的漏洞挖掘工具很多,如基于符号执行的可疑代码区域查找工具、基于约束求解的动态污点分析工具以及模糊测试工具,这些工具都是漏洞发现和确认的重要工具,但都复杂度很高,覆盖能力不够。本发明是一种集成系统,通过分析不同工具核心技术之间的关联性,对不同工具的中间成果进行集成利用,最终将符号执行技术、动态污点分析技术和模糊测试技术集成,结合了三种方法的优点。
[0030](4)漏洞模式易于扩展,漏洞检测能力可控。由于漏洞类型很多,在对漏洞进行检测时,需要提取出漏洞的具体模式,本系统针对具体的漏洞类型提取出漏洞模式,可以很容易地将该类漏洞以漏洞模式扩展进行漏洞检测系统,具有很好的扩展能力。另外,通过控制漏洞模式的配置。
【附图说明】
[0031 ] 图1为本发明的流水线机制图;
[0032]图2为本发明的功能结构图;
[0033]图3为本发明的系统组成框图。
【具体实施方式】
[0034]下面结合说明书附图,对本发明的【具体实施方式】做详细描述。
[0035]如图1所示,本发明采用任务流水机制,明确不同漏洞挖掘技术及工具之间的交叉验证关系和相互数据支持能力,依据特定的漏洞模式,将漏洞挖掘的核心流程按照流水线的模式进行组织。最终集成了动态污点分析、符号执行和模糊测试三种技术,实现了一种针对二进制程序的动态漏洞挖掘集成系统。
[0036]本发明的功能结构如图2所示,呈现了系统集成的动态污点分析技术、符号执行技术和模糊测试技术之间具体的交互和信息传递过程。首先根据特定的漏洞类型提取漏洞模式,根据漏洞模式设计动态污点分析模块,实现对可执行二进制程序的插粧操作,将输入数据标记为污点数据,跟踪污点数据在程序中的传播踪迹,从而获得程序的结构信息,同时标记出与漏洞模式相关的操作。然后将污点数据的踪迹形成符号化的结果,将结果传递给约束求解器,提取约束条件集合,通过求解计算可以生成新的测试用例,而这些新的测试用例都是通过对约束求解树进行深度遍历得到的,因而大大提高了测试的路径覆盖率,最后将这些测试用例重新输入应用程序中,重复整个流程,这个过程就是模糊测试的过程。
[0037]如图3所示,系统的具体实现步骤如下:
[0038](I)首先,将可执行的二进制程序以及种子测试用例作为参数选项传递给整个集成系统。二进制程序作为被测试的目标,种子测试用例作为初始测试用例,为后续生成新的用例提供基础数据。
[0039](2)动态污点分析模块首先对其进行操作:将测试用例标记为污点数据,针对二进制程序做插粧操作,跟踪污点数据在程序中的传播路径。由于此模块是基于特定的漏洞模式设计的,在动态跟踪的过程中,可以标记出与漏洞类型相关的危险操作,最终得到符号化的污点数据传播踪迹,传递回管理模块。
[0040](3)管理模块将符号化的污点数据传播踪迹传递给约束求解模块,进行约束求解操作,并通过对分支路径进行取反操作,生成新的测试用例。同时管理模块会将新生成的测试用例保存下来。
[0041](4)路径选择模块会计算所有测试用例在执行时会覆盖二进制程序中还未被覆盖的代码块的代码覆盖率,管理模块会选择出得分最高的测试用例优先执行,将此测试用例传递给动态污点分析模块。
[0042](5)重复步骤(2),直到所有的测试用例都执行完。
[0043]下面详细介绍各个模块的实现:
[0044](I)动态污点分析模块:
[0045]动态污点分析模块的实现是基于动态二进制代码插粧技术的。在运行目标二进制程序的同时对其进行插粧,从而跟踪输入数据的读入、传播过程。通过动态监控二进制程序的执行过程,获得污点数据在二进制程序中的执行轨迹,并将我们关心的危险操作标记出来,并将其以符号化的形式输出,得到符号化的污点传播踪迹。
[0046]在污点分析的过程中,我们需要标记出关心的危险操作,此方法的设计和实现是基于具体的漏洞模式的,需要根据具体的漏洞模式设计传播规则。下边以栈溢出型漏洞为例介绍具体实现:
[0047]栈溢出的漏洞模式可以归纳为有一个危险函数和危险函数的参数约束关系,如strncpy (si, s2, len) and strlen (si)〈strlen (s2),表示的含义是如果一个长的字符串 s2被拷贝到一个较短的字符串Si,则一定出现溢出。
[0048]首先,需要利用符号执行技术进行查找,通过路径遍历,确定可以到达当前语句的路径及所需要满足的条件,假设条件是5〈a〈10and 12〈b〈15,那么只有满足当前条件的时候才能够执行危险语句。执行至语句strncpy (sl, s2, len)时,例如strlen (si) = 10,则可能触发栈溢出的条件就是strlen (s2) >10。综合符号执行和漏洞触发条件,可以得到漏洞触发的综合条件是5〈a〈10and 12〈b〈15and strlen (s2) >10。满足这个条件的输入就可以触发漏洞。对于有些漏洞模式而言,可能这个综合条件不能那么确定,则可以对可能触发漏洞的条件的输入变量进行Fuzzing。
[0049]为了使漏洞模式描述更加精确和具有普遍性,漏洞模式以形式化方式描述,以栈溢出为例,栈结构中有两个重要的指针ESP和EBP,其中,栈指针寄存器(ESP),永远指向系统栈最上面一个栈帧的栈顶,而基址指针寄存器(EBP)永远指向系统栈最上面一个栈帧的栈底,它们二者确定了当下这个栈在内存中的确切位置。函数的局部变量在栈中是一个挨着一个排列的,如果这些