CN117972707A - 软件漏洞检测方法、装置、设备及存储介质 - Google Patents

软件漏洞检测方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN117972707A
CN117972707A CN202311567495.1A CN202311567495A CN117972707A CN 117972707 A CN117972707 A CN 117972707A CN 202311567495 A CN202311567495 A CN 202311567495A CN 117972707 A CN117972707 A CN 117972707A
Authority
CN
China
Prior art keywords
heap
heap block
program
detected
block
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202311567495.1A
Other languages
English (en)
Inventor
庄沃霖
曾炜
李艺枫
沈超建
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Industrial and Commercial Bank of China Ltd ICBC
Original Assignee
Industrial and Commercial Bank of China Ltd ICBC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Industrial and Commercial Bank of China Ltd ICBC filed Critical Industrial and Commercial Bank of China Ltd ICBC
Priority to CN202311567495.1A priority Critical patent/CN117972707A/zh
Publication of CN117972707A publication Critical patent/CN117972707A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本申请提供一种软件漏洞检测方法、装置、设备及存储介质,涉及信息安全领域。该方法包括:对待检测程序进行模糊测试,以获得可导致待检测程序崩溃的初始测试用例;对初始测试用例进行污点标记,并以标记后的初始测试用例为种子输入,驱动待检测程序进行动态符号执行,以获得待检测程序对应的路径约束;基于在待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;采用约束求解器,对路径约束和攻击约束进行合取并求解,以获得同时满足路径约束和攻击约束的求解结果,求解结果包括目标测试用例;采用目标测试用例对待检测程序进行漏洞检测。目标测试用例是针对堆漏洞生成的,更加有针对性,漏洞检测的准确性更高。

Description

软件漏洞检测方法、装置、设备及存储介质
技术领域
本申请涉及信息安全领域,尤其涉及一种软件漏洞检测方法、装置、设备及存储介质。
背景技术
堆内存漏洞是一种常见的软件漏洞,这类漏洞通过构造特殊的堆块结构来实现堆内存漏洞的利用,进而导致控制流劫持及任意代码执行的目的。目前有不少的二进制漏洞的自动化调试与检测方法已经能有效地发现程序错误,其中一部分程序错误可以被利用,并导致严重后果。如何快速、准确地自动检测漏洞,是当前漏洞自动分析与检测的关键问题之一。
目前,软件漏洞检测方法主要分为静态分析与动态分析两大类,静态分析主要是白盒代码审计,动态分析主要是灰/黑盒模糊测试。
然而,静态分析需要对代码进行人工审核,效率低而且审计效果取决于审计人员的技术水平,并且程序运行存在漏报与误报。模糊测试需采用随机或者人为的方式构造测试用例,测试用例不具有针对性,存在一定的局限性。
发明内容
本申请提供一种软件漏洞检测方法、装置、设备及存储介质,通过针对堆漏洞生成目标测试用例,更加有针对性,从而采用目标测试用例对待检测程序进行漏洞检测的准确性更高。
第一方面,本申请提供一种软件漏洞检测方法,包括:
对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例;
对所述初始测试用例进行污点标记,并以标记后的所述初始测试用例为种子输入,驱动所述待检测程序进行动态符号执行,以获得所述待检测程序对应的路径约束;
基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;所述堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;所述污染信息用于表示所述种子输入对内存区域的污染情况;所述内存区域为执行所述待检测程序的进程所映射的内存区域;
采用约束求解器,对所述路径约束和所述攻击约束进行合取并求解,以获得同时满足所述路径约束和所述攻击约束的求解结果,所述求解结果包括目标测试用例;
采用所述目标测试用例对所述待检测程序进行漏洞检测。
可选地,所述攻击约束包括tcache poisoning攻击约束和攻击载荷约束;所述基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束,包括:
基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合;所述可利用堆块集合中的堆块存在被攻击者利用的可能;
针对所述可利用堆块集合中的任一堆块,基于所述堆块对应的状态信息,确定所述堆块是否满足堆块可控条件;所述堆块可控条件用于判断堆块是否能够被攻击者控制;
若确定所述堆块满足所述堆块可控条件,则针对所述堆块,构造所述tcachepoisoning攻击约束,以将所述堆块对应的next指针所指向的地址约束为关键指针所指向的地址,所述关键指针所指向的地址为要申请的任一内存地址;
基于所述污染信息,确定所述堆块对应的next指针是否满足指针可控条件;所述指针可控条件用于判断指针是否能够被攻击者控制;
若确定所述next指针满足所述指针可控条件,则针对所述堆块,构造所述攻击载荷约束,以将所述堆块对应的next指针对应的指针数据约束为攻击载荷的值,所述指针数据为所述next指针所指向的地址中存放的数据。
可选地,所述堆块对应的状态信息包括所述堆块的数据区域的起始地址、所述堆块的数据区域的长度和所述堆块的状态;所述状态为已分配状态或被释放状态;
所述基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合,包括:
针对所述堆块集合中的各所述堆块,若确定所述堆块的数据区域的起始地址位于内存写入区域的地址范围内,且所述堆块的状态为所述被释放状态,则确定所述堆块存在释放后重用漏洞;
将所述堆块添加到所述可利用堆块集合中。
可选地,所述堆块对应的状态信息包括所述堆块的数据区域的起始地址、所述堆块的数据区域的长度和所述堆块的状态;所述状态为已分配状态或被释放状态;
所述基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合,包括:
针对所述堆块集合中的各所述堆块,若所述堆块的数据区域的下边界位于所述内存写入区域的地址范围内,则确定所述堆块存在堆溢出漏洞;所述下边界基于所述堆块的数据区域的起始地址与所述堆块的数据区域的长度确定;
将与所述堆块相邻的被数据溢出的堆块添加到所述可利用堆块集合中。
可选地,所述堆块对应的状态信息还包括第一状态关联信息和第二状态关联信息,所述第一状态指示信息用于指示所述堆块在所述被释放状态下是否位于tcache的链表上,所述第二状态指示信息用于指示所述堆块在所述被释放状态下且位于tcache的链表上时是否存在后继堆块;
所述基于所述堆块对应的状态信息,确定所述堆块是否满足堆块可控条件,包括:
若确定所述堆块的状态为所述被释放状态,且所述第一状态关联信息指示所述堆块位于tcache的链表上,且所述第二状态关联信息指示所述堆块存在后继堆块,则确定所述堆块满足所述堆块可控条件。
可选地,所述污染信息包括符号化区域对应的起始地址和长度;所述基于所述污染信息,确定所述堆块对应的next指针是否满足指针可控条件,包括:
若确定所述堆块对应的next指针所指向的地址位于所述符号化区域之内,则确定所述next指针满足所述指针可控条件。
可选地,所述污染信息的获取过程,包括:
在所述内存区域内遍历搜索,依次读取所遍历的值,并判断所遍历的值是否为符号值;
若确定所述所遍历的值为符号值,则确定所遍历的内存区域为符号化区域,以逐步确定所述符号化区域的起始地址和长度。
可选地,所述待检测程序为目标软件对应的二进制可执行程序;所述对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例之前,所述方法还包括以下任一项:
获取用户设备发送的所述待检测程序,所述用户设备用于对所述目标软件对应的源代码进行编译,以获得所述待检测程序;
获取所述目标软件对应的源代码,并对所述源代码进行编译,以获得所述待检测程序。
第二方面,本申请提供一种软件漏洞检测装置,包括:
模糊测试模块,用于对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例;
符号执行模块,用于对所述初始测试用例进行污点标记,并以标记后的所述初始测试用例为种子输入,驱动所述待检测程序进行动态符号执行,以获得所述待检测程序对应的路径约束;
约束构造模块,用于基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;所述堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;所述污染信息用于表示所述种子输入对内存区域的污染情况;所述内存区域为执行所述待检测程序的进程所映射的内存区域;
约束求解模块,用于采用约束求解器,对所述路径约束和所述攻击约束进行合取并求解,以获得同时满足所述路径约束和所述攻击约束的求解结果,所述求解结果包括目标测试用例;
漏洞检测模块,用于采用所述目标测试用例对所述待检测程序进行漏洞检测。
第三方面,本申请提供一种电子设备,包括:处理器以及与所述处理器通信连接的存储器;
所述存储器存储计算机执行指令;
所述处理器执行所述存储器存储的计算机执行指令,以实现如第一方面任一项所述的软件漏洞检测方法。
第四方面,本申请提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现第一方面任一项所述的软件漏洞检测方法。
第五方面,本申请提供一种计算机程序产品,包括计算机执行指令,所述计算机执行指令被处理器执行时实现第一方面任一项所述的软件漏洞检测方法。
本申请提供的软件漏洞检测方法、装置、设备及存储介质,提供了一种获取用于对待检测程序进行漏洞检测的测试用例的方案,通过先对待检测程序进行模糊测试,得到可导致待检测程序崩溃的初始测试用例,由于模糊测试所得的测试用例存在局限性,基于此,通过对初始测试用例进行污点标记,以标记后的初始测试用例为种子输入,对待检测程序进行动态符号执行,得到路径约束,然后基于在待检测程序运行过程中获取的堆块状态信息和污染信息,来构造针对堆漏洞的攻击约束,从而通过约束求解器来对路径约束和攻击约束进行合取并求解,得到同时满足路径约束和攻击约束的求解结果,这样求解结果中的目标测试用例是针对堆漏洞生成的,更加有针对性,从而采用目标测试用例对待检测程序进行漏洞检测的准确性更高。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
图1是根据一示例性实施例示出的一种应用场景的示意图;
图2是根据一示例性实施例示出的一种软件漏洞检测方法的流程示意图;
图3是根据另一示例性实施例示出的一种软件漏洞检测方法的流程示意图;
图4是根据一示例性实施例示出的一种攻击检测系统的示意图;
图5是根据一示例性实施例示出的一种软件漏洞检测流程的示意图;
图6是根据一示例性实施例示出的一种软件漏洞检测装置的结构示意图;
图7是根据一示例性实施例示出的一种电子设备的结构示意图。
通过上述附图,已示出本申请明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本申请构思的范围,而是通过参考特定实施例为本领域技术人员说明本申请的概念。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。在以下各实施例的描述中,“多个”的含义是两个以上,除非另有明确具体的限定。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
需要说明的是,本申请的软件漏洞检测方法、装置、设备及存储介质可用于信息安全领域,也可用于除信息安全之外的任意领域,本申请对软件漏洞检测方法、装置、设备及存储介质的应用领域不作限定。例如,可用于金融领域,以实现对金融软件的漏洞检测。
首先对本申请所涉及的名词进行解释:
堆溢出漏洞:堆溢出漏洞是指在程序运行时,由于没有正确验证输入数据的大小或格式,导致向堆中写入超出分配内存区域的数据,从而覆盖掉原有的数据或者修改程序运行时的状态,甚至可以在程序中执行恶意代码。
double free攻击:double free(双倍释放)攻击是一种常见的内存漏洞,它利用了程序中的内存管理错误。当程序中试图释放已经被释放的内存时,就会出现double free漏洞。攻击者可以通过多次释放同一个内存地址,从而导致程序崩溃或者执行恶意代码。攻击者通常会先使用一个指针释放一块内存,然后再使用另一个指针释放同一块内存。由于内存已经被释放,第二个释放操作可能会导致程序崩溃或执行恶意代码。攻击者可以利用这种漏洞来绕过安全检查、篡改数据或者执行其他恶意操作。
Use after free漏洞:Use-after-free(UAF,释放后重用)漏洞是一种常见的内存漏洞,通常发生在程序释放了内存后,但仍然使用了该内存指针的情况下。具体来说,UAF漏洞通常发生在程序使用动态内存分配函数(如malloc、calloc、realloc等函数)分配内存并在程序执行过程中释放该内存后,仍然继续使用了该内存指针,导致程序发生未定义行为,从而可能被攻击者利用,引发安全漏洞。攻击者通常会利用UAF漏洞来执行恶意代码,例如在被释放的内存上注入代码或者修改内存中的数据,从而执行非法操作,获取敏感信息或者控制系统。UAF漏洞往往是一种难以检测和修复的安全漏洞,因此对于程序员和安全专家来说,理解UAF漏洞的工作原理和预防方法非常重要。
tcache机制:tcache机制是glibc(一种c运行库)中一种用于优化堆内存分配效率的缓存机制。tcache指线程缓存。tcache将相同大小的内存块(又称堆块)分为一组,每组内存块形成一个单向链表。在每个线程中,tcache由多个单向链表组成,每个链表对应一种大小的内存块。当程序调用malloc请求内存时,glibc会首先查看tcache中是否有对应大小的空闲内存块可用。如果tcache中有可用的内存块,glibc会直接从tcache中分配内存,这比从堆中分配内存要快得多。当程序调用free释放内存时,glibc会将该内存块插入到tcache中,如果tcache已满,则会将该内存块插入到堆的未分配内存链表中。由于tcache是在每个线程中维护的,因此每个线程都有自己的tcache,减少了线程间同步的需要,提高了分配器的并发性能。tcache机制虽然优化了内存分配和释放效率,但是也会带来一些安全风险。例如,当tcache中存在同一个内存块的多个指针时,攻击者可能会利用这种情况实施doublefreee漏洞。另外,攻击者还可以利用tcache中存储的指针创造一些非法内存块,从而实现Heap Exploitation(堆利用)等攻击。
tcache poisoning攻击:tcache poisoning(缓存投毒)是一种针对glibc中的tcache机制的攻击技术,利用程序中的一个内存溢出漏洞或者UAF漏洞,控制已经释放的内存块,然后将恶意的数据放入到tcache中,从而实现对程序的控制。其中,内存溢出漏洞可以为堆溢出漏洞。
攻击者利用tcache poisoning攻击的基本流程如下:
1.找到一个漏洞,例如内存溢出漏洞或者UAF漏洞,使攻击者可以控制已经释放的内存块。
2.利用漏洞控制tcache中的一个已释放的内存块,将其指向恶意的数据。
3.利用malloc申请内存块,此时tcache会先尝试从tcache链表中找到已经释放的内存块来分配内存,由于攻击者已经控制了tcache中的某个已释放的内存块,因此攻击者就可以控制malloc返回的内存块地址。
4.利用已经控制的malloc返回的内存块地址进行进一步攻击,例如在返回的内存块中放置shellcode,实现远程代码执行。
需要注意的是,tcache poisoning攻击需要满足一些前提条件,例如必须有一个内存溢出漏洞或者UAF漏洞,攻击者必须能够控制已经释放的内存块等。
tcache poisoning攻击的成功与否取决于多个因素,如分配器内部状态、应用程序的代码实现以及攻击者能够控制的变量等。攻击者需要具备一定的技能和知识,例如熟悉glibc malloc的实现细节,能够定位和利用内存溢出漏洞和UAF漏洞等。
模糊测试:模糊测试是一种通过提供非预期的输入并监视异常结果来发现软件故障的方法。模糊测试一般是一个自动或半自动的过程,这个过程包括反复操纵软件并为其提供输入数据。在模糊测试中,首先要构造一个非正常的输入数据,然后根据设定好的测试模式进行测试,并对测试结果进行监测,通过对异常的分析,从中找出可能引发漏洞攻击的错误。
符号执行:符号执行(Symbolic Execution)是一种程序分析技术,它可以自动地探索程序的所有可能路径,而不需要执行实际的程序代码。在符号执行中,程序的输入被视为符号变量,而不是具体的数值。当程序执行到某个分支语句时,符号执行器会生成两个不同的路径条件,每个路径条件对应于分支语句的两个可能结果。符号执行器会对这些路径条件进行求解,并生成一组满足这些路径条件的输入,这些输入可以用作程序的测试用例。与传统的手工编写测试用例不同,符号执行技术可以自动生成输入,覆盖程序中所有可能的路径,并且可以发现一些难以发现的错误,例如内存泄漏、空指针引用等。同时,符号执行技术也可以帮助程序开发人员理解程序的行为,发现程序中隐藏的逻辑错误,并且可以进行代码审计等。
导向式符号执行:导向式符号执行(Directed Symbolic Execution)是一种基于符号执行的程序分析技术。与传统的符号执行技术相比,导向式符号执行能够更加高效地找出程序中的漏洞,并且能够生成更准确的测试用例。在传统的符号执行中,程序的执行路径是由符号执行器自动探索生成的。这种自动化探索的方式可能会导致大量的路径探索,其中许多路径可能并不具有实际意义。而在导向式符号执行中,程序的执行路径是由用户指定的导向条件来控制的。这些导向条件可以是程序中的断言、错误处理代码、或者是用户自定义的条件。导向式符号执行器只会在满足这些导向条件的情况下进行路径探索,从而减少了路径探索的数量。导向式符号执行技术还可以利用已知的程序语义信息来指导路径探索。例如,可以使用程序中已知的前置条件、后置条件或约束条件来限制符号执行的搜索空间。这些限制条件可以显著提高符号执行器的效率。
污点分析:污点分析是一种程序分析技术,用于追踪程序中敏感数据的流动和使用情况。通过污点分析,可以识别程序中的漏洞和潜在的安全问题,帮助开发人员和安全专家快速发现和修复安全漏洞。污点分析的核心思想是在程序执行过程中,为敏感数据打上标记,称之为“污点”。当敏感数据被使用时,它的污点也会被传递给其他相关的变量和函数,从而形成一条污点链。通过追踪污点链,可以确定敏感数据在程序中的使用情况和安全性。
约束求解器:约束求解器是一种计算机程序,用于解决带有约束条件的问题。这些问题可以是数学问题、逻辑问题或者其他类型的问题,通常会涉及多个变量和多个约束条件。约束求解器的主要目的是找到符合所有约束条件的变量值组合,或者确定是否存在这样的解。为此,约束求解器使用一系列算法和技术,包括搜索算法、剪枝算法、约束传播等等。
种子输入:在符号执行中,种子输入是指输入程序的初始输入,用于启动符号执行的过程。在符号执行中,程序的输入不再是具体的数值,而是用符号表示的符号变量,即变量的值是未知的,但是可以用符号变量表示。符号执行使用这些符号变量来代表程序中的输入,以便探索程序执行的所有可能路径。
为了清楚理解本申请的技术方案,首先对现有技术的方案进行详细介绍。
一直以来,软件安全漏洞不仅是病毒、蠕虫等的重要传播途径,也是网络攻防的攻击焦点,绝大多数的网络入侵都是基于软件的安全漏洞进行的。攻击者可以利用这些安全漏洞访问到未授权的系统资源,进而可以破坏系统中重要的数据信息,从而对信息系统安全造成了极大地威胁,因而信息安全领域的核心问题之一就是计算机系统中存在的各种软件漏洞。而在金融领域大型信息系统建设中,存在部分软件需要依赖外部产品的需求,该部分有可能难以获取源码进行内部安全检测,如果不能很好进行安全风险检测会为系统引入潜在的安全风险,因此需要一种能够只需要执行文件就能完成风险检测方案。
堆内存漏洞是一种常见的软件漏洞,这类漏洞通过构造特殊的堆块结构来实现堆内存漏洞的利用,进而导致控制流劫持及任意代码执行的目的。目前有不少的二进制漏洞的自动化调试与检测方法已经能有效地发现程序错误,但其中只有一部分程序错误可以被利用,并导致严重后果。如何快速、准确地自动分析漏洞的危险性,是当前漏洞自动分析与检测的关键问题之一。
目前业界对产品的安全测试主要分为静态分析与动态分析两大类,静态分析主要是白盒代码审计,动态分析主要是灰/黑盒模糊测试。
白盒代码审计是指对程序的源码通过人工或者运用半自动化或者自动化工具进行审计,检测程序中可能存在的安全漏洞的点,主要分析方法有词法分析、语法分析、控制流、数据流分析等。白盒代码审计一方面需要大量的代码审核人员对代码进行人工审核,还要求获得程序的源代码,而很多时候源代码作为厂家核心资产不予提供,审核效率低而且审核效果取决于审核人员的技术水平,另一方面对于静态代码审计而言,由于目前程序运行的复杂性,漏报率与误报率均居高不下,难以精准识别,这也给审核人员带来了极大的负担。由于软件庞大的代码量、复杂的代码结构还有各种封装的函数,人工审核计很难发现那些由于多处编码不够完善而产生或者目前尚未被广泛发现的漏洞,由于缺少在运行过程中的检验,在漏掉很多复杂的漏洞同时该方案还会将很多虽然编码不完善但是无法利用的代码标记为漏洞代码,因此往往需要有经验的人员花费大量的时间对检测结果进行再次检验。
灰/黑和模糊测试主要是通过构造模糊测试工具来实现的。通过向编写的模糊测试工具输入一些随机或者精心构造的数据来观察目标程序对输入数据的响应,从而发现代码存在的问题。通常对目标程序的模糊测试以大小相关的部分、字符串、标志字符串开始或者结束的二进制块等为重点。模糊测试需采用随机或者人为的方式构造测试用例,测试用例不具针对性,出现异常后需要测试人员对造成异常的数据包进行分析,存在一定的局限性。
针对上述技术中存在的问题,发明人在研究中发现,为了解决该问题,可以在模糊测试的基础上结合符号执行来生成测试用例。具体地,本申请提供了一种获取用于对待检测程序进行漏洞检测的测试用例的方案,通过先对待检测程序进行模糊测试,得到可导致待检测程序崩溃的初始测试用例,由于模糊测试所得的测试用例存在局限性,基于此,通过对初始测试用例进行污点标记,以标记后的初始测试用例为种子输入,对待检测程序进行动态符号执行,得到路径约束,然后基于在待检测程序运行过程中获取的堆块状态信息和污染信息,来构造针对堆漏洞的攻击约束,从而通过约束求解器来对路径约束和攻击约束进行合取并求解,得到同时满足路径约束和攻击约束的求解结果,这样求解结果中的目标测试用例是针对堆漏洞生成的,更加有针对性,从而采用目标测试用例对待检测程序进行漏洞检测的准确性更高。
下面对本申请实施例提供的软件漏洞检测方法的应用场景进行介绍。
图1是根据一示例性实施例示出的一种应用场景的示意图。如图1所示,该应用场景中包括:电子设备1。电子设备1为用于进行软件漏洞检测的设备,例如电子设备1为服务器、服务器集群等设备。在本实施例中,电子设备1先生成测试用例,再进行软件漏洞测试。在一种可选应用场景中,电子设备1对待检测程序进行模糊测试,以获得可导致待检测程序崩溃的初始测试用例,再对初始测试用例进行污点标记,并以标记后的初始测试用例为种子输入,驱动待检测程序进行动态符号执行,以获得待检测程序对应的路径约束,再基于在待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束,再采用约束求解器,对路径约束和攻击约束进行合取并求解,以获得同时满足路径约束和攻击约束的求解结果,求解结果包括目标测试用例;再采用目标测试用例对待检测程序进行漏洞检测。
下面以具体的实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本申请的实施例进行描述。
图2是根据一示例性实施例示出的一种软件漏洞检测方法的流程示意图。本申请提供的软件漏洞检测方法的执行主体为软件漏洞检测装置,该软件漏洞检测装置集成在电子设备中。如图2所示,本实施例提供的软件漏洞检测方法包括以下步骤。
步骤S101,对待检测程序进行模糊测试,以获得可导致待检测程序崩溃的初始测试用例。
其中,待检测程序为目标软件对应的任一需要进行漏洞检测的程序。目标软件可以是任一类型的软件,例如,金融软件、社交软件或视频软件等。示例性地,待检测程序为目标软件对应的二进制可执行文件。该二进制可执行文件由目标软件的源代码编译得到。
本实施例中,电子设备提供有模糊测试功能,在获取到待检测程序之后,通过对待检测程序进行模糊测试,得到初始测试用例。初始测试用例可以看作是一种crash文件(用于记录应用程序崩溃信息的文件)。而初始测试用例存在局限性,因此在步骤S101之后,电子设备基于初始测试用例对待检测程序进行符号执行,相应地,电子设备执行步骤S102。
步骤S102,对初始测试用例进行污点标记,并以标记后的初始测试用例为种子输入,驱动待检测程序进行动态符号执行,以获得待检测程序对应的路径约束。
本实施例中,电子设备还提供有符号执行功能,以动态符号执行的方式对待检测程序进行符号执行,基于此,还对初始测试用例进行污点标记,则标记后的初始测试用例可以看作是“污点”,将标记后的初始测试用例作为种子输入,来对待检测程序进行动态符号执行,而动态符号执行的结果是得到待检测程序对应的路径约束。其中,路径约束以约束条件表达式的形式存在。
在运行待检测程序的过程中,还获取堆块状态信息和污染信息,从而电子设备执行步骤S103。
步骤S103,基于在待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;污染信息用于表示种子输入对内存区域的污染情况;内存区域为执行待检测程序的进程所映射的内存区域。
其中,攻击约束以约束条件表达式的形式存在。堆块集合中的堆块为内存区域中的堆块,且内存区域为执行待检测程序的进程所映射的内存区域。
步骤S104,采用约束求解器,对路径约束和攻击约束进行合取并求解,以获得同时满足路径约束和攻击约束的求解结果,求解结果包括目标测试用例。
本实施例中,在得到路径约束和攻击约束之后,采用约束求解器来合取并求解,从而得到目标测试用例,该目标测试用例相较于初始测试用例更加具有针对性,能够用于对待检测程序进行漏洞检测。
步骤S105,采用目标测试用例对待检测程序进行漏洞检测。
本申请提出一种基于模糊测试与符号执行结合的tcache poisoning攻击检测方案,通过对待检测程序进行模糊测试与符号执行结合的检测,可以有效发现待检测程序中是否存在发生tcache poisoning攻击的可能。具体地,本申请提供了一种获取用于对待检测程序进行漏洞检测的测试用例的方案,通过先对待检测程序进行模糊测试,得到可导致待检测程序崩溃的初始测试用例,由于模糊测试所得的测试用例存在局限性,基于此,通过对初始测试用例进行污点标记,以标记后的初始测试用例为种子输入,对待检测程序进行动态符号执行,得到路径约束,然后基于在待检测程序运行过程中获取的堆块状态信息和污染信息,来构造针对堆漏洞的攻击约束,从而通过约束求解器来对路径约束和攻击约束进行合取并求解,得到同时满足路径约束和攻击约束的求解结果,这样求解结果中的目标测试用例是针对堆漏洞生成的,更加有针对性,从而采用目标测试用例对待检测程序进行漏洞检测的准确性更高。
图3是根据另一示例性实施例示出的一种软件漏洞检测方法的流程示意图,如图3所示,本实施例提供的软件漏洞检测方法,是在本申请上一实施例提供的软件漏洞检测方法的基础上,对步骤S103进行了进一步的细化。本实施例提供的软件漏洞检测方法包括以下步骤。
步骤S201,对待检测程序进行模糊测试,以获得可导致待检测程序崩溃的初始测试用例。
本实施例中,步骤S201的实现方式与上述步骤S101的实现方式同理,在此不再赘述。
在一种可选实施例中,待检测程序为目标软件对应的二进制可执行程序;相应地,在步骤S201之前,获取待检测程序的过程包括以下任一种实现方式:
第一种实现方式,电子设备获取用户设备发送的待检测程序,用户设备用于对目标软件对应的源代码进行编译,以获得待检测程序。其中,电子设备与用户设备通信连接,用户设备为用户所使用的终端设备,用户可以为软件测试人员或者其他专业技术人员,用户通过用户设备上传目标软件对应的源代码,然后触发用户设备对源代码进行编译,得到待检测程序,然后触发用户设备向电子设备发送该待检测程序,而电子设备接收该待检测程序并存储。
第二种实现方式,电子设备获取目标软件对应的源代码,并对源代码进行编译,以获得待检测程序。示例性地,电子设备直接从数据库中获取源代码,或者,电子设备接收用户设备发送的源代码。在获取到源代码之后,对源代码进行编译,得到待检测程序,然后存储待检测程序。
上述两种实现方式分别从不同角度获得待检测程序,一种是用户设备对源代码编译得到待检测程序,然后发送至电子设备,这种方式中,用户可以对编译得到的二进制可执行程序进行人工检查,更加灵活。另一种是电子设备对源代码编译得到待检测程序,无需用户额外操作,便捷性更高。
电子设备在需要对待检测程序进行模糊测试时,获取已存储的待检测程序,然后执行步骤S201。
步骤S202,对初始测试用例进行污点标记,并以标记后的初始测试用例为种子输入,驱动待检测程序进行动态符号执行,以获得待检测程序对应的路径约束。
本实施例中,步骤S202的实现方式与上述步骤S102的实现方式同理,在此不再赘述。
本实施例中,将模糊测试得到的初始测试用例标记为符号化的污点数据,作为符号化的种子文件输入,驱动待检测程序进行动态符号执行。在动态符号执行过程中,受到符号化输入也即种子文件影响的内存区域被标记为污点区域。此外,为了提高漏洞检测效率,在动态符号执行过程中,还会收集待检测程序在动态运行过程中的运行路径,得到路径约束。通过生成路径约束,使用导向式符号执行技术,可以快速定位待检测程序中的堆溢出错误位置,并使待检测程序沿着符号化种子输入所指向的确定路径动态运行到存在堆溢出漏洞的位置。
在步骤S202之后,电子设备基于在待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束。其中,堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;污染信息用于表示种子输入对内存区域的污染情况;内存区域为执行待检测程序的进程所映射的内存区域。
本实施例中,电子设备还提供有API函数挂钩功能,用于获取堆块状态信息。示例性地,可以通过对malloc、calloc、realloc以及free等堆内存管理相关的API(ApplicationProgramming Interface)函数进行挂钩实现。通过获取函数入口和返回时特定寄存器的值获取堆块状态信息。比如在malloc函数返回时进行函数挂钩,RAX寄存器中存储的是申请的堆块指针,通过读取RAX寄存器中的值就可以获取到堆块数据区域的起始地址。
在不改变程序行为的情况下,对堆的创建、写入、释放等行为进行监视。通过寄存器数据传递,获得相关函数的参数,例如新建堆块的相关数据,包括新建堆块的起始地址、新建堆块的长度、新建堆块的地址的指针值、新建堆块的初始化数据以及新建区块的相邻区块信息。还有监控堆块以及tcache的状态,包括堆块是否处于被释放状态、是否位于tcache链表上、是否存在后续堆块、tcache链表上被释放堆块的大小与该大小链表上存在的已释放堆块的数量等数据。
为了执行污点分析和符号执行,需要将外部的输入进行符号化。通过对外部输入的API函数进行函数挂钩,能够实现符号变元的引入。例如需要将read函数的输入进行符号化时,在read函数入口处进行函数挂钩,通过读取RSI和RDX寄存器(64位系统下)的值,获取到外部数据读入的地址以及长度等关键信息,然后将该数据区域标记为符号值。
在一种可选实施例中,攻击约束包括tcache poisoning攻击约束和攻击载荷约束;基于在待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束的实现方式包括以下步骤S203-步骤S207。
步骤S203,基于堆块状态信息,确定堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合;可利用堆块集合中的堆块存在被攻击者利用的可能。
其中,堆块对应的状态信息包括堆块的数据区域的起始地址、堆块的数据区域的长度和堆块的状态;该状态为已分配状态或被释放状态。堆漏洞的类型较多,例如堆漏洞为UAF漏洞、堆溢出漏洞或double free漏洞等。本实施例中,电子设备还提供有堆漏洞检测功能,以检测堆块是否存在堆漏洞,相应地,步骤S203包括以下几种实现方式。
第一种实现方式针对UAF漏洞,相关技术中通过对悬挂指针列表进行检测,观察程序中是否存在对悬挂指针进行解引用尝试访问非法内存的路径与操作,来确定是否存在UAF漏洞。具体地,本实施例针对堆块集合中的各堆块,若确定堆块的数据区域的起始地址位于内存写入区域的地址范围内,且堆块的状态为被释放状态,则确定堆块存在UAF漏洞;将堆块添加到可利用堆块集合中。其中,内存写入区域是指内存中已写入数据的区域。
该实现方式提供了一种确定堆块是否存在UAF漏洞的方案,若堆块存在UAF漏洞,表明堆块存在被攻击者利用的可能,则可以将堆块添加到可利用堆块集合中,为后续操作提供数据支持。
第二种实现方式针对堆溢出漏洞,具体地,针对堆块集合中的各堆块,若堆块的数据区域的下边界位于内存写入区域的地址范围内,则确定堆块存在堆溢出漏洞;下边界基于堆块的数据区域的起始地址与堆块的数据区域的长度确定;将与堆块相邻的被数据溢出的堆块添加到可利用堆块集合中。其中,下边界是指从堆块的数据区域的起始地址开始,经过该长度之后的内存地址。
该实现方式提供了一种确定堆块是否存在堆溢出漏洞的方案,若堆块存在堆溢出漏洞,表明与该堆块相邻的堆块存在被攻击者利用的可能,则可以将与该堆块相邻的堆块添加到可利用堆块集合中,为后续操作提供数据支持。
第三种实现方式针对double free漏洞,具体地,对free函数进行挂钩,被释放的堆块都存储到已释放堆块集合free_chunk中,在堆块即将被释放之前,将当前堆块指针与已释放堆块集合中的堆块指针进行比较,若相同,则说明存在double free漏洞。而为了防止已释放堆块被分配再被释放的情况出现,在新堆块成功创建之后,将当前堆块与已释放堆块集合中堆块进行对比,若相同,则将该堆块信息从已释放堆块集合中删除。
本实施例通过上述步骤得到了可利用堆块集合,该集合中的堆块存在被攻击者利用的可能,那么可以对可利用堆块集合中的堆块进行进一步地判断,以判断堆块是否存在被tcache poisoning攻击的可能。相应地,电子设备执行步骤S204。
步骤S204,针对可利用堆块集合中的任一堆块,基于堆块对应的状态信息,确定堆块是否满足堆块可控条件;堆块可控条件用于判断堆块是否能够被攻击者控制。
示例性地,堆块对应的状态信息还包括第一状态关联信息和第二状态关联信息,第一状态指示信息用于指示堆块在被释放状态下是否位于tcache的链表上,第二状态指示信息用于指示堆块在被释放状态下且位于tcache的链表上时是否存在后继堆块;相应地,本实施例中,电子设备还提供有堆块数据可控性检测功能,用于确定堆块是否满足堆块可控条件。基于堆块对应的状态信息,确定堆块是否满足堆块可控条件的实现方式包括:若确定堆块的状态为被释放状态,且第一状态关联信息指示堆块位于tcache的链表上,且第二状态关联信息指示堆块存在后继堆块,则确定堆块满足堆块可控条件。反之,则确定堆块不满足堆块可控条件。
本实施例在堆块被释放的情况下,通过判断堆块的第一状态关联信息和第二状态关联信息来确定堆块是否满足堆块可控条件,若满足堆块可控条件,表示堆块满足tcachepoisoning攻击对堆块控制的要求,堆块极有可能被攻击者控制,这种确定堆块是否可控的方式较为准确。
步骤S205,若确定堆块满足堆块可控条件,则针对堆块,构造tcache poisoning攻击约束,以将堆块对应的next指针所指向的地址约束为关键指针所指向的地址,关键指针所指向的地址为要申请的任一内存地址。
本实施例中,在确定堆块满足堆块可控条件之后,则可以针对堆块构造tcachepoisoning攻击约束,该tcache poisoning攻击约束用于约束堆块对应的next指针的值为要申请的任意内存地址,一般为关键指针的地址,例如free_hook指针。next指针用于指向下一个堆块。
步骤S206,基于污染信息,确定堆块对应的next指针是否满足指针可控条件;指针可控条件用于判断指针是否能够被攻击者控制。
本实施例中,在构造tcache poisoning攻击约束之后,需要构造相应的攻击载荷约束,在构造攻击载荷约束之前,先判断next指针能否被攻击者控制。示例性地,污染信息包括符号化区域对应的起始地址和长度;相应地,本实施例中,电子设备提供有指针可控性检测功能,以判断指针是否能够被攻击者控制。基于污染信息,确定堆块对应的next指针是否满足指针可控条件的实现方式包括:若确定堆块对应的next指针所指向的地址位于符号化区域之内,则确定next指针满足指针可控条件。
其中,符号化区域也就是被污点所污染的区域,因此符号化区域对应的起始地址和长度可以看作是污染信息,能够表示内存区域的污染情况。若堆块对应的next指针所指向的地址位于符号化区域内,表示下一个堆块位于符号化区域内,也即下一个堆块位于污点所污染的区域内,那么表示next指针是可控的。
本实施例提供了一种判断堆块对应的next指针是否能够被攻击者控制的方式,这种判断方式较为准确。
在一种可选实现方式中,污染信息的获取过程包括:在内存区域内遍历搜索,依次读取所遍历的值,并判断所遍历的值是否为符号值;若确定所遍历的值为符号值,则确定所遍历的内存区域为符号化区域,以逐步确定符号化区域的起始地址和长度。
上述实现方式提供了一种污染信息的获取方式,每次访问符号化区域时,都将对符号化区域进行维护更新,具体而言,首先会获取程序进程映射的内存区域,然后在该内存区域内遍历搜索,依次读取内存区域的值,判断其内容是否是符号值,逐步确定符号化区域的起始地址和长度,通过检查内存的符号化属性,可以进行污点数据的判断,为多个堆块监视模块进一步的检测构造数据约束提供标记数据。
步骤S207,若确定next指针满足指针可控条件,则针对堆块,构造攻击载荷约束,以将堆块对应的next指针对应的指针数据约束为攻击载荷的值,指针数据为next指针所指向的地址中存放的数据。
本实施例中,在堆块满足堆块数据可控性的基础上,可以通过检测堆块的关键数据指针(next指针)所在的内存区域是否被符号化。若指针数据被符号化,则说明指针数据可被外部输入控制,可以在当前区域构建攻击载荷约束(payload约束),约束next区域的值为想要申请的任意内存地址,实现任意地址写从而劫持程序控制流到攻击载荷。在攻击载荷的布置过程中,首先会遍历符号化区域,若具有可执行权限而且符号化区域的长度大于攻击载荷的长度,则将该区域的值约束为攻击载荷的值。
本实施例通过先判断堆块是否存在堆漏洞,得到可利用堆块集合,基于此,再判断堆块是否可控,以此构造tcache poisoning攻击约束,在此基础上,判断堆块对应的next指针是否可控,以此构造攻击载荷约束,从而实现了针对堆漏洞的攻击约束的构造。
步骤S208,采用约束求解器,对路径约束和攻击约束进行合取并求解,以获得同时满足路径约束和攻击约束的求解结果,求解结果包括目标测试用例。
通过对上述过程中建立输出的tcache poisoning攻击约束、payload约束与路径约束进行合取并求解,建立测试用例的数据约束条件,使用约束求解器对数据约束条件进行求解,,则可得到用于tcache poisoning攻击的目标测试用例。
步骤S209,采用目标测试用例对待检测程序进行漏洞检测。
本实施例中,电子设备还提供有攻击验证功能,通过动态运行待检测程序,使用约束求解器得到的目标测试用例进行攻击,验证是否成功,并完成相应报告。
图4是根据一示例性实施例示出的一种攻击检测系统的示意图,如图4所示,攻击检测系统包括模糊测试模块、符号执行模块、API函数挂钩模块、堆漏洞检测模块、堆块数据可控性检测模块、指针可控性检测模块、约束求解器和攻击验证模块。其中,攻击检测系统是指电子设备用于实现软件漏洞检测的多个功能模块的集合,每个功能模块所实现的相应功能参见上述实施例,在此不再赘述。
图5是根据一示例性实施例示出的一种软件漏洞检测流程的示意图,如图5所示,对待检测程序进行模糊测试,得到可导致目标程序崩溃的二进制文件,然后使用符号执行引擎,将该二进制文件标记为符号化的污点数据,作为种子输入,驱动待检测程序进行动态符号执行,在符号执行过程中收集得到待检测程序动态运行过程中的路径约束,并通过API函数挂钩模块进行监视,获取堆块对应的状态信息以及污染信息,然后对程序crash的位置进行符号化分析,对内存写入以及堆块释放的操作进行监控,通过堆漏洞检测模块检测是否存在堆溢出漏洞、UAF漏洞或者double free漏洞,然后通过堆块数据可控性检测模块,对可能存在漏洞的堆块进行判断,如果堆块满足堆块可控条件,则构造tcache poisoning攻击约束,通过指针可控性检测模块检测next指针所在的内存区域是否被符号化,若指针数据被符号化,则说明指针数据可控,可以在当前区域构建payload约束,然后通过约束求解器对tcache poisoning攻击约束、payload约束与路径约束进行合取并求解,得到攻击文件,该攻击文件为可以触发tcache poisoning攻击的二进制输入文件,然后使用该攻击文件进行攻击模拟测试,生成检测报告。该攻击文件也即上述实施例中的目标测试用例。
本申请提出了一种基于模糊测试与符号执行结合的tcache poisoning攻击风险检测方案,解决了白盒代码审计漏报率与误报率比较高的问题,通过模糊测试与符号执行技术相结合,对触发tcache poisoning攻击的条件进行建模并进行约束求解,求解后再进行攻击验证,减少误报的可能,减少漏报率;解决了白盒代码审计需要获取产品源代码的问题,本方案直接针对程序的可执行文件进行模糊测试来生成crash文件与污点数据,不需要产品源代码;解决了灰/黑模糊测试用例不具针对性,效率低,需要很长时间与计算资源的问题,通过导向式符号执行技术,用路径约束来定位溢出位置,提高了检测效率。
图6是根据一示例性实施例示出的一种软件漏洞检测装置的结构示意图,如图6所示,本实施例中,软件漏洞检测装置300可以设置在电子设备中,软件漏洞检测装置300包括:
模糊测试模块301,用于对待检测程序进行模糊测试,以获得可导致待检测程序崩溃的初始测试用例;
符号执行模块302,用于对初始测试用例进行污点标记,并以标记后的初始测试用例为种子输入,驱动待检测程序进行动态符号执行,以获得待检测程序对应的路径约束;
约束构造模块303,用于基于在待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;污染信息用于表示种子输入对内存区域的污染情况;内存区域为执行待检测程序的进程所映射的内存区域;
约束求解模块304,用于采用约束求解器,对路径约束和攻击约束进行合取并求解,以获得同时满足路径约束和攻击约束的求解结果,求解结果包括目标测试用例;
漏洞检测模块305,用于采用目标测试用例对待检测程序进行漏洞检测。
可选地,攻击约束包括tcache poisoning攻击约束和攻击载荷约束;约束构造模块303,具体用于:
基于堆块状态信息,确定堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合;可利用堆块集合中的堆块存在被攻击者利用的可能;
针对可利用堆块集合中的任一堆块,基于堆块对应的状态信息,确定堆块是否满足堆块可控条件;堆块可控条件用于判断堆块是否能够被攻击者控制;
若确定堆块满足堆块可控条件,则针对堆块,构造tcache poisoning攻击约束,以将堆块对应的next指针所指向的地址约束为关键指针所指向的地址,关键指针所指向的地址为要申请的任一内存地址;
基于污染信息,确定堆块对应的next指针是否满足指针可控条件;指针可控条件用于判断指针是否能够被攻击者控制;
若确定next指针满足指针可控条件,则针对堆块,构造攻击载荷约束,以将堆块对应的next指针对应的指针数据约束为攻击载荷的值,指针数据为next指针所指向的地址中存放的数据。
可选地,堆块对应的状态信息包括堆块的数据区域的起始地址、堆块的数据区域的长度和堆块的状态;状态为已分配状态或被释放状态;
约束构造模块303,具体用于:
针对堆块集合中的各堆块,若确定堆块的数据区域的起始地址位于内存写入区域的地址范围内,且堆块的状态为被释放状态,则确定堆块存在释放后重用漏洞;
将堆块添加到可利用堆块集合中。
可选地,堆块对应的状态信息包括堆块的数据区域的起始地址、堆块的数据区域的长度和堆块的状态;状态为已分配状态或被释放状态;
约束构造模块303,具体用于:
针对堆块集合中的各堆块,若堆块的数据区域的下边界位于内存写入区域的地址范围内,则确定堆块存在堆溢出漏洞;下边界基于堆块的数据区域的起始地址与堆块的数据区域的长度确定;
将与堆块相邻的被数据溢出的堆块添加到可利用堆块集合中。
可选地,堆块对应的状态信息还包括第一状态关联信息和第二状态关联信息,第一状态指示信息用于指示堆块在被释放状态下是否位于tcache的链表上,第二状态指示信息用于指示堆块在被释放状态下且位于tcache的链表上时是否存在后继堆块;
约束构造模块303,具体用于:
若确定堆块的状态为被释放状态,且第一状态关联信息指示堆块位于tcache的链表上,且第二状态关联信息指示堆块存在后继堆块,则确定堆块满足堆块可控条件。
可选地,污染信息包括符号化区域对应的起始地址和长度;约束构造模块303,具体用于:
若确定堆块对应的next指针所指向的地址位于符号化区域之内,则确定next指针满足指针可控条件。
可选地,装置300还包括第一获取模块,该第一获取模块,用于:
在内存区域内遍历搜索,依次读取所遍历的值,并判断所遍历的值是否为符号值;
若确定所遍历的值为符号值,则确定所遍历的内存区域为符号化区域,以逐步确定符号化区域的起始地址和长度。
可选地,待检测程序为目标软件对应的二进制可执行程序;装置300还包括第二获取模块,该第二获取模块,用于:
获取用户设备发送的待检测程序,用户设备用于对目标软件对应的源代码进行编译,以获得待检测程序;或者,
获取目标软件对应的源代码,并对源代码进行编译,以获得待检测程序。
本实施例提供的软件漏洞检测装置可以执行对应方法实施例的技术方案,其实现原理和技术效果与对应方法实施例类似,在此不再赘述。
本申请实施例还提供了一种电子设备。电子设备旨在各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机和其它适合的计算机。
图7是根据一示例性实施例示出的一种电子设备的结构示意图。如图7所示,电子设备400包括:处理器401以及与处理器401通信连接的存储器402。
存储器402存储有计算机执行指令;处理器401执行存储器402存储的计算机执行指令,以实现本申请所提供的软件漏洞检测方法。
其中,本申请实施例中,存储器402和处理器401通过总线连接。总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(PeripheralComponent Interconnect,PCI)总线或扩展工业标准体系结构(Extended IndustryStandard Architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本申请的实现。各个部件利用不同的总线互相连接,并且可以被安装在公共主板上或者根据需要以其它方式安装。
在示例性实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机执行指令,该计算机执行指令被处理器执行时用于实现本申请提供的软件漏洞检测方法。
在示例性实施例中,还提供了一种计算机程序产品,包括计算机执行指令,当该计算机程序产品中的计算机执行指令被处理器执行时用于实现本申请提供的软件漏洞检测方法。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本申请所必须的。
进一步需要说明的是,虽然流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
应该理解,上述的装置实施例仅是示意性的,本申请的装置还可通过其它的方式实现。例如,上述实施例中单元/模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如,多个单元、模块或组件可以结合,或者可以集成到另一个系统,或一些特征可以忽略或不执行。
另外,若无特别说明,在本申请各个实施例中的各功能单元/模块可以集成在一个单元/模块中,也可以是各个单元/模块单独物理存在,也可以两个或两个以上单元/模块集成在一起。上述集成的单元/模块既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。
集成的单元/模块如果以硬件的形式实现时,该硬件可以是数字电路,模拟电路等等。硬件结构的物理实现包括但不局限于晶体管,忆阻器等等。若无特别说明,处理器可以是任何适当的硬件处理器,比如中央处理器(Central Processing Unit,CPU)、图形处理器(Graphics Processing Unit,GPU)、专用集成电路(Application Specific IntegratedCircuit,ASIC)、数字信号处理器(Digital Signal Processor,DSP)、可编程逻辑器件(Programmable Logic Device,PLD)、现场可编程门阵列(Field Programmable GateArray,FPGA)、控制器、微控制器、微处理器或其他电子元件。若无特别说明,存储器可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如U盘、随机存取存储器(Random-Access Memory,RAM)、静态随机存取存储器(Static Random-Access Memory,SRAM),动态随机存取存储器(Dynamic Random-Access Memory,DRAM),增强动态随机存取存储器(Enhanced Dynamic Random-Access Memory,EDRAM),电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM),可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM),可编程只读存储器(Programmable read-only memory,PROM),只读存储器(Read-Only Memory,ROM),阻变式存储器(Resistive Random Access Memory,RRAM),高带宽内存HBM(High-BandwidthMemory),混合存储立方HMC(Hybrid Memory Cube),磁存储器,快闪存储器,磁盘、光盘、移动硬盘或磁碟等各种可以存储程序代码的介质。
集成的单元/模块如果以软件程序模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例方法的全部或部分步骤。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。上述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求书指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求书来限制。

Claims (12)

1.一种软件漏洞检测方法,其特征在于,包括:
对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例;
对所述初始测试用例进行污点标记,并以标记后的所述初始测试用例为种子输入,驱动所述待检测程序进行动态符号执行,以获得所述待检测程序对应的路径约束;
基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;所述堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;所述污染信息用于表示所述种子输入对内存区域的污染情况;所述内存区域为执行所述待检测程序的进程所映射的内存区域;
采用约束求解器,对所述路径约束和所述攻击约束进行合取并求解,以获得同时满足所述路径约束和所述攻击约束的求解结果,所述求解结果包括目标测试用例;
采用所述目标测试用例对所述待检测程序进行漏洞检测。
2.根据权利要求1所述的方法,其特征在于,所述攻击约束包括tcache poisoning缓存投毒攻击约束和攻击载荷约束;所述基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束,包括:
基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合;所述可利用堆块集合中的堆块存在被攻击者利用的可能;
针对所述可利用堆块集合中的任一堆块,基于所述堆块对应的状态信息,确定所述堆块是否满足堆块可控条件;所述堆块可控条件用于判断堆块是否能够被攻击者控制;
若确定所述堆块满足所述堆块可控条件,则针对所述堆块,构造所述tcachepoisoning攻击约束,以将所述堆块对应的next下一个指针所指向的地址约束为关键指针所指向的地址,所述关键指针所指向的地址为要申请的任一内存地址;
基于所述污染信息,确定所述堆块对应的next指针是否满足指针可控条件;所述指针可控条件用于判断指针是否能够被攻击者控制;
若确定所述next指针满足所述指针可控条件,则针对所述堆块,构造所述攻击载荷约束,以将所述堆块对应的next指针对应的指针数据约束为攻击载荷的值,所述指针数据为所述next指针所指向的地址中存放的数据。
3.根据权利要求2所述的方法,其特征在于,所述堆块对应的状态信息包括所述堆块的数据区域的起始地址、所述堆块的数据区域的长度和所述堆块的状态;所述状态为已分配状态或被释放状态;
所述基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合,包括:
针对所述堆块集合中的各所述堆块,若确定所述堆块的数据区域的起始地址位于内存写入区域的地址范围内,且所述堆块的状态为所述被释放状态,则确定所述堆块存在释放后重用漏洞;
将所述堆块添加到所述可利用堆块集合中。
4.根据权利要求2所述的方法,其特征在于,所述堆块对应的状态信息包括所述堆块的数据区域的起始地址、所述堆块的数据区域的长度和所述堆块的状态;所述状态为已分配状态或被释放状态;
所述基于所述堆块状态信息,确定所述堆块集合中的堆块是否存在堆漏洞,并基于存在堆漏洞的堆块,生成可利用堆块集合,包括:
针对所述堆块集合中的各所述堆块,若所述堆块的数据区域的下边界位于所述内存写入区域的地址范围内,则确定所述堆块存在堆溢出漏洞;所述下边界基于所述堆块的数据区域的起始地址与所述堆块的数据区域的长度确定;
将与所述堆块相邻的被数据溢出的堆块添加到所述可利用堆块集合中。
5.根据权利要求3或4所述的方法,其特征在于,所述堆块对应的状态信息还包括第一状态关联信息和第二状态关联信息,所述第一状态指示信息用于指示所述堆块在所述被释放状态下是否位于tcache线程缓存的链表上,所述第二状态指示信息用于指示所述堆块在所述被释放状态下且位于tcache的链表上时是否存在后继堆块;
所述基于所述堆块对应的状态信息,确定所述堆块是否满足堆块可控条件,包括:
若确定所述堆块的状态为所述被释放状态,且所述第一状态关联信息指示所述堆块位于tcache的链表上,且所述第二状态关联信息指示所述堆块存在后继堆块,则确定所述堆块满足所述堆块可控条件。
6.根据权利要求2所述的方法,其特征在于,所述污染信息包括符号化区域对应的起始地址和长度;所述基于所述污染信息,确定所述堆块对应的next指针是否满足指针可控条件,包括:
若确定所述堆块对应的next指针所指向的地址位于所述符号化区域之内,则确定所述next指针满足所述指针可控条件。
7.根据权利要求6所述的方法,其特征在于,所述污染信息的获取过程,包括:
在所述内存区域内遍历搜索,依次读取所遍历的值,并判断所遍历的值是否为符号值;
若确定所述所遍历的值为符号值,则确定所遍历的内存区域为符号化区域,以逐步确定所述符号化区域的起始地址和长度。
8.根据权利要求1所述的方法,其特征在于,所述待检测程序为目标软件对应的二进制可执行程序;所述对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例之前,所述方法还包括以下任一项:
获取用户设备发送的所述待检测程序,所述用户设备用于对所述目标软件对应的源代码进行编译,以获得所述待检测程序;
获取所述目标软件对应的源代码,并对所述源代码进行编译,以获得所述待检测程序。
9.一种软件漏洞检测装置,其特征在于,包括:
模糊测试模块,用于对待检测程序进行模糊测试,以获得可导致所述待检测程序崩溃的初始测试用例;
符号执行模块,用于对所述初始测试用例进行污点标记,并以标记后的所述初始测试用例为种子输入,驱动所述待检测程序进行动态符号执行,以获得所述待检测程序对应的路径约束;
约束构造模块,用于基于在所述待检测程序运行过程中获取的堆块状态信息和污染信息,构造针对堆漏洞的攻击约束;所述堆块状态信息包括堆块集合中的各堆块分别对应的状态信息;所述污染信息用于表示所述种子输入对内存区域的污染情况;所述内存区域为执行所述待检测程序的进程所映射的内存区域;
约束求解模块,用于采用约束求解器,对所述路径约束和所述攻击约束进行合取并求解,以获得同时满足所述路径约束和所述攻击约束的求解结果,所述求解结果包括目标测试用例;
漏洞检测模块,用于采用所述目标测试用例对所述待检测程序进行漏洞检测。
10.一种电子设备,其特征在于,包括:处理器,以及与所述处理器通信连接的存储器;
所述存储器存储计算机执行指令;
所述处理器执行所述存储器存储的计算机执行指令,以实现如权利要求1至8任一项所述的方法。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如权利要求1至8任一项所述的方法。
12.一种计算机程序产品,包括计算机执行指令,其特征在于,所述计算机执行指令被处理器执行时实现如权利要求1至8任一项所述的方法。
CN202311567495.1A 2023-11-22 2023-11-22 软件漏洞检测方法、装置、设备及存储介质 Pending CN117972707A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311567495.1A CN117972707A (zh) 2023-11-22 2023-11-22 软件漏洞检测方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311567495.1A CN117972707A (zh) 2023-11-22 2023-11-22 软件漏洞检测方法、装置、设备及存储介质

Publications (1)

Publication Number Publication Date
CN117972707A true CN117972707A (zh) 2024-05-03

Family

ID=90850655

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311567495.1A Pending CN117972707A (zh) 2023-11-22 2023-11-22 软件漏洞检测方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN117972707A (zh)

Similar Documents

Publication Publication Date Title
CN109583200B (zh) 一种基于动态污点传播的程序异常分析方法
Li et al. A novel approach for software vulnerability classification
Wang et al. A combinatorial approach to detecting buffer overflow vulnerabilities
CN111859380A (zh) Android App漏洞的零误报检测方法
Fell A review of fuzzing tools and methods
US11868465B2 (en) Binary image stack cookie protection
Wang et al. Tunter: assessing exploitability of vulnerabilities with taint-guided exploitable states exploration
CN113987507A (zh) 堆内存漏洞检测方法、装置、存储介质及电子设备
Roney et al. Identifying valuable pointers in heap data
US20230141948A1 (en) Analysis and Testing of Embedded Code
CN116166535A (zh) 一种基于模糊测试自动化挖掘非易失内存堆漏洞的方法
Zhou et al. The final security problem in IOT: Don’t count on the canary!
CN114741700B (zh) 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置
CN117972707A (zh) 软件漏洞检测方法、装置、设备及存储介质
CN111858307B (zh) 模糊测试方法和设备
Deng et al. A Pattern‐Based Software Testing Framework for Exploitability Evaluation of Metadata Corruption Vulnerabilities
Zeng et al. Heaptherapy+: Efficient handling of (almost) all heap vulnerabilities using targeted calling-context encoding
Xu et al. Memory Error Detection Based on Dynamic Binary Translation
Mouzarani et al. A smart fuzzing method for detecting heap‐based vulnerabilities in executable codes
Zeng et al. Code-less patching for heap vulnerabilities using targeted calling context encoding
CN118246025A (zh) 漏洞检测方法和装置、存储介质及电子设备
CN117034288A (zh) 漏洞检测方法和装置、存储介质及电子设备
CN117077144A (zh) 漏洞检测方法、装置、存储介质及电子设备
Yu et al. Senfuzzer: Detecting sgx memory corruption via information feedback and tailored interface analysis
Aloraini Towards better static analysis security testing methodologies

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination