堆内存漏洞检测方法、装置、存储介质及电子设备制造方法及图纸

技术编号:32126669 阅读:13 留言:0更新日期:2022-01-29 19:16
本申请公开了一种堆内存漏洞检测方法、装置、存储介质及电子设备,涉及信息安全领域。该方法包括:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。通过本申请,解决了相关技术中对堆内存破坏漏洞的检测效率较低的问题。的检测效率较低的问题。的检测效率较低的问题。

【技术实现步骤摘要】
堆内存漏洞检测方法、装置、存储介质及电子设备


[0001]本申请涉及堆内存漏洞检测领域,具体而言,涉及一种堆内存漏洞检测方法、装置、存储介质及电子设备。

技术介绍

[0002]随着堆内存破坏漏洞频繁爆出,堆内存破坏漏洞的利用与防护开始成为信息安全领域内存安全方向的研究重点。常见的堆内存破坏漏洞包括堆缓冲区溢出漏洞、Double free双重释放漏洞、UAF释放后使用漏洞等。恶意用户可精心构造输入数据以绕过现有保护机制,并利用这些堆内存破坏漏洞对程序运行时分配的堆内存进行各种非法访问操作,通过直接或间接控制堆块自身的元数据、篡改堆块布局方式来实现程序运行时内存信息的泄露、程序控制流的劫持。
[0003]GNU libc是Linux操作系统的标准C语言库,被部署在所有的linux发行版本中,采用的堆管理机制源于ptmalloc。该机制通过系统调用函数brk()/mmap()在程序第一次向操作系统申请内存时分配大片内存进行管理。Ptmalloc有三种最基本的数据结构,其中malloc_chunk是内存分配的基本单位,也是glibc中真正存储堆数据信息的结构体。程序申请的堆内存(chunk)在ptmalloc内部就是用malloc_chunk结构体来进行表示。Chunk主要分为三种类型:Allocated Chunk(已分配的堆)、Free Chunk(被释放的堆)、Top Chunk(顶块)。
[0004]当前针对堆内存破坏漏洞的检测方法主要包括模糊测试技术、污点分析技术、编译插桩技术,存在以下问题:/>[0005](1)Fuzzing模糊测试技术是一种被广泛使用的漏洞挖掘方法,其核心思想是将自动或半自动化生成的随机测试用例作为程序运行时的输入,监控程序运行时是否存在崩溃等异常情况来发现源码或二进制软件中可能的程序错误,该方法生成的模糊测试数据存在冗余度高的问题。堆由用户动态申请和释放,是受程序运行时输入的影响、根据程序运行时需要进行动态申请和释放的大小可变的内存空间,因此程序的执行行为较难预测。另外,由于堆内存破坏漏洞的输入实例通常只破坏堆块元数据而不会直接控制指令指针寄存器的值并篡改程序执行流,因此不会直接造成程序崩溃,导致Fuzzing测试技术针对堆内存破坏漏洞的检测效率较低。
[0006](2)基于污点分析的方法主要是分析程序中标记为污点的数据在执行过程中是否符合预设的策略,严重依赖于准确的语义指令集建模,难度较高,进一步导致对堆内存破坏漏洞的检测效率较低。
[0007](3)现有检测技术大多需要修改源代码、目标二进制程序,需要重新编译和链接程序来实现检测过程,进一步导致对堆内存破坏漏洞的检测效率较低。
[0008]针对相关技术中对堆内存破坏漏洞的检测效率较低的问题,目前尚未提出有效的解决方案。

技术实现思路

[0009]本申请的主要目的在于提供一种堆内存漏洞检测方法、装置、存储介质及电子设备,以解决相关技术中对堆内存破坏漏洞的检测效率较低的问题。
[0010]为了实现上述目的,根据本申请的一个方面,提供了一种堆内存漏洞检测方法。该方法包括:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,目标调用函数至少包括目标调用函数的函数名;将目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若匹配结果表示目标调用函数属于风险的内存操作函数时,确定目标调用函数的类型;根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略。
[0011]进一步地,目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。
[0012]进一步地,在根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略之前,该方法还包括:若目标调用函数的类型为堆分配函数的类型时,通过程序的目标接口获取堆分配函数的函数参数;根据函数参数计算目标调用函数分配的堆内存空间。
[0013]进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆分配函数的类型时,根据程序的目标接口获取堆分配函数的执行结果,其中,执行结果包括堆块元数据的内容;通过执行结果判断目标调用函数的堆内存空间是否分配成功,若目标调用函数的堆内存空间分配成功,对堆内存空间的申请次数进行判断;若堆内存空间的申请次数为第一预设值,通过堆分配函数的函数参数以及堆分配函数的程序执行结果确定堆内存的使用日志;若堆内存空间的申请次数大于第一预设值,判断堆内存空间地址是否为空闲堆内存地址,若堆内存空间地址为空闲堆内存地址,判断堆分配函数是否为目标函数,若堆分配函数为目标函数,则对堆内存的使用日志进行更新。
[0014]进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆释放函数的类型时,通过程序的目标接口获取堆释放函数的函数参数;根据堆释放函数的函数参数获取待释放的堆内存地址,判断待释放的堆内存地址是否与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;若待释放的堆内存地址与堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将待释放的堆内存地址进行释放,并对堆内存的使用日志进行更新。
[0015]进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测策略包括:若目标调用函数的类型为堆内存读取函数的类型时,通过程序的目标接口获取堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果;根据堆内存读取函数的函数参数以及堆内存读取函数的程序执行结果确定堆内存读取函数的目标信息,其中,目标信息至少包括:读内存的地址与读取内容的长度;通过目标信息判断目标二进制程序是否存在读堆内存数据的情况,在目标信息存在读堆内存数据的情况下,根据堆分配函数的内存使用日志中的堆内存分配状态,判断读内存的地址是否为释放的堆内存地址;若读内存的地址为释放的堆内存地址,触发异常报警并终止目标二进制程序进程。
[0016]进一步地,根据目标调用函数的类型,执行目标调用函数对应的堆内存漏洞检测
策略包括:若目标调用函数的类型为堆内存写入函数的类型时,通过程序的目标接口获取堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果;根据堆内存写入函数的函数参数以及堆内存写入函数的程序执行结果确定堆内存写入函数的目标信息,其中,目标信息至少包括:写内存的地址与写入内容的长度;根据写内存的地址判断堆内存写入函数是否为堆内存初始化函数,若堆内存写入函数为堆内存初始化函数,对堆内存的使用日志进行更新,若堆内存写入函数不为堆内存初始化函数,根据写内存的地址以及堆内存的使用日志判断目标二进制程序是否存在堆内存写入情况;在目标二进制程序存在读堆内存数据的情况下,判断写内存的地址是否为释放状态或者判断写内存的地址的堆内存是否未被分配;若写内存的地址为释放状态或者写本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.一种堆内存漏洞检测方法,其特征在于,包括:通过二进制插桩模块获取目标二进制程序中的目标调用函数,其中,所述目标调用函数至少包括所述目标调用函数的函数名;将所述目标调用函数的函数名与风险函数模型进行匹配,得到匹配结果,其中,所述风险函数模型中包括多个函数的函数名,各个函数是否属于风险的内存操作函数,以及各个函数名对应的类型;若所述匹配结果表示所述目标调用函数属于风险的内存操作函数时,确定所述目标调用函数的类型;根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略。2.根据权利要求1所述的方法,其特征在于,所述目标调用函数的类型为以下至少之一:堆分配函数的类型、堆释放函数的类型、堆内存读取函数的类型、堆内存写入函数的类型。3.根据权利要求2所述的方法,其特征在于,在根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略之前,所述方法还包括:若所述目标调用函数的类型为所述堆分配函数的类型时,通过程序的目标接口获取所述堆分配函数的函数参数;根据所述函数参数计算所述目标调用函数分配的堆内存空间。4.根据权利要求3所述的方法,其特征在于,根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略包括:若所述目标调用函数的类型为所述堆分配函数的类型时,根据所述程序的目标接口获取所述堆分配函数的执行结果,其中,所述执行结果包括堆块元数据的内容;通过所述执行结果判断所述目标调用函数的堆内存空间是否分配成功,若所述目标调用函数的堆内存空间分配成功,对所述堆内存空间的申请次数进行判断;若所述堆内存空间的申请次数为第一预设值,通过所述堆分配函数的函数参数以及所述堆分配函数的程序执行结果确定堆内存的使用日志;若所述堆内存空间的申请次数大于第一预设值,判断所述堆内存空间地址是否为空闲堆内存地址,若所述堆内存空间地址为空闲堆内存地址,判断所述堆分配函数是否为目标函数,若所述堆分配函数为所述目标函数,则对所述堆内存的使用日志进行更新。5.根据权利要求4所述的方法,其特征在于,根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略包括:若所述目标调用函数的类型为所述堆释放函数的类型时,通过所述程序的目标接口获取所述堆释放函数的函数参数;根据所述堆释放函数的函数参数获取待释放的堆内存地址,判断所述待释放的堆内存地址是否与所述堆内存的使用日志中已经分配的堆块首地址存在匹配的记录;若所述待释放的堆内存地址与所述堆内存的使用日志中已经分配的堆块首地址存在匹配的记录,将所述待释放的堆内存地址进行释放,并对所述堆内存的使用日志进行更新。6.根据权利要求4所述的方法,其特征在于,根据所述目标调用函数的类型,执行所述目标调用函数对应的堆内存漏洞检测策略包括:若所述目标调用函数的类型为所述堆内存读取函数的类型时,通过所述程序的目标接
口获取所述堆内存读取函数的函数参数以及所述堆内存读取函数的程序执行结果;根据所述堆内存读取函数的函数参数以及...

【专利技术属性】
技术研发人员:张茜闫海林蒋家堂李帅宇
申请(专利权)人:中国工商银行股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1