程序模糊测试方法、装置、设备及存储介质



1.本技术涉及计算机技术领域,尤其涉及一种程序模糊测试方法、装置、设备及存储介质。


背景技术:



2.网络协议作为计算机网络中不同实体之间的通信规则集合,是整个互联网世界的根基之一。随着互联网的不断发展,智能手机、个人电脑、物联网设备等设备的系统上都运行着越来越多不同种类的网络协议程序,从而在各种设备间建立起了信息通信桥梁。然而,相比于本地程序,攻击者可以利用网络协议程序中的漏洞更轻易地发动远程攻击,从而造成更加严重的危害。因此网络协议对于整个网络空间的安全是至关重要的。
3.目前,主要通过模糊测试的方式对目标程序进行漏洞挖掘。现有的大多数灰盒模糊测试工具主要针对运行在本地的,具有单次输入特性的应用程序进行测试。相比于这些本地应用程序,网络协议程序大多都被设计为客户端/服务端架构,在运行时会基于网络进行多轮通信。
4.然而,目前的灰盒模糊测试工具无法及时向被测协议程序发送测试消息,导致测试效率较低的问题。


技术实现要素:



5.本技术提供一种程序模糊测试方法、装置、设备及存储介质,用以解决现有技术中网络协议程序测试效率较低的问题。
6.第一方面,本技术提供一种程序模糊测试方法,包括:
7.获取代码插桩后的被测程序,代码插桩在所述被测程序的源代码中的位置为网络数据i/o交互同步点的位置;
8.利用m个测试用例,对所述代码插桩后的被测程序进行模糊测试,所述m为大于或等于1的整数,每个所述测试用例包括至少两条i/o交互请求消息,所述代码插桩用于发送反馈信息,所述反馈信息用于指示发送所述i/o交互请求消息;
9.根据所述模糊测试的执行情况,获取所述代码插桩后的被测程序的模糊测试的结果。
10.可选地,所述获取代码插桩后的被测程序,包括:
11.获取被测程序;根据所述被测程序,获取所述被测程序的代码插桩的位置;根据所述代码插桩的位置,对所述被测程序进行插桩处理,得到所述代码插桩后的被测程序。
12.可选地,所述根据所述被测程序,获取所述被测程序的代码插桩位置,包括:
13.根据所述被测程序,获取所述被测程序的断点;所述断点的位置为所述被测程序的输入类系统调用的位置;根据所述断点,获取所述被测程序触发断点时的目标函数调用栈信息,所述目标函数调用栈信息用于指示函数名称、函数调用顺序;获取所述被测程序的候选目标集合,所述被测程序的候选目标集合用于指示所述被测函数中的i/o操作循环结
构;根据所述目标函数调用栈信息,以及,所述被测程序的候选目标集合,获取所述被测程序的代码插桩位置。
14.可选地,所述获取所述被测程序的候选目标集合包括:根据所述被测程序的源代码,获取所述被测程序的候选目标集合,所述候选目标集合包括至少一个元素,每个元素包括:被测程序的一个所述i/o操作循环结构,以及,包含所述i/o操作循环结构的函数信息。
15.可选地,所述根据所述函数调用栈信息,以及,所述被测程序的候选目标集合,获取所述被测程序的代码插桩的位置,包括:
16.根据所述目标函数调用栈信息,与所述候选目标集合中的元素进行匹配,将第一个匹配到的函数的位置作为所述被测程序的网络协议i/o交互同步点的位置;
17.输出所述被测程序的网络协议i/o交互同步点的位置。
18.可选地,所述获取测试用例,包括:
19.获取测试用例池中的m个初始测试用例,所述测试用例池中包括n个初始测试用例,所述n为大于或等于m的整数;
20.对m个初始测试用例中至少一个初始测试用例进行变异处理,得到所述m个测试用例。
21.可选地,所述获取所述代码插桩后的被测程序的模糊测试的结果之后,还包括:
22.获取所述测试用例对于所述被测程序的代码覆盖率;
23.若所述代码覆盖率大于或等于代码覆盖率阈值,将所述测试用例作为新初始测试用例更新至所述测试用例池
24.第二方面,本技术提供一种程序模糊测试装置,包括:
25.第一获取模块,用于获取代码插桩后的被测程序,代码插桩在所述被测程序的源代码中的位置为网络数据i/o交互同步点的位置;
26.处理模块,用于利用m个测试用例,对所述代码插桩后的被测程序进行模糊测试,所述m为大于或等于1的整数,每个所述测试用例包括至少两条i/o交互请求消息,所述代码插桩用于发送反馈信息,所述反馈信息用于指示发送所述i/o交互请求消息;
27.第二获取模块,用于根据所述模糊测试的执行情况,获取所述代码插桩后的被测程序的模糊测试的结果。
28.第三方面,本技术提供一种电子设备,包括:处理器、以及与所述处理器通信连接的存储器;
29.所述存储器存储计算机执行指令;
30.所述处理器执行所述存储器存储的计算机执行指令,以实现如第一方面中任一项所述的方法。
31.第四方面,本技术提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如第一方面中任一项所述的程序模糊测试方法
32.第五方面,本技术提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如第一方面中任一项所述的方法。
33.本技术提供的程序模糊测试方法、装置、设备及存储介质,通过在被测程序中接收i/o交互请求消息的位置进行代码插桩,获得代码插桩后的被测程序,以在完成接收并处理
一条i/o交互请求消息后,代码插桩插入的函数发出反馈信息,以指示发送下一条i/o交互请求消息,从而使得模糊测试器能够及时向被测程序发送i/o交互请求消息,提高测试效率。
附图说明
34.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。
35.图1为本技术实施例提供的一种程序模糊测试方法的流程示意图;
36.图2为本技术实施例提供的一种程序模糊测试方法的交互示意图;
37.图3为本技术实施例提供的一种获取代码插桩后的被测程序的流程示意图;
38.图4为本技术实施例提供的一种程序模糊测试方法的完整流程图;
39.图5为本技术实施例提供的一种程序模糊测试装置的结构示意图;
40.图6为本技术实施例提供的一种电子设备的结构示意图。
41.通过上述附图,已示出本技术明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本技术构思的范围,而是通过参考特定实施例为本领域技术人员说明本技术的概念。
具体实施方式
42.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。
43.首先对本技术所涉及的名词进行解释:
44.网络协议程序:是指客户端/服务端(client/server,c/s)架构下的用于网络通信的网络协议的程序,本技术中所说的网络协议程序可以是应用层协议程序中的任意一种,例如可以是文件传输协议(file transfer protocol,ftp)程序、安全传输层协议(transport layer security,tls)程序等。
45.代码插桩:是指在被测程序中插入用于跟踪被测程序的执行过程的代码,以获取程序中可执行语句被执行的情况,程序执行的路径,变量的引用、定去
46.模糊测试:是指将随机数据输入至被测程序中,并监控被测程序的异常来发现程序漏洞的软件测试技术,本技术以通过模糊测试器等模糊测试工具进行模糊测试为例进行说明。
47.黑盒测试:也称功能测试,黑盒测试通过测试来检测被测程序的每个功能是否都能正常使用。在黑盒测试中,不考虑被测程序的内部结构和内部特性,在被测程序的接口进行测试,黑盒测试只检查被测程序的功能是否正常使用,被测程序是否能接收输入数据并产生正确的输出信息。
48.灰盒测试:多用于集成测试阶段,不仅关注被测程序输出、输入的正确性,同时也关注被测程序内部的情况。基于程序运行时的外部表现又结合程序内部逻辑结构来设计测试用例,执行程序并采集程序路径执行信息和外部用户接口结果的测试技术。
49.目前,模糊测试技术被已经被广泛地应用在针对网络协议相关程序的测试与漏洞挖掘工作上。传统的面向网络协议的模糊测试工具使用黑盒测试的方法进行模糊测试。黑盒测试方法只需要指定正在运行被测协议程序的设备网络ip地址与端口号,无需被测协议程序的源代码,即可进行测试。
50.由于黑盒测试的测试内容缺乏对被测程序内部情况的测试,无法测试出被测程序的内部逻辑存在的问题,因此,目前的模糊测试工具多使用灰盒测试的方法。由于灰盒测试将覆盖率反馈指导机制以及遗传变异算法等内容引入进了模糊测试的工作流程中,使得被测程序的代码覆盖率与模糊测试的漏洞挖掘效果都有了明显的提升。
51.目前,大多数灰盒模糊测试工具主要针对运行在本地的,具有单次输入特性的应用程序进行测试。即,灰盒模糊测试工具将测试用例输入被测应用程序后,执行被测应用程序并采集程序执行中的程序路径执行信息,以及,程序接口结果。其中,测试用例中仅包括一个输入/输出(in/out,i/o)交互请求消息,灰盒模糊测试工具仅需将该测试用例(即该i/o交互请求消息)输入被测应用程序中一次,被测应用程序运行过程中获取并处理该i/o交互请求消息,即可根据被测应用程序的执行情况获得测试结果。
52.然而,网络协议程序通常为客户端/服务端(client/server,c/s)架构,网络协议程序在运行时通常会基于网络进行多轮通信,执行多次i/o操作。因此,测试网络协议程序所使用的测试用例中需要包括多个i/o交互请求消息,以实现对网络协议程序基于网络进行多轮通信的测试。其中,灰盒模糊测试工具需要向被测程序轮流发送同一个测试用例中的多个i/o交互请求消息进行测试,在被测程序接收并处理完一个i/o交互请求消息后,灰盒模糊测试工具需要向被测程序发送测试用例中的下一个i/o交互请求消息。
53.然而,目前应用于测试单次输入特性的应用程序的灰盒模糊测试工具,无法在被测程序处理完一个测试消息后,及时向被测程序发送下一个用于测试的测试消息。因此,目前的灰盒模糊测试方法存在测试效率较低的问题。
54.有鉴于此,本技术提供了一种程序模糊测试方法,通过在被测程序中接收i/o交互请求消息的位置进行代码插桩,获得代码插桩后的被测程序,以在完成接收并处理一条i/o交互请求消息后,代码插桩插入的函数发出反馈信息,以指示发送下一条i/o交互请求消息,从而使得模糊测试器能够及时向被测程序发送i/o交互请求消息,提高测试效率。
55.本发明所提供的程序模糊测试方法的执行主体可以为灰盒模糊测试工具,该灰盒模糊测试工具可以为程序代码软件,也可以为存储有相关执行代码的介质,例如,u盘等;或者,该灰盒模糊测试工具还可以为集成或安装有相关执行代码的实体装置,例如,芯片、微控制单元(microcontroller unit,简称mcu)、电脑、计算机等电子设备。
56.下面以具体地实施例对本技术的技术方案以及本技术的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本技术的实施例进行描述。
57.图1为本技术实施例提供的一种程序模糊测试方法的流程示意图。如图1所示,该方法可以包括:
58.s101、获取代码插桩后的被测程序。
59.其中,代码插桩在被测程序的源代码中的位置为网络数据i/o交互同步点的位置。该被测程序为网络协议程序。该代码插桩用于发送反馈信息,该反馈信息用于指示发送i/o
交互请求消息。
60.被测程序中包括用于获取i/o交互请求消息的函数,用于处理i/o交互请求消息的函数等,在用于处理i/o交互请求消息的函数中也可能包括用于执行i/o操作的函数。其中,该网络数据i/o交互同步点为被测程序中的用于获取i/o交互请求消息的函数,其位置即为该函数的位置。被测程序在运行时,通过网络数据i/o交互同步点读取该i/o交互请求消息,该i/o交互请求消息用于对该被测程序进行测试。其中,用于获取i/o交互请求消息的函数例如可以是用于读取、接收消息的函数中的任意一种,例如可以是read、recv、或recvmsg函数。
61.一种可能的实现方式,在模糊测试的过程中,模糊测试器对被测程序进行代码插桩处理,获取该代码插桩后的被测程序,
62.另一种可能的实现方式,预先对该被测程序进行代码插桩处理,然后将代码插桩后的被测程序输入模糊测试器中,执行该代码插桩后的被测程序以进行模糊测试。
63.s102、利用m个测试用例,对代码插桩后的被测程序进行模糊测试,m为大于或等于1的整数。
64.其中,每个测试用例包括至少两条i/o交互请求消息。该m个测试用例可以是根据实际需要确定的,存储在测试用例池中的;也可以是根据测试用例池中存储的测试用例,经过变异处理后获得的。
65.模糊测试器将测试用例中的i/o交互请求消息输入代码插桩后的被测程序中,该代码插桩后的被测程序在执行过程中轮流处理多条i/o交互请求消息中的数据,以进行模糊测试。
66.下面以用于获取i/o交互请求消息的函数为read函数为例,对程序模糊测试方法的详细过程进行说明。图2是本技术实施例提供的一种程序模糊测试方法的交互示意图。如图2所示,该方法可以包括:
67.s1021、建立与模糊测试器与被测程序之间的通信连接。
68.其中,模糊测试器与被测程序之间的通信连接例如可以是通过网络套接字建立的。被测程序作为服务端,初始化网络套接字,进行端口的绑定与监听,该端口为待模糊测试器连接的端口。模糊测试器作为客户端,初始化网络套接字,与被测程序建立网络连接。关于如何通过网络套接字建立服务端与客户端之间的连接可以参照现有技术,在此不再赘述。
69.s1022、在被测程序的运行过程中,当被测程序执行到read函数的位置时,通过代码插桩,向模糊测试器发送反馈信息。
70.被测程序执行到read函数的位置时,通过代码插桩技术插入的代码,实现向模糊测试器发送反馈信息的功能。该代码的具体功能根据该反馈信息的功能确定,例如该代码可以用于反馈目前可接收i/o交互请求消息。
71.s1023、模糊测试器根据反馈信号,向被测程序发送i/o交互请求消息。
72.该i/o交互请求消息为上述测试用例中的任一条i/o交互请求消息,模糊测试器发送i/o交互请求消息的顺序可以根据实际需求确定,本技术不做限制。
73.s1024、被测程序接收并处理i/o交互请求消息。
74.被测程序通过read函数,读取该i/o交互请求消息,然后通过后续的函数调用,根
据该i/o交互请求消息的内容,对该i/o交互请求消息进行处理,具体的处理方式根据i/o交互请求消息的内容确定,可以是现有技术中任意一种数据处理的方式,本技术对此不做限制。
75.s1025、被测程序完成当前i/o交互请求消息的处理后,进入下一次循环以运行当前测试用例中的下一个i/o交互请求消息,被测程序通过循环结构,再次执行read函数,当执行到read函数时,通过代码插桩在read函数之前的函数,向模糊测试器发送用于指示模糊测试器发送下一条i/o交互请求消息的反馈信息。
76.其中,由于网络协议程序在运行过程中是需要基于网络进行多轮通信的,因此该被测程序中为了实现能够多次接收并处理网络i/o交互请求消息,存在以read函数为循环起点的循环结构,在完成一条i/o交互请求消息的处理后,会通过该循环结构回到read函数,以读取下一条i/o交互请求消息。在完成测试用例中所有i/o交互请求消息的处理后,结束循环,执行该循环结构之后的函数。因此,在模糊测试时,会通过在read函数之前进行代码插桩,插入用于发送反馈消息的函数,以实现及时指示模糊测试器发送下一条i/o交互请求消息的功能。
77.s103、根据所述模糊测试的执行情况,获取所述代码插桩后的被测程序的模糊测试的结果。
78.模糊测试器同步对被测程序的执行情况进行监视,根据代码插桩后的被测程序在执行处理i/o交互请求消息的过程中该被测程序的运行和/或输出结果是否存在异常,获取该代码插桩后的被测程序的模糊测试的结果。
79.当被测程序的运行和/或输出结果不存在异常时,使用该测试用例的模糊测试的结果为测试通过。
80.当被测程序的运行和/或输出结果存在异常时,使用该测试用例的模糊测试的结果为测试异常。其中,该被测程序的异常例如可以包括程序报错,程序崩溃,输出数据错误等内容。根据该异常获取模糊测试结果的方式例如可以是通过模糊测试器的监视日志信息,分析获取模糊测试的结果;或者根据程序报错内容,获取模糊测试的结果等。关于如何通过程序异常获取模糊测试结果,可以参照现有技术,本技术对此不再赘述。
81.本技术提供的程序模糊测试方法,通过包括多条i/o交互请求消息的测试用例测试代码插桩后的被测程序,在代码插桩后的被测程序执行该测试用例时,每当该被测程序运行到i/o交互同步点的位置时,通过代码插桩插入的函数,向模糊测试器发送反馈信息,以指示模糊测试器发送下一条i/o交互请求消息进行下一轮交互的测试,从而使得模糊测试器能够在多轮交互的过程中,每次都及时向被测程序发送下一轮交互的测试所需的i/o交互请求消息。因此,该程序模糊测试方法提高了测试效率。
82.下面,以预先对该被测程序进行代码插桩处理,然后将代码插桩后的被测程序输入模糊测试器中为例,对于步骤s201中如何获取代码插桩后的被测程序进行详细说明。
83.图3是本技术实施例提供的一种获取代码插桩后的被测程序的流程示意图。如图3所示,该方法可以包括:
84.s301、获取被测程序。
85.该被测程序为待进行模糊测试的网络协议程序,模糊测试工具获取该被测程序的方式可以是根据该被测协议的索引获取的,也可以是根据该被测协议的存储位置获取的
等。
86.s302、根据所述被测程序,获取所述被测程序的代码插桩位置。
87.实施方式a:根据被测程序的目标函数调用栈信息,以及,被测程序的候选目标集合,获取被测程序的代码插桩位置。
88.s3021、根据被测程序,获取被测程序的断点。
89.其中,断点的位置为该被测程序的输入类系统调用的位置。该输入类系统调用例如可以是上述所说的read、recv、或recvmsg等函数中的任意一种。
90.首先,在被测程序的编译过程中,根据断点机制,通过调试器在被测程序的输入类系统调用处设置断点,该调试器例如可以是gnu debugger(gdb)调试器等。
91.s3022、根据所述断点,获取被测程序触发断点时的目标函数调用栈信息。
92.其中,目标函数调用栈信息用于指示函数名称、函数调用顺序。该目标函数调用栈信息例如可以包括:函数名称或函数标识、函数调用顺序或函数调用关系。
93.建立与被测程序通信连接的客户端,该客户端用于向被测程序发送探测报文,本技术对该客户端的具体形式不做限制。
94.其次,客户端向被测程序发送探测报文,本技术对该探测报文中的内容不作限制,只要是能够被被测程序读取或接收的探测报文即可。被测程序接收到该探测报文后,在被测程序的执行过程中读取或接收该数据包,该被测程序通过输入类系统调用读取或接收该数据包。此时,由于被测程序执行了输入类系统调用,会触发该位置设置的断点。在断点触发时,对触发该断点时的函数调用栈信息进行存储。
95.示例性的,函数调用栈信息如下表1所示:
96.表1
97.函数名称函数调用顺序函数c4函数b3函数a2main函数1
98.其中,函数c为断点处的输入类系统调用对应的函数名称,函数b为调用函数c的函数,函数a为调用函数b的函数,函数调用栈底部的函数为main函数,main函数为调用函数a的函数。
99.s3023、获取所述被测程序的候选目标集合。
100.其中,该被测程序的候选目标集合用于指示该被测函数中的i/o操作循环结构。该候选目标集合包括至少一个元素,每个元素包括:被测程序的一个i/o操作循环结构,以及,该i/o操作循环结构包括的函数信息。
101.一种可能的实现方式,根据该被测程序的源代码,获取该被测程序的候选目标集合。
102.通过静态分析器获取被测程序中的所有包含了i/o操作的循环结构,该i/o操作的循环结构是用于获取i/o交互请求消息的循环结构,如何根据静态分析器获取包含了i/o操作的循环结构可以参照现有技术。对于每个包含了i/o操作的循环结构,获取包含该循环结构的函数信息,该函数信息为该循环结构所在的函数的函数信息,例如可以包括函数名称,
函数调用关系等。然后将每一个包含了i/o操作的循环结构,以及其对应的函数信息作为一个元素。最后以所有元素作为候选目标集合。
103.另一种可能的实现方式,根据现有技术中任意能够检测包含了i/o操作的循环结构,以及该循环结构所在的函数的方法,获取该被测程序的候选目标集合。例如可以是通过编译该被测程序时,遍历所有函数路径的方式获取的。
104.s3024、根据目标函数调用栈信息,以及,被测程序的候选目标集合,获取被测程序的代码插桩的位置。
105.其中,该代码插桩的位置可以表示为被测程序源代码中的代码行。
106.通过目标函数调用栈信息与被测函数包括的所有i/o操作循环结构进行匹配的方式,获取被测程序的代码插桩的位置,该方法的详细介绍如下:
107.根据该目标函数调用栈信息,与该候选目标集合中的元素进行匹配,将第一个匹配到的函数的位置作为该被测程序的网络协议i/o交互同步点的位置。示例性的,在本技术中以通过函数名称进行匹配为例进行说明:
108.根据目标函数调用栈信息中的函数调用关系(即函数调用的顺序),从函数调用栈底部的函数(例如可以是main函数)开始,按照函数调用栈中的调用顺序,依次根据该函数名称与候选目标集合中的函数名称进行匹配。继续以表1为例,首先通过函数调用栈信息中最外层的main函数,与候选目标集合中的函数名称进行一一匹配,若匹配成功,即该候选目标集合中包括main函数,则根据该函数名称(main)确定候选目标集合中函数名称为main的函数中的循环结构的开头为被测程序的网络协议i/o交互同步点。若函数调用栈信息中最外层的main函数未匹配到,则按照函数调用栈中函数的调用顺序,利用下一个函数——函数a与候选目标集合中的函数名称进行一一匹配。以此类推,若main函数、函数a、函数b均未匹配成功,则通过函数c与候选目标集合进行匹配。讲第一个匹配到的函数作为用于处理i/o交互请求消息时的循环结构。此时,该循环结构开头所对应的源代码的行数,即为被测程序的网络协议i/o交互同步点的位置。
109.最后,输出被测程序的网络协议i/o交互同步点的位置,即该位置在源代码中的行数。该位置即为需要进行代码插桩的位置。
110.实施方式b:根据其他任意能够确定被测程序中i/o交互同步点的位置的方法,确定该被测程序的代码插桩位置,本技术对于确定i/o交互同步点的位置的方法不做限制,只要是现有技术中能够实现该功能的方法即可。
111.s303、根据代码插桩的位置,对被测程序进行插桩处理,得到代码插桩后的被测程序。
112.通过编译器,编译该被测程序,然后使用编译器中用于遍历被测程序源代码的工具,例如llvm的pass工具等,对该被测程序的源代码进行遍历。在遍历过程中,将遍历到的代码位置与被测程序的网络协议i/o交互同步点的位置不断进行对比,当遍历到的代码位置与被测程序的网络协议i/o交互同步点的位置相同时,即完成匹配。
113.完成匹配后,在当前遍历到的代码位置插入用于发送反馈信息的函数,该函数中,包括向模糊测试器发送通信信息的功能,例如通过信号的方式发送通信信息,该信号例如可以使linux信号等。其中,该函数即为代码插桩操作插入的函数,该通信信息的功能可以包括:用于指示模糊测试器发送下一条i/o交互请求消息的功能。
114.在完成代码插桩操作后,将代码插桩后的被测程序输出至测试工具中,以代码插桩后的被测程序代替原来的被测程序。
115.本技术提供的获取代码插桩后的被测程序的方法,通过获取目标函数调用栈信息,以及,被测程序的候选目标集合,确定了被测程序的源代码中需要进行代码插桩操作的位置。然后在该需要代码插桩位置,插入用于发送反馈信息的函数,从而在模糊测试的过程中,能够通过该方法确定的向模糊测试器发送反馈信息,指示模糊测试器发送下一条i/o交互请求消息代码插桩位置,以及,插入的用于发送反馈信息的函数,使得在测试用于多轮通信的被测程序时,能够减少多轮通信测试之间的时间间隔,提高测试的效率。
116.下面,对于如何获取前述步骤s202中所说的获取测试用例的方法进行详细说明:
117.该灰盒模糊测试工具可以包括测试用例池,或者,该灰盒模糊测试工具与测试用例池之间存在通信连接,能够调用该测试用例池中的测试用例。其中,该测试用例池例如可以是一个数据库,其中存储了n个初始测试用例。在测试用例池中的n个初始测试用例,可以是根据实际需求设置的。在模糊测试的过程中,可以使用测试用例池中的所有初始测试用例,也可以仅使用测试用例池中的部分初始测试用例。即,用于进行模糊测试的m个测试用例的数量小于或等于初始测试用例的数量n。
118.对于用于测试的m个初始测试用例,可以是直接使用该m个初始测试用例作为测试用例,以测试被测程序;也可以是对m个初始测试用例中至少一个初始测试用例进行变异处理,得到m个测试用例,以测试被测程序。
119.针对上述所说的对初始测试用例进行的变异处理,例如可以是对初始测试用例中包含的字节进行翻转、截断等操作,还可以是在初始测试用例中插入随机数据等,或者是以上类型的操作均进行了的变异处理,本技术对此不作限制。
120.此外,在模糊测试过程中,由于测试用例与初始测试用例不同,经过变异操作后,该测试用例对该被测程序的测试效果也不同。为了能够通过更多的测试用例对被测程序进行下一轮测试,可以将测试时覆盖的代码范围较广的测试用例作为新的初始测试用例,存储入测试用例池中。
121.因此,还可以通过以下所述的方法,扩充测试用例池中的初始测试用例,以提高模糊测试的效果,测试出该被测程序更多可能存在的故障。
122.在获取代码插桩后的被测程序的模糊测试的结果之后,获取该测试用例对于所述被测程序的代码覆盖率。
123.其中,灰盒模糊测试工具通过模糊测试器发送的测试用例中包括至少两条i/o交互请求消息,在模糊测试器发送出当前测试用例中的最后一条i/o交互请求消息后,该被测程序在接收并处理该最后一条i/o交互请求消息。然后,在被测程序处理完成该最后一条i/o交互请求消息后,再次向模糊测试器发送反馈信息,以告知模糊测试器已完成该最后一条i/o交互请求消息的处理。当灰盒模糊测试工具监控到该测试用例所包括的所有i/o交互请求消息已完成处理时,从内存中读取使用该测试用例对代码插桩后的被测程序进行模糊测试的综合结果,以及该测试用例测试时对该被测程序的代码覆盖率。
124.上述代码覆盖率为每次通过i/o交互请求消息对被测程序进行测试的代码覆盖率的并集。
125.若该测试用例的代码覆盖率大于或等于代码覆盖率阈值,将该测试用例作为新初
始测试用例更新至所述测试用例池。
126.根据本技术提供的获取测试用例的方法,为模糊测试提供更多测试效率较高的测试用例,从而提高该模糊测试的精准度,以测试出更多该被测程序中可能存在的故障、缺陷或者错误,从而降低该被测程序在执行过程中崩溃、报错等情况。
127.为便于理解,以预先完成代码插桩操作获取代码插桩后的被测程序为例,图4为本技术实施例提供的一种程序模糊测试方法的完整流程图。如图4所示,该方法可以包括:
128.s401、获取被测函数。
129.s402、通过获取断点获取目标函数调用栈信息;通过获取被测函数源代码获取被测程序的候选目标集合。
130.s40211、获取断点。
131.s40212、根据断点获取目标函数调用栈信息。
132.s40221、获取被测函数源代码。
133.s40222、根据被测函数源代码获取包括i/o操作的循环结构,以及,该循环结构对应所在的函数的信息。
134.s40223、根据包括i/o操作的循环结构,以及,该循环结构对应所在的函数的信息,获取被测程序的候选目标集合。
135.s403、根据目标函数调用栈信息,以及,被测程序的候选目标集合,获取代码插桩的位置。
136.s404、进行代码插桩操作,获取代码插桩后的被测程序。
137.在获取代码插桩后的被测程序后,该方法还包括:
138.s501、根据初始测试用例,构建测试用例池。
139.s502、从测试用例池中选择初始测试用例。
140.s503、通过对初始测试用例的变异处理,获取测试用例。
141.s504、运行代码插桩后的被测程序,发送反馈信息至模糊测试器。
142.s505、模糊测试器将测试用例中的i/o交互请求消息发送至代码插桩后的被测程序。
143.s506、根据下一次的反馈信息,反馈当前处理的i/o交互请求消息的代码覆盖率。
144.s507、完成该测试用例中的所有i/o交互请求消息的测试后,获取通过该测试用例对被测程序进行测试对应的代码覆盖率;判断代码覆盖率是否大于预设的阈值,若是,执行步骤s508;若否,执行步骤s509。
145.s508、不在测试用例池中保留该测试用例。
146.s509、将该测试用例保留至测试用例池中。
147.通过图4中所包括的流程实现上述方法实施例中的程序模糊测试方法,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
148.图5为本技术实施例提供的一种程序模糊测试装置的结构示意图。如图5所示,该程序模糊测试包括:第一获取模块11,处理模块12,第二获取模块13。在一种可能的实施方式中,还包括:输出模块14。
149.第一获取模块11,用于获取代码插桩后的被测程序。
150.处理模块12,用于利用m个测试用例,对代码插桩后的被测程序进行模糊测试。
specific integrated circuit,简称为asic),或者是被配置成实施本技术实施例的一个或多个集成电路。
165.可选地,处理器601通过通信接口603可以与外部设备进行通信交互。此处所说的外部设备例如可以是作为测试用例池的数据库所在的实体设备。
166.在具体实现上,如果通信接口603、存储器602以及处理器601独立实现,则通信接口603、存储器602以及处理器601可以通过总线相互连接并完成相互间的通信。总线可以是工业标准体系结构(industry standard architecture,简称为isa)总线、外部设备互连(peripheral component,简称为pci)总线或扩展工业标准体系结构(extended industry standard architecture,简称为eisa)总线等。总线可以分为地址总线、数据总线、控制总线等,但并不表示仅有一根总线或一种类型的总线。
167.可选的,在具体实现上,如果通信接口603、存储器602和处理器601集成在一块芯片上实现,则通信接口603、存储器602和处理器601可以通过内部接口完成通信。
168.本技术还提供了一种计算机可读存储介质,该计算机可读存储介质可以包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁盘或者光盘等各种可以存储程序代码的介质,具体的,该计算机可读存储介质中存储有程序指令,程序指令用于上述实施例中的方法。
169.本技术还提供一种程序产品,该程序产品包括执行指令,该执行指令存储在可读存储介质中。电子设备的至少一个处理器可以从可读存储介质读取该执行指令,至少一个处理器执行该执行指令使得电子设备实施上述各种实施方式提供的程序模糊测试方法。
170.最后应说明的是:以上各实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述各实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的范围。

技术特征:


1.一种程序模糊测试方法,其特征在于,包括:获取代码插桩后的被测程序,代码插桩在所述被测程序的源代码中的位置为网络数据i/o交互同步点的位置;利用m个测试用例,对所述代码插桩后的被测程序进行模糊测试,所述m为大于或等于1的整数,每个所述测试用例包括至少两条i/o交互请求消息,所述代码插桩用于发送反馈信息,所述反馈信息用于指示发送所述i/o交互请求消息;根据所述模糊测试的执行情况,获取所述代码插桩后的被测程序的模糊测试的结果。2.根据权利要求1所述的方法,其特征在于,所述获取代码插桩后的被测程序,包括:获取被测程序;根据所述被测程序,获取所述被测程序的代码插桩的位置;根据所述代码插桩的位置,对所述被测程序进行插桩处理,得到所述代码插桩后的被测程序。3.根据权利要求2所述的方法,其特征在于,所述根据所述被测程序,获取所述被测程序的代码插桩位置,包括:根据所述被测程序,获取所述被测程序的断点;所述断点的位置为所述被测程序的输入类系统调用的位置;根据所述断点,获取所述被测程序触发断点时的目标函数调用栈信息,所述目标函数调用栈信息用于指示函数名称、函数调用顺序;获取所述被测程序的候选目标集合,所述被测程序的候选目标集合用于指示所述被测函数中的i/o操作循环结构;根据所述目标函数调用栈信息,以及,所述被测程序的候选目标集合,获取所述被测程序的代码插桩位置。4.根据权利要求3所述的方法,其特征在于,所述获取所述被测程序的候选目标集合包括:根据所述被测程序的源代码,获取所述被测程序的候选目标集合,所述候选目标集合包括至少一个元素,每个元素包括:被测程序的一个所述i/o操作循环结构,以及,包含所述i/o操作循环结构的函数信息。5.根据权利要求3或4所述的方法,其特征在于,所述根据所述函数调用栈信息,以及,所述被测程序的候选目标集合,获取所述被测程序的代码插桩的位置,包括:根据所述目标函数调用栈信息,与所述候选目标集合中的元素进行匹配,将第一个匹配到的函数的位置作为所述被测程序的网络协议i/o交互同步点的位置;输出所述被测程序的网络协议i/o交互同步点的位置。6.根据权利要求1-4任一项所述的方法,其特征在于,所述获取测试用例,包括:获取测试用例池中的m个初始测试用例,所述测试用例池中包括n个初始测试用例,所述n为大于或等于m的整数;对m个初始测试用例中至少一个初始测试用例进行变异处理,得到所述m个测试用例。7.根据权利要求1-4任一项所述的方法,其特征在于,所述获取所述代码插桩后的被测程序的模糊测试的结果之后,还包括:获取所述测试用例对于所述被测程序的代码覆盖率;若所述代码覆盖率大于或等于代码覆盖率阈值,将所述测试用例作为新初始测试用例
更新至所述测试用例池。8.一种程序模糊测试装置,其特征在于,包括:第一获取模块,用于获取代码插桩后的被测程序,代码插桩在所述被测程序的源代码中的位置为网络数据i/o交互同步点的位置;处理模块,用于利用m个测试用例,对所述代码插桩后的被测程序进行模糊测试,所述m为大于或等于1的整数,每个所述测试用例包括至少两条i/o交互请求消息,所述代码插桩用于发送反馈信息,所述反馈信息用于指示发送所述i/o交互请求消息;第二获取模块,用于根据所述模糊测试的执行情况,获取所述代码插桩后的被测程序的模糊测试的结果。9.一种电子设备,其特征在于,包括:处理器,以及存储器;所述处理器与所述存储器通信连接;所述存储器存储计算机执行指令;所述处理器执行所述存储器存储的计算机执行指令,以实现如权利要求1-7中任一项所述的方法。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如权利要求1至7任一项所述的程序模糊测试方法。

技术总结


本申请提供一种程序模糊测试方法、装置、设备及存储介质。该方法包括:获取代码插桩后的被测程序,代码插桩在被测程序的源代码中的位置为网络数据I/O交互同步点的位置。利用M个测试用例,对代码插桩后的被测程序进行模糊测试,M为大于或等于1的整数,每个测试用例包括至少两条I/O交互请求消息,代码插桩用于发送反馈信息,反馈信息用于指示发送I/O交互请求消息、根据模糊测试的执行情况,获取代码插桩后的被测程序的模糊测试的结果。本申请的方法,使得模糊测试器能够及时向被测程序发送I/O交互请求消息,提高了测试效率。提高了测试效率。提高了测试效率。


技术研发人员:

张超 秦世松 赵博栋

受保护的技术使用者:

清华大学

技术研发日:

2022.09.06

技术公布日:

2022/11/18

本文发布于:2024-09-20 13:29:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/3353.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:程序   测试   所述   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议