CN116502239B - 二进制程序的内存漏洞检测方法、装置、设备及介质 - Google Patents
二进制程序的内存漏洞检测方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN116502239B CN116502239B CN202310763574.3A CN202310763574A CN116502239B CN 116502239 B CN116502239 B CN 116502239B CN 202310763574 A CN202310763574 A CN 202310763574A CN 116502239 B CN116502239 B CN 116502239B
- Authority
- CN
- China
- Prior art keywords
- memory
- error
- stack
- pointer
- determining
- 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.)
- Active
Links
- 230000015654 memory Effects 0.000 title claims abstract description 524
- 238000001514 detection method Methods 0.000 title claims abstract description 66
- 238000012360 testing method Methods 0.000 claims abstract description 109
- 238000000034 method Methods 0.000 claims abstract description 63
- 230000008569 process Effects 0.000 claims abstract description 30
- 230000006870 function Effects 0.000 claims description 64
- 230000007246 mechanism Effects 0.000 claims description 7
- 238000005315 distribution function Methods 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 12
- 238000013461 design Methods 0.000 description 9
- 238000012545 processing Methods 0.000 description 9
- 230000001960 triggered effect Effects 0.000 description 9
- 230000000694 effects Effects 0.000 description 8
- 230000003044 adaptive effect Effects 0.000 description 6
- 238000004891 communication Methods 0.000 description 6
- 230000000750 progressive effect Effects 0.000 description 6
- 238000011084 recovery Methods 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 5
- 238000004590 computer program Methods 0.000 description 3
- 238000007689 inspection Methods 0.000 description 3
- 238000002513 implantation Methods 0.000 description 2
- 238000005065 mining Methods 0.000 description 2
- 238000011160 research Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 239000000645 desinfectant Substances 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 230000000644 propagated effect Effects 0.000 description 1
- 239000013589 supplement Substances 0.000 description 1
- 238000010998 test method Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Quality & Reliability (AREA)
- Computing Systems (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请提供一种二进制程序的内存漏洞检测方法、装置、设备及介质。该方法包括:标记二进制程序中指向内存对象的所有指针,内存对象包括堆对象、栈对象、全局对象中的至少一种;基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误;当检测到内存错误时,确定内存错误所属的类别,内存错误至少分为非严重错误和严重错误两种;在模糊测试过程中,根据内存错误所属的类别,检测二进制程序中存在的内存漏洞。本申请提高了在模糊测试中检测包括堆对象、栈对象和全局变量对象中出现的内存漏洞的效率,同时还可以降低性能开销。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种二进制程序的内存漏洞检测方法、装置、设备及介质。
背景技术
软件漏洞是信息产业面临的一大严重威胁,攻击者可以利用漏洞实施网络攻击,完成窃取数据、植入后门等操作,严重的影响了用户、行业实体乃至国家的安全。为此需要对软件进行漏洞测试,及时发现存在的漏洞,例如对二进制程序进行漏洞检测。
现有技术中,主要是使用模糊测试来实现对二进制程序的漏洞挖掘,其主要是通过为目标程序生成大量的畸形测试用例,并在执行过程中捕获违反安全策略的信号作为漏洞被触发的标志。
但是,由于二进制程序在编译生成的过程中丢失了变量的类型信息,在使用模糊测试进行漏洞检测时,往往漏洞检测效果较差。
发明内容
本申请提供一种二进制程序的内存漏洞检测方法、装置、设备及介质,用以解决现有技术漏洞检测效果差的问题。
第一方面,本申请提供一种二进制程序的内存漏洞检测方法,包括:
标记二进制程序中指向内存对象的所有指针,所述内存对象包括堆对象、栈对象、全局对象中的至少一种;
基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误;
当检测到内存错误时,确定所述内存错误所属的类别,所述内存错误至少分为非严重错误和严重错误两种;
在模糊测试过程中,根据所述内存错误所属的类别,检测所述二进制程序中存在的内存漏洞。
在第一方面的一种可能设计中,所述标记二进制程序中指向内存对象的所有指针,包括:
若所述内存对象为所述堆对象,则获取所述堆对象的堆内存管理函数,并根据所述堆内存管理函数调用时的返回数据,识别和标记所述堆对象的指针;
若所述内存对象为所述栈对象,则根据栈指针寄存器,识别和标记所述栈对象的指针;
若所述内存对象为所述全局对象,则根据所述全局对象的全局内存地址派生得到的原始对象指针,识别和标记所述全局对象的指针。
在第一方面的另一种可能设计中,所述基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误之前,还包括:
为每个内存对象分配一个随机的标记,该标记用于对该内存对象的指针和内存空间进行标记。
在第一方面的又一种可能设计中,所述基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误,包括:
当指针访问内存时,通过安全机制内存标记MTE检查该指针的标记和待访问的目标内存对象的内存标记是否匹配;
若该指针的标记和待访问的目标内存对象的内存标记不匹配,则产生段错误信号,所述段错误信号用于表征检测到内存错误。
在第一方面的又一种可能设计中,所述当检测到内存错误时,确定所述内存错误所属的类别,包括:
确定该内存错误依赖于确定性属性的检查或该内存错误依赖于非确定性属性的检查;
若该内存错误依赖于确定性属性的检查,则确定该内存错误为严重错误;
若该内存错误依赖于非确定性属性的检查,则确定该内存错误为非严重错误;
若所述内存对象为栈对象且该栈对象的指针访问的内存地址为非本栈帧的内存地址或其它无效内存地址,则确定该内存错误为严重错误。
在第一方面的又一种可能设计中,还包括:
若所述内存对象为堆对象,则获取所述堆对象的分配函数和释放函数;
根据所述分配函数的参数确定所述堆对象的边界信息;
根据所述分配函数和释放函数的调用位置确定所述堆对象的生命周期;
若所述内存对象为所述栈对象或所述全局对象,则获取所述栈对象或所述全局对象指针的内存访问信息,所述内存访问信息中包括所述栈对象或所述全局对象指针访问的连续内存区域;
根据所述栈对象或所述全局对象指针访问的连续内存区域,确定所述栈对象或所述全局对象的边界信息;
若所述内存对象为所述栈对象,则获取所述栈对象的调用函数;
根据所述调用函数的函数调用与函数返回时间,确定所述栈对象的生命周期;
若所述内存对象为所述全局对象,则所述全局对象的生命周期为进程的运行时长;
将所述堆对象的边界信息、堆对象的生命周期、栈对象的生命周期、全局对象的生命周期作为确定性属性;
将所述栈对象、所述全局对象的边界信息作为非确定属性,其中,所述内存对象的边界信息和生命周期用于确定所述内存错误所属的类别。
在第一方面的又一种可能设计中,所述根据所述内存错误所属的类别,检测所述二进制程序中存在的内存漏洞,包括:
若所述内存错误所属的类别为严重错误,则确定该目标内存对象存在内存漏洞;
若所述内存错误所属的类别为非严重错误,则获取进行模糊测试时触发所述非严重错误的测试用例,并将所述测试用例插入模糊测试的种子队列中;
更新所述目标内存对象的边界;
根据所述模糊测试的种子队列,对更新后的目标内存对象继续进行模糊测试,检测出所述二进制程序中存在的内存漏洞。
在第一方面的又一种可能设计中,所述根据所述模糊测试的种子队列,对更新后的目标内存对象继续进行模糊测试,检测出所述二进制程序中存在的内存漏洞,包括:
根据所述模糊测试的种子队列,对更新后的目标内存对象继续进行测试;
若更新后的目标内存对象存在内存错误且所述内存错误为严重错误,则确定该目标内存对象存在内存漏洞。
第二方面,本申请提供一种二进制程序的内存漏洞检测装置,包括:
指针标记模块,用于标记二进制程序中指向内存对象的所有指针,所述内存对象包括堆对象、栈对象、全局对象中的至少一种;
内存错误确定模块,用于基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误;
错误分类模块,用于当检测到内存错误时,确定所述内存错误所属的类别,所述内存错误至少分为非严重错误和严重错误两种;
漏洞检测模块,用于在模糊测试中,根据所述内存错误所属的类别,检测所述二进制程序中存在的内存漏洞。
第三方面,本申请实施例提供一种电子设备,包括:处理器,以及与所述处理器通信连接的存储器;所述存储器存储计算机执行指令;所述处理器执行所述存储器存储的计算机执行指令,以实现如第一方面任一项所述的二进制程序的内存漏洞检测方法。
第四方面,本申请实施例提供一种可读存储介质,计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现第一方面任一项所述的二进制程序的内存漏洞检测方法。
第五方面,本申请实施例提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时用于实现第一方面任一项所述的二进制程序的内存漏洞检测方法。
本申请提供的二进制程序的内存漏洞检测方法、装置、设备及介质,通过渐进式对象恢复方案识别并标记指向内存对象的所有指针,然后通过自适应内存漏洞检测方案基于指针标记和内存标记是否匹配,若不匹配则认为检测到内存错误,然后基于内存错误是否为严重错误或非严重错误,来进一步识别出是否存在真实的内存漏洞,能够有效检测包括堆、栈和全局变量区域中出现的内存错误,提高二进制程序的内存漏洞检测效率和检测效果。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
图1为本申请实施例提供的二进制程序的内存漏洞检测方法流程示意图;
图2为本申请提供的获取内存对象的边界的示意图;
图3为本申请实施例提供的内存漏洞检测的示意图;
图4为本申请实施例提供的模糊测试示意图;
图5为本申请实施例提供的二进制程序的内存漏洞检测方法结构示意图;
图6为本申请实施例提供的二进制程序的内存漏洞检测装置结构示意图;
图7为本申请实施例提供的一种电子设备的结构示意图。
通过上述附图,已示出本申请明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本申请构思的范围,而是通过参考特定实施例为本领域技术人员说明本申请的概念。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
需要说明的是,在本申请实施例的描述中,术语“内”、“外”等指示的方向或位置关系的术语是基于附图所示的方向或位置关系,这仅仅是为了便于描述,而不是指示或暗示装置或构件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本申请的限制。
软件漏洞是信息产业面临的一大严重威胁,攻击者可以利用漏洞实施网络攻击,完成窃取数据、植入后门等操作,严重的影响了用户、行业实体乃至国家的安全。在当前的网络空间安全形势下,软件漏洞的发现技术作为核心,也是当前网络安全领域研究的重点和热点技术。
模糊测试是一种流行的漏洞发现技术,由于其有效性,近年来成为了学术界和工业界的研究热点。模糊测试工具为目标程序生成大量的畸形测试用例,并在执行过程中捕获违反安全策略的信号作为漏洞被触发的标志。因此,研究者们往往在模糊测试的同时部署漏洞检测工具(Sanitizer,又称消毒剂)。
需要说明的是,在本文中提到的二进制程序指的是计算机中使用二进制代码编写的程序,也称为机器码程序。虽然模糊测试也被广泛应用于二进制程序的漏洞挖掘,但针对二进制程序进行漏洞检测的方案较少,且效果有限。一般而言,内存安全违规的产生原因有二,其一是解引用指向预期内存对象边界之外的指针,此类错误被称为基于空间的内存错误;其二是解引用不再有效的指针(即对应的内存对象不再有效),此类错误被称为基于时序的内存错误。漏洞检测工具往往通过在指针解引用(即内存访问)时,检测访问是否合法,以发现内存错误。然而,对于二进制程序而言,其在编译生成的过程中,丢失了变量的类型信息,漏洞检测工具难以检测内存访问是否位于预期对象边界内,从而无法确定内存访问是否合法。其次,对于二进制程序而言,无法在不重新编译二进制或调整内存布局的情况下,通过为栈和全局变量区域添加无效内存区域以检测溢出。最后,使用流行的二进制程序动态插桩方案,可能会导致较大的性能开销,影响模糊测试的效率。
因此,针对现有技术的上述技术问题,本申请提出一种二进制程序的内存漏洞检测方法、装置、设备及介质。首先,为了解决二进制程序中缺少变量类型信息的挑战,本申请设计了一种称为渐进式对象恢复方案,使用了模糊测试过程中可用的内存访问信息,以概率性地恢复内存对象及其边界,同时设计了一种自适应内存错误检测策略以最大限度地减少误报的产生。最后,基于Advanced RISC Machines处理器(简称为ARM处理器)中引入的安全机制内存标记(Memory Tagging Extension,MTE),实现高效检测二进制程序内存漏洞的效果。本申请可以有效检测包括堆、栈和全局变量区域中出现的基于空间和时序的内存错误,相比于现有的二进制程序内存漏洞检测工具,具有更好的性能,以及更强的检测能力。
下面以具体地实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本申请的实施例进行描述。
图1为本申请实施例提供的二进制程序的内存漏洞检测方法流程示意图,该方法的执行主体可以为具备内存漏洞检测功能的终端,例如,可以为个人计算机、笔记本电脑、智能手机、平板电脑、便携式可穿戴设备、服务器或服务器集群等。本实施例中的方法可以通过软件、硬件或者软硬件结合的方式来实现。如图1所示,该方法具体包括以下步骤:
步骤S101,标记二进制程序中指向内存对象的所有指针。其中,内存对象包括堆对象、栈对象、全局对象中的至少一种。
在本实施例中,内存对象是一种在内存中存储的对象。它们存储的是一系列的数据或对象的形式,这些数据或对象被存储在内存中,而不是存储在文件或磁盘上。这样使得它们可以在程序运行时快速访问。内存对象可以是任何类型的对象,但是一般来说它们是用来存储某种基本数据类型,如整数、字符串、布尔值等。它们常常是用来存储程序的中间数据,以便于程序的运行。它们可以用来存储程序运行时所需的变量,或者用来提高程序效率。
其中,堆可以理解为在程序运行时在内存中申请的空间,放入到堆中的对象就可以称为堆对象。同理,放入到栈中的对象就可以称为栈对象。全局对象提供可在任何地方(具体可以是指二进制程序内的任何地方)使用的变量和函数。其中,在二进制程序中定义一个变量,变量的值会被放在内存对象中。若申请动态分配,变量的值会被放在堆对象中,若未申请动态分配,变量的值会被放在栈对象中。或者自定义变量的值将被放在全局对象中。
在本实施例中,可以先识别二进制程序中的堆对象、栈对象和全局对象的指针,然后对堆对象、栈对象和全局对象的指针进行标记即可。可以理解,不同的指针对应的标记是不相同的。
步骤S102,基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误。
在本实施例中,在当前发起内存访问时,可以基于指针标记和内存标记判断当前内存访问是否合法。具体的,当使用任何指针访问内存时,可以检查该指针的指针标记与访问的该目标内存对象的内存标记是否匹配,如果匹配,则说明当前内存访问是合法的,不存在内存错误。如果不匹配,则说明当前内存访问是不合法的,存在内存错误。
其中,可以通过安全机制内存标记(Memory Tagging Extension,MTE)来检查指针标记和访问的目标内存标记是否匹配,如果不匹配,CPU将产生段错误信号。需要说明的是,这些检查都是基于硬件完成的,无需事先插桩标记检查的相关指令,如此可以提高检查效率。
步骤S103、当检测到内存错误时,确定内存错误所属的类别。其中,内存错误至少分为非严重错误和严重错误两种。
在本实施例中,在内存错误触发时,由于所检测到内存错误存在有是误报的可能性,为此可以将其分为两类:即非严重错误和严重错误。其中,非严重错误对应的是有可能存在真正的内存漏洞,也有可能是存在误报,即不存在真正的内存漏洞。而严重错误对应的是存在真正的内存漏洞。
步骤S104,在模糊测试过程中,根据内存错误所属的类别,检测二进制程序中存在的内存漏洞。
在本实施例中,当内存错误为严重错误时,则说明其存在内存漏洞,此时可以获取触发该内存错误的测试用例,基于该测试用例分析出二进制程序存在内存漏洞的原因。
进一步的,当内存错误为非严重错误时,触发该非严重错误的原因可能是存在真正的内存漏洞,也可能是由于误报导致的(即不存在真正的内存漏洞)。此时可以通过回归模糊测试策略来处理非严重错误,进一步确认排查该非严重错误的原因。
本申请实施例通过渐进式对象恢复方案识别并标记指向内存对象的所有指针,然后通过自适应内存漏洞检测方案基于指针标记和内存标记是否匹配,若不匹配则认为检测到内存错误,然后基于内存错误是否为严重错误或非严重错误,来进一步识别出是否存在真实的内存漏洞,能够有效检测包括堆、栈和全局变量区域中出现的内存错误,提高二进制程序的内存漏洞检测效率和检测效果。
进一步的,在一些实施例中,本实施例提供了一种渐进式对象恢复方案,该方案可以识别和标记指向堆、栈和全局对象的所有指针。并在运行时动态推断对象的边界、生命周期属性。由于模糊测试中涉及到大量的迭代执行,该方案将多次执行中的推断结果进行合并,逐步完善所有被推断的对象属性。
其中,在识别和标记指向堆、栈和全局对象的所有指针时,具体可以通过如下步骤实现:若内存对象为堆对象,则获取堆对象的堆内存管理函数,并根据堆内存管理函数调用时的返回数据,识别和标记堆对象的指针;若内存对象为栈对象,则根据栈指针寄存器,识别和标记栈对象的指针;若内存对象为全局对象,则根据全局对象的全局内存地址派生得到的原始对象指针,识别和标记全局对象的指针。
在本实施例中,首先根据内存对象的内存位置,可以有两类识别方法:
第一类:对于在堆上分配的内存对象,由于堆对象总是被显式的分配和释放(例如,通过调用malloc函数来分配,并通过调用free来释放),识别堆对象的指针相对简单,只需要关注相关堆内存管理函数即可。以malloc函数为例,可以将其返回值视为堆对象的指针。
第二类:对于栈对象和全局对象而言,识别直接由栈指针寄存器或全局内存地址派生得到的原始对象指针,同时识别由原始对象指针经过算术运算派生得到的指针。
在另一些实施方式中,在渐进式对象恢复方案中,当在运行时动态推断对象的边界、生命周期属性时,具体可以通过如下步骤实现:
若内存对象为堆对象,则获取堆对象的分配函数和释放函数;根据分配函数的参数确定堆对象的边界信息;根据分配函数和释放函数的调用位置确定堆对象的生命周期。
若内存对象为栈对象或全局对象,则获取栈对象或全局对象指针的内存访问信息,内存访问信息中包括栈对象或全局对象指针访问的连续内存区域;根据栈对象或全局对象指针访问的连续内存区域,确定栈对象或全局对象的边界信息。
若内存对象为栈对象,则获取栈对象的调用函数;根据调用函数的函数调用与函数返回时间,确定栈对象的生命周期;若内存对象为全局对象,则全局对象的生命周期为进程的运行时长;
在本实施例中,将堆对象的边界信息、堆对象的生命周期、栈对象的生命周期、全局对象的生命周期作为确定性属性;将栈对象和全局对象的边界信息作为非确定属性,其中,内存对象的边界信息和生命周期用于确定内存错误所属的类别。
其中,根据内存对象的内存位置,可以有两类方法推断对象属性:
第一类:对于堆对象,其边界可以通过观察分配函数的参数而确定,而生命周期可以直接通过观察释放函数的参数而确定。
第二类:对于栈对象和全局对象,栈对象和全局对象边界可以通过观察对象指针的内存访问,将所访问的连续内存区域视为该对象的范围,确定其边界。栈对象和全局对象的生命周期:全局对象在进程生命周期内一直有效,栈对象生命周期为从函数调用到函数返回。
需要说明的是,本实施例提出的渐进式对象恢复方案可以使用模糊测试过程中可用的内存访问信息来概率性的恢复对象边界,然后,由于栈和全局对象的边界推断结果中可能存在错误,而错误的边界推断可能会导致大量误报,由此有可能产生上述的非严重错误。故需要再利用自适应内存错误检测策略,以最大限度地减少错误推断的影响,后文将对自适应内存错误检测策略进行详细说明。
本申请实施例区别于现有的二进制程序的内存漏洞检测工具的错误检测方案,现有的二进制程序的内存漏洞检测工具的错误检测方案均属于基于位置的错误检测方法(即通过添加无效内存检测溢出),而对于二进制程序而言,无法在不重新编译二进制或调整内存布局的情况下,在栈和全局变量区域添加无效内存。因此,它们无法发现位于栈和全局变量区域中的内存错误。本申请实施例基于内存标记硬件机制检测内存错误的方案,可以检测位于所有区域(堆、栈、全局变量)的内存错误。
在一些实施例中,本申请实施例提供了一种自适应内存漏洞检测策略,该策略首先基于指针标记和内存标记是否匹配判断当前内存访问是否合法,若不匹配则认为检测到内存错误。同时,该自适应内存漏洞检测方案根据所检测到内存错误是误报的可能性,将其分为两类并分别处理,直接报告严重错误,并通过回归模糊测试策略来处理非严重错误被触发的情况。具体的,其包括如下步骤:
1、内存错误的检测
1.1、首先为每一个内存对象分配一个随机的标记,该标记将用于内存对象对应的指针,以及其对应的内存空间;
1.2、其次在内存对象分配后,立即标记对应的堆指针和内存空间,指针标记被存储于指针未被使用的高位,且随着指针一起传播;
1.3、当使用任何指针访问内存时,MTE会检查指针标记和访问目标内存标记是否匹配,若不匹配则产生错误信号,这些检查都是基于硬件完成的,无需事先插桩标记检查的相关指令。
2、内存错误严重级别分类
2.1、在内存错误触发时,根据所检测到内存错误是误报的可能性,将其分为两类:如果该内存错误仅依赖于确定性属性的检查,此时认为该内存错误非误报,并将其分类为“严重错误”,所有的严重错误都对应真正的内存漏洞;
2.2、若内存错误依赖于非确定性属性的检查,将其分类为“非严重错误”。此类非严重错误有可能对应了真正的内存漏洞,也有可能是由于对象恢复过程中出现的错误而引发的误报,不是真正的内存漏洞。
另外,若内存对象为栈对象且该栈对象的指针访问的内存地址为非本栈帧的内存地址或其它无效内存地址,则确定该内存错误为严重错误。
在本实施例中,为每个内存对象随机分配的标记是不相同的,例如可以先随机生成若干个互不相同的标记,然后为每个内存对象分配其中一个标记。其中,上文渐进式对象恢复方案已经提到了标记指向堆、栈和全局对象的所有指针,当有任何指针访问某个目标内存对象时,都可以通过MTE来检查指针标记和访问目标内存标记是否匹配。其中,现有的二进制程序的内存漏洞检测工具的错误检测方案均产生了较高的运行时开销。本申请实施例使用ARM处理器中最近引入的安全机制内存标记MTE,基于硬件辅助,有效降低了运行时的内存开销和运行时开销。
在本实施例中,所有的严重错误都对应真实的内存漏洞。例如,由于堆对象具有确定性的属性信息,因此,若访问堆对象时生成内存错误信息,则堆对象存在真实的内存漏洞。
若内存错误依赖于非确定性属性的检查,将其分类为“非严重错误”。例如,栈对象和全局变量对象由于具有不确定性的属性信息,被分为“非严重错误”(若栈返回地址、保存在栈上的栈指针,以及栈中只存在单个变量,在这种特殊情况下,其具有确定性的属性信息,否则,则具有不确定性的属性信息)。此类“非严重错误”有可能对应了真实的内存漏洞,也有可能是由于内存对象属性信息恢复过程中出现错误而引发的对内存漏洞的误报,即非真实的内存漏洞。因此,需要对类型为“非严重错误”的内存对象进行回归模糊测试:若内存错误所属的类别为严重错误,则确定该目标内存对象存在内存漏洞;若内存错误所属的类别为非严重错误,则获取触发非严重错误时的测试用例,并将测试用例插入模糊测试的种子队列中;更新目标内存对象的边界;根据模糊测试的种子队列,对更新后的目标内存对象继续进行测试,检测出二进制程序中存在的内存漏洞。
在本实施例中,若为误报导致的非真实内存漏洞,根据待访问的目标内存对象指针中带有的标记信息,将待访问的目标内存对象对应的内存空间的标记信息进行恢复处理,以使内存空间的标记信息与指针中带有的标记信息一致。具体的,若为误报,误报产生原因可以是由于上述属性信息推断中的错误导致,将所有涉及的对象合并为同一个对象,同时更新元数据区域中存储的相应的属性信息即内存对象的边界,从而恢复真正的边界。恢复之后,未来执行过程将不会再触发和此次相同的“非严重错误”。继续模糊测试过程,基于测试用例对待访问的目标内存对象进行测试,得到真实的内存漏洞。
其中,进行回归模糊测试,避免了模糊测试过程的中断,通过回归模糊测试,可以保留可能满足漏洞触发约束条件的测试用例,这些被额外保留的测试用例不会增加代码覆盖率,但是可以增加模糊测试工具触发真正内存漏洞的可能性。
回归模糊测试的具体过程如下:
3、回归模糊测试
3.1、记录。当检测到非严重错误时,记录测试用例,同时转储元数据区域,元数据区域中可以包括为标记后的内存对象的相关数据及标记信息;
3.2、恢复。首先假设该非严重错误是误报引起的(由于对象属性推断中的错误导致),并将所有涉及的对象合并为同一个对象,同时更新元数据区域中存储的相应的推定属性(即内存对象的边界),在此基础上,未来执行过程将不会再触发和此次相同的非严重错误。然后恢复模糊测试过程;
3.3、回归模糊测试。将3.1步中所记录的测试用例插入模糊测试工具的种子队列中,以启动回归模糊过程,从而进一步探索可能存在的漏洞状态。通过回归模糊测试,可以保留可能满足漏洞触发约束条件的测试用例,即使这些测试用例不会增加代码覆盖率。这些被额外保留的测试用例将增加模糊测试工具触发真正内存漏洞的可能性。
需要说明的是,在通过上述3.2步骤恢复内存对象边界之后,通过上述3.3步骤继续进行回归模糊测试时,可以根据模糊测试的种子队列,对更新后的目标内存对象继续进行测试;若更新后的目标内存对象存在内存错误且内存错误为严重错误,则确定该目标内存对象存在内存漏洞。
在本实施例中,在对二进制程序进行模糊测试的同时,如果某个测试用例触发了非严重错误,则该测试用例可以插入到模糊测试工具的种子队列中,以启动回归模糊过程,从而进一步探索可能存在的漏洞状态。
本申请实施例可以在模糊测试同时有效的恢复内存对象的属性,并根据此检查执行过程中可能被触发的内存漏洞,并通过自适应漏洞检测方案有效的筛出真正的内存漏洞。
可以理解的是,由于模糊测试中涉及到大量的迭代执行,该方案将多次执行中的结果进行合并,能够逐步完善所有内存对象的属性信息。
图2为本申请提供的获取内存对象的边界的示意图,从原始二进制程序的汇编指令中,例如X0,SP,#0×78、X0,X0,#0×400识别出待访问对象的指针“X0”,并识别出标记信息,如图2所示,图2中分别用第一符号图例和第二符号图例进行了标记,根据指针expr+0的标记信息(第一符号图例)与指针运算后产生的指针expr+3000的标记信息(第一符号图例),确定边界。在图2中,expr和list表示不同的栈变量名称;expr+数字表示已识别到指针运算后产生的指针。
在本申请的上述实施例中,准确的识别出了指向堆、栈和全局对象的所有指针,并在运行时动态恢复了内存对象的属性信息即边界和生命周期,使得得到的信息更加完整,便于后续根据识别出的指针和属性信息进行内存漏洞检测。
图3为本申请实施例提供的内存漏洞检测的示意图,如图3所示,得到内存对象的元数据(元数据中包括标记信息、类型、确定性的属性信息、不确定性的属性信息、函数及已识别的指针及位置等)后,根据元数据进行内存漏洞检测,若根据指针的标签信息不可以匹配到正确的内存空间,如图3中的“?”处,说明MTE产生错误信息,触发自适应漏洞检测策略。
图4为本申请实施例提供的模糊测试示意图,如图4所示,当指针的标签信息(第一符号图例)与内存的标签信息(第二符号图例)不一致时,触发“非严重错误”,记录当前所用的测试用例,并恢复正确的边界。具体的,根据标签信息识别出冲突的对象,合并对象,然后更新边界,即根据指针的标签信息(第一符号图例),将内存的标签信息(第二符号图例)恢复为正确的标签信息(第一符号图例),进而进行回归模糊测试,将测试用例输入回归模糊测试队列,通过测试检测到“严重错误”,从而得到真实的内存漏洞。
在本申请的上述实施例中,通过基于指针标记信息和内存空间标记信息是否匹配判断当前内存对象的访问是否合法,若不匹配则生成内存错误信息,其中,错误信息用于指示待访问内存对象存在候选内存漏洞。进而根据内存错误信息中候选内存漏洞的类型,若类型为“严重错误”,则该候选内存漏洞为真实的内存漏洞。若类型为“非严重错误”,则通过回归模糊测试来筛选出真实的内存漏洞,从而降低误报带来的影响,提高了内存漏洞检测的准确性。
进一步的,本申请还提供一种实现本申请的方法的一种可能的方式,包括二进制分析模块、二进制重写模块、运行时库等。
示例性的,二进制分析模块可以基于二进制程序分析框架Angr,以及二进制程序逆向汇编工具IDA Pro实现。其中,Angr可以提供开发接口,并提供程序分析功能。对于某些特定功能,例如上述的对函数的相关识别等,由于IDA Pro的性能优于Angr,因此可以使用IDA Pro作为补充。具体而言,对象恢复功能即恢复属性信息可以基于Angr的符号执行(Symbolic Execution)、强制执行(Forced Execution)以及常量传播(ConstantPropagation)等功能实现,而分配点识别功能可以基于IDA Pro的函数识别功能实现。
二进制重写模块可以基于流行的编译和反编译引擎Capstone和Keystone工具实现。上述实施例中可能会触发的一些特定指令,例如,指针比较和指针减法运算等,需要在运行时被替换为MTE提供的指针比较和指针减法运算。本申请可以采用生成多版本二进制文件的方案,或者将目标代码片段置于共享内存区域中,并在运行时直接修改的方案。后者的优势在于可以在模糊测试过程中启用分叉服务器模式(fork-server mode),有效消除了由于重复加载多版本二进制文件而导致的额外开销。
本申请可以通过运行时库,在运行时库中存储有本申请方法所需的多种函数,通过运行时库可以维护和更新本申请相关的数据,运行时库在启动时被加载到目标进程中,并注册MTE信号处理函数。该运行时库可以基于C语言技术实现,可以使用Capstone和Keystone的相关功能。
为了支持回归模糊测试,本申请可以通过代码补丁,以支持对“非严重错误”的自适应检测处理逻辑。该补丁程序记录“非严重错误”,并将测试用例直接添加到模糊测试工具的队列中。
可以理解的是,上述二进制分析模块、二进制重写模块、运行时库等仅用于举例说明,也可以通过其它具备相同作用的模块实现,本申请不进行限定。
通过上述模块实现本申请的具体过程可以如图5所示,图5为本申请实施例提供的二进制程序的内存漏洞检测方法结构示意图。
在预处理阶段,二进制分析模块对目标二进制程序进行分析,利用插桩指令及运行时库中的函数等,通过二进制重写模块等对目标二进制程序进行代码插桩(用于标记指针和内存),得到插桩后的二进制程序。
在模糊测试阶段,利用运行时库,对得到的插桩后的二进制程序的属性信息进行渐进式恢复,得到相关的元数据,其中,元数据中包括标记信息等。进而进行内存漏洞检测,通过自适应漏洞检测的方式,得到类型为“非严重错误”和“严重错误”的内存错误信息。若为“严重错误”,则为真实的内存漏洞,若为“非严重错误”,说明内存漏洞有可能是误报导致,进而根据获取的测试用例进行回归模糊测试,增加暴露“真实”内存漏洞的可能性,其中,测试用例可以通过从语料库中获取。具体的过程请参见上述的多个实施例,在此不再重复赘述。
下述为本申请装置实施例,可以用于执行本申请方法实施例。对于本申请装置实施例中未披露的细节,请参照本申请方法实施例。
图6为本申请实施例提供的二进制程序的内存漏洞检测装置结构示意图,如图6所示,该内存漏洞检测装置600包括:指针标记模块610、内存错误确定模块620、错误分类模块630、漏洞检测模块640。
其中,指针标记模块610用于标记二进制程序中指向内存对象的所有指针,内存对象包括堆对象、栈对象、全局对象中的至少一种。内存错误确定模块620用于基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误。错误分类模块630用于当检测到内存错误时,确定内存错误所属的类别,内存错误至少分为非严重错误和严重错误两种。漏洞检测模块640用于在模糊测试过程中,根据内存错误所属的类别,检测二进制程序中存在的内存漏洞。
可选的,指针标记模块具体可以用于:若内存对象为堆对象,则获取堆对象的堆内存管理函数,并根据堆内存管理函数调用时的返回数据,识别和标记堆对象的指针;若内存对象为栈对象,则根据栈指针寄存器,识别和标记栈对象的指针;若内存对象为全局对象,则根据全局对象的全局内存地址派生得到的原始对象指针,识别和标记全局对象的指针。
可选的,还包括内存对象标记模块,用于为每个内存对象分配一个随机的标记,该标记用于对该内存对象的指针和内存空间进行标记。
可选的,内存错误确定模块具体可以用于:当指针访问内存时,通过安全机制内存标记MTE检查该指针的标记和待访问的目标内存对象的内存标记是否匹配;若该指针的标记和待访问的目标内存对象的内存标记不匹配,则产生段错误信号,段错误信号用于表征检测到内存错误。
可选的,错误分类模块具体可以用于:确定该内存错误依赖于确定性属性的检查或该内存错误依赖于非确定性属性的检查;若该内存错误依赖于确定性属性的检查,则确定该内存错误为严重错误;若该内存错误依赖于非确定性属性的检查,则确定该内存错误为非严重错误;若内存对象为栈对象且该栈对象的指针访问的内存地址为非本栈帧的内存地址或其它无效内存地址,则确定该内存错误为严重错误。
可选的,还包括属性确定模块,用于若内存对象为堆对象,则获取堆对象的分配函数和释放函数;根据分配函数的参数确定堆对象的边界信息;根据分配函数和释放函数的调用位置确定堆对象的生命周期;若内存对象为栈对象或全局对象,则获取栈对象或全局对象指针的内存访问信息,内存访问信息中包括栈对象或全局对象指针访问的连续内存区域;根据栈对象或全局对象指针访问的连续内存区域,确定栈对象或全局对象的边界信息;若内存对象为栈对象,则获取栈对象的调用函数;根据调用函数的函数调用与函数返回时间,确定栈对象的生命周期;若内存对象为全局对象,则全局对象的生命周期为进程的运行时长;将堆对象的边界信息、堆对象的生命周期、栈对象的生命周期、全局对象的生命周期作为确定性属性;将栈对象和全局对象的边界信息作为非确定属性,其中,内存对象的边界信息和生命周期用于确定内存错误所属的类别。
可选的,漏洞检测模块具体还可以用于:若内存错误所属的类别为严重错误,则确定该目标内存对象存在内存漏洞;若内存错误所属的类别为非严重错误,则获取触发非严重错误时的测试用例,并将测试用例插入模糊测试的种子队列中;更新目标内存对象的边界;根据模糊测试的种子队列,对更新后的目标内存对象继续进行测试,检测出二进制程序中存在的内存漏洞。
可选的,漏洞检测模块具体还可以用于:根据模糊测试的种子队列,对更新后的目标内存对象继续进行测试;若更新后的目标内存对象存在内存错误且内存错误为严重错误,则确定该目标内存对象存在内存漏洞。
本实施例提供的二进制程序的内存漏洞检测装置,用于执行前述的方法实施例,其实现原理与技术效果类似,对此不再赘述。
需要说明的是,应理解以上装置的各个模块的划分仅仅是一种逻辑功能的划分,实际实现时可以全部或部分集成到一个物理实体上,也可以物理上分开。且这些模块可以全部以软件通过处理元件调用的形式实现;也可以全部以硬件的形式实现;还可以部分模块通过处理元件调用软件的形式实现,部分模块通过硬件的形式实现。例如,指针标记模块可以为单独设立的处理元件,也可以集成在上述装置的某一个芯片中实现,此外,也可以以程序代码的形式存储于上述装置的存储器中,由上述装置的某一个处理元件调用并执行以上指针标记模块的功能。其它模块的实现与之类似。此外这些模块全部或部分可以集成在一起,也可以独立实现。这里的处理元件可以是一种集成电路,具有信号的处理能力。在实现过程中,上述方法的各步骤或以上各个模块可以通过处理器元件中的硬件的集成逻辑电路或者软件形式的指令完成。
图7为本申请实施例提供的一种电子设备的结构示意图,如图7所示,该电子设备700可以包括:至少一个处理器701、存储器702、总线703及通信接口704。其中:处理器701、通信接口704以及存储器702通过总线703完成相互间的通信。通信接口704用于与其它设备进行通信。该通信接口包括用于进行数据传输的通信接口以及用于进行人机交互的显示界面或者操作界面等。
处理器701用于执行存储器702中存储的计算机执行指令,具体可以执行上述实施例中所描述的方法中的相关步骤。处理器可能是中央处理器,或者是特定集成电路(Application Specific Integrated Circuit,ASIC),或者是被配置成实施本发明实施例的一个或多个集成电路。电子设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。
存储器,用于存放计算机执行指令。存储器可能包含高速RAM存储器,也可能还包括非易失性存储器,例如至少一个磁盘存储器。
本实施例提供的电子设备,用于执行前述实施例执行的方法,其实现原理与技术效果类似,对此不再赘述。
本申请还提供了一种计算机可读存储介质,该计算机可读存储介质可以包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或者光盘等各种可以存储程序代码的介质,具体的,该计算机可读存储介质中存储有计算机执行指令,计算机执行指令用于上述实施例中二进制程序的内存漏洞检测方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求书指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求书来限制。
Claims (9)
1.一种二进制程序的内存漏洞检测方法,其特征在于,包括:
标记二进制程序中指向内存对象的所有指针,所述内存对象包括堆对象、栈对象、全局对象中的至少一种;
基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误;
当检测到内存错误时,确定所述内存错误所属的类别,所述内存错误至少分为非严重错误和严重错误两种;
在模糊测试过程中,根据所述内存错误所属的类别,检测所述二进制程序中存在的内存漏洞;
所述当检测到内存错误时,确定所述内存错误所属的类别,包括:
确定该内存错误依赖于确定性属性的检查或该内存错误依赖于非确定性属性的检查;
若该内存错误依赖于确定性属性的检查,则确定该内存错误为严重错误;
若该内存错误依赖于非确定性属性的检查,则确定该内存错误为非严重错误;
若所述内存对象为栈对象且该栈对象的指针访问的内存地址为非本栈帧的内存地址或其它无效内存地址,则确定该内存错误为严重错误;
所述根据所述内存错误所属的类别,检测所述二进制程序中存在的内存漏洞,包括:
若所述内存错误所属的类别为严重错误,则确定该目标内存对象存在内存漏洞;
若所述内存错误所属的类别为非严重错误,则获取进行模糊测试时触发所述非严重错误的测试用例,并将所述测试用例插入模糊测试的种子队列中;
更新所述目标内存对象的边界;
根据所述模糊测试的种子队列,对更新后的目标内存对象继续进行模糊测试,检测出所述二进制程序中存在的内存漏洞。
2.根据权利要求1所述的方法,其特征在于,所述标记二进制程序中指向内存对象的所有指针,包括:
若所述内存对象为所述堆对象,则获取所述堆对象的堆内存管理函数,并根据所述堆内存管理函数调用时的返回数据,识别和标记所述堆对象的指针;
若所述内存对象为所述栈对象,则根据栈指针寄存器,识别和标记所述栈对象的指针;
若所述内存对象为所述全局对象,则根据所述全局对象的全局内存地址派生得到的原始对象指针,识别和标记所述全局对象的指针。
3.根据权利要求1所述的方法,其特征在于,所述基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误之前,还包括:
为每个内存对象分配一个随机的标记,该标记用于对该内存对象的指针和内存空间进行标记。
4.根据权利要求1所述的方法,其特征在于,所述基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误,包括:
当指针访问内存时,通过安全机制内存标记MTE检查该指针的标记和待访问的目标内存对象的内存标记是否匹配;
若该指针的标记和待访问的目标内存对象的内存标记不匹配,则产生段错误信号,所述段错误信号用于表征检测到内存错误。
5.根据权利要求1所述的方法,其特征在于,还包括:
若所述内存对象为堆对象,则获取所述堆对象的分配函数和释放函数;
根据所述分配函数的参数确定所述堆对象的边界信息;
根据所述分配函数和释放函数的调用位置确定所述堆对象的生命周期;
若所述内存对象为所述栈对象或所述全局对象,则获取所述栈对象或所述全局对象指针的内存访问信息,所述内存访问信息中包括所述栈对象或所述全局对象指针访问的连续内存区域;
根据所述栈对象或所述全局对象指针访问的连续内存区域,确定所述栈对象或所述全局对象的边界信息;
若所述内存对象为所述栈对象,则获取所述栈对象的调用函数;
根据所述调用函数的函数调用与函数返回时间,确定所述栈对象的生命周期;
若所述内存对象为所述全局对象,则所述全局对象的生命周期为进程的运行时长;
将所述堆对象的边界信息、堆对象的生命周期、栈对象的生命周期、全局对象的生命周期作为确定性属性;
将所述栈对象和所述全局对象的边界信息作为非确定属性,其中,所述内存对象的边界信息和生命周期用于确定所述内存错误所属的类别。
6.根据权利要求1所述的方法,其特征在于,所述根据所述模糊测试的种子队列,对更新后的目标内存对象继续进行模糊测试,检测出所述二进制程序中存在的内存漏洞,包括:
根据所述模糊测试的种子队列,对更新后的目标内存对象继续进行测试;
若更新后的目标内存对象存在内存错误且所述内存错误为严重错误,则确定该目标内存对象存在内存漏洞。
7.一种二进制程序的内存漏洞检测装置,其特征在于,包括:
指针标记模块,用于标记二进制程序中指向内存对象的所有指针,所述内存对象包括堆对象、栈对象、全局对象中的至少一种;
内存错误确定模块,用于基于被标记的所有指针和待访问的目标内存对象的内存标记,检测是否存在内存错误;
错误分类模块,用于当检测到内存错误时,确定所述内存错误所属的类别,所述内存错误至少分为非严重错误和严重错误两种;
漏洞检测模块,用于在模糊测试过程中,根据所述内存错误所属的类别,检测所述二进制程序中存在的内存漏洞;
所述错误分类模块,具体用于:
确定该内存错误依赖于确定性属性的检查或该内存错误依赖于非确定性属性的检查;
若该内存错误依赖于确定性属性的检查,则确定该内存错误为严重错误;
若该内存错误依赖于非确定性属性的检查,则确定该内存错误为非严重错误;
若所述内存对象为栈对象且该栈对象的指针访问的内存地址为非本栈帧的内存地址或其它无效内存地址,则确定该内存错误为严重错误;
所述漏洞检测模块,具体用于:
若所述内存错误所属的类别为严重错误,则确定该目标内存对象存在内存漏洞;
若所述内存错误所属的类别为非严重错误,则获取进行模糊测试时触发所述非严重错误的测试用例,并将所述测试用例插入模糊测试的种子队列中;
更新所述目标内存对象的边界;
根据所述模糊测试的种子队列,对更新后的目标内存对象继续进行模糊测试,检测出所述二进制程序中存在的内存漏洞。
8.一种电子设备,其特征在于,包括:处理器,以及与所述处理器通信连接的存储器;
所述存储器存储计算机执行指令;
所述处理器执行所述存储器存储的计算机执行指令,以实现如权利要求1至6中任一项所述的二进制程序的内存漏洞检测方法。
9.一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如权利要求1至6中任一项所述的二进制程序的内存漏洞检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310763574.3A CN116502239B (zh) | 2023-06-27 | 2023-06-27 | 二进制程序的内存漏洞检测方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310763574.3A CN116502239B (zh) | 2023-06-27 | 2023-06-27 | 二进制程序的内存漏洞检测方法、装置、设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116502239A CN116502239A (zh) | 2023-07-28 |
CN116502239B true CN116502239B (zh) | 2023-09-19 |
Family
ID=87325184
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310763574.3A Active CN116502239B (zh) | 2023-06-27 | 2023-06-27 | 二进制程序的内存漏洞检测方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116502239B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113987507A (zh) * | 2021-10-22 | 2022-01-28 | 中国工商银行股份有限公司 | 堆内存漏洞检测方法、装置、存储介质及电子设备 |
CN115617687A (zh) * | 2022-10-31 | 2023-01-17 | 清华大学 | 程序插桩方法、装置、设备和存储介质 |
CN115758224A (zh) * | 2022-12-09 | 2023-03-07 | 北京天融信网络安全技术有限公司 | 一种挖掘闭源程序漏洞的方法及装置 |
CN116166535A (zh) * | 2022-12-23 | 2023-05-26 | 湖南大学 | 一种基于模糊测试自动化挖掘非易失内存堆漏洞的方法 |
CN116305162A (zh) * | 2023-03-31 | 2023-06-23 | 西安交通大学 | 一种基于模糊测试和静态分析的并发程序漏洞检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8245209B2 (en) * | 2007-05-29 | 2012-08-14 | International Business Machines Corporation | Detecting dangling pointers and memory leaks within software |
-
2023
- 2023-06-27 CN CN202310763574.3A patent/CN116502239B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113987507A (zh) * | 2021-10-22 | 2022-01-28 | 中国工商银行股份有限公司 | 堆内存漏洞检测方法、装置、存储介质及电子设备 |
CN115617687A (zh) * | 2022-10-31 | 2023-01-17 | 清华大学 | 程序插桩方法、装置、设备和存储介质 |
CN115758224A (zh) * | 2022-12-09 | 2023-03-07 | 北京天融信网络安全技术有限公司 | 一种挖掘闭源程序漏洞的方法及装置 |
CN116166535A (zh) * | 2022-12-23 | 2023-05-26 | 湖南大学 | 一种基于模糊测试自动化挖掘非易失内存堆漏洞的方法 |
CN116305162A (zh) * | 2023-03-31 | 2023-06-23 | 西安交通大学 | 一种基于模糊测试和静态分析的并发程序漏洞检测方法 |
Non-Patent Citations (1)
Title |
---|
面向二进制程序的空指针解引用错误的检测方法;傅玉;邓艺;孙晓山;程亮;张阳;冯登国;;计算机学报(第03期);第574-587页 * |
Also Published As
Publication number | Publication date |
---|---|
CN116502239A (zh) | 2023-07-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8533681B2 (en) | Atomicity violation detection using access interleaving invariants | |
US8352921B2 (en) | Static analysis defect detection in the presence of virtual function calls | |
US10241894B2 (en) | Data-scoped dynamic data race detection | |
CN114154190A (zh) | 管理敏感生产数据 | |
CN112733150B (zh) | 一种基于脆弱性分析的固件未知漏洞检测方法 | |
CN109271789B (zh) | 恶意进程检测方法、装置、电子设备及存储介质 | |
US20220335135A1 (en) | Vulnerability analysis and reporting for embedded systems | |
JP2021051745A (ja) | コンピュータ装置およびメモリ管理方法 | |
US11687646B2 (en) | Forensic data collection and analysis utilizing function call stacks | |
CN105683985B (zh) | 用于虚拟机内省的系统、方法及非暂时性计算机可读介质 | |
US20210004470A1 (en) | Automatic Generation Of Patches For Security Violations | |
US8302210B2 (en) | System and method for call path enforcement | |
US11868465B2 (en) | Binary image stack cookie protection | |
CN117555523A (zh) | 一种基于辅助程序执行反馈的控制流构建方法及系统 | |
CN111931191A (zh) | Linux平台二进制软件堆溢漏洞动态检测方法及系统 | |
CN116502239B (zh) | 二进制程序的内存漏洞检测方法、装置、设备及介质 | |
Zhou et al. | The final security problem in IOT: Don’t count on the canary! | |
Zhou et al. | Non-distinguishable inconsistencies as a deterministic oracle for detecting security bugs | |
CN109711167B (zh) | 一种基于多级指针的uaf漏洞防御方法 | |
Kim et al. | Source code analysis for static prediction of dynamic memory usage | |
Li et al. | Experience report: An application-specific checkpointing technique for minimizing checkpoint corruption | |
CN111625784B (zh) | 一种应用的反调试方法、相关装置及存储介质 | |
CN110908869A (zh) | 一种应用程序数据监控方法、装置、设备及储存介质 | |
US11989572B2 (en) | Computer system enabled with runtime software module tracking | |
CN115757160A (zh) | 一种测试集评估方法、电子设备和存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |