本技术涉及信息安全领域,尤其涉及一种软件漏洞检测方法、装置、设备及存储介质。
背景技术:
1、堆内存漏洞是一种常见的软件漏洞,这类漏洞通过构造特殊的堆块结构来实现堆内存漏洞的利用,进而导致控制流劫持及任意代码执行的目的。目前有不少的二进制漏洞的自动化调试与检测方法已经能有效地发现程序错误,其中一部分程序错误可以被利用,并导致严重后果。如何快速、准确地自动检测漏洞,是当前漏洞自动分析与检测的关键问题之一。
2、目前,软件漏洞检测方法主要分为静态分析与动态分析两大类,静态分析主要是白盒代码审计,动态分析主要是灰/黑盒模糊测试。
3、然而,静态分析需要对代码进行人工审核,效率低而且审计效果取决于审计人员的技术水平,并且程序运行存在漏报与误报。模糊测试需采用随机或者人为的方式构造测试用例,测试用例不具有针对性,存在一定的局限性。
技术实现思路
1、本技术提供一种软件漏洞检测方法、装置、设备及存储介质,通过针对堆漏洞生成目标测试用例,更加有针对性,从而采用目标测试用例对待检测程序进行漏洞检测的准确性更高。
2、第一方面,本技术提供一种软件漏洞检测方法,包括:
3、对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例;
4、对所述初始测试用例进行污点标记,并以标记后的所述初始测试用例为种子输入,驱动所述待检测程序进行动态符号执行,以获得所述待检测程序对应的路径约束;
5、基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;所述堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;所述污染信息用于表示所述种子输入对内存区域的污染情况;所述内存区域为执行所述待检测程序的进程所映射的内存区域;
6、采用约束求解器,对所述路径约束和所述攻击约束进行合取并求解,以获得同时满足所述路径约束和所述攻击约束的求解结果,所述求解结果包括目标测试用例;
7、采用所述目标测试用例对所述待检测程序进行漏洞检测。
8、可选地,所述攻击约束包括tcache poisoning攻击约束和攻击载荷约束;所述基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束,包括:
9、基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合;所述可利用堆块集合中的堆块存在被攻击者利用的可能;
10、针对所述可利用堆块集合中的任一堆块,基于所述堆块对应的状态信息,确定所述堆块是否满足堆块可控条件;所述堆块可控条件用于判断堆块是否能够被攻击者控制;
11、若确定所述堆块满足所述堆块可控条件,则针对所述堆块,构造所述tcachepoisoning攻击约束,以将所述堆块对应的next指针所指向的地址约束为关键指针所指向的地址,所述关键指针所指向的地址为要申请的任一内存地址;
12、基于所述污染信息,确定所述堆块对应的next指针是否满足指针可控条件;所述指针可控条件用于判断指针是否能够被攻击者控制;
13、若确定所述next指针满足所述指针可控条件,则针对所述堆块,构造所述攻击载荷约束,以将所述堆块对应的next指针对应的指针数据约束为攻击载荷的值,所述指针数据为所述next指针所指向的地址中存放的数据。
14、可选地,所述堆块对应的状态信息包括所述堆块的数据区域的起始地址、所述堆块的数据区域的长度和所述堆块的状态;所述状态为已分配状态或被释放状态;
15、所述基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合,包括:
16、针对所述堆块集合中的各所述堆块,若确定所述堆块的数据区域的起始地址位于内存写入区域的地址范围内,且所述堆块的状态为所述被释放状态,则确定所述堆块存在释放后重用漏洞;
17、将所述堆块添加到所述可利用堆块集合中。
18、可选地,所述堆块对应的状态信息包括所述堆块的数据区域的起始地址、所述堆块的数据区域的长度和所述堆块的状态;所述状态为已分配状态或被释放状态;
19、所述基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合,包括:
20、针对所述堆块集合中的各所述堆块,若所述堆块的数据区域的下边界位于所述内存写入区域的地址范围内,则确定所述堆块存在堆溢出漏洞;所述下边界基于所述堆块的数据区域的起始地址与所述堆块的数据区域的长度确定;
21、将与所述堆块相邻的被数据溢出的堆块添加到所述可利用堆块集合中。
22、可选地,所述堆块对应的状态信息还包括第一状态关联信息和第二状态关联信息,所述第一状态指示信息用于指示所述堆块在所述被释放状态下是否位于tcache的链表上,所述第二状态指示信息用于指示所述堆块在所述被释放状态下且位于tcache的链表上时是否存在后继堆块;
23、所述基于所述堆块对应的状态信息,确定所述堆块是否满足堆块可控条件,包括:
24、若确定所述堆块的状态为所述被释放状态,且所述第一状态关联信息指示所述堆块位于tcache的链表上,且所述第二状态关联信息指示所述堆块存在后继堆块,则确定所述堆块满足所述堆块可控条件。
25、可选地,所述污染信息包括符号化区域对应的起始地址和长度;所述基于所述污染信息,确定所述堆块对应的next指针是否满足指针可控条件,包括:
26、若确定所述堆块对应的next指针所指向的地址位于所述符号化区域之内,则确定所述next指针满足所述指针可控条件。
27、可选地,所述污染信息的获取过程,包括:
28、在所述内存区域内遍历搜索,依次读取所遍历的值,并判断所遍历的值是否为符号值;
29、若确定所述所遍历的值为符号值,则确定所遍历的内存区域为符号化区域,以逐步确定所述符号化区域的起始地址和长度。
30、可选地,所述待检测程序为目标软件对应的二进制可执行程序;所述对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例之前,所述方法还包括以下任一项:
31、获取用户设备发送的所述待检测程序,所述用户设备用于对所述目标软件对应的源代码进行编译,以获得所述待检测程序;
32、获取所述目标软件对应的源代码,并对所述源代码进行编译,以获得所述待检测程序。
33、第二方面,本技术提供一种软件漏洞检测装置,包括:
34、模糊测试模块,用于对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例;
35、符号执行模块,用于对所述初始测试用例进行污点标记,并以标记后的所述初始测试用例为种子输入,驱动所述待检测程序进行动态符号执行,以获得所述待检测程序对应的路径约束;
36、约束构造模块,用于基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;所述堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;所述污染信息用于表示所述种子输入对内存区域的污染情况;所述内存区域为执行所述待检测程序的进程所映射的内存区域;
37、约束求解模块,用于采用约束求解器,对所述路径约束和所述攻击约束进行合取并求解,以获得同时满足所述路径约束和所述攻击约束的求解结果,所述求解结果包括目标测试用例;
38、漏洞检测模块,用于采用所述目标测试用例对所述待检测程序进行漏洞检测。
39、第三方面,本技术提供一种电子设备,包括:处理器以及与所述处理器通信连接的存储器;
40、所述存储器存储计算机执行指令;
41、所述处理器执行所述存储器存储的计算机执行指令,以实现如第一方面任一项所述的软件漏洞检测方法。
42、第四方面,本技术提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现第一方面任一项所述的软件漏洞检测方法。
43、第五方面,本技术提供一种计算机程序产品,包括计算机执行指令,所述计算机执行指令被处理器执行时实现第一方面任一项所述的软件漏洞检测方法。
44、本技术提供的软件漏洞检测方法、装置、设备及存储介质,提供了一种获取用于对待检测程序进行漏洞检测的测试用例的方案,通过先对待检测程序进行模糊测试,得到可导致待检测程序崩溃的初始测试用例,由于模糊测试所得的测试用例存在局限性,基于此,通过对初始测试用例进行污点标记,以标记后的初始测试用例为种子输入,对待检测程序进行动态符号执行,得到路径约束,然后基于在待检测程序运行过程中获取的堆块状态信息和污染信息,来构造针对堆漏洞的攻击约束,从而通过约束求解器来对路径约束和攻击约束进行合取并求解,得到同时满足路径约束和攻击约束的求解结果,这样求解结果中的目标测试用例是针对堆漏洞生成的,更加有针对性,从而采用目标测试用例对待检测程序进行漏洞检测的准确性更高。