CN116842526A - 漏洞检测方法、装置、计算机设备和存储介质 - Google Patents

漏洞检测方法、装置、计算机设备和存储介质 Download PDF

Info

Publication number
CN116842526A
CN116842526A CN202310834289.6A CN202310834289A CN116842526A CN 116842526 A CN116842526 A CN 116842526A CN 202310834289 A CN202310834289 A CN 202310834289A CN 116842526 A CN116842526 A CN 116842526A
Authority
CN
China
Prior art keywords
data
program
heap
tested
constraint
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
CN202310834289.6A
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 CN202310834289.6A priority Critical patent/CN116842526A/zh
Publication of CN116842526A publication Critical patent/CN116842526A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Abstract

本申请涉及一种漏洞检测方法、装置、计算机设备和存储介质。涉及数据测试领域,可用于金融科技领域或其他相关领域。该方法包括:基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定初始测试文件中包含的污点数据;基于污点数据对待测试程序进行检测,得到待测试程序对应的路径约束和数据约束;路径约束表征待测试程序中存在堆溢出漏洞的堆块的路径;数据约束表征待测试程序中存在堆溢出漏洞的堆块数据;对路径约束和数据约束进行合取,得到合取约束条件,并对合取约束条件进行求解,得到攻击输入文件;基于攻击输入文件对待测试程序进行测试,确定待测试程序的测试结果。采用本方法能够实现待测试程序漏洞的定位。

Description

漏洞检测方法、装置、计算机设备和存储介质
技术领域
本申请涉及数据检测技术领域,特别是涉及一种漏洞检测方法、装置、计算机设备、存储介质和计算机程序产品。
背景技术
堆内存漏洞是一种常见的程序漏洞,这类漏洞通过构造特殊的堆块结构来实现堆内存漏洞的利用,进而导致控制流劫持及任意代码执行的目的。因此,需要对程序进行漏洞检测,得到漏洞检测结果,并根据漏洞检测结果修复软件。
目前的漏洞检测方法通常是对程序的源代码进行黑盒测试。具体地,检测人员通过向编写的模糊测试工具输入一些随机或者精心构造的数据来观察待测试程序对输入数据的响应,得到漏洞检测结果。
然而,目前的漏洞检测方法得到的漏洞检测结果只能够确定待测试程序运行是否正常,无法明确造成待测试程序异常的原因和待测试程序的异常之处。因此,目前的漏洞检测方法无法定位待测试程序的漏洞。
发明内容
基于此,有必要针对上述技术问题,提供一种漏洞测试方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。
第一方面,本申请提供了一种漏洞检测方法。所述方法包括:
基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;
基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;
对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;
基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。
在其中一个实施例中,所述基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据,包括:
获取待测试程序,并基于预设的初始测试文件,对所述待测试程序进行模糊测试,得到模糊测试结果;
基于所述模糊测试结果在所述初始测试文件中确定污点数据。
在其中一个实施例中,所述基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束,包括:
基于所述污点数据进行动态符号执行,得到所述待测试程序的路径约束;
基于所述污点数据,对所述待测试程序中的各类型堆块进行检测,得到每一类型堆块的检测结果,并基于所述检测结果构建所述待测试程序的数据约束。
在其中一个实施例中,所述各类型堆块包括第一堆块和第二堆块,所述基于所述污点数据,对所述待测试程序中的各类型堆块进行检测,得到每一类型堆块的检测结果,并基于所述检测结果构建所述待测试程序的数据约束,包括:
针对每一所述第一堆块,判断所述第一堆块是否存在堆块溢出漏洞,并在所述第一堆块存在所述堆块溢出漏洞的情况下,确定堆块溢出结果;所述第一堆块为已写入数据的堆块;
根据所述堆块溢出结果,构建第一数据约束;
针对每一所述第二堆块,判断所述第二堆块是否符合unlink解链操作触发条件,在所述第二堆块符合unlink操作触发条件的情况下,确定操作触发结果;所述第二堆块为当前释放堆块;
根据所述待测试程序的堆块的基础信息和所述操作触发结果,构建第二数据约束;
将所述第一数据约束和所述第二数据约束合并为所述待测试程序的数据约束。
在其中一个实施例中,所述针对每一所述第一堆块,判断所述第一堆块是否存在堆块溢出漏洞,并在所述第一堆块存在所述堆块溢出漏洞的情况下,确定堆块溢出结果,包括:
针对每一所述第一堆块,检查流入所述第一堆块中的数据是否为符号化数据;
在所述第一堆块中的数据为所述符号化数据的情况下,判断所述第一堆块中的数据是否超过所述第一堆块的边界;
在所述第一堆块中的数据超过所述第一堆块的边界的情况下,将所述第一堆块确定为溢出堆块;
若所述溢出堆块的首部指针数据为所述污点数据,确定所述第一堆块的堆块溢出结果。
在其中一个实施例中,所述针对每一所述第二堆块,判断所述第二堆块是否符合unlink解链操作触发条件,在所述第二堆块符合unlink操作触发条件的情况下,确定操作触发结果,包括:
针对每一所述第二堆块,判断所述第二堆块是否与溢出堆块相邻;
在所述第二堆块与所述溢出堆块相邻的情况下,确定所述第二堆块对应的unlink的操作方式;
若所述第二堆块的首部结构中的数据为污点数据,根据所述第二堆块以及所述第二堆块对应的unlink操作方式,构建操作触发结果。
在其中一个实施例中,所述基于所述检测结果构建所述待测试程序的数据约束之后,所述方法还包括:
对所述待测试程序中的关键指针数据进行符号化检查,判断所述关键指针数据是否满足预设的指针可控条件;
在所述关键指针数据满足所述指针可控性条件的情况下,根据所述关键指针数据建立指针可控性约束,并将所述指针可控性约束添加到所述待测试程序的数据约束中。
在其中一个实施例中,所述基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果,包括:
动态运行所述待测试程序,并基于所述攻击输入文件中各攻击输入数据构建对应的攻击输入指令;
基于所述攻击输入指令攻击所述待测试程序,得到攻击结果;
在所述攻击结果满足预设的堆溢出条件的情况下,确定所述攻击输入指令指向的所述待测试程序中存在溢出漏洞的堆块地址,基于所述攻击输入指令、所述攻击结果和所述堆块地址,构建测试结果。
第二方面,本申请还提供了一种漏洞检测装置。所述装置包括:
确定模块,用于基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;
检测模块,用于基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;
合取模块,用于对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;
测试模块,用于基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。
第三方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;
基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;
对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;
基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。
第四方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;
基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;
对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;
基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。
第五方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;
基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;
对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;
基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。
上述漏洞检测方法、装置、计算机设备、存储介质和计算机程序产品,基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。采用本方法,通过模糊测试确定污点数据,并基于所述污点数据对待测试程序进行检测,得到合取约束条件,该合取约束条件表征待测试程序可能存在溢出漏洞之处,基于合取约束条件能够得到对待检测程序进行检测的攻击输入文件,基于该攻击输入文件对待测试程序进行检测,得到测试结果,该测试结果明确了造成待测试程序异常的原因和待测试程序的异常之处,实现了待测试程序漏洞的定位。
附图说明
图1为一个实施例中漏洞检测方法的流程示意图;
图2为一个实施例中确定污点数据步骤的流程示意图;
图3为一个实施例中建立数据约束和路径约束步骤的流程示意图;
图4为一个实施例中导向式符号执行的示意图;
图5为一个实施例中构建数据约束步骤的流程示意图;
图6为一个实施例中确定堆块溢出结果步骤的流程示意图;
图7为一个实施例中处于释放状态的堆块结构示意图;
图8为一个实施例中操作触发结果步骤的流程示意图;
图9为一个实施例中unlink攻击检测模型的架构示意图;
图10为一个实施例中确定指针可控性约束步骤的流程示意图;
图11为一个实施例中确定测试结果步骤的流程示意图;
图12为另一个实施例中漏洞检测方法的流程示意图;
图13为一个实施例中漏洞检测装置的结构框图;
图14为另一个实施例中漏洞检测装置的结构示意图;
图15为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,如图1所示,提供了一种漏洞检测方法,以该方法应用于计算机设备为例进行说明,包括以下步骤:
步骤102,基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定初始测试文件中包含的污点数据。
其中,初始测试文件包含预先构建的多个测试数据。污点数据为导致待测试程序崩溃的二进制数据。
在实施中,计算机设备中预先设置有初始测试文件。计算机设备获取待测试程序。然后,计算机设备将初始测试文件输入待测试程序中,对待测试程序进行模糊测试,得到模糊测试结果。计算机设备根据模糊测试结果,在初始测试文件中确定污点数据。
步骤104,基于污点数据对待测试程序进行检测,得到待测试程序对应的路径约束和数据约束。
其中,路径约束表征待测试程序中存在堆溢出漏洞的堆块的路径;数据约束表征待测试程序中存在堆溢出漏洞的堆块数据。堆溢出漏洞是指在程序运行时,由于没有正确验证输入数据的大小或格式,导致向堆中写入超出分配内存区域的数据,从而覆盖掉原有的数据或者修改程序运行时的状态,甚至可以在程序中执行恶意代码。
在实施中,计算机设备将污点数据作为种子输入,对待测试程序进行动态符号执行,得到路径约束。然后,计算机设备基于污点数据,对待测试程序中各类型的堆块进行检测,得到检测结果。计算机设备基于检测结果构建数据约束。
步骤106,对路径约束和数据约束进行合取,得到合取约束条件,并对合取约束条件进行求解,得到攻击输入文件。
其中,合取是自然语言中的联结词“并且”的抽象,用符号∧表示,符号∧读作“并且”。合取约束条件为建造测试用例的数据约束条件。
在实施中,计算机设备中预先设置有约束求解器。计算机设备对路径约束和数据约束进行合取操作,得到合取约束条件。计算机设备将合取约束条件输入到约束求解器中进行求解,得到攻击输入文件。其中,攻击输入文件为可触发unlink解链攻击的二进制输入文件。unlink攻击是一种针对堆内存的攻击技术,主要利用了C/C++中的动态内存管理函数中的漏洞,通过修改堆块头部的信息,来实现对程序的攻击。具体来说,攻击者利用堆溢出漏洞,将堆块的头部信息进行修改,将后继块的地址修改为前驱块的地址,同时将前驱块的后继块地址修改为当前块的后继块地址,从而形成一个无效的块链表,使程序在后续的堆块释放操作中发生错误,导致程序崩溃或执行意外的操作。
可选的,约束求解器用于解决带有约束条件的问题。这些问题可以是数学问题、逻辑问题或者其他类型的问题,通常会涉及多个变量和多个约束条件。约束求解器的主要目的是找到符合所有约束条件的变量值组合,或者确定是否存在这样的解。为此,约束求解器使用一系列算法和技术,包括搜索算法、剪枝算法、约束传播等等。约束求解器可以为Z3(一款高性能的可满足性模理论求解器)、CVC4(一款开源的可满足性模理论求解器)等,本申请实施例对约束求解器不做限定。
步骤108,基于攻击输入文件对待测试程序进行测试,确定待测试程序的测试结果。
在实施中,计算机设备基于攻击输入文件中的攻击输入数据确定攻击输入指令。然后,计算机设备根据攻击输入指令攻击待测试程序,得到攻击结果。计算机设备根据攻击结果确定待测试程序的测试结果。
上述漏洞检测方法中,通过模糊测试确定污点数据,并基于污点数据对待测试程序进行检测,得到合取约束条件,该合取约束条件表征待测试程序可能存在溢出漏洞之处,基于合取约束条件能够得到对待检测程序进行检测的攻击输入文件,基于该攻击输入文件对待测试程序进行检测,得到测试结果,该测试结果明确了造成待测试程序异常的原因和待测试程序的异常之处,实现了待测试程序漏洞的定位。
在一个实施例中,如图2所示,步骤102的具体处理过程包括:
步骤202,获取待测试程序,并基于预设的初始测试文件,对待测试程序进行模糊测试,得到模糊测试结果。
其中,模糊测试结果表征待测试程序是否正常运行。模糊测试是一种通过提供非预期的输入并监视异常结果来发现软件故障的方法。模糊测试一般是一个自动或半自动的过程,这个过程包括反复操纵目标软件并为其提供输入数据。在模糊测试中,首先要构造一个非正常输入的数据,然后根据设定好的测试模式进行测试,并对模糊测试结果进行监测,通过对异常的分析,从中找出可能引发漏洞攻击的错误。
在实施中,计算机设备获取待测试程序。然后,计算机设备根据预设的模糊测试软件构建初始测试文件。计算机设备将初始测试文件输入待测试程序中,基于初始测试文件中的各测试数据对待测试程序进行模糊测试,得到测试数据对应的模糊测试结果。
步骤204,基于模糊测试结果在初始测试文件中确定污点数据。
其中,污点数据为在计算机系统中被恶意篡改、损坏或注入恶意代码的数据。这些数据在系统中引起意外的行为或暴露系统中的漏洞,使攻击者能够利用它们进行进一步的攻击。
在实施中,计算机设备针对各测试数据中每一测试数据对应的模糊测试结果,判断模糊测试结果是否表征待测试程序正常运行。在模糊测试结果表征待测试程序未正常运行的情况下,将该模糊测试结果对应的模糊数据确定为二进制输入数据。然后,计算机设备根据各二进制输入数据构建二进制输入文件。计算机设备将二进制输入文件标记为符号化的污点数据。其中,符号化的污点数据用于标记待测试程序中的数据。例如,gdb(一款调试工具)中用来确定栈溢出偏移的字符串,通过特殊构造就可以确定某几个字符串是输入的第几个字符串。
可选的,二进制输入文件可以为网络数据包或文件,本申请实施例二进制输入文件的形式不做限定。
本实施例中,通过预设的初始测试文件对待测试程序进行模糊测试,并根据模糊测试结果在初始测试文件中确定污点数据,明确了易造成待测试程序崩溃的数据。并且,解决了白盒代码审计需要获取产品源代码的问题,直接针对程序执行文件进行模糊测试来生成crash文件与污点数据,不需要产品源代码。
在一个实施例中,如图3所示,步骤104的具体处理过程包括:
步骤302,基于污点数据进行动态符号执行,得到待测试程序的路径约束。
其中,符号执行(Symbolic Execution)是一种程序分析技术,它可以自动地探索程序的所有可能路径,而不需要执行实际的程序代码。在符号执行中,程序的输入被视为符号变量,而不是具体的数值。当程序执行到某个分支语句时,符号执行器会生成两个不同的路径条件,每个路径条件对应于分支语句的两个可能结果。符号执行器会对这些路径条件进行求解,并生成一组满足这些路径条件的输入,这些输入可以用作程序的测试用例。与传统的手工编写测试用例不同,符号执行技术可以自动生成输入,覆盖程序中所有可能的路径,并且可以发现一些难以发现的错误,例如内存泄漏、空指针引用等。同时,符号执行技术也可以帮助程序开发人员理解程序的行为,发现程序中隐藏的逻辑错误,并且可以进行代码审计等。
在实施中,计算机设备将污点数据作为种子输入,驱动待测试程序进行动态符号执行。在待测试程序进行动态符号执行的过程中,待测试程序中所有受到符号化输入影响的内存区域都被标记为污点区域。并且,在待测试程序进行动态符号执行的过程中,计算机设备收集待测试程序动态运行过程中的运行路径,并根据运行路径确定路径约束。
具体地,计算机设备基于导向式符号执行技术,快速定位待测试程序中的堆溢出错误位置并使待测试程序沿着种子输入所指向的确定路径动态运行到存在堆溢出漏洞的位置。然后,计算机设备对存在堆溢出漏洞的位置的运行路径进行转化,得到运行路径对应的符号化表达式。计算机设备将符号化表达式确定为路径约束。其中,导向式符号执行(Directed Symbolic Execution)是一种基于符号执行的程序分析技术。与传统的符号执行技术相比,导向式符号执行能够更加高效地找出程序中的漏洞,并且能够生成更准确的测试用例。在传统的符号执行中,程序的执行路径是由符号执行器自动探索生成的。这种自动化探索的方式可能会导致大量的路径探索,其中许多路径可能并不具有实际意义。而在导向式符号执行中,程序的执行路径是由用户指定的导向条件来控制的。这些导向条件可以是程序中的断言、错误处理代码、或者是用户自定义的条件。导向式符号执行器只会在满足这些导向条件的情况下进行路径探索,从而减少了路径探索的数量。导向式符号执行技术还可以利用已知的程序语义信息来指导路径探索。例如,可以使用程序中已知的前置条件、后置条件或约束条件来限制符号执行的搜索空间。这些限制条件可以显著提高符号执行器的效率。
在一个可选的实施例中,如图4所示,图4为导向式符号执行的示意图。计算机设备将符号化的污点数据作为种子输入,对待测试程序(目标程序)进行导向式符号执行。计算机设备待测试程序沿着种子输入所指向的确定路径动态运行到存在堆溢出漏洞的位置。然后,计算机设备对存在堆溢出漏洞的位置的运行路径进行转化,得到运行路径对应的符号化表达式。通过导向式符号执行能够提高漏洞检测的风险检测效率。
步骤304,基于污点数据,对待测试程序中的各类型堆块进行检测,得到每一类型堆块的检测结果,并基于检测结果构建待测试程序的数据约束。
在实施中,待测试程序中包含不同类型堆块。计算机设备针对每一类型堆块,根据污点数据,对该类型堆块进行检测,得到该类型堆块的检测结果。然后,计算机设备根据检测结果构建待测试程序的数据约束。
在一个可选的实施例中,在对各类型堆块进行检测之前,当待测试程序中的堆块创建时,计算机设备获取堆块数据区的起始地址、堆块数据区的长度、堆块地址的指针值、堆块的初始化数据以及堆块的相邻堆块信息。计算机设备堆块数据区的起始地址、堆块数据区的长度、堆块地址的指针值、堆块的初始化数据以及堆块的相邻堆块信息,构建该堆块的基础信息。
本实施例中,通过污点数据对待测试程序进行动态符号执行,得到了待测试程序的路径约束,并且,基于动态符号执行检查内存的符号化属性,可以进行污点数据的跟踪分析与判断,为构造数据约束提供标记数据。另外,解决了灰/黑模糊测试用例不具针对性,效率低,需要很长时间与计算资源的问题,通过导向式符号执行技术,用路径约束来定位溢出位置,提高了检测效率。基于污点数据对待测试程序的各类型堆块进行检测,并根据检测数据确定数据约束。通过数据约束和路径约束明确了待测试程序可能存在溢出漏洞之处。
在一个实施例中,各类型堆块包括第一堆块和第二堆块,如图5所示,步骤304的具体处理过程包括:
步骤502,针对每一第一堆块,判断第一堆块是否存在堆块溢出漏洞,并在第一堆块存在堆块溢出漏洞的情况下,确定堆块溢出结果。
其中,第一堆块为已写入数据的堆块。堆块溢出漏洞包含堆溢出特征和可控性特征。
在实施中,计算机设备针对每一第一堆块,判断第一堆块是否满足堆溢出特征和可控性特征。然后,计算机设备在第一堆块满足堆溢出特征和可控性特征的情况下,确定堆块溢出结果。
在一个可选的实施例中,第一堆块为存在写入操作的现存堆块。计算机设备对每一对现存堆块的写入操作进行监视,判断该现存堆块是否存在堆块溢出漏洞。然后,计算机设备在该现存堆块存在堆块溢出漏洞的情况下,确定堆块溢出结果。
步骤504,根据堆块溢出结果,构建第一数据约束。
在实施中,计算机设备基于堆块溢出结果,构造第一数据约束。
步骤506,针对每一第二堆块,判断第二堆块是否符合unlink解链操作触发条件,在第二堆块符合unlink操作触发条件的情况下,确定操作触发结果。
其中,第二堆块为当前释放堆块。
在实施中,计算机设备针对每一当前释放堆块,判断当前释放堆块是否符合unlink解链操作触发条件。然后,计算机设备在当前释放堆块符合unlink操作触发条件的情况下,根据当前释放堆块对应的unlink操作方式和当前释放堆块,确定当前释放堆块的操作触发结果。
步骤508,根据待测试程序的堆块的基础信息和操作触发结果,构建第二数据约束。
在实施中,计算机设备根据待测试程序的操作触发结果和第二堆块的基础信息,构建第二数据约束。
步骤510,将第一数据约束和第二数据约束合并为待测试程序的数据约束。
在实施中,计算机设备将第一数据约束和第二数据约束合并为待测试程序的数据约束。
本实施例中,基于第一堆块是否存在堆块溢出漏洞,确定第一数据约束和基于第二堆块是否符合unlink解链,确定第二数据约束,明确了第一堆块和第二堆块中存在堆漏洞风险的堆块,并将第一数据约束和第二数据约束合并为数据约束,使得数据约束能够表征待测试程序中存在堆溢出漏洞的堆块数据,便于后续进行待测试程序的测试。另外,解决了白盒代码审计漏报率与误报率比较高的问题,通过模糊测试与符号执行技术相结合,对触发unlink攻击的条件进行建模并进行约束求解,求解后再进行攻击验证,杜绝误报的可能,减少漏报率。
在一个实施例中,如图6所示,步骤502的具体处理过程包括:
步骤602,针对每一第一堆块,检查流入第一堆块中的数据是否为符号化数据。
其中,符号化数据为程序运行时,程序中的某些变量被用符号化的符号表示,代表未知的、未定义的或可变的值,而不是实际的具体数值。
在实施中,计算机设备针对每一第一堆块,通过搜索符号化内存检查流入第一堆块中的数据是否为符号化数据。
在一个可选的实施例中,计算机设备对指向已申请堆块的数据流进行监视,通过搜索符号化内存检查流入已申请堆块的数据是否为符号化数据。
步骤604,在第一堆块中的数据为符号化数据的情况下,判断第一堆块中的数据是否超过第一堆块的边界。
在实施中,计算机设备在流入第一堆块中的数据为符号化数据的情况下,在第一堆块的基础信息中获取第一堆块的堆块数据区的长度。然后,计算机设备基于第一堆块的堆块数据区的长度,判断第一堆块中的符号化数据的长度是否超过第一堆块的边界。
步骤606,在第一堆块中的数据超过第一堆块的边界的情况下,将第一堆块确定为溢出堆块。
在实施中,计算机设备在第一堆块中的符号化数据的长度超过第一堆块的边界的情况下,计算机设备确定第一堆块符合堆溢出特征,并将第一堆块确定为溢出堆块。
步骤608,若溢出堆块的首部指针数据为污点数据,确定第一堆块的堆块溢出结果。
在实施中,计算机设备判断溢出堆块的首部指针数据是否为污点数据。若溢出堆块的首部指针数据是否为污点数据,计算机设备确定溢出堆块符合可控性特征,并确定第一堆块的堆块溢出结果。
在一个可选的实施例中,如图7所示,图7为处于释放状态的堆块结构示意图。chunk为堆块。首部指针数据是指fd(有的时候包含bk,根据堆块大小,所在的bins决定)。fd,bk。chunk处于分配状态时,从fd字段开始是用户的数据。chunk空闲时,会被添加到对应的空闲管理链表中,其字段的含义如下:fd指向下一个(非物理相邻)空闲的chunk;bk指向上一个(非物理相邻)空闲的chunk通过fd和bk可以将空闲的chunk块加入到空闲的chunk块链表进行统一管理。fd_nextsize,bk_nextsize,也是只有chunk空闲的时候才使用,不过其用于较大的chunk(large chunk)。fd_nextsize指向前一个与当前chunk大小不同的第一个空闲块,不包含bin的头指针。bk_nextsize指向后一个与当前chunk大小不同的第一个空闲块,不包含bin的头指针。一般空闲的large chunk在fd的遍历顺序中,按照由大到小的顺序排列。这样做可以避免在寻找合适chunk时挨个遍历。prev_size,如果该chunk的物理相邻的前一地址chunk(两个指针的地址差值为前一chunk大小)是空闲的话,那该字段记录的是前一个chunk的大小(包括chunk头)。否则,该字段可以用来存储物理相邻的前一个chunk的数据。这里的前一chunk指的是较低地址的chunk。size,该chunk的大小,大小必须是2*SIZE_SZ的整数倍。如果申请的内存大小不是2*SIZE_SZ的整数倍,会被转换满足大小的最小的2*SIZE_SZ的倍数。32位系统中,SIZE_SZ是4;64位系统中,SIZE_SZ是8。该字段的低三个比特位对chunk的大小没有影响,它们从高到低分别表示NON_MAIN_ARENA,记录当前chunk是否不属于主线程,1表示不属于,0表示属于。IS_MAPPED,记录当前chunk是否是由mmap分配的。PREV_INUSE,记录前一个chunk块是否被分配。一般来说,堆中第一个被分配的内存块的size字段的P位都会被设置为1,以便于防止访问前面的非法内存。当一个chunk的size的P位为0时,能通过prev_size字段来获取上一个chunk的大小以及地址。这也方便进行空闲chunk之间的合并。
本实施例中,通过确定第一堆块是否符合堆溢出特征和可控性特征,得到堆块溢出结果,明确了第一堆块是否存在堆块溢出漏洞,便于后续构建数据约束。
在一个实施例中,如图8所示,步骤506的具体处理过程包括:
步骤802,针对每一第二堆块,判断第二堆块是否与溢出堆块相邻。
其中,溢出堆块为符合堆溢出特征的堆块。第二堆块为当前释放堆块。
在实施中,计算机设备针对每一第二堆块,判断第二堆块是否与溢出堆块相邻。
步骤804,在第二堆块与溢出堆块相邻的情况下,确定第二堆块对应的unlink的操作方式。
其中,unlink的操作方式包括向前合并还是向后合并
在实施中,计算机设备在第二堆块和溢出堆块相邻的情况下,确定第二堆块对应的unlink的操作方式为向前合并还是向后合并。
步骤806,若第二堆块的首部结构中的数据为污点数据,根据第二堆块以及第二堆块对应的unlink操作方式,构建操作触发结果。
在实施中,计算机设备判断第二堆块的首部结构中的数据是否为污点数据。若第二堆块的首部结构中的数据为污点数据,计算机设备确定第二堆块满足unlink操作触发条件。然后,计算机设备根据满足unlink操作触发条件的第二堆块和该第二堆块对应的unlink操作方式,构建操作触发结果。
在一个可选的实施例中,如图9所示,图9为unlink攻击检测模型的架构示意图。在图9中,Chunk为堆块。计算机设备根据挂钩接口函数(例如free malloc),确定堆块的分配的起始位置,并对比符号化区域的长度与堆块数据区的长度,确定符号化区域的长度是否超过堆块数据区的长度。若符号化区域长度超出堆块数据区的长度,计算机设备确定堆块为溢出堆块。然后,计算机设备确定当前释放堆块跟溢出堆块的位置关系,判断当前释放堆块是否与溢出堆块相邻。在当前释放堆块与溢出堆块相邻的情况下,计算机设备确定当前释放堆块对应的unlink的操作方式。若当前释放堆块的首部结构中的数据为污点数据,根据当前释放堆块以及当前释放堆块对应的unlink操作方式,构建操作触发结果。
本实施例中,通过确定第二堆块是否符合unlink操作触发条件,得到操作触发结果,明确了第二堆块是否存在堆溢出漏洞,便于后续构建数据约束。
在一个实施例中,在得到数据约束之后,需要对关键指针数据进行符号化检测,确定指针可控性约束,并将指针可控性约束添加到数据约束中。如图10所示,在步骤304执行之后,该漏洞检测方法的具体处理过程还包括:
步骤1002,对待测试程序中的关键指针数据进行符号化检查,判断关键指针数据是否满足预设的指针可控条件。
在实施中,计算机设备基对预先指定的关键指针数据进行符号化检查,确定关键指针数据是否为污点数据。若关键指针数据为污点数据,计算机设备确定关键指针数据则满足指针可控性条件。
步骤1004,在关键指针数据满足指针可控性条件的情况下,根据关键指针数据建立指针可控性约束,并将指针可控性约束添加到待测试程序的数据约束中。
在实施中,计算机设备在关键指针数据满足指针可控性条件的情况下,根据关键指针数据建立指针可控性约束,并将指针可控性约束添加到待测试程序的数据约束中。然后,计算机设备将关键指针数据的指针内容改写为shellcode(恶意代码)起始地址。
本实施例中,通过判断关键指针数据是否满足指针可控性条件,明确关键指针数据是否存在堆溢出漏洞,并根据满足指针可控条件的关键指针数据建立指针可控性约束,扩大了漏洞检测的范围。
在一个实施例中,如图11所示,步骤108的具体处理过程包括:
步骤1102,动态运行待测试程序,并基于攻击输入文件中各攻击输入数据构建对应的攻击输入指令。
在实施中,计算机设备动态运行待测试程序。然后,计算机设备根据攻击输入文件中的各攻击输入数据,构建每一攻击输入数据对应的攻击输入指令。
步骤1104,基于攻击输入指令攻击待测试程序,得到攻击结果。
其中,攻击结果表征攻击输入指令是否攻击成功,即待测试程序是否出现堆溢出情况。
在实施中,计算机设备根据攻击输入指令攻击待测试程序,得到攻击结果。
步骤1106,在攻击结果满足预设的堆溢出条件的情况下,确定攻击输入指令指向的待测试程序中存在溢出漏洞的堆块地址,基于攻击输入指令、攻击结果和堆块地址,构建测试结果。
其中,堆溢出条件为待测试程序出现堆溢出情况。
在实施中,计算机设备判断攻击结果是否为待测试程序出现堆溢出情况。在待测试程序出现堆溢出的情况下,计算机设备确定攻击结果满足预设的堆溢出条件。然后,计算机设备在攻击结果满足预设的堆溢出条件的情况下,确定攻击输入指令指向的待测试程序中存在溢出漏洞的堆块地址。计算机设备基于攻击输入指令、攻击结果和堆块地址,构建测试结果。
本实施例中,基于该攻击输入文件对待测试程序进行检测,得到测试结果,该测试结果明确了造成待测试程序异常的原因和待测试程序的异常之处,实现了待测试程序漏洞的定位。
在一个可选的实施例中,如图12所示,图12为漏洞检测方法的流程示意图。计算机设备对待检测程序(待测试程序)进行模糊测试,得到模糊测试结果,并基于模糊测试结果确定crash文件(二进制输入文件)。然后,计算机设备基于符号执行模块确定路径约束和污点数据。然后,计算机设备基于堆块创建监视模块用于获取堆块的基础信息。然后,计算机设备通过堆块数据操作监视模块确定第一数据约束,并通过堆块释放监视模块确定第二数据约束。计算机设备基于指针变量监视模块确定指针可控性约束。计算机设备将第一数据约束、第二数据约束和指针可控性约束合并为数据约束。计算机设备合取数据约束和路径约束,得到合取约束条件,并基于约束求解器求解合取约束条件,得到攻击文件(攻击输入文件)。计算机设备基于攻击文件对待测试程序进行攻击测试,得到检测报告。
在一个可选的实施例中,如图13所示,图13为漏洞检测装置的结构示意图。该漏洞检测装置包括模糊测试模块、符号执行模块、堆块创建监视模块、堆块数据操作监视模块、堆块释放监视模块、指针变量监视模块、约束求解器和攻击测试模块。模糊测试模块用于对待测试模块进行模糊测试,确定二进制输入文件。符号执行模块用于确定路径约束。堆块创建监视模块用于获取堆块的基础信息。堆块数据操作监视模块用于确定第一数据约束。堆块释放监视模块用于确定第二数据约束。指针变量监视模块用于确定指针可控性约束。约束求解器用于确定攻击输入文件。攻击测试模块用于确定待测试程序的测试结果。
应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的
各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的漏洞检测方法的漏洞检测装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个漏洞检测装置实施例中的具体限定可以参见上文中对于漏洞检测方法的限定,在此不再赘述。
在一个实施例中,如图13所示,提供了一种漏洞检测装置1300,包括:确定模块1301、检测模块1302、合取模块1303和测试模块1304,其中:
确定模块1301,用于基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定初始测试文件中包含的污点数据。
检测模块1302,用于基于污点数据对待测试程序进行检测,得到待测试程序对应的路径约束和数据约束;路径约束表征待测试程序中存在堆溢出漏洞的堆块的路径;数据约束表征待测试程序中存在堆溢出漏洞的堆块数据。
合取模块1303,用于对路径约束和数据约束进行合取,得到合取约束条件,并对合取约束条件进行求解,得到攻击输入文件。
测试模块1304,用于基于攻击输入文件对待测试程序进行测试,确定待测试程序的测试结果。
在一示例性实施例中,确定模块1301包括:
第一测试子模块,用于获取待测试程序,并基于预设的初始测试文件,对待测试程序进行模糊测试,得到模糊测试结果。
第一确定子模块,用于基于模糊测试结果在初始测试文件中确定污点数据。
在一示例性实施例中,检测模块1302包括:
执行子模块,用于基于污点数据进行动态符号执行,得到待测试程序的路径约束。
第一检测子模块,用于基于污点数据,对待测试程序中的各类型堆块进行检测,得到每一类型堆块的检测结果,并基于检测结果构建待测试程序的数据约束。
在一示例性实施例中,第一检测子模块包括:
第一判断子模块,用于针对每一第一堆块,判断第一堆块是否存在堆块溢出漏洞,并在第一堆块存在堆块溢出漏洞的情况下,确定堆块溢出结果;第一堆块为已写入数据的堆块。
第一构建子模块,用于根据堆块溢出结果,构建第一数据约束。
第二判断子模块,用于针对每一第二堆块,判断第二堆块是否符合unlink解链操作触发条件,在第二堆块符合unlink操作触发条件的情况下,确定操作触发结果;第二堆块为当前释放堆块。
第二构建子模块,用于根据待测试程序的堆块的基础信息和操作触发结果,构建第二数据约束。
合并子模块,用于将第一数据约束和第二数据约束合并为待测试程序的数据约束。
在一示例性实施例中,第一判断子模块包括:
第一检查子模块,用于针对每一第一堆块,检查流入第一堆块中的数据是否为符号化数据。
第二判断子模块,用于在第一堆块中的数据为符号化数据的情况下,判断第一堆块中的数据是否超过第一堆块的边界。
第二确定子模块,用于在第一堆块中的数据超过第一堆块的边界的情况下,将第一堆块确定为溢出堆块。
第三确定子模块,用于若溢出堆块的首部指针数据为污点数据,确定第一堆块的堆块溢出结果。
在一示例性实施例中,第二判断子模块包括:
第三判断子模块,用于针对每一第二堆块,判断第二堆块是否与溢出堆块相邻;
第四确定子模块,用于在第二堆块与溢出堆块相邻的情况下,确定第二堆块对应的unlink的操作方式。
第三构建子模块,用于若第二堆块的首部结构中的数据为污点数据,根据第二堆块以及第二堆块对应的unlink操作方式,构建操作触发结果。
在一示例性实施例中,漏洞检测装置1300还包括:
检查模块,用于对待测试程序中的关键指针数据进行符号化检查,判断关键指针数据是否满足预设的指针可控条件。
建立模块,用于在关键指针数据满足指针可控性条件的情况下,根据关键指针数据建立指针可控性约束,并将指针可控性约束添加到待测试程序的数据约束中。
在一示例性实施例中,测试模块1304包括:
第四构建子模块,用于动态运行待测试程序,并基于攻击输入文件中各攻击输入数据构建对应的攻击输入指令。
攻击子模块,用于基于攻击输入指令攻击待测试程序,得到攻击结果。
第五构建子模块,用于在攻击结果满足预设的堆溢出条件的情况下,确定攻击输入指令指向的待测试程序中存在溢出漏洞的堆块地址,基于攻击输入指令、攻击结果和堆块地址,构建测试结果。
可选的,上述漏洞检测装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。因此,针对模块的功能给出另一种漏洞检测装置的示例,如图14所述,图14为漏洞检测装置的结构示意图。该漏洞检测装置包括模糊测试模块、符号执行模块、堆块创建监视模块、堆块数据操作监视模块、堆块释放监视模块、指针变量监视模块、约束求解器和攻击测试模块。模糊测试模块用于对待测试模块进行模糊测试,确定二进制输入文件。符号执行模块用于确定路径约束。堆块创建监视模块用于获取堆块的基础信息。堆块数据操作监视模块用于确定第一数据约束。堆块释放监视模块用于确定第二数据约束。指针变量监视模块用于确定指针可控性约束。约束求解器用于确定攻击输入文件。攻击测试模块用于确定待测试程序的测试结果。
上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图15所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、移动蜂窝网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种漏洞检测方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图15中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

Claims (11)

1.一种漏洞检测方法,其特征在于,所述方法包括:
基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;
基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;
对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;
基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。
2.根据权利要求1所述的方法,其特征在于,所述基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据,包括:
获取待测试程序,并基于预设的初始测试文件,对所述待测试程序进行模糊测试,得到模糊测试结果;
基于所述模糊测试结果在所述初始测试文件中确定污点数据。
3.根据权利要求1所述的方法,其特征在于,所述基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束,包括:
基于所述污点数据进行动态符号执行,得到所述待测试程序的路径约束;
基于所述污点数据,对所述待测试程序中的各类型堆块进行检测,得到每一类型堆块的检测结果,并基于所述检测结果构建所述待测试程序的数据约束。
4.根据权利要求3所述的方法,其特征在于,所述各类型堆块包括第一堆块和第二堆块,所述基于所述污点数据,对所述待测试程序中的各类型堆块进行检测,得到每一类型堆块的检测结果,并基于所述检测结果构建所述待测试程序的数据约束,包括:
针对每一所述第一堆块,判断所述第一堆块是否存在堆块溢出漏洞,并在所述第一堆块存在所述堆块溢出漏洞的情况下,确定堆块溢出结果;所述第一堆块为已写入数据的堆块;
根据所述堆块溢出结果,构建第一数据约束;
针对每一所述第二堆块,判断所述第二堆块是否符合unlink解链操作触发条件,在所述第二堆块符合unlink操作触发条件的情况下,确定操作触发结果;所述第二堆块为当前释放堆块;
根据所述待测试程序的堆块的基础信息和所述操作触发结果,构建第二数据约束;
将所述第一数据约束和所述第二数据约束合并为所述待测试程序的数据约束。
5.根据权利要求4所述的方法,其特征在于,所述针对每一所述第一堆块,判断所述第一堆块是否存在堆块溢出漏洞,并在所述第一堆块存在所述堆块溢出漏洞的情况下,确定堆块溢出结果,包括:
针对每一所述第一堆块,检查流入所述第一堆块中的数据是否为符号化数据;
在所述第一堆块中的数据为所述符号化数据的情况下,判断所述第一堆块中的数据是否超过所述第一堆块的边界;
在所述第一堆块中的数据超过所述第一堆块的边界的情况下,将所述第一堆块确定为溢出堆块;
若所述溢出堆块的首部指针数据为所述污点数据,确定所述第一堆块的堆块溢出结果。
6.根据权利要求4所述的方法,其特征在于,所述针对每一所述第二堆块,判断所述第二堆块是否符合unlink解链操作触发条件,在所述第二堆块符合unlink操作触发条件的情况下,确定操作触发结果,包括:
针对每一所述第二堆块,判断所述第二堆块是否与溢出堆块相邻;
在所述第二堆块与所述溢出堆块相邻的情况下,确定所述第二堆块对应的unlink的操作方式;
若所述第二堆块的首部结构中的数据为污点数据,根据所述第二堆块以及所述第二堆块对应的unlink操作方式,构建操作触发结果。
7.根据权利要求3所述的方法,其特征在于,所述基于所述检测结果构建所述待测试程序的数据约束之后,所述方法还包括:
对所述待测试程序中的关键指针数据进行符号化检查,判断所述关键指针数据是否满足预设的指针可控条件;
在所述关键指针数据满足所述指针可控性条件的情况下,根据所述关键指针数据建立指针可控性约束,并将所述指针可控性约束添加到所述待测试程序的数据约束中。
8.根据权利要求1所述的方法,其特征在于,所述基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果,包括:
动态运行所述待测试程序,并基于所述攻击输入文件中各攻击输入数据构建对应的攻击输入指令;
基于所述攻击输入指令攻击所述待测试程序,得到攻击结果;
在所述攻击结果满足预设的堆溢出条件的情况下,确定所述攻击输入指令指向的所述待测试程序中存在溢出漏洞的堆块地址,基于所述攻击输入指令、所述攻击结果和所述堆块地址,构建测试结果。
9.一种漏洞检测装置,其特征在于,所述装置包括:
确定模块,用于基于预设的初始测试文件对待测试程序进行模糊测试,并基于模糊测试结果确定所述初始测试文件中包含的污点数据;
检测模块,用于基于所述污点数据对所述待测试程序进行检测,得到所述待测试程序对应的路径约束和数据约束;所述路径约束表征所述待测试程序中存在堆溢出漏洞的堆块的路径;所述数据约束表征所述待测试程序中存在堆溢出漏洞的堆块数据;
合取模块,用于对所述路径约束和所述数据约束进行合取,得到合取约束条件,并对所述合取约束条件进行求解,得到攻击输入文件;
测试模块,用于基于所述攻击输入文件对所述待测试程序进行测试,确定所述待测试程序的测试结果。
10.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至8中任一项所述的方法的步骤。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至8中任一项所述的方法的步骤。
CN202310834289.6A 2023-07-07 2023-07-07 漏洞检测方法、装置、计算机设备和存储介质 Pending CN116842526A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310834289.6A CN116842526A (zh) 2023-07-07 2023-07-07 漏洞检测方法、装置、计算机设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310834289.6A CN116842526A (zh) 2023-07-07 2023-07-07 漏洞检测方法、装置、计算机设备和存储介质

Publications (1)

Publication Number Publication Date
CN116842526A true CN116842526A (zh) 2023-10-03

Family

ID=88164892

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310834289.6A Pending CN116842526A (zh) 2023-07-07 2023-07-07 漏洞检测方法、装置、计算机设备和存储介质

Country Status (1)

Country Link
CN (1) CN116842526A (zh)

Similar Documents

Publication Publication Date Title
US9268945B2 (en) Detection of vulnerabilities in computer systems
CN109583200B (zh) 一种基于动态污点传播的程序异常分析方法
US10380349B2 (en) Security analysis using relational abstraction of data structures
Huang et al. Software crash analysis for automatic exploit generation on binary programs
CN111695119B (zh) 一种基于细粒度静态污点分析与符号执行的web漏洞检测方法
CN111832026B (zh) 一种漏洞利用定位方法、系统、装置及介质
CN108123956A (zh) 基于Petri网的密码误用漏洞检测方法及系统
CN111967044B (zh) 一种适用于云环境的被泄漏隐私数据的追踪方法及系统
US11868465B2 (en) Binary image stack cookie protection
CN114329366A (zh) 网盘文件控制方法、装置、网盘及存储介质
Wang et al. Tunter: assessing exploitability of vulnerabilities with taint-guided exploitable states exploration
CN109255238B (zh) 终端威胁检测与响应方法及引擎
CN116842526A (zh) 漏洞检测方法、装置、计算机设备和存储介质
US20220335135A1 (en) Vulnerability analysis and reporting for embedded systems
US20220035928A1 (en) Detecting exploitable paths in application software that uses third-party libraries
US11573887B2 (en) Extracting code patches from binary code for fuzz testing
CN111858307B (zh) 模糊测试方法和设备
CN114553551A (zh) 对入侵防御系统进行测试的方法及装置
Li et al. Memory access integrity: detecting fine-grained memory access errors in binary code
CN111310162A (zh) 基于可信计算的设备接入控制方法、装置、产品及介质
CN117034288A (zh) 漏洞检测方法和装置、存储介质及电子设备
WO2023067663A1 (ja) 解析機能付与方法、解析機能付与装置及び解析機能付与プログラム
WO2023067665A1 (ja) 解析機能付与方法、解析機能付与装置及び解析機能付与プログラム
CN117972707A (zh) 软件漏洞检测方法、装置、设备及存储介质
Situ et al. Automatic detection and repair recommendation for missing checks

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