CN111859372A - 堆内存攻击的检测方法、装置和电子设备 - Google Patents
堆内存攻击的检测方法、装置和电子设备 Download PDFInfo
- Publication number
- CN111859372A CN111859372A CN202010743125.9A CN202010743125A CN111859372A CN 111859372 A CN111859372 A CN 111859372A CN 202010743125 A CN202010743125 A CN 202010743125A CN 111859372 A CN111859372 A CN 111859372A
- Authority
- CN
- China
- Prior art keywords
- address
- memory
- heap
- program
- detection
- 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.)
- Granted
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/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
-
- 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)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本公开提供了一种堆内存攻击的检测方法、装置和电子设备,可用于信息安全技术领域,该方法包括:确定程序的检测点集合,检测点集合包括针对程序的至少一个检测点;响应于程序处于运行状态,在程序中与至少一个检测点对应的位置设置回调函数;基于回调函数确定程序申请的堆内存的第一地址,和/或,程序释放的堆内存的第二地址;以及对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
Description
技术领域
本公开涉及信息安全技术领域,更具体地,涉及一种堆内存攻击的检测方法、装置和电子设备。
背景技术
堆内存漏洞广泛存在于采用C/C++编写的程序中,攻击者通过堆内存漏洞可以实现任意内存地址读写,进而夺取程序控制流,并且获得系统控制权。相关技术可以采用安全检测以降低堆内存攻击的危害。
在实现本公开构思的过程中,发明人发现现有技术中至少存在如下问题:相关技术中进行安全检测时,需要侵入源程序以实现检测过程。
发明内容
本公开的一个方面提供了一种堆内存攻击的检测方法,包括:确定程序的检测点集合,检测点集合包括针对程序的至少一个检测点;响应于程序处于运行状态,在程序中与至少一个检测点对应的位置设置回调函数;基于回调函数确定程序申请的堆内存的第一地址,和/或,程序释放的堆内存的第二地址;以及对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
根据本公开的实施例,基于检测规则和内存标记图,对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果,其中,内存标记图包括内存区域类型和堆块使用状态,检测规则包括与第一地址和/或第二地址对应内存的内存区域类型和内存使用状态。
本公开的另一个方面提供了一种堆内存攻击的检测装置,包括:检测点确定模块、回调函数设置模块、地址确定模块和攻击检测模块。其中,检测点确定模块用于确定程序的检测点集合,检测点集合包括针对程序的至少一个检测点;回调函数设置模块用于响应于程序处于运行状态,在程序中与至少一个检测点对应的位置设置回调函数;地址确定模块用于基于回调函数确定程序申请的堆内存的第一地址,和/或,程序释放的堆内存的第二地址;以及攻击检测模块用于对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
本公开的另一方面提供了一种电子设备,包括:存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时用于实现如上所述的方法。
本公开的另一方面提供了一种计算机可读存储介质,存储有计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。
本公开的另一方面提供了一种计算机程序,所述计算机程序包括计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。
根据本公开的实施例,首先确定程序的多个检测点,然后在各检测点通过回调函数确定程序申请的堆内存的第一地址和程序释放的堆内存的第一地址,这样使得可以基于第一地址户第二地址的堆内存的属性确定是否遭到攻击,期间无需侵入源程序,只需调用回调函数即可,在保证被测程序原有逻辑完整性的基础上,实现堆内存攻击的检测,满足用户的多样化需求。
附图说明
为了更完整地理解本公开及其优势,现在将参考结合附图的以下描述,其中:
图1示意性示出了根据本公开实施例的适用于堆内存攻击的检测方法、装置和电子设备的应用场景的示意图;
图2示意性示出了根据本公开实施例的应用堆内存攻击的检测方法、装置和电子设备的示例性系统架构;
图3示意性示出了根据本公开实施例的堆内存攻击的检测方法的流程图;
图4示意性示出了根据本公开实施例的堆内存攻击的检测方法逻辑图;
图5示意性示出了根据本公开实施例的堆块的结构示意图;
图6示意性示出了根据本公开实施例的插桩后的程序进行堆内存操作时的流程;
图7示意性示出了根据本公开实施例的内存申请位置的回调函数执行方法的流程图;
图8示意性示出了根据本公开另一实施例的内存申请位置的回调函数执行方法的流程图;
图9示意性示出了根据本公开实施例的内存释放位置的回调函数执行方法的流程图;
图10示意性示出了根据本公开实施例的堆内存攻击的检测装置的结构示意图;以及
图11示意性示出了根据本公开实施例的电子设备的方框图。
具体实施方式
以下,将参照附图来描述本公开的实施例。但是应该理解,这些描述只是示例性的,而并非要限制本公开的范围。在下面的详细描述中,为便于解释,阐述了许多具体的细节以提供对本公开实施例的全面理解。然而,明显地,一个或多个实施例在没有这些具体细节的情况下也可以被实施。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。
在此使用的术语仅仅是为了描述具体实施例,而并非意在限制本公开。在此使用的术语“包括”、“包含”等表明了所述特征、步骤、操作和/或部件的存在,但是并不排除存在或添加一个或多个其他特征、步骤、操作或部件。
在此使用的所有术语(包括技术和科学术语)具有本领域技术人员通常所理解的含义,除非另外定义。应注意,这里使用的术语应解释为具有与本说明书的上下文相一致的含义,而不应以理想化或过于刻板的方式来解释。
在使用类似于“A、B和C等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有A、B和C中至少一个的系统”应包括但不限于单独具有A、单独具有B、单独具有C、具有A和B、具有A和C、具有B和C、和/或具有A、B、C的系统等)。在使用类似于“A、B或C等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有A、B或C中至少一个的系统”应包括但不限于单独具有A、单独具有B、单独具有C、具有A和B、具有A和C、具有B和C、和/或具有A、B、C的系统等)。本领域技术人员还应理解,实质上任意表示两个或更多可选项目的转折连词和/或短语,无论是在说明书、权利要求书还是附图中,都应被理解为给出了包括这些项目之一、这些项目任一方、或两个项目的可能性。例如,短语“A或B”应当被理解为包括“A”或“B”、或“A和B”的可能性。术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个所述特征。
为了便于更好地理解本公开的实施例,首先对堆内存技术进行说明。在C语言中,内存可以分为如四块存储区域:栈内存区、堆内存区、静态存储区和代码区。堆内存是一种在需要使用时进行申请,在不需要使用时进行释放的内存区。GNU C Library(简称glibc)所采用的内存分配方法源自malloc的底层实现(简称ptmalloc),该方法通过brk或mmap系统调用申请一大片内存后进行管理,在能够满足用户态的内存请求时不再进行系统调用以减少开销。用户通过glibc中的malloc或calloc或realloc函数进行内存申请,通过free函数进行内存释放。攻击者进行堆内存攻击时通常需要结合glibc的内存管理机制。
应用程序使用glibc的方式可分为动态链接和静态链接。动态链接在程序启动运行时再加载glibc,glibc中的函数地址存储于程序的GOT库中,通过PLT进行跳转。静态链接的程序在编译阶段将相关函数和程序一起打包。
相关技术中针对堆内存攻击的防御方法可以如下所示。
例如,在内存分配及释放时,glibc采用了一些安全检查以防止内存破坏。如包括双重释放(double free)检查、unlink时的双向链表完整性检查、块大小(chunk size)检查等,这些检查使得内存分配释放更加规范安全,提高了攻击者的攻击难度,但仍无法保证程序安全。其中,double free是一种在free时利用伪造chunk并欺骗操作系统,达到修改内存的目的。Unlink函数用于删除一个文件的目录项并减少链接数。
例如,恶意代码检查能够在一定程度上保护程序安全,但其对于变种的恶意代码可能无法检查出来。
例如,沙箱保护能够限制程序的运行行为,降低恶意代码的能力,但攻击者仍有可能通过构造合适的小配件(gadget)达到攻击目的。
本公开的实施例提供了一种堆内存攻击的检测方法、装置和电子设备。该方法包括插桩过程和攻击检测过程。在插桩过程中,首先确定程序的检测点集合,检测点集合包括针对程序的至少一个检测点,然后,响应于程序处于运行状态,在程序中与至少一个检测点对应的位置设置回调函数。在完成插桩过程之后,进入攻击检测过程,首先,基于回调函数确定程序申请的堆内存的第一地址,和/或,程序释放的堆内存的第二地址,然后,对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
图1示意性示出了根据本公开实施例的适用于堆内存攻击的检测方法、装置和电子设备的应用场景的示意图。需要说明的是,本公开实施例的堆内存攻击的检测方法、装置和电子设备可用于信息安全技术领域,也可用于除信息安全技术领域之外的多种领域,如金融领域。本公开实施例的堆内存攻击的检测方法、装置和电子设备的应用领域不做限定。
如图1所示,相关技术中,运行的程序发出内存申请或内存释放请求,系统给程序分配内存地址或释放针对指定地址的内存空间,这样就可以实现申请堆内存或释放堆内存。然而该操作容易受到来自攻击者的攻击。例如,堆内存中被分配给程序A的存储空间,如果可以被程序B使用,则可能导致与程序A相关的数据被程序B读取等。又例如,程序B删除或修改了堆内存中被分配给程序A的空间中的数据,导致程序A运行异常等。此外,相关技术中,如果需要进行堆内存攻击检测,需要侵入源程序,如在源程序中添加一些代码,以便于获取所需的数据,并对这些数据进行检测,或者直接利用添加的代码进行检测,以确定测试结果。本公开实施例的堆内存检测方法、装置和电子设备可以通过设置在检测点的回调函数得到所需的测试数据,无需侵入源程序以保证源程序的运行逻辑和完整性等。回调函数可以从内存标记图中得到针对特定地址的内存使用状态、堆块大小等属性信息,进而便于基于该属性信息对申请的地址或释放的地址进行检测,降低被堆内存攻击的风险。
图2示意性示出了根据本公开实施例的应用堆内存攻击的检测方法、装置和电子设备的示例性系统架构。
需要注意的是,图2所示仅为可以应用本公开实施例的系统架构的示例,以帮助本领域技术人员理解本公开的技术内容,但并不意味着本公开实施例不可以用于其他设备、系统、环境或场景。
如图2所示,根据本公开实施例的系统架构200可以包括终端设备201、202、203,网络204、服务器205。终端设备201、202、203,服务器205之间可以通过网络204连接,网络204可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
终端设备201、202、203可以是安装有程序的多种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机、主机和台式计算机等等。根据本公开实施例,终端设备201、202、203可以通过程序实现用户所需的功能,如文档编辑、上网、购物、娱乐等。
服务器205可以是提供各种服务的服务器,例如对用户利用终端设备201、202、203所发起的请求提供支持的后台管理服务器(仅为示例)。服务器205中可以安装有程序,以对接收到的用户请求等数据进行分析等处理,并将处理结果(例如根据用户请求获取或生成的网页、信息、或数据等)反馈给终端设备。
需要说明的是,本公开实施例所提供的堆内存攻击的检测方法可以由终端设备201、202、203或服务器205执行。相应地,本公开实施例所提供的堆内存攻击的检测装置一般可以设置于终端设备201、202、203或服务器205中。本公开实施例所提供的堆内存攻击的检测方法也可以由不同于防火墙205且能够与终端设备201、202、203和/或服务器205通信的服务器或服务器集群执行。
应该理解,图2中的终端设备、防火墙和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、防火墙和服务器。
图3示意性示出了根据本公开实施例的堆内存攻击的检测方法的流程图。
如图3所示,该由服务器端执行的堆内存攻击的检测方法可以包括操作S301~操作S307。
在操作S301,确定程序的检测点集合,检测点集合包括针对程序的至少一个检测点。
在本实施例中,可以通过静态分析程序的方法来确定程序的检测点集合。其中,检测点可以用于获取被分配的内存地址或待释放的内存地址。例如,该检测点可以作为插桩点,对于不同的链接方式(动态链接、静态链接)采用的分析方式、获取的插桩点可以不同。
在一个实施例中,确定程序的检测点集合可以包括如下操作。对于动态链接程序,将动态分配内存的malloc、realloc、calloc中至少一种函数的plt地址,作为内存申请的检测点,以及,将动态分配内存的free函数的plt地址,作为内存释放的检测点。
例如,对于动态链接程序,将malloc/realloc/calloc函数的plt地址作为内存申请插桩点,将free函数的plt地址作为内存释放插桩点。
malloc的全称是memory allocation,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,如果无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。函数的原型是extern void*malloc(unsignedintnum_bytes)。其中,malloc函数分配内存空间之后,不会自动初始化内存空间,malloc函数的作用就是申请特定大小的堆内存空间。
calloc函数在内存的动态存储区中分配n个长度为大小(size)的连续空间,函数返回一个指向分配的内存起始地址的指针。如果分配不成功,返回NULL。calloc函数的原型是void*calloc(size_t n,size_tsize)。需要说明的是,通过calloc函数申请的堆内存已经被初始化为0。
realloc函数先判断当前的指针是否有足够的连续空间,如果有,扩大内存地址(mem_address)指向的地址,并且将mem_address返回,如果空间不够,先按照新大小(newsize)指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(其中,原来指针是自动释放,不需要使用free函数),同时返回新分配的内存区域的首地址。即重新分配存堆块的地址。realloc函数的原型是externvoid*realloc(void*mem_address,unsigned int newsize)。例如,如果先用malloc函数申请100个字节的堆内存,再用realloc函数进行扩增,如果只扩增4个字节,可能会发现两个内存的地址是相同的,但如果扩增400个字节,可能会发现这两个内存的地址是不相同的。即,使用realloc函数之前会先判断原内存后面内存是否能满足扩大内存的需求,如果能满足,则会直接接在原内存后面进行扩增,如果不能满足,则会先将原内存的内容拷贝至一新的存储空间,然后释放原内存,再在新内存后面进行扩增。
PLT用于实现动态链接库延迟绑定。例如,在调用动态链接库里面的函数之前,并不知道动态链接库里面的函数的地址,直到第一次调用这个函数。因为程序的分支很多,并不是所有的分支都需要运行,如果运行程序时就解析出所有出现过的动态链接库里面的函数,会导致浪费时间和资源。而PLT则是调用动态链接库里面的函数的操作位置。如free函数的plt地址则是程序中调用free函数的操作位置。
在一个实施例中,确定程序的检测点集合可以包括如下操作。对于静态链接程序,将动态分配内存的malloc、realloc、calloc中至少一种函数的入口地址,作为内存申请的检测点,将动态分配内存的free函数的plt地址,作为内存释放的检测点。
具体地,对于静态链接程序,将malloc/realloc/calloc函数的入口地址作为内存申请插桩点,将free函数的plt地址作为内存释放插桩点。
在操作S303,响应于程序处于运行状态,在程序中与至少一个检测点对应的位置设置回调函数。
在本实施例中,可以通过在程序中检测点处设置回调函数来获取程序被分配到的堆内存的第一地址,以及程序希望释放的堆内存的第二地址。
其中,与第一地址对应的回调函数与第一地址对应的回调函数可以不同。例如,内存申请插桩点的回调函数为funca,内存释放插桩点的回调函数为funcb。funca和funcb的功能和执行的流程可以不同。
在操作S305,基于回调函数确定程序申请的堆内存的第一地址,和/或,程序释放的堆内存的第二地址。
其中,第一地址可以是程序被分配的堆内存的堆块的内存起始地址。第二地址可以是程序待释放的堆内存的堆块的内存起始地址。此外,还可以进一步确定与第一地址相对应的堆块的内存结束地址,或者第二地址相对应的堆块的内存结束地址。另外,还可以进一步确定与第一地址相对应的堆块的堆块大小,或者第二地址相对应的堆块的堆块大小等属性信息。这些属性信息可以用于表征是否存在堆内存攻击行为。
在操作S307,对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
在本实施例中,可以基于与第一地址对应的存储空间的类型、使用状态、大小等属性来确定是否存在堆内存攻击行为。例如,程序向系统申请地址为Z的堆内存,或者被分配了地址为Z的堆内存,但是,通过检测确定了与Z地址对应的存储空间的类型是栈内存、静态存储区或代码区,不是堆内存,则可以确定该第一地址存在异常,可能是攻击行为。又例如,程序向系统申请释放地址为Z的堆内存,但是,通过检测确定了与Z地址对应的存储空间的类型是代码区,则可以确定该第二地址存在异常,可能是攻击行为。又例如,程序向系统申请释放地址为Z、堆块大小为X的堆内存,但是,其大小大于系统为其分配的地址为Z、堆块大小为Y的堆内存,则该第二地址可能存在异常,可能是攻击行为。又例如,程序向系统申请地址为Z的堆内存,但是,通过检测确定了与Z地址对应的存储空间当前处于使用状态,则可以确定该第一地址存在异常,可能是攻击行为。
在一个实施例中,上述方法还包括:响应于攻击检测结果是被攻击,拒绝程序使用与第一地址对应的堆块和/或释放与第二地址对应的堆块。
在可以在检测出存在堆内存攻击行为是,通过拒绝申请(使用)第一地址的堆块、发出警告或者拒绝释放第二地址的堆块等方式来降低堆内存攻击行为可能造成的影响。
图4示意性示出了根据本公开实施例的堆内存攻击的检测方法逻辑图。
如图4所示,首先,静态分析程序,确定插桩地址集合set1。然后,程序运行时对set1中的地址进行插桩,并设置回调函数。接着,当程序申请或释放内存时,对申请到的内存的地址及被释放的地址进行检查,若不符合规则便认为程序受到了攻击,禁止此次内存操作或发出警告;如果符合规则,则允许内存操作。然后,持续对程序进行检测,直至程序停止运行。这样可以实现基于动态二进制重写技术,在程序进行内存申请及释放时进行插桩,在回调函数中对所分配、释放的内存地址进行检查,若出现异常则认为受到了攻击,禁止此次分配或发出警告。
在一个实施例中,上述方法还包括:响应于第一地址,对与第一地址对应的内存空间进行初始化。
在本实施例中,当程序申请到第一地址之后,为了避免程序可以从与该第一地址对应的堆内存的堆块中读取之前存储的信息,可以对与第一地址对应的内存空间进行初始化,进一步降低了信息泄露的风险。
本公开实施例提供的堆内存攻击的检测方法,可以利用二进制重写技术对使用glibc的程序进行安全检测,在检测期间对源程序没有任何侵入。此外,可以基于第一地址和/或第二地址的属性信息进行安全检测,如能够防御堆内存攻击,能够有效防御利用堆内存破坏漏洞进行恶意地址内存分配的攻击,保护目标程序及系统安全,降低服务中断、信息泄露或系统被非法操控的风险。
在一个实施例中,对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果可以包括如下操作:基于检测规则和内存标记图,对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果,其中,内存标记图包括内存区域类型和堆块使用状态,检测规则包括与第一地址和/或第二地址对应内存的内存区域类型和内存使用状态。
图5示意性示出了根据本公开实施例的堆块的结构示意图。
如图5所示,堆内存中堆块信息如图5所示。用户申请的一片内存称为一个堆块,使用中的堆块由“堆块头+用户空间”两部分组成,堆块头中存储了上一个堆块的堆块大小(prev_size)、当前堆块的堆块大小(size)、上一个堆块的使用状态(prev_inuse)等信息;用户空间是程序申请内存时实际得到的可操作的空间。其中,size的最后3bit不表示大小,值为0/1时分别表示是否属于主线程或是否由映射至内存(mmap)分配/前一堆块的使用状态是否为使用中。
为了便于理解检测规则和内存标记图,首先对插桩后程序进行堆内存操作进行示例性说明。图6示意性示出了根据本公开实施例的插桩后的程序进行堆内存操作时的流程。
如图6所示,与内存申请操作对应的插桩点的回调函数为funca,与内存释放操作对应的插桩点的回调函数为funcb。完成插桩后程序的申请内存、释放内存的过程如图6所示,图6中实线框部分为程序运行的流程,图6中虚线框部分为插桩后新增的流程。
图7示意性示出了根据本公开实施例的内存申请位置的回调函数执行方法的流程图。
如图7所示,funca主要功能如下所示。一方面,在程序首次进行内存申请时构建内存标记图,以记录各内存地址的内存区域类型。一方面,在程序申请内存时进行检查,如果不满足检查规则进行拒绝。一方面,在程序成功申请内存后更新内存标记图信息。
图8示意性示出了根据本公开另一实施例的内存申请位置的回调函数执行方法的流程图。
如图8所示,funca在程序成功申请内存后,更新内存标记图信息之后,还可以进一步包括如下功能,对被申请的内存进行清空、初始化,进一步降低信息泄露的风险。
图9示意性示出了根据本公开实施例的内存释放位置的回调函数执行方法的流程图。
如图9所示,funcb主要功能如下所示。一方面,释放内存时进行检查,如果不满足检查规则进行拒绝或报警。一方面,成功释放内存后更新内存标记图信息。
在一个实施例中,内存区域类型包括由内存起始地址、内存结束地址和地址区域类型三个变量构成的数组,内存起始地址的取值按照从小到大的顺序进行排序。
堆块使用状态包括双向链表,其中,双向链表中各节点分别为结构体,结构体的变量包括:前后指针以及以下至少一种:内存起始地址、内存结束地址和地址使用状态。
相应地,上述方法还可以包括如下操作。在程序首次进行堆内存申请时,构建内存标记图。其中,首次进行堆内存申请可以指安装该程序的电子设备上电之后,程序首次进行堆内存申请时。对于内存标记图备份在非易失性存储器中的情形,首次进行堆内存申请可以指用户在安装该程序后,首次进行堆内存申请时。
具体地,内存标记图中记录了内存区域的类型(堆栈地址、代码段地址、外部链接库地址等)及使用状态(是否已分配给用户),内存标记图在用户首次申请内存时建立,之后在每次进行内存操作时进行维护、更新等。内存标记图存储于程序主线程的内存空间中,位于独立的内存页,不与程序运行所使用的内存重叠。内存区域功能信息可以从程序的线程信息中获取,使用状态通过回调函数funca或funcb维护。通过查询内存标记图,可以得到与某一个地址对应的存储空间的类型及使用状态,或者查询某一个地址区间的使用状态是否唯一(如是否部分地址处于使用状态,部分地址处于空闲状态)。
例如,内存标记图存储的数据结构分为两部分:内存区域类型和使用状态。内存区域类型是一个数组A,其中每一个元素i是一个结构体类型,元素i包含三个变量:内存起始地址、内存结束地址和地址区域类型,元素i在数组A中按照内存起始地址从小到大排序。使用状态是一个双向链表,其中每一个节点是一个结构体,结构体变量除了前后指针外,还包括内存起始地址、内存结束地址、地址使用状态三个信息,地址使用状态表示内存起始地址到内存结束地址之间的内存是否已分配给程序使用。使用状态仅存储堆内存空间的信息。i为大于零的正整数。
需要说明的是,本公开实施例提供的方法可以对内存破坏漏洞(堆缓冲区溢出、释放后重用、双重释放等)被触发时进行防护,如对攻击者利用内存破坏漏洞进行恶意地址分配、释放时,会检测到该攻击行为。堆内存在正常情况下,程序申请得内存应当位于堆内存空间中,且申请得到的内存应当是一段空闲的不在使用中的内存。然而通过内存破坏漏洞,攻击者可以修改堆内存的空闲链表,使得分配到的地址是堆中已经分配的地址(或部分已经分配),也可能不在堆内存空间,而是glibc、栈内存或者程序地址空间,从而修改其中的数据、函数指针等。利用内存标记图记录并更新地址相关属性信息,如内存区域类型和使用状态,使得可以基于内存标记图中记录的地址相关属性信息对内存申请操作的地址和内存释放操作的地址进行检测,有效提升攻击行为检测准确率。
在一个实施例中,可以通过如下方式进行内存标记图更新。
具体地,内存标记图在释放内存时通过如下方式进行更新。首先,根据第二地址和堆块头中存储的第一堆块大小,更新内存标记图中与第二地址对应的堆块的使用状态。然后,重复以下操作直至双向链表中当前节点的相邻节点的内存使用状态是使用状态,当前节点是与第二地址对应的块体的节点:如果前向节点的内存使用状态是空闲状态,则将当前节点和前向节点进行合并,以及,如果后向节点的内存使用状态是空闲状态,则将当前节点和前后向节点进行合并。
例如,在释放内存时,首先,根据待释放地址、堆块头中存储的堆块大小,更新内存标记图此段区间的使用状态。
然后,如果双向链表的前向节点的内存使用状态为未使用,则将两个节点进行合并,重复本操作直到前向节点状态为使用中。
并且,如果双向链表后向节点的内存使用状态为未使用,则将两个节点进行合并,重复当前操作直到后向节点状态为使用中。需要说明的是,进行前向合并和后向合并不分前后顺序。
具体地,内存标记图在申请内存时可以通过如下方式进行更新。
一方面,对于通过动态分配内存的malloc函数或calloc函数申请的第一地址,基于第一方式进行更新,第一方式包括:更新内存标记图中与第一地址对应的堆块的使用状态,以及调整双向链表的节点;如果当前节点存在处于空闲状态的空间,则将当前节点进行拆分。
例如,对于使用malloc函数或calloc函数申请的内存,更新内存标记图此段区间的使用状态,同时调整包括内存使用状态的双向链表的节点,若当前节点仍有未使用空间则将节点进行拆分,使得节点内各空间的使用状态保持一致。
另一方面,对于通过动态分配内存的realloc函数申请的第一地址,如果申请后的第一地址与申请前的第一地址相同,则在申请后的堆块大小和申请前的堆块大小不同时,基于第一方式进行更新。如果申请后的第一地址与申请前的第一地址不同,则按照释放内存的方式更新内存标记图,以及基于第一方式进行更新。
例如,对于使用realloc函数申请的内存,首先判断申请得到的地址和申请前是否相同,若相同,则可以判断申请后的堆块大小和申请前是否相同,如果相同则结束。否则,按照通过动态分配内存的malloc函数或calloc函数申请的第一地址时,的更新方式来更新内存标记图。
又例如,对于使用realloc函数申请的内存,首先判断申请得到的地址和申请前是否相同,如果不同,则先将申请前的地址按照释放内存时内存标记图更新流程处理,然后,再按照通过动态分配内存的malloc或calloc函数申请的第一地址时,的更新方式来更新内存标记图。
以下对检测规则进行示例性说明。本公开实施例提供的检测规则用于对针对堆内存破坏漏洞的攻击行为进行检测。其中,堆内存破坏漏洞主要包含堆缓冲区溢出、释放后重用及双重释放等。攻击者利用这些漏洞的手段是在恶意内存地址进行内存的分配及释放操作,进而达到任意地址读写并控制程序流。
在一个实施例中,检测规则包括:如果第一地址是堆内存的地址,并且与第一地址对应的内存使用状态仅包含空闲状态,则攻击检测结果是未被攻击。
例如,首先,根据内存标记图的内存区域类型,判断申请到的内存地址是否是堆地址,如果不是则拒绝。然后,根据内存标记图的使用状态,判断申请到的内存地址区间是否包含状态为使用中的地址,如果存在则拒绝。如针对缓冲区溢出,攻击者利用内存破坏漏洞,可以分配得到一片已经分配过的内存地址,从而修改其中的数据。以盒子作为存储空间进行类比说明:一个盒子(内存区间)应当只被用户使用,非法用户通过漏洞拿到了盒子的使用权,因此向盒子里放入了一些奇怪的东西,而用户不知道,当用户正常使用时便可能发生异常。
需要说明的是,由于基于不同函数申请的第一地址的存储空间的状态等可能存在差异,可以分别设置不同的检测规则。
具体地,对于通过动态分配内存的realloc函数申请的第一地址,检测规则可以包括:如果申请后的第一地址与申请前的第一地址不同、申请后的第一地址是堆内存的地址、并且与申请后的第一地址对应的内存使用状态仅包含空闲状态,则攻击检测结果是未被攻击。
如果申请后的第一地址与申请前第一地址相同、第一地址是堆内存的地址、并且与区间地址对应的内存使用状态仅包含空闲状态,则攻击检测结果是未被攻击,其中,区间地址是申请前的第一地址的内存结束地址与申请后的第一地址的内存结束地址之间的地址区间。
例如,对于通过realloc函数申请的内存,如果申请后的地址与申请前不同,则根据内存标记图的使用状态,判断申请到的内存地址区间是否包含状态为使用中的地址,如果存在则拒绝。如果申请后的地址与申请前相同,确定申请前内存结束地址到申请后内存结束地址这一段的空间,根据内存标记图的使用状态,判断申请前内存结束地址到申请后内存结束地址这一段的空间是否包含状态为使用中的空间,如果存在则拒绝。
在一个实施例中,检测规则可以包括:如果第二地址是堆内存的地址,并且与第二地址对应的内存使用状态仅包含使用状态,则攻击检测结果是未被攻击;或者,如果第二地址是堆内存的地址,并且第一地址不同于双向链表的节点的内存起始地址,则输出告警信息。
例如,在步骤1中,根据内存标记图的内存区域类型,判断释放的内存是否是堆地址,如果不是则拒绝。在步骤2中,根据内存标记图的使用状态,判断待释放的内存地址区间是否为使用中状态,如果不是则拒绝。在步骤3中,根据内存标记图的使用状态,判断待释放的内存地址是否等于双向链表的节点的内存起始地址,如果不是则发出警告。其中,步骤2和步骤3之间不分前后顺序。由于攻击者可以通过伪造一个堆块(一片堆内存)传递给free函数进行释放,从而进行进一步攻击。伪造的堆块的内存起始地址可能和分配得到的内存起始地址不同,因此,可以基于此进行攻击检测。
在一个实施例中,内存区域类型和/或堆块使用状态中包括内存起始地址和内存结束地址。
相应地,检测规则还包括:如果第一堆块大小和第二堆块大小不相同,则攻击检测结果是被攻击,其中,第一堆块大小是从第二地址的堆块头中获取的,第二堆块大小是基于内存起始地址和内存结束地址确定的。
例如,在执行上述操作2或3之后,从待释放地址的堆块头中获取堆块大小size1,并计算内存标记图中使用状态起止地址之差为size2,对二者进行比较,若不相等则拒绝。这样可以有效降低攻击者缩小堆块大小后,伪造一个地址,然后利用该地址进行攻击行为的风险。
在一个实施例中,检测规则还可以包括如下操作,如果相对于第二地址的上一堆块处于空闲状态,且上一堆块的内存起始地址与双向链表的节点的内存起始地址不同,则输出告警信息,其中,上一堆块的内存起始地址是根据上一堆块大小确定的。
例如,从待释放地址的堆块头中获取prev_inuse标记位;如果prev_inuse为1(上一堆块在使用中),此检查结束;否则,根据prev_size计算得出上一堆块头地址prev_addr,并根据内存标记图的使用状态判断此地址是否等于双向链表的节点的内存起始地址,如果不是则发出警告。其中,本实施例中进行警告而不是直接拒绝,是考虑到:因为在某些情况下,程序本身会释放一段地址,其内存起始地址不是由分配得到,此时可以告知用户存在风险,以便于用户及时进行检测。
本公共实施例利用二进制重写技术,提供了针对堆内存攻击的防御方法,能够防御堆内存攻击,有效防御利用堆内存破坏漏洞进行恶意地址内存分配的攻击,保护目标程序及系统安全,降低服务中断、信息泄露或系统被非法操控的风险。此外,本公开实施例可以适用于多种使用glibc的程序,通用性较好,且对源程序没有任何侵入。
图10示意性示出了根据本公开实施例的堆内存攻击的检测装置的结构示意图。
如图10所示,该堆内存攻击的检测装置1000可以包括检测点确定模块1010、回调函数设置模块1020、地址确定模块1030和攻击检测模块1040。
其中,检测点确定模块1010用于确定程序的检测点集合,检测点集合包括针对程序的至少一个检测点。
回调函数设置模块1020用于响应于程序处于运行状态,在程序中与至少一个检测点对应的位置设置回调函数。
地址确定模块1030用于基于回调函数确定程序申请的堆内存的第一地址,和/或,程序释放的堆内存的第二地址。
攻击检测模块1040用于对与第一地址和/或第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
该检测装置1000适用的计算机,可以运行主流Linux发行版系统,可以使用GNU CLibrary。通过该检测装置1000通过检测点确定模块1010确定多个检测点,然后基于回调函数设置模块1020在检测点处设置回调函数,以确定程序申请的堆内存的第一地址,和/或,程序释放的堆内存的第二地址,这样使得攻击检测模块1040可以对与第一地址和/或第二地址对应的堆内存的属性进行检测,实现检测出针对堆内存攻击行为,并进行攻击拦截。能够有效防御利用堆内存破坏漏洞进行恶意地址内存分配的攻击,保护程序及系统安全。
其中,各模块执行的操作可以参考如上所示的方法部分相关内容,在此不再一一详述。
根据本公开的实施例的模块、子模块、单元、子单元中的任意多个、或其中任意多个的至少部分功能可以在一个模块中实现。根据本公开实施例的模块、子模块、单元、子单元中的任意一个或多个可以被拆分成多个模块来实现。根据本公开实施例的模块、子模块、单元、子单元中的任意一个或多个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(FPGA)、可编程逻辑阵列(PLA)、片上系统、基板上的系统、封装上的系统、专用集成电路(ASIC),或可以通过对电路进行集成或封装的任何其他的合理方式的硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,根据本公开实施例的模块、子模块、单元、子单元中的一个或多个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。
例如,检测点确定模块1010、回调函数设置模块1020、地址确定模块1030和攻击检测模块1040中的任意多个可以合并在一个模块中实现,或者其中的任意一个模块可以被拆分成多个模块。或者,这些模块中的一个或多个模块的至少部分功能可以与其他模块的至少部分功能相结合,并在一个模块中实现。根据本公开的实施例,检测点确定模块1010、回调函数设置模块1020、地址确定模块1030和攻击检测模块1040中的至少一个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(FPGA)、可编程逻辑阵列(PLA)、片上系统、基板上的系统、封装上的系统、专用集成电路(ASIC),或可以通过对电路进行集成或封装的任何其他的合理方式等硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,检测点确定模块1010、回调函数设置模块1020、地址确定模块1030和攻击检测模块1040中的至少一个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。
图11示意性示出了根据本公开实施例的电子设备的方框图。图11示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图11所示,根据本公开实施例的电子设备1100包括处理器1101,其可以根据存储在只读存储器(ROM)1102中的程序或者从存储部分1108加载到随机访问存储器(RAM)1103中的程序而执行各种适当的动作和处理。处理器1101例如可以包括通用微处理器(例如CPU)、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(ASIC)),等等。处理器1101还可以包括用于缓存用途的板载存储器。处理器1101可以包括用于执行根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。
在RAM 1103中,存储有电子设备1100操作所需的各种程序和数据。处理器1101、ROM 1102以及RAM 1103通过总线1104彼此相连。处理器1101通过执行ROM 1102和/或RAM1103中的程序来执行根据本公开实施例的方法流程的各种操作。需要注意,程序也可以存储在除ROM 1102和RAM 1103以外的一个或多个存储器中。处理器1101也可以通过执行存储在所述一个或多个存储器中的程序来执行根据本公开实施例的方法流程的各种操作。
根据本公开的实施例,电子设备1100还可以包括输入/输出(I/O)接口1105,输入/输出(I/O)接口1105也连接至总线1104。电子设备1100还可以包括连接至I/O接口1105的以下部件中的一项或多项:包括键盘、鼠标等的输入部分1106;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1107;包括硬盘等的存储部分1108;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1109。通信部分1109经由诸如因特网的网络执行通信处理。驱动器1110也根据需要连接至I/O接口1105。可拆卸介质1111,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1110上,以便于从其上读出的计算机程序根据需要被安装入存储部分1108。
根据本公开的实施例,根据本公开实施例的方法流程可以被实现为计算机程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读存储介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1109从网络上被下载和安装,和/或从可拆卸介质1111被安装。在该计算机程序被处理器1101执行时,执行本公开实施例的电子设备中限定的上述功能。根据本公开的实施例,上文描述的电子设备、设备、装置、模块、单元等可以通过计算机程序模块来实现。
本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的设备/装置/系统中所包含的;也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被执行时,实现根据本公开实施例的方法。
根据本公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。例如,根据本公开的实施例,计算机可读存储介质可以包括上文描述的ROM 1102和/或RAM 1103和/或ROM 1102和RAM 1103以外的一个或多个存储器。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合或/或结合,即使这样的组合或结合没有明确记载于本公开中。特别地,在不脱离本公开精神和教导的情况下,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合。所有这些组合和/或结合均落入本公开的范围。
以上对本公开的实施例进行了描述。但是,这些实施例仅仅是为了说明的目的,而并非为了限制本公开的范围。尽管在以上分别描述了各实施例,但是这并不意味着各个实施例中的措施不能有利地结合使用。本公开的范围由所附权利要求及其等同物限定。不脱离本公开的范围,本领域技术人员可以做出多种替代和修改,这些替代和修改都应落在本公开的范围之内。
Claims (16)
1.一种堆内存攻击的检测方法,包括:
确定程序的检测点集合,所述检测点集合包括针对所述程序的至少一个检测点;
响应于所述程序处于运行状态,在所述程序中与至少一个所述检测点对应的位置设置回调函数;
基于所述回调函数确定所述程序申请的堆内存的第一地址,和/或,所述程序释放的堆内存的第二地址;以及
对与所述第一地址和/或所述第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
2.根据权利要求1所述的方法,其中,所述对与所述第一地址和/或所述第二地址对应的堆内存的属性进行检测,以确定攻击检测结果包括:
基于检测规则和内存标记图,对与所述第一地址和/或所述第二地址对应的堆内存的属性进行检测,以确定攻击检测结果,其中,所述内存标记图包括内存区域类型和堆块使用状态,所述检测规则包括与所述第一地址和/或所述第二地址对应内存的内存区域类型和内存使用状态。
3.根据权利要求2所述的方法,其中,所述检测规则包括:
如果所述第一地址是堆内存的地址,并且与所述第一地址对应的内存使用状态仅包含空闲状态,则所述攻击检测结果是未被攻击。
4.根据权利要求2所述的方法,其中,所述检测规则包括:对于通过动态分配内存的realloc函数申请的第一地址,
如果申请后的第一地址与申请前的第一地址不同、所述申请后的第一地址是堆内存的地址、并且与所述申请后的第一地址对应的内存使用状态仅包含空闲状态,则所述攻击检测结果是未被攻击;
如果申请后的第一地址与申请前第一地址相同、所述第一地址是堆内存的地址、并且与区间地址对应的内存使用状态仅包含空闲状态,则所述攻击检测结果是未被攻击,其中,所述区间地址是所述申请前的第一地址的内存结束地址与申请后的第一地址的内存结束地址之间的地址区间。
5.根据权利要求2所述的方法,其中,所述检测规则包括:
如果所述第二地址是堆内存的地址,并且与所述第二地址对应的内存使用状态仅包含使用状态,则所述攻击检测结果是未被攻击;或者
如果所述第二地址是堆内存的地址,并且所述第一地址不同于双向链表中节点的内存起始地址,则输出告警信息。
6.根据权利要求5所述的方法,其中,所述内存区域类型和/或所述堆块使用状态中包括内存起始地址和内存结束地址;
所述检测规则还包括:
如果第一堆块大小和第二堆块大小不相同,则所述攻击检测结果是被攻击,其中,所述第一堆块大小是从所述第二地址的堆块头中获取的,所述第二堆块大小是基于所述内存起始地址和所述内存结束地址确定的。
7.根据权利要求6所述的方法,其中,所述检测规则还包括:
如果相对于所述第二地址的上一堆块处于空闲状态,且所述上一堆块的内存起始地址与双向链表中各节点的内存起始地址不同,则输出告警信息,其中,所述上一堆块的内存起始地址是根据上一堆块大小确定的。
8.根据权利要求2所述的方法,其中:
所述内存区域类型包括由内存起始地址、内存结束地址和地址区域类型三个变量构成的数组,内存起始地址的取值按照从小到大的顺序进行排序;
所述堆块使用状态包括双向链表,其中,所述双向链表中各节点分别为结构体,所述结构体的变量包括:前后指针以及以下至少一种:内存起始地址、内存结束地址和地址使用状态。
9.根据权利要求2所述的方法,其中,所述内存标记图在释放内存时通过如下方式进行更新:
根据所述第二地址和堆块头中存储的第一堆块大小,更新所述内存标记图中与所述第二地址对应的堆块的使用状态;
重复以下操作直至双向链表中当前节点的相邻节点的内存使用状态是使用状态,所述当前节点是与所述第二地址对应的块体的节点:如果前向节点的内存使用状态是空闲状态,则将当前节点和前向节点进行合并,以及,如果后向节点的内存使用状态是空闲状态,则将当前节点和前后向节点进行合并。
10.根据权利要求9所述的方法,其中,所述内存标记图在申请内存时通过如下方式进行更新:
对于通过动态分配内存的malloc或calloc函数申请的第一地址,基于第一方式进行更新,所述第一方式包括:更新所述内存标记图中与所述第一地址对应的堆块的使用状态,以及调整双向链表的节点;如果当前节点存在处于空闲状态的空间,则将所述当前节点进行拆分;
对于通过动态分配内存的realloc函数申请的第一地址,
如果申请后的第一地址与申请前的第一地址相同,则在申请后的堆块大小和申请前的堆块大小不同时,基于所述第一方式进行更新,
如果申请后的第一地址与申请前的第一地址不同,则按照释放内存的方式更新所述内存标记图,以及基于所述第一方式进行更新。
11.根据权利要求2所述的方法,还包括:
在所述程序首次进行堆内存申请时,构建所述内存标记图。
12.根据权利要求1至11任一项所述的方法,其中:所述确定程序的检测点集合包括:
对于动态链接程序,将动态分配内存的malloc、realloc、calloc中至少一种函数的plt地址,作为内存申请的检测点,以及,将动态分配内存的free函数的plt地址,作为内存释放的检测点;
对于静态链接程序,将动态分配内存的malloc、realloc、calloc中至少一种函数的入口地址,作为内存申请的检测点,将动态分配内存的free函数的plt地址,作为内存释放的检测点。
13.根据权利要求1至11任一项所述的方法,还包括:
响应于所述攻击检测结果是被攻击,拒绝所述程序使用与所述第一地址对应的堆块和/或释放与所述第二地址对应的堆块。
14.根据权利要求1至11任一项所述的方法,还包括:
响应于所述第一地址,对与所述第一地址对应的内存空间进行初始化。
15.一种堆内存攻击的检测装置,包括:
检测点确定模块,用于确定程序的检测点集合,所述检测点集合包括针对所述程序的至少一个检测点;
回调函数设置模块,用于响应于所述程序处于运行状态,在所述程序中与至少一个所述检测点对应的位置设置回调函数;
地址确定模块,用于基于所述回调函数确定所述程序申请的堆内存的第一地址,和/或,所述程序释放的堆内存的第二地址;以及
攻击检测模块,用于对与所述第一地址和/或所述第二地址对应的堆内存的属性进行检测,以确定攻击检测结果。
16.一种电子设备,包括:
一个或多个处理器;
存储装置,用于存储可执行指令,所述可执行指令在被所述处理器执行时,实现根据权利要求1~14任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010743125.9A CN111859372B (zh) | 2020-07-29 | 2020-07-29 | 堆内存攻击的检测方法、装置和电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010743125.9A CN111859372B (zh) | 2020-07-29 | 2020-07-29 | 堆内存攻击的检测方法、装置和电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111859372A true CN111859372A (zh) | 2020-10-30 |
CN111859372B CN111859372B (zh) | 2023-08-22 |
Family
ID=72945480
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010743125.9A Active CN111859372B (zh) | 2020-07-29 | 2020-07-29 | 堆内存攻击的检测方法、装置和电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111859372B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112650645A (zh) * | 2020-12-24 | 2021-04-13 | 大连市共进科技有限公司 | 堆内存使用情况监测方法、装置和5g基站设备 |
CN114579976A (zh) * | 2022-02-25 | 2022-06-03 | 中国人民解放军国防科技大学 | 基于状态转换的堆内存破坏漏洞自动验证方法和系统 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060225134A1 (en) * | 2005-03-31 | 2006-10-05 | Conti Gregory R | Method and system for detection and neutralization of buffer overflow attacks |
CN104572460A (zh) * | 2014-12-30 | 2015-04-29 | 大唐移动通信设备有限公司 | 一种内存泄露的检测方法和装置 |
CN104881610A (zh) * | 2015-06-16 | 2015-09-02 | 北京理工大学 | 一种针对虚函数表劫持攻击的防御方法 |
US20160283302A1 (en) * | 2015-03-27 | 2016-09-29 | Justin E. Gottschlich | Technologies for root cause identification of use-after-free memory corruption bugs |
CN106201851A (zh) * | 2015-04-29 | 2016-12-07 | 中兴通讯股份有限公司 | 堆内存操作的检测方法及装置 |
CN110059477A (zh) * | 2019-03-14 | 2019-07-26 | 成都亚信网络安全产业技术研究院有限公司 | 一种攻击检测方法及装置 |
-
2020
- 2020-07-29 CN CN202010743125.9A patent/CN111859372B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060225134A1 (en) * | 2005-03-31 | 2006-10-05 | Conti Gregory R | Method and system for detection and neutralization of buffer overflow attacks |
CN104572460A (zh) * | 2014-12-30 | 2015-04-29 | 大唐移动通信设备有限公司 | 一种内存泄露的检测方法和装置 |
US20160283302A1 (en) * | 2015-03-27 | 2016-09-29 | Justin E. Gottschlich | Technologies for root cause identification of use-after-free memory corruption bugs |
CN106201851A (zh) * | 2015-04-29 | 2016-12-07 | 中兴通讯股份有限公司 | 堆内存操作的检测方法及装置 |
CN104881610A (zh) * | 2015-06-16 | 2015-09-02 | 北京理工大学 | 一种针对虚函数表劫持攻击的防御方法 |
CN110059477A (zh) * | 2019-03-14 | 2019-07-26 | 成都亚信网络安全产业技术研究院有限公司 | 一种攻击检测方法及装置 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112650645A (zh) * | 2020-12-24 | 2021-04-13 | 大连市共进科技有限公司 | 堆内存使用情况监测方法、装置和5g基站设备 |
CN112650645B (zh) * | 2020-12-24 | 2023-05-30 | 大连市共进科技有限公司 | 堆内存使用情况监测方法、装置和5g基站设备 |
CN114579976A (zh) * | 2022-02-25 | 2022-06-03 | 中国人民解放军国防科技大学 | 基于状态转换的堆内存破坏漏洞自动验证方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111859372B (zh) | 2023-08-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9037873B2 (en) | Method and system for preventing tampering with software agent in a virtual machine | |
US8316448B2 (en) | Automatic filter generation and generalization | |
US20090300764A1 (en) | System and method for identification and blocking of malicious code for web browser script engines | |
US7631356B2 (en) | System and method for foreign code detection | |
US7797702B1 (en) | Preventing execution of remotely injected threads | |
US10114948B2 (en) | Hypervisor-based buffer overflow detection and prevention | |
US9038161B2 (en) | Exploit nonspecific host intrusion prevention/detection methods and systems and smart filters therefor | |
CN110325994B (zh) | 增强软件应用的控制流完整性的设备和方法 | |
US11449615B2 (en) | System and method of forming a log when executing a file with vulnerabilities in a virtual machine | |
CN111859372B (zh) | 堆内存攻击的检测方法、装置和电子设备 | |
Mittal et al. | A survey of techniques for improving security of gpus | |
Zhang et al. | Android ion hazard: The curse of customizable memory management system | |
US11947666B2 (en) | Systems and methods for exploit prevention and malicious code neutralization using non-predictable results for JavaScript-enabled applications | |
CN110070360B (zh) | 一种事务请求处理方法、装置、设备及存储介质 | |
US20040250105A1 (en) | Method and apparatus for creating an execution shield | |
US7484239B1 (en) | Detecting heap and stack execution in the operating system using regions | |
CN112579988B (zh) | 影子栈数据完整性保护方法、装置和计算机设备 | |
US10929148B2 (en) | Executing services in containers | |
IL266459B1 (en) | A system and method for detecting and alerting the exploitation of security loopholes in computer systems | |
US8863159B2 (en) | System, method and computer program product for inserting an emulation layer in association with a COM server DLL | |
Zonouz et al. | Dynamic memory protection via Intel SGX-supported heap allocation | |
US20240095363A1 (en) | Method, device, and electronic apparatus for securely passing data | |
EP3674940B1 (en) | System and method of forming a log when executing a file with vulnerabilities in a virtual machine | |
Zaheri et al. | Preventing reflective dll injection on uwp apps | |
Helmy et al. | Performance evaluation of system resources utilization with sandboxing applications |
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 |