一种基于路径追踪的漏洞检测方法及系统转让专利

申请号 : CN201810643006.9

文献号 : CN109063483B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张世琨高庆邓枭马森

申请人 : 北京大学北京北大软件工程股份有限公司

摘要 :

本发明提供一种基于路径追踪的漏洞检测方法及系统,其中方法包括:对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径;将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。该方法及系统以预设漏洞路径为标准,当且仅当某一个当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,才确定该当前测试用例为能够触发待检测程序中漏洞的测试用例,最终确定的测试用例能够有效检测出待检测程序中的漏洞,克服了现有的模糊测试工具在进行程序漏洞检测时难以确保有效检测出漏洞的问题,一定程度上提高了漏洞检测的效率。

权利要求 :

1.一种基于路径追踪的漏洞检测方法,其特征在于,包括:

对于当前测试用例,获取所述当前测试用例在待检测程序中运行时产生的第一运行路径;

将所述第一运行路径与预设漏洞路径进行匹配,若所述第一运行路径与所述预设漏洞路径完全匹配,则根据所述当前测试用例检测所述待检测程序中的漏洞;

所述将所述第一运行路径与预设漏洞路径进行匹配,之后还包括:若所述第一运行路径与所述预设漏洞路径不完全匹配,则将所述第一运行路径与所述预设漏洞路径之间的匹配长度确定为第一匹配长度,并将第二运行路径与所述预设漏洞路径之间的匹配长度确定为第二匹配长度;

将所述第一匹配长度和所述第二匹配长度进行比对,若所述第一匹配长度大于所述第二匹配长度,则将所述当前测试用例进行变异,并将变异获得的测试用例作为下一次在所述待检测程序中运行的测试用例;

其中,所述第二运行路径为所述当前测试用例变异前的测试用例在所述待检测程序中运行时产生的路径。

2.根据权利要求1所述的方法,其特征在于,所述将所述第一匹配长度和所述第二匹配长度进行比对,之后还包括:若所述第一匹配长度不大于所述第二匹配长度,则将所述当前测试用例变异前的测试用例进行变异,并将变异获得的测试用例作为下一次在所述待检测程序中运行的测试用例。

3.根据权利要求1所述的方法,其特征在于,所述获取所述当前测试用例在待检测程序中运行时产生的第一运行路径,进一步包括:利用动态监控工具获取所述当前测试用例在待检测程序中运行时产生的第一运行路径。

4.根据权利要求1所述的方法,其特征在于,所述将所述第一运行路径与预设漏洞路径进行匹配,之前还包括:采用静态检测技术获取所述待检测程序中所有异常位置;

利用控制流图生成到达所述所有异常位置的调用路径,将所述调用路径确定为所述预设漏洞路径。

5.根据权利要求1所述的方法,其特征在于,所述将所述第一运行路径与预设漏洞路径进行匹配,进一步包括:对于所述漏洞路径中的任一待匹配地址,获取所述待匹配地址的前一个已匹配地址在所述第一运行路径中对应的匹配地址,作为基准地址,从所述基准地址后查找与所述待匹配地址对应的匹配地址;

若满足所述漏洞路径中的所有待匹配地址在所述第一运行路径中均存在对应的匹配地址,则确定所述第一运行路径与预设漏洞路径完全匹配。

6.根据权利要求5所述的方法,其特征在于,所述将所述第一运行路径与预设漏洞路径进行匹配,还包括:若不满足所述漏洞路径中的所有待匹配地址在所述第一运行路径中均存在对应的匹配地址,则确定所述第一运行路径与预设漏洞路径不完全匹配,并将所述预设漏洞路径中已匹配地址的数量确定为所述第一运行路径与所述预设漏洞路径之间的匹配长度。

7.一种基于路径追踪的漏洞检测系统,其特征在于,包括:

路径获取模块,用于对于当前测试用例,获取所述当前测试用例在待检测程序中运行时产生的第一运行路径;

漏洞检测模块,用于将所述第一运行路径与预设漏洞路径进行匹配,若所述第一运行路径与所述预设漏洞路径完全匹配,则根据所述当前测试用例检测所述待检测程序中的漏洞;

其中,漏洞检测模块,还用于:

若所述第一运行路径与所述预设漏洞路径不完全匹配,则将所述第一运行路径与所述预设漏洞路径之间的匹配长度确定为第一匹配长度,并将第二运行路径与所述预设漏洞路径之间的匹配长度确定为第二匹配长度;

将所述第一匹配长度和所述第二匹配长度进行比对,若所述第一匹配长度大于所述第二匹配长度,则将所述当前测试用例进行变异,并将变异获得的测试用例作为下一次在所述待检测程序中运行的测试用例;

其中,所述第二运行路径为所述当前测试用例变异前的测试用例在所述待检测程序中运行时产生的路径。

8.一种基于路径追踪的漏洞检测方法的设备,其特征在于,包括:至少一个处理器;以及

与所述处理器通信连接的至少一个存储器,其中:

所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至6任一所述的方法。

9.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如权利要求1至6任一所述的方法。

说明书 :

一种基于路径追踪的漏洞检测方法及系统

技术领域

[0001] 本发明涉及漏洞检测技术领域,更具体地,涉及一种基于路径追踪的漏洞检测方法及系统。

背景技术

[0002] 模糊测试(Fuzzing)是动态漏洞挖掘领域的核心技术,也是目前业界主流的漏洞挖掘技术。其通过向目标系统提供大量非预期的输入并监视异常结果来发现程序或软件漏洞。
[0003] 近年来有很多关于模糊测试的工具,其中主流的工具为AFL(American Fuzzy Loop),AFL通过对初始的测试样例进行不断变异,来尝试触发被挖掘程序的潜在漏洞。AFL基于覆盖率来进行漏洞检测,采用的是插桩代码导向的遗传算法,其总体思路是:根据自定义的分支覆盖率,来识别局部的程序控制流。具体算法如下:
[0004] 1)将用户提供的初始测试用例装载进队列中。
[0005] 2)从队列中获取下一个输入文件。
[0006] 3)在不影响覆盖效果(覆盖率)的情况下对测试用例进行精简。
[0007] 4)使用模糊策略对测试用例进行变异。
[0008] 5)如果变异导致了插桩状态(即覆盖率)的变化,则将这种变异作为一个新的条目记录到队列中。
[0009] 6)返回步骤2。
[0010] 从上述算法中可以看出,AFL是基于覆盖率的变化确定测试用例的变异方向的,然而,即便变异后的测试用例能够使得覆盖率达到期望值,也并不能确保该变异后的测试用例可以触发被挖掘程序中的潜在漏洞。即,AFL所采用的变异策略为随机方向变异,导致漏洞检测工作存在一定的盲目性,从而影响漏洞检测工作的整体工作效率。

发明内容

[0011] 本发明为了克服现有技术中的模糊测试工具在进行程序漏洞检测时,并不能确保最终变异后的测试用例可以触发被挖掘程序中的潜在漏洞,导致漏洞检测工作的整体工作效率低下的问题,提供一种基于路径追踪的漏洞检测方法及系统。
[0012] 一方面,本发明提供一种基于路径追踪的漏洞检测方法,包括:
[0013] 对于当前测试用例,获取所述当前测试用例在待检测程序中运行时产生的第一运行路径;
[0014] 将所述第一运行路径与预设漏洞路径进行匹配,若所述第一运行路径与所述预设漏洞路径完全匹配,则根据所述当前测试用例检测所述待检测程序中的漏洞。
[0015] 优选地,所述将所述第一运行路径与预设漏洞路径进行匹配,之后还包括:
[0016] 若所述第一运行路径与所述预设漏洞路径不完全匹配,则将所述第一运行路径与所述预设漏洞路径之间的匹配长度确定为第一匹配长度,并将第二运行路径与所述预设漏洞路径之间的匹配长度确定为第二匹配长度;
[0017] 将所述第一匹配长度和所述第二匹配长度进行比对,若所述第一匹配长度大于所述第二匹配长度,则将所述当前测试用例进行变异,并将变异获得的测试用例作为下一次在所述待检测程序中运行的测试用例;
[0018] 其中,所述第二运行路径为所述当前测试用例变异前的测试用例在所述待检测程序中运行时产生的路径。
[0019] 优选地,所述将所述第一匹配长度和所述第二匹配长度进行比对,之后还包括:
[0020] 若所述第一匹配长度不大于所述第二匹配长度,则将所述当前测试用例变异前的测试用例进行变异,并将变异获得的测试用例作为下一次在所述待检测程序中运行的测试用例。
[0021] 优选地,所述获取所述当前测试用例在待检测程序中运行时产生的第一运行路径,进一步包括:
[0022] 利用动态监控工具获取所述当前测试用例在待检测程序中运行时产生的第一运行路径。
[0023] 优选地,所述将所述第一运行路径与预设漏洞路径进行匹配,之前还包括:
[0024] 采用静态检测技术获取所述待检测程序中所有异常位置;
[0025] 利用控制流图生成到达所述所有异常位置的调用路径,将所述调用路径确定为所述预设漏洞路径。
[0026] 优选地,所述将所述第一运行路径与预设漏洞路径进行匹配,进一步包括:
[0027] 对于所述漏洞路径中的任一待匹配地址,获取所述待匹配地址的前一个已匹配地址在所述第一运行路径中对应的匹配地址,作为基准地址,从所述基准地址后查找与所述待匹配地址对应的匹配地址;
[0028] 若满足所述漏洞路径中的所有待匹配地址在所述第一运行路径中均存在对应的匹配地址,则确定所述第一运行路径与预设漏洞路径完全匹配。
[0029] 优选地,所述将所述第一运行路径与预设漏洞路径进行匹配,还包括:
[0030] 若不满足所述漏洞路径中的所有待匹配地址在所述第一运行路径中均存在对应的匹配地址,则确定所述第一运行路径与预设漏洞路径不完全匹配,并将所述预设漏洞路径中已匹配地址的数量确定为所述第一运行路径与所述预设漏洞路径之间的匹配长度。
[0031] 一方面,本发明提供一种基于路径追踪的漏洞检测系统,包括:
[0032] 路径获取模块,用于对于当前测试用例,获取所述当前测试用例在待检测程序中运行时产生的第一运行路径;
[0033] 漏洞检测模块,用于将所述第一运行路径与预设漏洞路径进行匹配,若所述第一运行路径与所述预设漏洞路径完全匹配,则根据所述当前测试用例检测所述待检测程序中的漏洞。
[0034] 一方面,本发明提供一种基于路径追踪的漏洞检测方法的设备,包括:
[0035] 至少一个处理器;以及
[0036] 与所述处理器通信连接的至少一个存储器,其中:
[0037] 所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行上述任一所述的方法。
[0038] 一方面,本发明提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述任一所述的方法。
[0039] 本发明提供的一种基于路径追踪的漏洞检测方法及系统,在待检测程序的漏洞检测过程中,对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径,将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。该方法及系统以预设漏洞路径为标准,由于待检测程序按照预设漏洞路径执行即可检测出待检测程序中的漏洞,因此当且仅当某一个当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,才确定该当前测试用例为能够触发待检测程序中漏洞的测试用例。该方法及系统最终确定的测试用例能够有效检测出待检测程序中的漏洞,克服了现有的模糊测试工具在进行程序漏洞检测时难以确保有效检测出漏洞的问题,一定程度上提高了漏洞检测的效率。

附图说明

[0040] 图1为本发明实施例的一种基于路径追踪的漏洞检测方法的整体流程示意图;
[0041] 图2为本发明实施例的一种基于路径追踪的漏洞检测系统的整体结构示意图;
[0042] 图3为本发明实施例的一种基于路径追踪的漏洞检测方法的设备的结构框架示意图。

具体实施方式

[0043] 下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
[0044] 目前,现有的模糊测试工具在进行漏洞检测时,若将某一个测试用例输入至待检测程序中后导致待检测程序中已执行代码的覆盖率增加,则在该测试用例的基础上进行变异,再将变异后的测试用例输入至待检测程序中,重复执行上述步骤,直至某一变异后的测试用例输入至待检测程序中能够使得待检测程序中已执行代码的覆盖率达到期望值。然而,待检测程序往往存在多个分支结构,覆盖率达到期望值往往仅表示某一分支上的已执行代码的覆盖率达到期望值,若漏洞存在于其他分支,则即便该分支上的覆盖率达到了期望值,也无法检测出漏洞。可以看出,现有的模糊测试工具在进行漏洞检测时存在一定的盲目性,无法确保最终变异后的测试用例能够触发待检测程序中的漏洞。
[0045] 有鉴于此,本发明提供一种基于路径追踪的漏洞检测方法,图1为本发明实施例的一种基于路径追踪的漏洞检测方法的整体流程示意图,如图1所示,本发明提供一种基于路径追踪的漏洞检测方法,包括:
[0046] S1,对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径;
[0047] 具体地,在对待检测程序进行漏洞检测时,需先确定测试用例。本实施例中,采用现有的模糊测试工具AFL默认的初始测试用例“FUZZ”作为初始用例进行变异,生成多个测试用例。在其他实施例中,也可以采用其他方式获得初始测试用例,可以根据实际需求进行设置,此处不做具体限定。此后,可以将多个测试用例依次添加至队列中,再从队列中依次取出每个测试用例进行待检测程序的漏洞检测。
[0048] 将当前从队列中取出的测试用例确定为当前测试用例,对于每一个当前测试用例,将当前测试用例输入至待检测程序中,并获取当前测试用例在待检测程序中运行时产生的第一运行路径。其中,路径是指程序运行时,针对汇编代码跳转关系形成的代码块提取出的多行汇编地址序列,即一个路径包含多行地址,每一行地址代表一个代码块的起始汇编地址。
[0049] S2,将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。
[0050] 具体地,预先设置漏洞路径,待检测程序按照该预设漏洞路径执行即可检测出待检测程序中的漏洞。在此基础上,将上述获得的第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则可确定当前测试用例为能够触发待检测程序中的漏洞的测试用例,最终再根据当前测试用例检测待检测程序中的漏洞。由于待检测程序按照预设漏洞路径执行即可检测出待检测程序中的漏洞,因此若当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,则可确保根据当前测试用例可有效检测出待检测程序中的一个漏洞。
[0051] 需要说明的是,区别于现有的模糊测试工具,采用本实施例的方法进行漏洞检测时,并不是以覆盖率为标准,而是以预设漏洞路径为标准,当且仅当某一个当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,才确定该当前测试用例为能够触发待检测程序中漏洞的测试用例。由于待检测程序按照预设漏洞路径执行即可检测出待检测程序中的漏洞,因此本实施例的方法最终确定的测试用例能够有效检测出待检测程序中的漏洞。
[0052] 本发明提供的一种基于路径追踪的漏洞检测方法,在待检测程序的漏洞检测过程中,对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径,将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。该方法以预设漏洞路径为标准,由于待检测程序按照预设漏洞路径执行即可检测出待检测程序中的漏洞,因此当且仅当某一个当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,才确定该当前测试用例为能够触发待检测程序中漏洞的测试用例。该方法最终确定的测试用例能够有效检测出待检测程序中的漏洞,克服了现有的模糊测试工具在进行程序漏洞检测时难以确保有效检测出漏洞的问题,一定程度上提高了漏洞检测的效率。
[0053] 基于上述任一实施例,提供一种基于路径追踪的漏洞检测方法,将第一运行路径与预设漏洞路径进行匹配,之后还包括:若第一运行路径与预设漏洞路径不完全匹配,则将第一运行路径与预设漏洞路径之间的匹配长度确定为第一匹配长度,并将第二运行路径与预设漏洞路径之间的匹配长度确定为第二匹配长度;将第一匹配长度和第二匹配长度进行比对,若第一匹配长度大于第二匹配长度,则将当前测试用例进行变异,并将变异获得的测试用例作为下一次在待检测程序中运行的测试用例;其中,第二运行路径为当前测试用例变异前的测试用例在待检测程序中运行时产生的路径。
[0054] 具体地,将当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径进行匹配后,若第一运行路径与预设漏洞路径不完全匹配,则将第一运行路径与预设漏洞路径之间的匹配长度确定为第一匹配长度。由于漏洞检测过程中的当前测试用例往往是在前一测试用例的基础上进行变异获得的,在此基础上,获取当前测试用例变异前的测试用例,并将当前测试用例变异前的测试用例在待检测程序中运行时产生的路径确定为第二路径,再将第二运行路径与预设漏洞路径之间的匹配长度确定为第二匹配长度。其中,两个路径之间的匹配长度代表两个路径之间的匹配程度,匹配长度越大,则可确定两个路径之间的匹配程度越高。
[0055] 在此基础上,将第一匹配长度和第二匹配长度进行比对,若第一匹配长度大于第二匹配长度,则可确定当前测试用例相较于当前测试用例变异前的测试用例能够触发待检测程序中的漏洞的几率越大,即可确定将前一测试用例变异成当前测试用例的变异方向是正确的。在此基础上,保留当前测试用例,并在当前测试用例的基础上进行变异,将当前测试用例变异后获得的测试用例作为下一次在待检测程序中运行的测试用例。最终,将当前测试用例变异后获得的测试用例输入至待检测程序中运行,并重复执行上述任一实施例中的方法步骤,直至某一变异后的测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配,再根据该变异后的测试用例检测待检测程序中的漏洞。
[0056] 本发明提供的一种基于路径追踪的漏洞检测方法,在将第一运行路径与预设漏洞路径进行匹配之后,若第一运行路径与预设漏洞路径不完全匹配,则将第一运行路径与预设漏洞路径之间的匹配长度确定为第一匹配长度,并将第二运行路径与预设漏洞路径之间的匹配长度确定为第二匹配长度,其中第二运行路径为当前测试用例变异前的测试用例在待检测程序中运行时产生的路径;再将第一匹配长度和第二匹配长度进行比对,若第一匹配长度大于第二匹配长度,则将当前测试用例进行变异,并将变异获得的测试用例作为下一次在待检测程序中运行的测试用例;最终,将当前测试用例变异后获得的测试用例输入至待检测程序中运行,并重复执行上述任一实施例中的方法步骤,直至某一变异后的测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配,再根据该变异后的测试用例检测待检测程序中的漏洞。该方法通过预设漏洞路径对测试用例的变异方向进行指导,将测试用例的变异方向制约在测试用例对应的运行路径与预设漏洞路径之间的匹配长度增大的方向,能够使得最终变异后的测试用例的运行路径与预设漏洞路径完全匹配,进而利用最终变异后的测试用例可有效检测出待检测程序中的漏洞,一定程度上提高了漏洞检测的效率。
[0057] 基于上述任一实施例,提供一种基于路径追踪的漏洞检测方法,将第一匹配长度和第二匹配长度进行比对,之后还包括:若第一匹配长度不大于第二匹配长度,则将当前测试用例变异前的测试用例进行变异,并将变异获得的测试用例作为下一次在待检测程序中运行的测试用例。
[0058] 具体地,在将第一匹配长度和第二匹配长度进行比对之后,若第一匹配长度不大于第二匹配长度,则可确定当前测试用例相较于当前测试用例变异前的测试用例能够触发待检测程序中的漏洞的几率越小,即可确定将前一测试用例变异成当前测试用例的变异方向是错误的。在此基础上,舍弃当前测试用例,并在当前测试用例变异前的测试用例的基础上进行变异,将变异后获得的测试用例作为下一次在待检测程序中运行的测试用例。最终,将当前测试用例变异前的测试用例在变异后获得的测试用例输入至待检测程序中运行,并重复执行上述任一实施例中的方法步骤,直至某一变异后的测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配,再根据该变异后的测试用例检测待检测程序中的漏洞。
[0059] 本发明提供的一种基于路径追踪的漏洞检测方法,若第一匹配长度不大于第二匹配长度,则将当前测试用例变异前的测试用例进行变异,并将变异获得的测试用例作为下一次在待检测程序中运行的测试用例;最终,将当前测试用例变异前的测试用例在变异后获得的测试用例输入至待检测程序中运行,并重复执行上述任一实施例中的方法步骤,直至某一变异后的测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配,再根据该变异后的测试用例检测待检测程序中的漏洞。该方法通过预设漏洞路径对测试用例的变异方向进行指导,将测试用例的变异方向制约在测试用例对应的运行路径与预设漏洞路径之间的匹配长度增大的方向,能够使得最终变异后的测试用例的运行路径与预设漏洞路径完全匹配,进而利用最终变异后的测试用例可有效检测出待检测程序中的漏洞,一定程度上提高了漏洞检测的效率。
[0060] 基于上述任一实施例,提供一种基于路径追踪的漏洞检测方法,获取当前测试用例在待检测程序中运行时产生的第一运行路径,进一步包括:利用动态监控工具获取当前测试用例在待检测程序中运行时产生的第一运行路径。
[0061] 具体地,在将当前测试用例输入至待检测程序中之后,利用动态监测工具获取当前测试用例在待检测程序中运行时产生的第一运行路径。其中,动态监控工具是一类用来检测程序运行时状态的工具。动态监控工具大多为依靠软件实现的用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码;动态监控工具还可以作为虚拟机监管器模拟全系统,利用其他VMM(Xen,KVM,etc)来使用硬件提供的虚拟化支持,创建接近于主机性能的虚拟机,由此可全面记录程序在虚拟机中的全部运行流程,从而达到监控的目的。目前主流的动态监控工具有QEMU、DynamoRio和Valgrind等,本发明采用QEMU作为动态监控工具,即利用QEMU获取当前测试用例在待检测程序中运行时产生的第一运行路径。在其他实施例中,还可以利用其他动态监测工具,可以根据实际需求进行设置,此处不做具体限定。
[0062] 本发明提供的基于路径追踪的漏洞检测方法,在将当前测试用例输入至待检测程序中之后,利用动态监测工具获取当前测试用例在待检测程序中运行时产生的第一运行路径,有利于将第一运行路径与预设漏洞进行匹配,并在第一运行路径与预设漏洞完全匹配时,确定该当前测试用例为能够触发待检测程序中漏洞的测试用例,最终根据当前测试用例检测待检测程序中的漏洞,能够有效检测出待检测程序中的漏洞,一定程度上提高了漏洞检测的效率。
[0063] 基于上述任一实施例,提供一种基于路径追踪的漏洞检测方法,将第一运行路径与预设漏洞路径进行匹配,之前还包括:采用静态检测技术获取待检测程序中所有异常位置;利用控制流图生成到达所有异常位置的调用路径,将调用路径确定为预设漏洞路径。
[0064] 具体地,在将第一运行路径与预设漏洞路径进行匹配之前,需预先获取待检测程序中的所有异常位置,其中异常位置表示待检测程序在该位置的程序代码可能存在异常。本实施例中,采用静态检测技术获取待检测程序中所有异常位置,其中静态检测技术是指对被测软件的源程序或者二进制代码进行扫描,从语法、语义上理解程序的行为,直接分析被检测程序的特征,寻找可能导致错误的异常。
[0065] 在此基础上,利用控制流图生成到达所有异常位置的调用路径,即通过该调用路径可使得待检测程序在被执行时能够到达待检测程序中的所有异常位置。最终,将获得的调用路径确定为预设漏洞路径。在此基础上,若待检测程序按照该预设漏洞路径执行则可检测出漏洞,即若某个测试用例输入待检测程序中运行的路径与预设漏洞路径完全匹配,则通过该测试用例即可触发待检测程序中的漏洞。
[0066] 本发明提供的基于路径追踪的漏洞检测方法,在将第一运行路径与预设漏洞路径进行匹配之前,采用静态检测技术获取待检测程序中所有异常位置,利用控制流图生成到达所有异常位置的调用路径,将调用路径确定为预设漏洞路径,进而通过预设漏洞路径指导测试用例的变异方向,若变异获得的某个测试用例输入待检测程序中运行的路径与预设漏洞路径完全匹配,则通过该测试用例即可触发待检测程序中的漏洞;有利于准确检测出待检测程序中的漏洞,一定程度上提高了漏洞检测的效率。
[0067] 基于上述任一实施例,提供一种基于路径追踪的漏洞检测方法,将第一运行路径与预设漏洞路径进行匹配,进一步包括:对于漏洞路径中的任一待匹配地址,获取待匹配地址的前一个已匹配地址在第一运行路径中对应的匹配地址,作为基准地址,从基准地址后查找与待匹配地址对应的匹配地址;若满足漏洞路径中的所有待匹配地址在第一运行路径中均存在对应的匹配地址,则确定第一运行路径与预设漏洞路径完全匹配。
[0068] 具体地,由于第一运行路径和预设漏洞路径均为多行地址序列,在将第一运行与预设漏洞路径进行匹配时,对于预设漏洞路径中的任一待匹配地址,即第n(n>1)行待匹配地址,当需要从第一运行路径中查找与第n行待匹配地址对应的匹配地址时,首先获取第n行待匹配地址的前一已匹配地址(即第n-1行待匹配地址)在第一运行路径中对应的匹配地址,并将其作为基准地址。在此之前,已将第n-1行待匹配地址确定为已匹配地址,即已在第一运行路径中查找到与第n-1行待匹配地址对应的匹配地址。
[0069] 在此基础上,在第一运行路径中的基准地址之后的地址中查找与第n行待匹配地址对应的匹配地址。按照此方法在第一运行路径中依次查找与预设漏洞路径中的每一待匹配地址对应的匹配地址,若漏洞路径中的所有待匹配地址在第一运行路径中均存在对应的匹配地址,则确定第一运行路径与预设漏洞路径完全匹配。
[0070] 举例来说,假设预设漏洞路径包含的地址序列为:b,d,f;若第一运行路径包含的地址序列为:a,b,c,d,e,f;则可确定预设漏洞路径中的所有地址在第一运行路径中均存在对应的匹配地址,即第一运行路径也包含了b,d,f,且b,d,f在预设漏洞路径和第一运行路径中的先后顺序相同,由此,可确定第一运行路径与预设漏洞路径完全匹配。
[0071] 本发明提供的一种基于路径追踪的漏洞检测方法,在将第一运行路径与预设漏洞路径进行匹配时,对于漏洞路径中的任一待匹配地址,获取待匹配地址的前一个已匹配地址在第一运行路径中对应的匹配地址,作为基准地址,从基准地址后查找与待匹配地址对应的匹配地址;若满足漏洞路径中的所有待匹配地址在第一运行路径中均存在对应的匹配地址,则确定第一运行路径与预设漏洞路径完全匹配。在此基础上,当且仅当某一个当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,才确定该当前测试用例为能够触发待检测程序中漏洞的测试用例;有利于确保能够有效检测出待检测程序中的漏洞,一定程度上提高了漏洞检测的效率。
[0072] 基于上述任一实施例,提供一种基于路径追踪的漏洞检测方法,将第一运行路径与预设漏洞路径进行匹配,还包括:若不满足漏洞路径中的所有待匹配地址在第一运行路径中均存在对应的匹配地址,则确定第一运行路径与预设漏洞路径不完全匹配,并将预设漏洞路径中已匹配地址的数量确定为第一运行路径与预设漏洞路径之间的匹配长度。
[0073] 具体地,在按照上述实施例中的方法将第一运行路径与预设漏洞路径进行匹配时,若不满足漏洞路径中的所有待匹配地址在第一运行路径中均存在对应的匹配地址,则确定第一运行路径与预设漏洞路径不完全匹配,并将预设漏洞路径中已匹配地址的数量确定为第一运行路径与预设漏洞路径之间的匹配长度。
[0074] 例如,假设预设漏洞路径包含的地址序列为:b,d,f;若第一运行路径包含的地址序列为:a,b,c,d,e;由于第一运行路径中不包含地址f,故而可确定第一运行路径与预设漏洞路径不完全匹配。同时,由于预设漏洞路径中的地址b和d在第一运行路径中存在对应的匹配地址,故而,可将b和d确定为已匹配的地址,最终第一运行路径与预设漏洞路径之间的匹配长度为已匹配的地址的数量,即匹配长度为2。
[0075] 本发明提供的一种基于路径追踪的漏洞检测方法,若不满足漏洞路径中的所有待匹配地址在第一运行路径中均存在对应的匹配地址,则确定第一运行路径与预设漏洞路径不完全匹配,并将预设漏洞路径中已匹配地址的数量确定为第一运行路径与预设漏洞路径之间的匹配长度。在此基础上,将测试用例的变异方向制约在测试用例对应的运行路径与预设漏洞路径之间的匹配长度增大的方向,能够使得最终变异后的测试用例的运行路径与预设漏洞路径完全匹配,进而利用最终变异后的测试用例可有效检测出待检测程序中的漏洞,一定程度上提高了漏洞检测的效率。
[0076] 图2为本发明实施例的一种基于路径追踪的漏洞检测系统的整体结构示意图,如图2所示,基于上述任一实施例,提供一种基于路径追踪的漏洞检测系统,包括:
[0077] 路径获取模块1,用于对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径;
[0078] 具体地,在对待检测程序进行漏洞检测时,需先确定测试用例。本实施例中,采用现有的模糊测试工具AFL默认的初始测试用例“FUZZ”作为初始用例进行变异,生成多个测试用例。在其他实施例中,也可以采用其他方式获得初始测试用例,可以根据实际需求进行设置,此处不做具体限定。此后,可以将多个测试用例依次添加至队列中,再从队列中依次取出每个测试用例进行待检测程序的漏洞检测。
[0079] 将当前从队列中取出的测试用例确定为当前测试用例,对于每一个当前测试用例,利用路径获取模块1将当前测试用例输入至待检测程序中,并获取当前测试用例在待检测程序中运行时产生的第一运行路径。其中,路径是指程序运行时,针对汇编代码跳转关系形成的代码块提取出的多行汇编地址序列,即一个路径包含多行地址,每一行地址代表一个代码块的起始汇编地址。
[0080] 漏洞检测模块2,用于将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。
[0081] 具体地,预先设置漏洞路径,待检测程序按照该预设漏洞路径执行即可检测出待检测程序中的漏洞。在此基础上,利用漏洞检测模块2将上述获得的第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则可确定当前测试用例为能够触发待检测程序中的漏洞的测试用例,最终再根据当前测试用例检测待检测程序中的漏洞。由于待检测程序按照预设漏洞路径执行即可检测出待检测程序中的漏洞,因此若当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,则可确保根据当前测试用例可有效检测出待检测程序中的漏洞。
[0082] 需要说明的是,区别于现有的模糊测试工具,采用本实施例的系统进行漏洞检测时,并不是以覆盖率为标准,而是以预设漏洞路径为标准,当且仅当某一个当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,才确定该当前测试用例为能够触发待检测程序中漏洞的测试用例。由于待检测程序按照预设漏洞路径执行即可检测出待检测程序中的漏洞,因此本实施例的系统最终确定的测试用例能够有效检测出待检测程序中的漏洞。
[0083] 本发明提供的一种基于路径追踪的漏洞检测系统,在待检测程序的漏洞检测过程中,对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径,将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。该系统以预设漏洞路径为标准,由于待检测程序按照预设漏洞路径执行即可检测出待检测程序中的漏洞,因此当且仅当某一个当前测试用例在待检测程序中运行时产生的第一运行路径与预设漏洞路径完全匹配时,才确定该当前测试用例为能够触发待检测程序中漏洞的测试用例。该系统最终确定的测试用例能够有效检测出待检测程序中的漏洞,克服了现有的模糊测试工具在进行程序漏洞检测时难以确保有效检测出漏洞的问题,一定程度上提高了漏洞检测的效率。
[0084] 图3示出本申请实施例的基于路径追踪的漏洞检测方法的设备的结构框图。参照图3,所述基于路径追踪的漏洞检测方法的设备,包括:处理器(processor)31、存储器(memory)32和总线33;其中,所述处理器31和存储器32通过所述总线33完成相互间的通信;所述处理器31用于调用所述存储器32中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径;将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。
[0085] 本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径;将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。
[0086] 本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:对于当前测试用例,获取当前测试用例在待检测程序中运行时产生的第一运行路径;将第一运行路径与预设漏洞路径进行匹配,若第一运行路径与预设漏洞路径完全匹配,则根据当前测试用例检测待检测程序中的漏洞。
[0087] 本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0088] 以上所描述的基于路径追踪的漏洞检测方法的设备等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0089] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
[0090] 最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。