CN113987507A - 堆内存漏洞检测方法、装置、存储介质及电子设备 - Google Patents
堆内存漏洞检测方法、装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN113987507A CN113987507A CN202111236368.4A CN202111236368A CN113987507A CN 113987507 A CN113987507 A CN 113987507A CN 202111236368 A CN202111236368 A CN 202111236368A CN 113987507 A CN113987507 A CN 113987507A
- Authority
- CN
- China
- Prior art keywords
- function
- heap
- memory
- heap memory
- target
- 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
Links
Images
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
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请公开了一种堆内存漏洞检测方法、装置、存储介质及电子设备,涉及信息安全领域。该方法包括:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。通过本申请,解决了相关技术中对堆内存破坏漏洞的检测效率较低的问题。
Description
技术领域
本申请涉及堆内存漏洞检测领域,具体而言,涉及一种堆内存漏洞检测方法、装置、存储介质及电子设备。
背景技术
随着堆内存破坏漏洞频繁爆出,堆内存破坏漏洞的利用与防护开始成为信息安全领域内存安全方向的研究重点。常见的堆内存破坏漏洞包括堆缓冲区溢出漏洞、Doublefree双重释放漏洞、UAF释放后使用漏洞等。恶意用户可精心构造输入数据以绕过现有保护机制,并利用这些堆内存破坏漏洞对程序运行时分配的堆内存进行各种非法访问操作,通过直接或间接控制堆块自身的元数据、篡改堆块布局方式来实现程序运行时内存信息的泄露、程序控制流的劫持。
GNU libc是Linux操作系统的标准C语言库,被部署在所有的linux发行版本中,采用的堆管理机制源于ptmalloc。该机制通过系统调用函数brk()/mmap()在程序第一次向操作系统申请内存时分配大片内存进行管理。Ptmalloc有三种最基本的数据结构,其中malloc_chunk是内存分配的基本单位,也是glibc中真正存储堆数据信息的结构体。程序申请的堆内存(chunk)在ptmalloc内部就是用malloc_chunk结构体来进行表示。Chunk主要分为三种类型:Allocated Chunk(已分配的堆)、Free Chunk(被释放的堆)、Top Chunk(顶块)。
当前针对堆内存破坏漏洞的检测方法主要包括模糊测试技术、污点分析技术、编译插桩技术,存在以下问题:
(1)Fuzzing模糊测试技术是一种被广泛使用的漏洞挖掘方法,其核心思想是将自动或半自动化生成的随机测试用例作为程序运行时的输入,监控程序运行时是否存在崩溃等异常情况来发现源码或二进制软件中可能的程序错误,该方法生成的模糊测试数据存在冗余度高的问题。堆由用户动态申请和释放,是受程序运行时输入的影响、根据程序运行时需要进行动态申请和释放的大小可变的内存空间,因此程序的执行行为较难预测。另外,由于堆内存破坏漏洞的输入实例通常只破坏堆块元数据而不会直接控制指令指针寄存器的值并篡改程序执行流,因此不会直接造成程序崩溃,导致Fuzzing测试技术针对堆内存破坏漏洞的检测效率较低。
(2)基于污点分析的方法主要是分析程序中标记为污点的数据在执行过程中是否符合预设的策略,严重依赖于准确的语义指令集建模,难度较高,进一步导致对堆内存破坏漏洞的检测效率较低。
(3)现有检测技术大多需要修改源代码、目标二进制程序,需要重新编译和链接程序来实现检测过程,进一步导致对堆内存破坏漏洞的检测效率较低。
针对相关技术中对堆内存破坏漏洞的检测效率较低的问题,目前尚未提出有效的解决方案。
发明内容
本申请的主要目的在于提供一种堆内存漏洞检测方法、装置、存储介质及电子设备,以解决相关技术中对堆内存破坏漏洞的检测效率较低的问题。
为了实现上述目的,根据本申请的一个方面,提供了一种堆内存漏洞检测方法。该方法包括:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。
进一步地,目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
进一步地,在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之前,该方法还包括:若目标调用函数的类型为堆分配函数的类型时,通过程序的目标接口获取堆分配函数的函数参数;根据函数参数计算目标调用函数分配的堆内存空间。
进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆分配函数的类型时,根据程序的目标接口获取堆分配函数的执行结果,其中,执行结果包括堆块元数据的内容;通过执行结果判断目标调用函数的堆内存空间是否分配成功,若目标调用函数的堆内存空间分配成功,对堆内存空间的申请次数进行判断;若堆内存空间的申请次数为第一预设值,通过堆分配函数的函数参数以及堆分配函数的程序执行结果确定堆内存的使用日志;若堆内存空间的申请次数大于第一预设值,判断堆内存空间地址是否为空闲堆内存地址,若堆内存空间地址为空闲堆内存地址,判断堆分配函数是否为目标函数,若堆分配函数为目标函数,则对堆内存的使用日志进行更新。
进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆释放函数的类型时,通过程序的目标接口获取堆释放函数的函数参数;根据堆释放函数的函数参数获取待释放的堆内存地址,判断待释放的堆内存地址是否与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;若待释放的堆内存地址与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将待释放的堆内存地址进行释放,并对堆内存的使用日志进行更新。
进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆内存读取函数的类型时,通过程序的目标接口获取堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果;根据堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果确定堆内存读取函数的目标信息,其中,目标信息至少包括:读内存的地址与读取内容的长度;通过目标信息判断目标二进制程序是否存在读堆内存数据的情况,在目标信息存在读堆内存数据的情况下,根据堆分配函数的内存使用日志中的堆内存分配状态,判断读内存的地址是否为释放的堆内存地址;若读内存的地址为释放的堆内存地址,触发异常报警并终止目标二进制程序进程。
进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆内存写入函数的类型时,通过程序的目标接口获取堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果;根据堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果确定堆内存写入函数的目标信息,其中,目标信息至少包括:写内存的地址与写入内容的长度;根据写内存的地址判断堆内存写入函数是否为堆内存初始化函数,若堆内存写入函数为堆内存初始化函数,对堆内存的使用日志进行更新,若堆内存写入函数不为堆内存初始化函数,根据写内存的地址以及堆内存的使用日志判断目标二进制程序是否存在堆内存写入情况;在目标二进制程序存在读堆内存数据的情况下,判断写内存的地址是否为释放状态或者判断写内存的地址的堆内存是否未被分配;若写内存的地址为释放状态或者写内存的地址的堆内存未被分配,触发异常报警并终止目标二进制程序进程。
进一步地,在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之后,该方法还包括:对堆内存的使用日志中的堆内存分配状态记录进行遍历,得到遍历结果;基于遍历结果对目标二进制程序进行监测。
为了实现上述目的,根据本申请的另一方面,提供了一种堆内存漏洞检测装置。该装置包括:第一获取单元,用于通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;第一匹配单元,用于将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;第一确定单元,用于若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;第一执行单元,用于根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。
进一步地,目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
进一步地,该装置还包括:第二获取单元,用于在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之前,若目标调用函数的类型为堆分配函数的类型时,通过程序的目标接口获取堆分配函数的函数参数;第一计算单元,用于根据函数参数计算目标调用函数分配的堆内存空间。
进一步地,第一执行单元包括:第一获取模块,用于若目标调用函数的类型为堆分配函数的类型时,根据程序的目标接口获取堆分配函数的执行结果,其中,执行结果包括堆块元数据的内容;第一判断模块,用于通过执行结果判断目标调用函数的堆内存空间是否分配成功,若目标调用函数的堆内存空间分配成功,对堆内存空间的申请次数进行判断;第一确定模块,用于若堆内存空间的申请次数为第一预设值,通过堆分配函数的函数参数以及堆分配函数的程序执行结果确定堆内存的使用日志;第一更新模块,用于若堆内存空间的申请次数大于第一预设值,判断堆内存空间地址是否为空闲堆内存地址,若堆内存空间地址为空闲堆内存地址,判断堆分配函数是否为目标函数,若堆分配函数为目标函数,则对堆内存的使用日志进行更新。
进一步地,第一执行单元包括:第二获取模块,用于若目标调用函数的类型为堆释放函数的类型时,通过程序的目标接口获取堆释放函数的函数参数;第二判断模块,用于根据堆释放函数的函数参数获取待释放的堆内存地址,判断待释放的堆内存地址是否与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;第二更新模块,用于若待释放的堆内存地址与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将待释放的堆内存地址进行释放,并对堆内存的使用日志进行更新。
进一步地,第一执行单元包括:第三获取模块,用于若目标调用函数的类型为堆内存读取函数的类型时,通过程序的目标接口获取堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果;第二确定模块,用于根据堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果确定堆内存读取函数的目标信息,其中,目标信息至少包括:读内存的地址与读取内容的长度;第三判断模块,用于通过目标信息判断目标二进制程序是否存在读堆内存数据的情况,在目标信息存在读堆内存数据的情况下,根据堆分配函数的内存使用日志中的堆内存分配状态,判断读内存的地址是否为释放的堆内存地址;第一触发模块,用于若读内存的地址为释放的堆内存地址,触发异常报警并终止目标二进制程序进程。
进一步地,第一执行单元包括:第四获取模块,用于若目标调用函数的类型为堆内存写入函数的类型时,通过程序的目标接口获取堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果;第三确定模块,用于根据堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果确定堆内存写入函数的目标信息,其中,目标信息至少包括:写内存的地址与写入内容的长度;第四判断模块,用于根据写内存的地址判断堆内存写入函数是否为堆内存初始化函数,若堆内存写入函数为堆内存初始化函数,对堆内存的使用日志进行更新,若堆内存写入函数不为堆内存初始化函数,根据写内存的地址以及堆内存的使用日志判断目标二进制程序是否存在堆内存写入情况;第五判断模块,用于在目标二进制程序存在读堆内存数据的情况下,判断写内存的地址是否为释放状态或者判断写内存的地址的堆内存是否未被分配;第二触发模块,用于若写内存的地址为释放状态或者写内存的地址的堆内存未被分配,触发异常报警并终止目标二进制程序进程。
进一步地,该装置还包括:第一遍历单元,用于在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之后,对堆内存的使用日志中的堆内存分配状态记录进行遍历,得到遍历结果;第一监测单元,用于基于遍历结果对目标二进制程序进行监测。
根据本申请实施例的另一方面,还提供了一种电子设备,包括一个或多个处理器和存储器,存储器用于存储一个或多个程序,其中,当一个或多个程序被一个或多个处理器执行时,使得一个或多个处理器实现上述任意一项的方法。
根据本申请实施例的另一方面,还提供了一种计算机可读存储介质,其上存储有计算机程序/指令,该计算机程序/指令被处理器执行时执行上述任意一项的方法。
通过本申请,采用以下步骤:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。解决了相关技术中对堆内存破坏漏洞的检测效率较低的问题。通过二进制插桩模块获取目标二进制程序中的目标调用函数,将目标调用函数的函数名与风险函数模型进行匹配,基于匹配结果确定目标调用函数的类型,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略,进而达到了提高对堆内存破坏漏洞的检测效率的效果。
附图说明
构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据本申请实施例提供的堆内存漏洞检测方法的流程图;
图2是根据本申请实施例提供的堆内存漏洞检测方法的堆分配操作检测流程图;
图3是根据本申请实施例提供的堆内存漏洞检测方法的堆释放操作检测流程图;
图4是根据本申请实施例提供的堆内存漏洞检测方法的内存读取操作检测流程图;
图5是根据本申请实施例提供的堆内存漏洞检测方法的内存写入操作检测流程图;
图6是根据本申请实施例提供的堆内存漏洞检测方法的系统架构示意图;
图7是根据本申请实施例提供的堆内存漏洞检测装置的示意图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
为了便于描述,以下对本申请实施例涉及的部分名词或术语进行说明:
Glibc:glibc是GNU发布的libc库,即c运行库,glibc是linux系统中最底层的api,几乎其他任何运行库都会依赖于glibc。
根据本申请的实施例,提供了一种堆内存漏洞检测方法。
图1是根据本申请实施例的堆内存漏洞检测方法的流程图。如图1所示,该方法包括以下步骤:
步骤S101,通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名。
例如,利用动态二进制插桩模块加载目标二进制程序,在程序运行时进行函数级的二进制插桩,在自定义的插桩模块中,获取当前调用函数所属的链接库、函数名字与对应的函数偏移。
步骤S102,将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型。
具体的,将获取的函数名与危险函数模型(对应于本申请中的风险函数模型)进行匹配,根据匹配结果判断目标二进制程序调用的函数是否是危险的内存操作函数以及函数类型。
步骤S103,若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型。
具体的,若目标二进制程序调用的函数是危险的内存操作函数以及函数类型,则与危险函数模型匹配成功,确定目标调用函数的类型,并进行程序插桩,根据函数类型设置回调函数与插桩后执行的分析函数。
具体的,在本申请实施例提供的堆内存漏洞检测方法中,目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
步骤S104,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。
例如,本申请使用Func=[F1,F2,F3,...,Fn],F(fname,ftype,fpara,foffset,flibc)来描述危险函数模型,Fi表示函数,由fname、ftype、fpara、foffset、flibc五个参数共同描述函数特征。其中:fname表示函数名字;ftype=[alloca,free,read,write]表示函数类型,alloca表示为堆分配函数类型(包括malloc()/calloc()/realloc()函数)、free表示堆释放函数类型、read表示内存读取操作函数类型、write表示内存写操作函数类型;fpara=[p1,p2,p3,...,pn]表示函数参数集合;flibc表示函数所属的链接库;foffset表示函数偏移,本申请创建的危险函数模型维护方便,对使用glibc的软件具有通用性。。
可选地,在本申请实施例提供的堆内存漏洞检测方法中,在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之前,该方法还包括:若目标调用函数的类型为堆分配函数的类型时,通过程序的目标接口获取堆分配函数的函数参数;根据函数参数计算目标调用函数分配的堆内存空间。
具体的,目标调用函数的函数名与危险函数模型进行匹配。得到目标调用函数的类型为堆分配函数的类型时,在目标二进制程序对目标调用函数进行调用之前,向程序中插入分析例程(对应于本申请中的目标接口)用以获取函数参数,根据函数参数(申请分配的堆内存)计算实际分配的堆内存大小。
可选地,在本申请实施例提供的堆内存漏洞检测方法中,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆分配函数的类型时,根据程序的目标接口获取堆分配函数的执行结果,其中,执行结果包括堆块元数据的内容;通过执行结果判断目标调用函数的堆内存空间是否分配成功,若目标调用函数的堆内存空间分配成功,对堆内存空间的申请次数进行判断;若堆内存空间的申请次数为第一预设值,通过堆分配函数的函数参数以及堆分配函数的程序执行结果确定堆内存的使用日志;若堆内存空间的申请次数大于第一预设值,判断堆内存空间地址是否为空闲堆内存地址,若堆内存空间地址为空闲堆内存地址,判断堆分配函数是否为目标函数,若堆分配函数为目标函数,则对堆内存的使用日志进行更新。
具体的,图2是根据本申请实施例提供的堆内存漏洞检测方法的堆分配操作检测流程图,如图2所示,在堆分配函数调用之前插入分析例程获取函数参数,根据函数参数(申请分配的堆内存)计算实际分配的堆内存大小,在堆分配函数调用之后插入分析例程获取返回值,并根据返回值获取堆块元数据的内容(例如,prev_size与size字段的值)。根据解析的函数返回值判断堆内存是否分配成功,若分配失败触发异常报警,终止程序执行;若堆内存分配成功,判断是否是第一次(对应于本申请中的第一预设值)申请堆内存,若第一次申请堆内存则依据调用函数的参数、返回值建立内存使用日志;内存使用日志记录程序运行时堆块的状态,运行时堆块由堆内存的开始地址、实际分配的堆内存大小,堆内存分配状态(已分配/已释放),堆内存初始化状态(已初始化/未初始化/未分配),上一个堆块的内存分配状态(分配/未分配)进行描述。其中上一个堆块的内存分配状态由当前分配堆块chunk结构中size字段的最低一位表示;若非第一次申请堆内存,依据内存使用日志判断分配的堆内存空间是否是空闲的以及未分配堆内存空间,若不是空闲的以及未分配堆内存空间,触发异常报警终止程序执行。若是空闲堆内存空间,则更新内存使用日志;并判断堆分配函数是否为calloc()函数(对应于本申请中的目标函数),若当前堆分配函数为calloc()函数,则会在动态分配完内存后自动初始化堆内存空间为零,此时更新内存使用日志相应记录的初始化状态为已初始化,本申请在软件运行过程中动态插桩堆内存分配,达到了不依赖于复杂的语义指令集建模就能够有效检测堆块元数据破坏、未初始化堆内存访问、内存泄漏等各种堆内存非法操作行为的效果,可以有效保护软件的安全,避免信息泄露和程序控制流的执行,进一步提高了堆内存漏洞检测效率。
可选地,在本申请实施例提供的堆内存漏洞检测方法中,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆释放函数的类型时,通过程序的目标接口获取堆释放函数的函数参数;根据堆释放函数的函数参数获取待释放的堆内存地址,判断待释放的堆内存地址是否与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;若待释放的堆内存地址与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将待释放的堆内存地址进行释放,并对堆内存的使用日志进行更新。
具体的,图3是根据本申请实施例提供的堆内存漏洞检测方法的堆释放操作检测流程图,如图3所示,在堆释放函数调用之前插入分析例程(对应于本申请中程序的目标接口,下同),获取堆释放free()函数的参数得到要释放的堆内存地址。判断要释放的堆内存地址是否为已分配堆块的首地址,也即判断释放的堆内存地址是否与内存使用日志中已分配的堆块首地址存在匹配的记录。若存在匹配记录,释放堆块,更新内存使用日志,并修改内存使用日志相应记录的初始化状态为未初始化;若不存在匹配记录,说明重复释放了堆内存空间或释放了错误的内存地址,触发异常报警操作并终止程序执行,本申请在软件运行过程中动态插桩堆内存释放,达到了不依赖于复杂的语义指令集建模就能够有效检测堆块元数据破坏、未初始化堆内存访问、内存泄漏等各种堆内存非法操作行为的效果,可以有效保护软件的安全,避免信息泄露和程序控制流的执行,进一步提高了堆内存漏洞检测效率。
可选地,在本申请实施例提供的堆内存漏洞检测方法中,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆内存读取函数的类型时,通过程序的目标接口获取堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果;根据堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果确定堆内存读取函数的目标信息,其中,目标信息至少包括:读内存的地址与读取内容的长度;通过目标信息判断目标二进制程序是否存在读堆内存数据的情况,在目标信息存在读堆内存数据的情况下,根据堆分配函数的内存使用日志中的堆内存分配状态,判断读内存的地址是否为释放的堆内存地址;若读内存的地址为释放的堆内存地址,触发异常报警并终止目标二进制程序进程。
具体的,图4是根据本申请实施例提供的堆内存漏洞检测方法的内存读取操作检测流程图,如图4所示,在内存读取操作函数调用之前插入分析例程,获取程序调用函数的参数,在内存读取操作函数调用之后插入分析例程,获取函数返回值(对应于本申请中的程序执行结果),依据危险函数模型,分析得到读内存的地址与读取内容的长度;判断是否存在堆内存读取情况,即根据内存使用日志中的堆内存开始地址与长度判断读内存的地址是否为堆内存地址,若存在,根据内存使用日志中的堆内存分配状态,判断读内存地址是否为已释放的堆内存地址,若是,存在内存释放后使用的情况,触发异常报警并终止程序执行;若不是,说明存在已分配堆内存读取情况,根据内存使用日志的初始化状态,判断是否存在未初始化的堆内存读取行为。若存在,说明检测到未初始化堆内存访问的异常操作行为,触发异常报警并终止程序执行,本申请在软件运行过程中动态插桩堆内存读取,达到了不依赖于复杂的语义指令集建模就能够有效检测堆块元数据破坏、未初始化堆内存访问、内存泄漏等各种堆内存非法操作行为的效果,可以有效保护软件的安全,避免信息泄露和程序控制流的执行,进一步提高了堆内存漏洞检测效率。
可选地,在本申请实施例提供的堆内存漏洞检测方法中,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆内存写入函数的类型时,通过程序的目标接口获取堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果;根据堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果确定堆内存写入函数的目标信息,其中,目标信息至少包括:写内存的地址与写入内容的长度;根据写内存的地址判断堆内存写入函数是否为堆内存初始化函数,若堆内存写入函数为堆内存初始化函数,对堆内存的使用日志进行更新,若堆内存写入函数不为堆内存初始化函数,根据写内存的地址以及堆内存的使用日志判断目标二进制程序是否存在堆内存写入情况在目标二进制程序存在读堆内存数据的情况下,判断写内存的地址是否为释放状态或者判断写内存的地址的堆内存是否未被分配;若写内存的地址为释放状态或者写内存的地址的堆内存未被分配,触发异常报警并终止目标二进制程序进程。
具体的,图5是根据本申请实施例提供的堆内存漏洞检测方法的内存写入操作检测流程图,如图5所示,在内存写操作函数调用之前、之后分别插入分析例程,获取程序调用函数的参数,获取函数返回值,同时依据危险函数模型,分析得到写内存的地址与成功写入数据的长度;判断是否为memset等内存初始化函数,若为内存初始化函数且初始化堆内存操作执行成功,更新内存使用日志相应堆内存的初始化状态为已初始化;若不是内存初始化函数,依据写内存的地址于内存使用日志判断是否存在堆内存写入情况。若存在,根据写内存的地址与内存使用日志的堆内存分配状态,判断写内存地址是否为已释放或未分配的堆内存;若是,说明存在已释放堆块或未分配堆块的内存写入操作行为,触发异常报警并终止程序执行;若不是,存在已分配堆块内存写入操作,判断是否存在堆块元数据篡改行为,具体检测步骤为:若存在已分配堆块内存写入操作,根据内存使用日志、写内存地址获取该堆块的相应记录,包括该堆内存的开始地址,实际分配的堆内存大小;根据实际分配的堆内存大小计算堆块实际数据区域大小,判断实际写入的数据长度是否大于堆块实际数据区域大小;若大于,说明内存写操作覆盖了物理相邻的下一个堆块元数据;若写入的数据覆盖到物理相邻的下一个堆块元数据,且实际写入的长度比堆内存实际数据区域大小多八个字节以内(例如,以64位系统为例),说明写入的数据覆盖到下一个堆块的prev_size字段,继续运行程序;若实际写入的数据长度比堆内存数据区域大小多八个字节以上,说明写入的数据覆盖到下一个堆块的size字段,堆块元数据被破坏,触发异常报警并终止程序执行,本申请在软件运行过程中动态插桩堆内存写入,达到了不依赖于复杂的语义指令集建模就能够有效检测堆块元数据破坏、未初始化堆内存访问、内存泄漏等各种堆内存非法操作行为的效果,可以有效保护软件的安全,避免信息泄露和程序控制流的执行,进一步提高了堆内存漏洞检测效率。
可选地,在本申请实施例提供的堆内存漏洞检测方法中,在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之后,该方法还包括:对堆内存的使用日志中的堆内存分配状态记录进行遍历,得到遍历结果;基于遍历结果对目标二进制程序进行监测。
具体的,在程序正常退出前,遍历内存使用日志的堆内存分配状态记录,检测是否仍存在已分配状态的堆内存未释放,若存在,说明程序存在内存泄漏,触发异常报警,结束目标二进制程序的执行进程,本申请通过二进制动态插桩技术实时监控程序运行时调用的函数,以检测堆块元数据破坏、未初始化堆内存访问、内存泄漏等堆内存漏洞利用的方法,达到了无需静态分析程序、不依赖于源代码、无需重新编译和链接程序、对二进制程序没有任何侵入,提高了堆内存漏洞检测效率的效果。
图6是根据本申请实施例提供的堆内存漏洞检测方法的系统架构示意图,如图6所示,主要包括危险函数模型、函数插桩模块、堆内存漏洞利用攻击检测模块、内存使用日志、进程报警模块、响应模块。危险函数模型主要用于帮助检测模块判断程序运行时调用的函数所属的内存操作类型、分析调用函数的参数。函数插桩模块主要对加载的目标二进制程序执行函数级别插桩,结合危险函数模型决定要插桩的地点与要执行的分析策略;堆内存漏洞利用攻击检测模块主要依据检测策略和维护的内存使用日志检测非法堆内存访问操作,检测模块又包括堆分配检测策略、堆释放检测策略、堆内存读取检测策略、堆内存写入检测策略;响应模块用于在进程触发异常报警后执行进程终止、混淆堆内存数据等操作。
综上,本申请实施例提供的堆内存漏洞检测方法,通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略,解决了相关技术中对堆内存破坏漏洞的检测效率较低的问题。通过二进制插桩模块获取目标二进制程序中的目标调用函数,将目标调用函数的函数名与风险函数模型进行匹配,基于匹配结果确定目标调用函数的类型,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略,进而达到了提高对堆内存破坏漏洞的检测效率的效果。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本申请实施例还提供了一种堆内存漏洞检测装置,需要说明的是,本申请实施例的堆内存漏洞检测装置可以用于执行本申请实施例所提供的用于堆内存漏洞检测方法。以下对本申请实施例提供的堆内存漏洞检测装置进行介绍。
图7是根据本申请实施例的堆内存漏洞检测装置的示意图。如图7所示,该装置包括:第一获取单元701、第一匹配单元702、第一确定单元703、第一执行单元704。
具体的,第一获取单元701,用于通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;
第一匹配单元702,用于将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;
第一确定单元703,用于若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;
第一执行单元704,用于根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。
综上,本申请实施例提供的堆内存漏洞检测装置,通过第一获取单元701通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;第一匹配单元702将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;第一确定单元703若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;第一执行单元704根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略,解决了相关技术中对堆内存破坏漏洞的检测效率较低的问题。通过二进制插桩模块获取目标二进制程序中的目标调用函数,将目标调用函数的函数名与风险函数模型进行匹配,基于匹配结果确定目标调用函数的类型,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略,进而达到了提高对堆内存破坏漏洞的检测效率的效果。
可选地,在本申请实施例提供的堆内存漏洞检测装置中,目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
可选地,在本申请实施例提供的堆内存漏洞检测装置中,该装置还包括:第二获取单元,用于在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之前,若目标调用函数的类型为堆分配函数的类型时,通过程序的目标接口获取堆分配函数的函数参数;第一计算单元,用于根据函数参数计算目标调用函数分配的堆内存空间。
可选地,在本申请实施例提供的堆内存漏洞检测装置中,第一执行单元包括:第一获取模块,用于若目标调用函数的类型为堆分配函数的类型时,根据程序的目标接口获取堆分配函数的执行结果,其中,执行结果包括堆块元数据的内容;第一判断模块,用于通过执行结果判断目标调用函数的堆内存空间是否分配成功,若目标调用函数的堆内存空间分配成功,对堆内存空间的申请次数进行判断;第一确定模块,用于若堆内存空间的申请次数为第一预设值,通过堆分配函数的函数参数以及堆分配函数的程序执行结果确定堆内存的使用日志;第一更新模块,用于若堆内存空间的申请次数大于第一预设值,判断堆内存空间地址是否为空闲堆内存地址,若堆内存空间地址为空闲堆内存地址,判断堆分配函数是否为目标函数,若堆分配函数为目标函数,则对堆内存的使用日志进行更新。
可选地,在本申请实施例提供的堆内存漏洞检测装置中,第一执行单元704包括:第二获取模块,用于若目标调用函数的类型为堆释放函数的类型时,通过程序的目标接口获取堆释放函数的函数参数;第二判断模块,用于根据堆释放函数的函数参数获取待释放的堆内存地址,判断待释放的堆内存地址是否与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;第二更新模块,用于若待释放的堆内存地址与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将待释放的堆内存地址进行释放,并对堆内存的使用日志进行更新。
可选地,在本申请实施例提供的堆内存漏洞检测装置中,第一执行单元704包括:第三获取模块,用于若目标调用函数的类型为堆内存读取函数的类型时,通过程序的目标接口获取堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果;第二确定模块,用于根据堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果确定堆内存读取函数的目标信息,其中,目标信息至少包括:读内存的地址与读取内容的长度;第三判断模块,用于通过目标信息判断目标二进制程序是否存在读堆内存数据的情况,在目标信息存在读堆内存数据的情况下,根据堆分配函数的内存使用日志中的堆内存分配状态,判断读内存的地址是否为释放的堆内存地址;第一触发模块,用于若读内存的地址为释放的堆内存地址,触发异常报警并终止目标二进制程序进程。
可选地,在本申请实施例提供的堆内存漏洞检测装置中,第一执行单元704包括:第四获取模块,用于若目标调用函数的类型为堆内存写入函数的类型时,通过程序的目标接口获取堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果;第三确定模块,用于根据堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果确定堆内存写入函数的目标信息,其中,目标信息至少包括:写内存的地址与写入内容的长度;第四判断模块,用于根据写内存的地址判断堆内存写入函数是否为堆内存初始化函数,若堆内存写入函数为堆内存初始化函数,对堆内存的使用日志进行更新,若堆内存写入函数不为堆内存初始化函数,根据写内存的地址以及堆内存的使用日志判断目标二进制程序是否存在堆内存写入情况;第五判断模块,用于在目标二进制程序存在读堆内存数据的情况下,判断写内存的地址是否为释放状态或者判断写内存的地址的堆内存是否未被分配;第二触发模块,用于若写内存的地址为释放状态或者写内存的地址的堆内存未被分配,触发异常报警并终止目标二进制程序进程。
可选地,在本申请实施例提供的堆内存漏洞检测装置中,该装置还包括:第一遍历单元,用于在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之后,对堆内存的使用日志中的堆内存分配状态记录进行遍历,得到遍历结果;第一监测单元,用于基于遍历结果对目标二进制程序进行监测。
堆内存漏洞检测装置包括处理器和存储器,上述的第一获取单元701、第一匹配单元702、第一确定单元703、第一执行单元704等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来进行堆内存漏洞检测。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。
本发明实施例提供了一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时实现堆内存漏洞检测方法。
本发明实施例提供了一种处理器,处理器用于运行程序,其中,程序运行时执行堆内存漏洞检测方法。
本发明实施例提供了一种电子设备,设备包括处理器、存储器及存储在存储器上并可在处理器上运行的程序,处理器执行程序时实现以下步骤:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。
处理器执行程序时还实现以下步骤:目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
处理器执行程序时还实现以下步骤:在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之前,若目标调用函数的类型为堆分配函数的类型时,通过程序的目标接口获取堆分配函数的函数参数;根据函数参数计算目标调用函数分配的堆内存空间。
处理器执行程序时还实现以下步骤:若目标调用函数的类型为堆分配函数的类型时,根据程序的目标接口获取堆分配函数的执行结果,其中,执行结果包括堆块元数据的内容;通过执行结果判断目标调用函数的堆内存空间是否分配成功,若目标调用函数的堆内存空间分配成功,对堆内存空间的申请次数进行判断;若堆内存空间的申请次数为第一预设值,通过堆分配函数的函数参数以及堆分配函数的程序执行结果确定堆内存的使用日志;若堆内存空间的申请次数大于第一预设值,判断堆内存空间地址是否为空闲堆内存地址,若堆内存空间地址为空闲堆内存地址,判断堆分配函数是否为目标函数,若堆分配函数为目标函数,则对堆内存的使用日志进行更新。
处理器执行程序时还实现以下步骤:若目标调用函数的类型为堆释放函数的类型时,通过程序的目标接口获取堆释放函数的函数参数;根据堆释放函数的函数参数获取待释放的堆内存地址,判断待释放的堆内存地址是否与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;若待释放的堆内存地址与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将待释放的堆内存地址进行释放,并对堆内存的使用日志进行更新。
处理器执行程序时还实现以下步骤:若目标调用函数的类型为堆内存读取函数的类型时,通过程序的目标接口获取堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果;根据堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果确定堆内存读取函数的目标信息,其中,目标信息至少包括:读内存的地址与读取内容的长度;通过目标信息判断目标二进制程序是否存在读堆内存数据的情况,在目标信息存在读堆内存数据的情况下,根据堆分配函数的内存使用日志中的堆内存分配状态,判断读内存的地址是否为释放的堆内存地址;若读内存的地址为释放的堆内存地址,触发异常报警并终止目标二进制程序进程。
处理器执行程序时还实现以下步骤:若目标调用函数的类型为堆内存写入函数的类型时,通过程序的目标接口获取堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果;根据堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果确定堆内存写入函数的目标信息,其中,目标信息至少包括:写内存的地址与写入内容的长度;根据写内存的地址判断堆内存写入函数是否为堆内存初始化函数,若堆内存写入函数为堆内存初始化函数,对堆内存的使用日志进行更新,若堆内存写入函数不为堆内存初始化函数,根据写内存的地址以及堆内存的使用日志判断目标二进制程序是否存在堆内存写入情况;在目标二进制程序存在读堆内存数据的情况下,判断写内存的地址是否为释放状态或者判断写内存的地址的堆内存是否未被分配;若写内存的地址为释放状态或者写内存的地址的堆内存未被分配,触发异常报警并终止目标二进制程序进程。
处理器执行程序时还实现以下步骤:在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之后,对堆内存的使用日志中的堆内存分配状态记录进行遍历,得到遍历结果;基于遍历结果对目标二进制程序进行监测。
本文中的设备可以是服务器、PC、PAD、手机等。
本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。
当在数据处理设备上执行时,还适于执行初始化有如下方法步骤的程序:目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
当在数据处理设备上执行时,还适于执行初始化有如下方法步骤的程序:在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之前,若目标调用函数的类型为堆分配函数的类型时,通过程序的目标接口获取堆分配函数的函数参数;根据函数参数计算目标调用函数分配的堆内存空间。
当在数据处理设备上执行时,还适于执行初始化有如下方法步骤的程序:若目标调用函数的类型为堆分配函数的类型时,根据程序的目标接口获取堆分配函数的执行结果,其中,执行结果包括堆块元数据的内容;通过执行结果判断目标调用函数的堆内存空间是否分配成功,若目标调用函数的堆内存空间分配成功,对堆内存空间的申请次数进行判断;若堆内存空间的申请次数为第一预设值,通过堆分配函数的函数参数以及堆分配函数的程序执行结果确定堆内存的使用日志;若堆内存空间的申请次数大于第一预设值,判断堆内存空间地址是否为空闲堆内存地址,若堆内存空间地址为空闲堆内存地址,判断堆分配函数是否为目标函数,若堆分配函数为目标函数,则对堆内存的使用日志进行更新。
当在数据处理设备上执行时,还适于执行初始化有如下方法步骤的程序:若目标调用函数的类型为堆释放函数的类型时,通过程序的目标接口获取堆释放函数的函数参数;根据堆释放函数的函数参数获取待释放的堆内存地址,判断待释放的堆内存地址是否与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;若待释放的堆内存地址与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将待释放的堆内存地址进行释放,并对堆内存的使用日志进行更新。
当在数据处理设备上执行时,还适于执行初始化有如下方法步骤的程序:若目标调用函数的类型为堆内存读取函数的类型时,通过程序的目标接口获取堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果;根据堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果确定堆内存读取函数的目标信息,其中,目标信息至少包括:读内存的地址与读取内容的长度;通过目标信息判断目标二进制程序是否存在读堆内存数据的情况,在目标信息存在读堆内存数据的情况下,根据堆分配函数的内存使用日志中的堆内存分配状态,判断读内存的地址是否为释放的堆内存地址;若读内存的地址为释放的堆内存地址,触发异常报警并终止目标二进制程序进程。
当在数据处理设备上执行时,还适于执行初始化有如下方法步骤的程序:若目标调用函数的类型为堆内存写入函数的类型时,通过程序的目标接口获取堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果;根据堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果确定堆内存写入函数的目标信息,其中,目标信息至少包括:写内存的地址与写入内容的长度;根据写内存的地址判断堆内存写入函数是否为堆内存初始化函数,若堆内存写入函数为堆内存初始化函数,对堆内存的使用日志进行更新,若堆内存写入函数不为堆内存初始化函数,根据写内存的地址以及堆内存的使用日志判断目标二进制程序是否存在堆内存写入情况;在目标二进制程序存在读堆内存数据的情况下,判断写内存的地址是否为释放状态或者判断写内存的地址的堆内存是否未被分配;若写内存的地址为释放状态或者写内存的地址的堆内存未被分配,触发异常报警并终止目标二进制程序进程。
当在数据处理设备上执行时,还适于执行初始化有如下方法步骤的程序:在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之后,对堆内存的使用日志中的堆内存分配状态记录进行遍历,得到遍历结果;基于遍历结果对目标二进制程序进行监测。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。存储器是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (11)
1.一种堆内存漏洞检测方法,其特征在于,包括:
通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,所述目标调用函数至少包括所述目标调用函数的函数名;
将所述目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,所述风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;
若所述匹配结果表示所述目标调用函数属于风险的内存操作函数时,确定所述目标调用函数的类型;
根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略。
2.根据权利要求1所述的方法,其特征在于,所述目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
3.根据权利要求2所述的方法,其特征在于,在根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略之前,所述方法还包括:
若所述目标调用函数的类型为所述堆分配函数的类型时,通过程序的目标接口获取所述堆分配函数的函数参数;
根据所述函数参数计算所述目标调用函数分配的堆内存空间。
4.根据权利要求3所述的方法,其特征在于,根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略包括:
若所述目标调用函数的类型为所述堆分配函数的类型时,根据所述程序的目标接口获取所述堆分配函数的执行结果,其中,所述执行结果包括堆块元数据的内容;
通过所述执行结果判断所述目标调用函数的堆内存空间是否分配成功,若所述目标调用函数的堆内存空间分配成功,对所述堆内存空间的申请次数进行判断;
若所述堆内存空间的申请次数为第一预设值,通过所述堆分配函数的函数参数以及所述堆分配函数的程序执行结果确定堆内存的使用日志;
若所述堆内存空间的申请次数大于第一预设值,判断所述堆内存空间地址是否为空闲堆内存地址,若所述堆内存空间地址为空闲堆内存地址,判断所述堆分配函数是否为目标函数,若所述堆分配函数为所述目标函数,则对所述堆内存的使用日志进行更新。
5.根据权利要求4所述的方法,其特征在于,根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略包括:
若所述目标调用函数的类型为所述堆释放函数的类型时,通过所述程序的目标接口获取所述堆释放函数的函数参数;
根据所述堆释放函数的函数参数获取待释放的堆内存地址,判断所述待释放的堆内存地址是否与所述堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;
若所述待释放的堆内存地址与所述堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将所述待释放的堆内存地址进行释放,并对所述堆内存的使用日志进行更新。
6.根据权利要求4所述的方法,其特征在于,根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略包括:
若所述目标调用函数的类型为所述堆内存读取函数的类型时,通过所述程序的目标接口获取所述堆内存读取函数的函数参数以及所述堆内存读取函数的程序执行结果;
根据所述堆内存读取函数的函数参数以及所述堆内存读取函数的程序执行结果确定所述堆内存读取函数的目标信息,其中,所述目标信息至少包括:读内存的地址与读取内容的长度;
通过所述目标信息判断所述目标二进制程序是否存在读堆内存数据的情况,在所述目标信息存在读堆内存数据的情况下,根据所述堆分配函数的内存使用日志中的堆内存分配状态,判断所述读内存的地址是否为释放的堆内存地址;
若所述读内存的地址为释放的堆内存地址,触发异常报警并终止所述目标二进制程序进程。
7.根据权利要求6所述的方法,其特征在于,根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略包括:
若所述目标调用函数的类型为所述堆内存写入函数的类型时,通过所述程序的目标接口获取所述堆内存写入函数的函数参数以及所述堆内存写入函数的程序执行结果;
根据所述堆内存写入函数的函数参数以及所述堆内存写入函数的程序执行结果确定所述堆内存写入函数的目标信息,其中,所述目标信息至少包括:写内存的地址与写入内容的长度;
根据所述写内存的地址判断所述堆内存写入函数是否为堆内存初始化函数,若所述堆内存写入函数为堆内存初始化函数,对所述堆内存的使用日志进行更新,若所述堆内存写入函数不为堆内存初始化函数,根据所述写内存的地址以及所述堆内存的使用日志判断所述目标二进制程序是否存在堆内存写入情况;
在所述目标二进制程序存在读堆内存数据的情况下,判断所述写内存的地址是否为释放状态或者判断所述写内存的地址的堆内存是否未被分配;
若所述写内存的地址为释放状态或者所述写内存的地址的堆内存未被分配,触发异常报警并终止所述目标二进制程序进程。
8.根据权利要求4所述的方法,其特征在于,在根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略之后,所述方法还包括:
对所述堆内存的使用日志中的堆内存分配状态记录进行遍历,得到遍历结果;
基于所述遍历结果对所述目标二进制程序进行监测。
9.一种堆内存漏洞检测装置,其特征在于,包括:
第一获取单元,用于通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,所述目标调用函数至少包括所述目标调用函数的函数名;
第一匹配单元,用于将所述目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,所述风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;
第一确定单元,用于若所述匹配结果表示所述目标调用函数属于风险的内存操作函数时,确定所述目标调用函数的类型;
第一执行单元,用于根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略。
10.一种计算机可读存储介质,其特征在于,所述存储介质包括存储的程序,其中,所述程序执行权利要求1至8中任意一项所述的方法。
11.一种电子设备,其特征在于,包括一个或多个处理器和存储器,所述存储器用于存储一个或多个程序,其中,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现权利要求1至8中任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111236368.4A CN113987507A (zh) | 2021-10-22 | 2021-10-22 | 堆内存漏洞检测方法、装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111236368.4A CN113987507A (zh) | 2021-10-22 | 2021-10-22 | 堆内存漏洞检测方法、装置、存储介质及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113987507A true CN113987507A (zh) | 2022-01-28 |
Family
ID=79740645
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111236368.4A Pending CN113987507A (zh) | 2021-10-22 | 2021-10-22 | 堆内存漏洞检测方法、装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113987507A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116204892A (zh) * | 2023-05-05 | 2023-06-02 | 中国人民解放军国防科技大学 | 漏洞处理方法、装置、设备以及存储介质 |
CN116502239A (zh) * | 2023-06-27 | 2023-07-28 | 清华大学 | 二进制程序的内存漏洞检测方法、装置、设备及介质 |
-
2021
- 2021-10-22 CN CN202111236368.4A patent/CN113987507A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116204892A (zh) * | 2023-05-05 | 2023-06-02 | 中国人民解放军国防科技大学 | 漏洞处理方法、装置、设备以及存储介质 |
CN116204892B (zh) * | 2023-05-05 | 2023-08-08 | 中国人民解放军国防科技大学 | 漏洞处理方法、装置、设备以及存储介质 |
CN116502239A (zh) * | 2023-06-27 | 2023-07-28 | 清华大学 | 二进制程序的内存漏洞检测方法、装置、设备及介质 |
CN116502239B (zh) * | 2023-06-27 | 2023-09-19 | 清华大学 | 二进制程序的内存漏洞检测方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109583200B (zh) | 一种基于动态污点传播的程序异常分析方法 | |
US10990667B2 (en) | Systems and/or methods for automatically protecting against memory corruption vulnerabilities | |
US7991961B1 (en) | Low-overhead run-time memory leak detection and recovery | |
US5355469A (en) | Method for detecting program errors | |
Liu et al. | Doubletake: Fast and precise error detection via evidence-based dynamic analysis | |
CN113987507A (zh) | 堆内存漏洞检测方法、装置、存储介质及电子设备 | |
JPWO2005024630A1 (ja) | 不正コードの防止方法および防止プログラム | |
US7096339B2 (en) | System and method for detecting memory management programming errors | |
US20060085156A1 (en) | Method and system for predicting memory leaks from unit testing | |
US10599558B1 (en) | System and method for identifying inputs to trigger software bugs | |
US10114948B2 (en) | Hypervisor-based buffer overflow detection and prevention | |
WO2017177801A1 (zh) | 一种实现操作系统完整性保护的方法和装置 | |
CN108920253B (zh) | 一种无代理的虚拟机监控系统和监控方法 | |
US10445020B2 (en) | Computer-implemented method and a system for encoding a stack application memory state using shadow memory | |
Kollenda et al. | Towards automated discovery of crash-resistant primitives in binary executables | |
US20240095174A1 (en) | Method for detecting error of operating system kernel memory in real time | |
Giuffrida et al. | Practical automated vulnerability monitoring using program state invariants | |
CN111931191A (zh) | Linux平台二进制软件堆溢漏洞动态检测方法及系统 | |
Yagemann et al. | {PUMM}: Preventing {Use-After-Free} Using Execution Unit Partitioning | |
KR20220095986A (ko) | 임베디드 프로세서의 소스 코드의 컴파일링 방법 및 컴파일러 | |
KR100580071B1 (ko) | 메모리 오류 검출방법 | |
KR102543663B1 (ko) | 전자 장치의 소프트웨어 검증 방법 | |
CN115344867A (zh) | 漏洞利用检测的处理方法及装置、存储介质 | |
Li et al. | Research on automatic exploitation of house of spirit heap overflow vulnerability | |
Zheng et al. | Chariot: a high compatible architecture to improve virtual machine reliability |
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 |