CN107729747A - 一种面向二进制程序的堆溢出检测方法 - Google Patents
一种面向二进制程序的堆溢出检测方法 Download PDFInfo
- Publication number
- CN107729747A CN107729747A CN201711104808.4A CN201711104808A CN107729747A CN 107729747 A CN107729747 A CN 107729747A CN 201711104808 A CN201711104808 A CN 201711104808A CN 107729747 A CN107729747 A CN 107729747A
- Authority
- CN
- China
- Prior art keywords
- heap
- instruction
- program
- stain
- detection method
- 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
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
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)
- Executing Machine-Instructions (AREA)
Abstract
本发明提出一种面向二进制程序的堆溢出检测方法,其步骤如下:根据程序运行过程中的堆管理操作函数的调用情况,对相关堆管理操作信息进行记录;根据堆管理操作信息生成污点信息并对二者进行关联,通过对污点信息动态传播,动态监控程序运行过程中所有和污点信息相关的操作;如发现某指令中使用该污点数据,则将该条指令作为堆溢出判断指令;根据污点数据确定该指令实际访问内存地址,判断该内存地址是否存在堆溢出。通过动态监控程序运行过程中的堆分配以及堆指针,识别所有堆访问操作过程中的越界行为,从而完成堆溢出的检测。
Description
技术领域
本发明属于网络安全技术领域,具体涉及一种面向二进制程序的堆溢出检测方法。
背景技术
现有软件漏洞类型繁多,而程序缓冲区溢出漏洞是目前最为常见也是可利用性最高的一类漏洞,其根据缓冲区内存的不同可以分为栈溢出漏洞和堆溢出漏洞。其中,栈溢出漏洞是历史最为悠久的一类溢出漏洞,对于该类型漏洞的挖掘、防御以及可利用性分析已经有相当丰富的研究成果;而对于堆溢出漏洞来说,由于堆自身结构的复杂性以及堆分配的动态特性,目前针对其相关的漏洞挖掘检测、成因分析以及可利用性分析是目前软件漏洞研究领域中的热点及难点问题。
现有的堆溢出检测工作主要分为以下两种:
1)基于堆防护页的检测方法:通过在每个堆块的头部或尾部放置不可访问的防护页,如果堆溢出发生并尝试访问防护页,则***会因为内存不可访问而告警或者崩溃,从而检测出堆溢出的发生;
2)基于源码重编译的检测方法:该方法主要是替代原有堆分配、释放等函数库,通过新的具有安全检测的函数库(例如,每次堆分配或者释放时,这些函数库中的安全函数会检测堆管理数据是否被破坏)来检测堆溢出的发生。
上述两类方法主要存在的问题在于效率不理想以及存在对于源码的依赖性。
其中,基于堆防护页的检测方法需要在程序每次堆分配申请时额外分配一定数量的内存来充当防护页,该过程将明显增加***的开销,降低程序的运行效率,使得该方法难以使用于目前流行的大规模程序。而对于第二种借助源码重编译的检测方法,由于其无可避免的需要依赖程序源码,因此对于目前数量众多的闭源软件将无法开展进一步溢出检测分析。
发明内容
针对现有堆溢出检测方法存在的效率不理想以及存在对于源码的依赖性的不足,本发明的目的在于提出一种面向二进制程序的堆溢出检测方法,通过动态监控程序运行过程中的堆分配以及堆指针,识别所有堆访问操作过程中的越界行为,从而完成堆溢出的检测。
本发明所采用的技术方案是:
一种面向二进制程序的堆溢出检测方法,其步骤如下:
根据程序运行过程中的堆管理操作函数的调用情况,对相关堆管理操作信息进行记录;
根据堆管理操作信息生成污点信息并对二者进行关联,通过对污点信息动态传播,动态监控程序运行过程中所有和污点信息相关的操作;
如发现某指令中使用该污点数据,则将该条指令作为堆溢出判断指令;
根据污点数据确定该指令实际访问内存地址,判断该内存地址是否存在堆溢出。
进一步地,所述堆管理操作包括堆分配,堆释放。
进一步地,所述堆管理操作信息包括:堆分配对应的线程标识,堆分配/堆释放的堆起始地址,堆分配/堆释放的大小,是否进行堆分配/堆释放。
进一步地,所述污点信息包括:堆起始地址对应的内存地址及其长度。
进一步地,动态监控程序运行过程中与污点信息相关的操作包括:
通过程序动态监控的方式,获取程序执行过程中的每一条指令,并通过语义解析来进行指令信息的记录,记录内容包括:指令所处的线程标识、指令的语义类型及指令不同操作数所对应的内存地址集合。
进一步地,所述动态监控包括行文监控及指令监控。
进一步地,若指令类型为数据移动或者数据计算,则通过动态污点传播计算,分析相应的污点传播过程。
进一步地,若指令类型为内存地址访问,则根据指令不同操作数所对应的内存地址集合进行判定;
若指令中有操作数为污点,则认定该指令将进行堆内存访问,通过查询污点信息及与其关联的堆管理操作信息来判定访问的内存地址是否超出了其合法的堆空间;
超出则认定存在堆溢出,否则继续进行下一条指令的分析。
一种服务器,其包括存储器和处理器,所述存储器存储计算机程序,所述程序被配置为由所述处理器执行,所述程序包括用于执行前述方法中各步骤的指令。
一种存储计算机程序的计算机可读存储介质,所述计算机程序包括指令,所述指令当由服务器的处理器执行时使得所述服务器执行前述方法中的各个步骤。
通过采取上述技术方案,本发明借助动态污点传播方法,能够细粒度跟踪堆地址相关操作,防止漏报问题发生;通过透明式的动态分析方法,能够保证原有程序的运行效率,可以适用于大规模程序;此外,本发明不需要依赖源代码重编译,能够很好的适应目前数目众多的闭源软件。
综上,本发明提出的面向二进制程序的堆溢出检测方法,解决现有检测方法中存在的漏报、效率低以及依赖源码等问题,能够帮助快速发现程序中存在的堆溢出漏洞,进一步降低堆溢出漏洞给现有互联网环境所带来的潜在危害。
附图说明
图1为本发明一实施例中的面向二进制程序的堆溢出检测方法的流程示意图。
图2为本发明一实施例中的基于污点分析的堆溢出判定的流程示意图。
具体实施方式
下面结合附图详细说明本发明的技术方案:
如图1所示,在一实施例中,提供了一种面向二进制程序的堆溢出检测方法,包括以下步骤:
1.监控程序动态堆分配、释放等行为;
根据程序运行过程中对于堆分配、释放以及重分配等堆管理操作函数的调用情况进行实时记录,并将其相关堆分配(包含重分配)、释放的大小、堆起始地址等堆管理操作信息进行记录。
首先,通过程序动态监控技术,获取堆分配(包含重分配)、释放等行为,并在基础上进行堆操作行为记录。
具体的,本发明使用堆信息HeapInfo=(ThreadID、HeapBase、HeapSize,IsFree)来描述相关的堆分配。
其中,由于在同一个程序中存在多线程同时分配堆内存的情况,因此为了更加有效的区分不同线程的堆分配,用ThreadID来作为不同的线程标识;HeapBase作为本次堆分配的起始地址,也称为堆地址指针,后续将通过跟踪该指针来监控程序对于该堆块数据的访问和写入等操作过程,针对程序的每一次分配都将对应这一个HeapInfo,,而该堆块数据指的是相应HeapInfo指定的堆块数据,;HeapSize用来记录该次堆分配的大小,后续将根据其来进行堆内存访问越界,即堆溢出的主要判定因素,IsFree用来表示该堆块是否正在被使用(分配、重分配)以及被释放,如果被释放则无需进一步溢出检测。
2.堆地址指针污点标记;
将程序运行过程中的堆分配返回的堆起始地址及大小等信息作为污点数据,在后续执行过程中可以此污点数据为基础,进行堆信息的查询,从而帮助检测是否存在堆溢出;污点数据是一个综合信息结构,包括堆起始地址、大小以及是否释放等。
为了能够跟踪程序对于堆块的具体操作过程,采用动态污点传播手段,而该技术手段的关键在于定义污点源、污点传播规则以及污点异常检测规则。异常检测就是后文中所描述的堆溢出检测所描述的内容。
在本实施例中,具体地将所有堆分配的起始地址,即堆地址指针作为污点源,使用传统的污点传播规则,并将所有的内存地址访问指令作为污点异常检测的目标。具体地,对于每一次堆分配过程,将产生一个污点记录,即TaintInfo=(THeapBase,SHeapBase)。其中,THeapBase表示对于HeapBase的污点记录,而SHeapBase则表示该污点记录的字节长度,在32位***中,该长度为4个字节,而在64位***中,该长度为8个字节。
3.基于动态污点传播分析的堆溢出检测;
采用动态污点传播技术,动态监控程序运行过程中所有和上述污点堆地址相关的操作,如果发现某条指令中使用该污点地址作为内存访问地址,则将该条指令作为堆溢出判断指令;
查询该污点地址指针所对应的堆内存区域,并结合待判断的指令实际访问内存地址,判断是否存在堆溢出。
污点传播计算流程主要包括以下三个过程:即首先根据程序动态执行过程提取程序当前执行指令的语义信息;其次,如果该指令是计算指令,则需要判定相关操作数是否为污点,如果是则根据相应的污点传播规则进行污点扩散、清除分析,如果不是则忽略该条指令;最后,如果该指令是数据访问指令,则需要判定该操作数所对应的地址是否为污点,如果是则说明待访问的目标地址为某个堆块,即进行堆内存访问,针对该地址进行溢出检测,如果不是,则忽略该条指令。
具体操作的详细流程可参见图2,即首先通过程序动态监控的方式,获取程序执行过程中的每一条指令,动态监控既包括行文监控,也包括指令监控;并通过语义解析来进行指令信息的记录,这里用InstructionInfo=(ThreadID,Type,AddressSet)来表示指令信息。
其中,ThreadID表示该指令所处的线程标识,只有和其相同的堆地址指针才可进行有效的污点传播以及堆溢出检测;Type表示该指令的语义类型,例如数据移动、数据计算以及内存地址访问等;AddressSet表示该指令不同操作数所对应的内存地址集合,根据该地址集合可以判定相应的操作数是否为污点,即是否为堆地址指针。随后根据每条指令的不同类型,即不同的Type值来进行后续程序行为分析:
如果Type值表示该指令为数据移动或者数据计算指令,那么该指令意味着将要操作相应的堆地址指针,该情况也意味着需要进一步跟踪和该指针有关联的其他数据才可以进一步进行堆溢出判定,否则将漏掉可能的堆溢出访问过程,而通过动态污点传播技术即可实现上述目标;
如果Type值表示该指令内存地址访问指令,那么该指令意味着有可能会通过堆地址指针进行寻址,因此需要首先根据InstructionInfo中的AddressSet来进行判定,如果指令中有操作数为污点,即意味该指令将访问堆内存地址,随后可以通过查询TaintInfo以及和其关联的HeapInfo来判定本次访问的地址是否超出了其合法的堆空间,如果超出则意味着堆溢出的发生,否则继续进行下一条指令的分析。
本发明提出的面向二进制程序的堆溢出检测方法,对于本领域的技术人员而言,可以根据需要自己部署不同的程序动态监控方案,以及在传播过程中添加更加复杂的传播规则,可以根据情况针对每种语义类型部署不同的特殊传播规则、程序敏感点以及处理方法,从而获得达到特定需求的分析目的。
另外,上述方法可通过可执行程序的形式实现,程序可以存储于计算机可读存储介质,也可以通过处理器执行。
尽管为说明目的公开了本发明的具体实施例和附图,其目的在于帮助理解本发明的内容并据以实施,但是本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例和附图所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
Claims (10)
1.一种面向二进制程序的堆溢出检测方法,其步骤如下:
根据程序运行过程中的堆管理操作函数的调用情况,对相关堆管理操作信息进行记录;
根据堆管理操作信息生成污点信息并对二者进行关联,通过对污点信息动态传播,动态监控程序运行过程中所有和污点信息相关的操作;
如发现某指令中使用该污点数据,则将该条指令作为堆溢出判断指令;
根据污点数据确定该指令实际访问内存地址,判断该内存地址是否存在堆溢出。
2.如权利要求1所述的面向二进制程序的堆溢出检测方法,其特征在于,所述堆管理操作包括堆分配,堆释放。
3.如权利要求2所述的面向二进制程序的堆溢出检测方法,其特征在于,所述堆管理操作信息包括:堆分配对应的线程标识,堆分配/堆释放的堆起始地址,堆分配/堆释放的大小,是否进行堆分配/堆释放。
4.如权利要求3所述的面向二进制程序的堆溢出检测方法,其特征在于,所述污点信息包括:堆起始地址对应的内存地址及其长度。
5.如权利要求3所述的面向二进制程序的堆溢出检测方法,其特征在于,动态监控程序运行过程中与污点信息相关的操作包括:
通过程序动态监控的方式,获取程序执行过程中的每一条指令,并通过语义解析来进行指令信息的记录,记录内容包括:指令所处的线程标识、指令的语义类型及指令不同操作数所对应的内存地址集合。
6.如权利要求5所述的面向二进制程序的堆溢出检测方法,其特征在于,所述动态监控包括行文监控及指令监控。
7.如权利要求5所述的面向二进制程序的堆溢出检测方法,其特征在于,若指令类型为数据移动或者数据计算,则通过动态污点传播计算,分析相应的污点传播过程。
8.如权利要求7所述的面向二进制程序的堆溢出检测方法,其特征在于,若指令类型为内存地址访问,则根据指令不同操作数所对应的内存地址集合进行判定;
若指令中有操作数为污点,则认定该指令将进行堆内存访问,通过查询污点信息及与其关联的堆管理操作信息来判定访问的内存地址是否超出了其合法的堆空间;
超出则认定存在堆溢出,否则继续进行下一条指令的分析。
9.一种服务器,其包括存储器和处理器,所述存储器存储计算机程序,所述程序被配置为由所述处理器执行,所述程序包括用于执行权利要求1-8任一项所述方法中各步骤的指令。
10.一种存储计算机程序的计算机可读存储介质,所述计算机程序包括指令,所述指令当由服务器的处理器执行时使得所述服务器执行权利要求1-8任一项所述方法中的各个步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711104808.4A CN107729747A (zh) | 2017-11-10 | 2017-11-10 | 一种面向二进制程序的堆溢出检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711104808.4A CN107729747A (zh) | 2017-11-10 | 2017-11-10 | 一种面向二进制程序的堆溢出检测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107729747A true CN107729747A (zh) | 2018-02-23 |
Family
ID=61214929
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711104808.4A Pending CN107729747A (zh) | 2017-11-10 | 2017-11-10 | 一种面向二进制程序的堆溢出检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107729747A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110895499A (zh) * | 2018-09-13 | 2020-03-20 | 北京奇虎科技有限公司 | 程序溢出保护方法及装置 |
CN114741700A (zh) * | 2022-03-28 | 2022-07-12 | 中国人民解放军战略支援部队信息工程大学 | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及*** |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102129538A (zh) * | 2011-03-04 | 2011-07-20 | 北京邮电大学 | 传感器网络源代码缓冲区溢出漏洞检测***和方法 |
CN103116529A (zh) * | 2011-07-18 | 2013-05-22 | 英飞凌科技股份有限公司 | 用于实时检测缓冲区溢出致堆内存损坏的方法和设备 |
US20140337600A1 (en) * | 2007-12-28 | 2014-11-13 | Intel Corporation | Providing metadata in a translation lookaside buffer (tlb) |
CN105808430A (zh) * | 2016-03-03 | 2016-07-27 | 中国科学院软件研究所 | 一种多语义动态污点分析方法 |
-
2017
- 2017-11-10 CN CN201711104808.4A patent/CN107729747A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140337600A1 (en) * | 2007-12-28 | 2014-11-13 | Intel Corporation | Providing metadata in a translation lookaside buffer (tlb) |
CN102129538A (zh) * | 2011-03-04 | 2011-07-20 | 北京邮电大学 | 传感器网络源代码缓冲区溢出漏洞检测***和方法 |
CN103116529A (zh) * | 2011-07-18 | 2013-05-22 | 英飞凌科技股份有限公司 | 用于实时检测缓冲区溢出致堆内存损坏的方法和设备 |
CN105808430A (zh) * | 2016-03-03 | 2016-07-27 | 中国科学院软件研究所 | 一种多语义动态污点分析方法 |
Non-Patent Citations (2)
Title |
---|
刘洋: "基于动态污点分析的二进制程序缓冲区溢出的研究", 《中国优秀硕士学位论文全文数据库信息科技辑》 * |
孙峰: "一种基于污点分析的缓冲区溢出检测方法", 《科技视界》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110895499A (zh) * | 2018-09-13 | 2020-03-20 | 北京奇虎科技有限公司 | 程序溢出保护方法及装置 |
CN114741700A (zh) * | 2022-03-28 | 2022-07-12 | 中国人民解放军战略支援部队信息工程大学 | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 |
CN114741700B (zh) * | 2022-03-28 | 2024-05-03 | 中国人民解放军战略支援部队信息工程大学 | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及*** |
CN117435440B (zh) * | 2023-12-20 | 2024-04-05 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及*** |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103399812B (zh) | 基于Xen硬件虚拟化的磁盘文件操作监控***及监控方法 | |
US10255434B2 (en) | Detecting software attacks on processes in computing devices | |
KR101519845B1 (ko) | 안티디버깅 방법 | |
CN110225029B (zh) | 注入攻击检测方法、装置、服务器及存储介质 | |
CN109002721A (zh) | 一种信息安全漏洞的挖掘分析方法 | |
CN104008329B (zh) | 一种基于虚拟化技术的软件隐私泄露行为检测方法及*** | |
CN102651062B (zh) | 基于虚拟机架构的恶意行为跟踪***和方法 | |
CN104346148A (zh) | 获取程序性能消耗信息的方法、装置及*** | |
CN103095821B (zh) | 一种基于虚拟机迁移识别的持续审计*** | |
US20180046441A1 (en) | Code relatives detection | |
US20220335135A1 (en) | Vulnerability analysis and reporting for embedded systems | |
CN107729747A (zh) | 一种面向二进制程序的堆溢出检测方法 | |
US20220083668A1 (en) | Method for discovering vulnerabilities of operating system access control mechanism based on model checkin | |
CN111625833A (zh) | 一种高效的软件程序释放后重用漏洞判定方法和装置 | |
CN113419960B (zh) | 用于可信操作***内核模糊测试的种子生成方法及*** | |
KR101696694B1 (ko) | 역추적을 이용한 소스 코드 취약점 분석 방법 및 장치 | |
Sadeghi et al. | Mining the categorized software repositories to improve the analysis of security vulnerabilities | |
CN114780962A (zh) | 基于动态能量调控的Windows程序模糊测试方法及*** | |
JP2016099857A (ja) | 不正プログラム対策システムおよび不正プログラム対策方法 | |
CN113282606A (zh) | 数据处理方法、装置、存储介质和计算设备 | |
Al-Sharif et al. | The Effects of Platforms and Languages on the Memory Footprint of the Executable Program: A Memory Forensic Approach. | |
KR102324950B1 (ko) | 취약점을 효율적으로 탐지할 수 있는 아키텍처로 구성된 힙 영역 메모리 관리 방법 및 그 장치 | |
CN114741700B (zh) | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 | |
CN116595523A (zh) | 基于动态编排的多引擎文件检测方法、***、设备及介质 | |
CN114840418A (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 | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20180223 |
|
WD01 | Invention patent application deemed withdrawn after publication |