CN114065208A - 一种面向堆内存错误的检测方法及装置 - Google Patents
一种面向堆内存错误的检测方法及装置 Download PDFInfo
- Publication number
- CN114065208A CN114065208A CN202111202487.8A CN202111202487A CN114065208A CN 114065208 A CN114065208 A CN 114065208A CN 202111202487 A CN202111202487 A CN 202111202487A CN 114065208 A CN114065208 A CN 114065208A
- Authority
- CN
- China
- Prior art keywords
- memory
- heap
- execution
- program
- vulnerability
- 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
-
- 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
-
- 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/55—Detecting local intrusion or implementing counter-measures
- G06F21/556—Detecting local intrusion or implementing counter-measures involving covert channels, i.e. data leakage between processes
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种面向堆内存错误的检测方法及装置,包括:选取输入参数后,对被测试程序进行concolic执行;当跟踪concolic执行中的每一执行跟踪路径时,对每一分支生成对应的分支约束,对每一与堆相关操作的代码块进行漏洞检测,并对存在与堆相关漏洞的代码块生成漏洞约束;基于每一执行跟踪路径对应的分支约束与漏洞约束,生成该执行跟踪路径的测试用例;将各测试用例分别输入被测试程序,得到经验证的被测试程序堆内存错误。本发明能够有效的增加程序覆盖率的同时尽快找到待分析的目标点,在保持与程序真实运行环境强一致性前提下,最小化系统性能开销,能够检测不同类型的堆内存错误。
Description
技术领域
本发明涉及软件安全测试,尤其涉及一种面向堆内存错误的检测方法及装置。
背景技术
内存错误是发生在程序运行过程中,当内存中改写的内容超出了编程者原有意图的一种行为(https://en.wikipedia.org/wiki/Memory_corruption)。现代的编程语言,如C、C++ 有强大的内存管理与指针运算的特性,也因为这种特性带来了内存安全的隐患(L.Szekeres, M.Payer,T.Wei and D.Song,"SoK:Eternal War in Memory,"2013IEEESymposium on Security and Privacy,2013,pp.48-62,doi:10.1109/SP.2013.13)。
由于内存错误导致的漏洞主要分为基于栈的内存漏洞与基于堆的内存漏洞。它们会导致非常严重的危险,如:系统崩溃,拒绝服务,任意代码执行和数据泄露,等等。其中,基于栈的内存漏洞曾经是最普遍,最受欢迎的。而随着有效的针对栈漏洞利用的防御技术的部署 (Gregory J.Duck and Lorenzo Yap,Cavallaro.Stack Bounds Protection withLow Fat Pointers.In NDSS,2017),基于堆的内存漏洞变得原来越普遍。例如,在Windows7系统上25%的利用都是基于堆内存漏洞(Microsoft.Software vulnerabilityexploitation trends:Exploring the impact of software mitigations on patternsof vulnerability exploitation(2013).http://download.microsoft.com/download/F/D/F /FDFBE532-91F2-4216-9916-2620967CEAF4/Software%20Vulnerability%20Exploita- tion%20Trends.pdf),CVE-2021-3156是由于off-by-one引起的堆内存溢出,它能够导致权限提升并且存在与大多数Linux系统中。
当前,有很多的方法被提出用来保护堆上的内存安全。它们主要分为两个类别,一类是通过诸如在漏洞发生的时候终止软件的运行等措施来加强软件的保护。一类是在软件发布之前经过大量的,广泛的测试。尽管第一种方法能够有效的阻止程序的漏洞被利用,当时它们并没有消除内存漏洞,并且会带来巨大的性能开销以及导致拒绝服务,如:文献Emery D Berger and Benjamin G Zorn.Diehard:probabilistic memory safety forunsafe languages.In ACM SIGPLAN Notices,volume 41,pages 158–168,2006、文献GeneNovark and Emery D Berger.Dieharder:securing the heap.In CCS,pages 573–584.ACM,2010、文献Nick Nikiforakis,Frank Piessens,and Wouter Joosen.Heapsentry:Kernel-assisted protection against heap overflows.In DIMVA,2013及文献QiangZeng,Mingyi Zhao,and Peng Liu.Heaptherapy:An efficient end-to-end solutionagainst heap buffer overflows.In 2015 45th Annual IEEE/IFIP InternationalConference on Dependable Systems and Networks,pages 485–496.IEEE,2015,因此有必要在软件发布之前来检测内存相关的漏洞。
当前,主要有静态分析与动态分析的方法来检测基于堆的内存漏洞。静态分析的方法是通过扫描程序源代码来发现隐藏在程序内的漏洞,例如文献Yuhan Gao,LiweiChen,Gang Shi,Fei Zhang.A Comprehensive Detection of Memory CorruptionVulnerabilities for C/C++Programs[C]//2018IEEE Intl Conf on Parallel&Distributed Processing with Applications,Ubiquitous Computing&Communications,Big Data&Cloud Computing,Social Computing&Networking,Sustainable Computing&Communications (ISPA/IUCC/BDCloud/SocialCom/SustainCom).IEEE,2018与文献PengLuo,Dz A,Yd B,et al.Static detection of real-world buffer overflow induced byloop- ScienceDirect[J].Computers&Security,89。虽然这种静态分析的方法能够获取高覆盖率。但是静态检测由于没有实际运行程序,其结果会包含大量的潜在的误报,而确认这些潜在的误报需要耗费大量的人力资源来做源代码审查。并且由于基于堆的内存时动态分配和回收的,目前其对应的检测方法主要是采用动态检测。
然而,现存的动态分析工具都是针对某一类的堆内存相关漏洞检测,而不是全面的检测所有与堆内存相关的漏洞。另外一方面,现有的堆内存相关检测工具不能自动遍历程序的路径并生成其对应的测试用例,并且产生巨大系统性能开销。如:LeakFix只能检测基于堆内存的内存泄露相关漏洞(Qing Gao,Yingfei Xiong,Yaqing Mi,Lu Zhang,WeikunYang, Zhaoping Zhou,Bing Xie,and Hong Mei.2015.Safe memory-leak fixing for Cprograms. In Proceedings of the 37th International Conference on SoftwareEngineering- Volume 1(ICSE'15).IEEE Press,459–470),Heaptherapy(Qiang Zeng,Mingyi Zhao, and Peng Liu.Heaptherapy:An efficient end-to-end solutionagainst heap buffer overflows.In 2015 45th Annual IEEE/IFIP InternationalConference on Dependable Systems and Networks,pages 485–496.IEEE,2015)和Hotracer(Xiangkun Jia,Chao Zhang,Purui Su,Yi Yang,Huafeng Huang,Dengguo Feng:Towards Efficient Heap Overflow Discovery.USENIX Security Symposium 2017:989-1006),能够检测基于堆内存的缓冲区溢出漏洞。AdderessSanitizer(KonstantinSerebryany,Derek Bruening, Alexander Potapenko,and DmitryVyukov.2012.AddressSanitizer:a fast address sanity checker.In Proceedings ofthe 2012USENIX conference on Annual Technical Conference(USENIX ATC'12).USENIX Association,USA,28)能够全面检测所有与堆内存相关的漏洞,但是它带来73%的系统性能开销,并且不能够自动遍历程序的路径与生成对应的测试用例。
从某种程度上来说,离线的组合现存的检测工具也能够达到动态检测的效果。但这种离线组合的方法通常是采用现存的动态分析工具来自动遍历程序的不同路径并生成对应的测试输入,然后将被测试程序运行在内存检测工具的同时依次注入上一步生成的测试输入,并查看检测结果。例如:Dowser(Istvan Haller,Asia Slowinska,MatthiasNeugschwandtner, and Herbert Bos.2013.Dowsing for overflows:a guided fuzzerto find buffer boundary violations.In Proceedings of the 22nd USENIXconference on Security (SEC'13).USENIX Association,USA,49–64)和BORG(MatthiasNeugschwandtner,Paolo Milani Comparetti,Istvan Haller,and Herbert Bos.Theborg:Nanoprobing binaries for buffer overreads.In Proceedings of the 5th ACMConference on Data and Application Security and Privacy,CODASPY’15,2015)。BORG是离线组合S2E和 AddressSanitizer。这种简单的组合不仅会由于在动态符号执行和基于堆的内存漏洞检测过程中采用非一致性内存模型而产生一些漏报,并且从系统性能开销的角度来说,这种简单的组合使得每条程序的路径运行次数加倍从而导致浪费大量的系统资源而增加系统开销负担。
发明内容
本发明提出了一种面向堆内存错误的动态检测方法CTHM及装置,CTHM基于输入参数的类型和数量的不同采用启发式方法选择初始输入,能够有效的增加程序覆盖率的同时尽快找到待分析的目标点。CTHM采用自定义的动态符号执行内存模型,在保持与程序真实运行环境强一致性前提下,最小化系统性能开销。CTHM提供了一个全面的分析引擎,不仅能够全面的检测所有与堆内存错误相关的漏洞,而且能够充分发挥这三种检测引擎的特点减少系统性能开销。
本发明的技术方案包括:
一种面向堆内存错误的动态检测方法,其步骤包括:
1)选取输入参数后,对被测试程序进行concolic执行;
2)当跟踪concolic执行中的每一执行跟踪路径时,对每一分支生成对应的分支约束,对每一与堆相关操作的代码块进行漏洞检测,并对存在与堆相关漏洞的代码块生成漏洞约束;
3)基于每一执行跟踪路径对应的分支约束与漏洞约束,生成该执行跟踪路径的测试用例;
4)将各测试用例分别输入被测试程序,得到经验证的被测试程序堆内存错误。
进一步地,被测试程序进行concolic执行时,定时或不定时地更换不同类型与数量的输入参数。
进一步地,通过以下策略获取不同类型与数量的输入参数:
1)对于输入参数是已知类型与数量的被测试程序,从发布程序软件包的测试集中选择不同类型与数量的输入参数;
2)对于输入参数是位置的类型与数量的被测试程序,使用fuzzer来生成一系列的输入参数后,使用启发式方法获取不同类型与数量的输入参数。
进一步地,通过以下步骤查找所述分支及与堆相关操作的代码块:
1)将被测试程序在自定义的内存模型执行,生成内存对象,其中所述内存模型是基于现有的动态符号执行内存模型的扩展,其利用内存分配器生成内存对象,所述内存对象的变量包括:内存对象索引、内存对象起始地址、内存对象大小和内存对象属性;
2)执行引擎依据内存对象的各变量,查找所述分支及与堆相关操作的代码块。
进一步地,内存对象中依据符号化标志位Sym-flag,标志存储的是具体值或符号值。
进一步地,内存对象属性包括:内存地址是否可被寻找的属性A和内存块是否初始化的属性V。
进一步地,进程地址空间内存块以字节为单位,其中每一个字节分配一个bit的A位与一个bit的V位。
进一步地,与堆相关漏洞包括:缓冲区溢出漏洞、堆内存未初始化漏洞、堆内存非法访问漏洞和内存泄露与双重释放的堆错误。
进一步地,通过以下步骤检测缓冲区溢出漏洞:
1)当进程访问某一个内存对象时,利用地址反向方法查找该内存对象所在的域;
2)利用访问的offset查找所在域的地址是否超过内存对象的边界:若是,则检测到缓冲区溢出漏洞,其中所述内存对象的边界通过内存对象起始地址与内存对象大小得到。
进一步地,通过以下步骤检测堆内存未初始化漏洞:
1)对于读或写的内存区域,查找该内存区域对应的影子内存;
2)获取该影子内存块对应的内存对象属性;
3)将访问内存的值加载到CPU后,基于内存块是否初始化的属性V,得到堆内存未初始化漏洞的检测结果。
进一步地,通过以下步骤检测堆内存非法访问漏洞:
1)对于读或写的内存区域,查找该内存区域对应的影子内存;
2)获取该影子内存块对应的内存对象属性;
3)基于内存地址是否可被寻找的属性A,得到堆内存非法访问漏洞的检测结果。
进一步地,通过以下步骤检测内存泄露与双重释放的堆错误:
1)将每条执行跟踪路径上分配与释放的内存对象以链表形式串在一起,其中链表的表头就是执行跟踪路径名;
2)当分配一块新的内存对象的时候,就会将对应的内存对象索引挂到该链表上去;当释放一块内存对象的时候,就会从该链表上删除其对应的内存对象索引;
3)当一条执行跟踪路径执行完后,若该执行跟踪路径对应的链表不为NULL,则检测到内存泄露的堆错误;同时,当释放一块内存对象的时候,在对应链表上找不到相应的内存对象索引,则检测到双重释放的堆错误。
进一步地,通过影子内存查找与判断的方法,检测与堆相关漏洞。
一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行以上所述方法。
一种电子装置,包括存储器和处理器,其中存储器存储执行以上所述方法的程序。
与现有技术相比,本发明取得了以下技术效果:
1、本发明基于输入参数的类型和数量的不同采用启发式方法选择初始输入,能够有效的增加程序覆盖率的同时尽快找到待分析的目标点;
2、本发明采用自定义的动态符号执行内存模型,在保持与程序真实运行环境强一致性前提下,最小化系统性能开销;
3、本发明提供了一个全面的分析引擎,不仅能够检测不同类型的堆内存错误,而且能够充分发挥这三种检测引擎的特点减少系统性能开销。
附图说明
图1为本发明的总体框架示意图。
图2为自定义内存模型示意图;
图3为标志位的管理示意图;
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了使得这种组合在实际工程中能够有效地,切实可行的应用,我们需要构建面向堆内存漏洞检测的精确内存模型,并且增加对应的检测引擎,以便在动态程序分析过程中能够实时的与求解器进行交互。我们需要解决如下挑战:
1、动态程序分析中内存模型是非常重要的一部分。精确的内存模型不仅能够与程序真实运行环境保持一致的前提下,准确检测指定类型的内存错误,而且能够减少不必要的内存开销。CTHM采用自定义的内存模型解决了上述问题。
2、分析引擎对与动态程序分析功能能够检测哪种类型的错误至关重要,并且直接影响系统性能。CTHM是面向堆内存错误的综合性检测工具,它针对不同堆内存错误的特点采用不同的分析方法,有效的解决了堆内存错误全面性检测问题的前提下,尽量减少系统性能开销。
为更好地说明本发明,现对本发明使用的部分现有技术进行说明:
内存布局:程序运行的所占用的用户空间按照“访问属性一致的地址空间存放在一起”的原则,划分为5个不同的内存区域,分别是代码段内存区域、数据段内存区域、BSS段内存区域、堆内存区域、栈内存区域。(1)代码段内存区域是用来存储程序执行的代码,该区域是可以被共享的,例如,父进程共享相同的代码段内存区域给其子进程。为了防止代码段内存区域被错误的改写,该区域其属性通常被设置为只读。(2)数据段内存区域,存储的是已经初始化的全局变量和静态局部变量,它可以进一步划分为只读数据段和可读可写数据段,例如,程序中的常量字符串就是只读数据段。(3)BSS内存区域,被用来存储没有被显式初始化的全局变量和静态局部变量,这些变量在程序运行之前被隐式的初始化为0。(4)堆内存区域,是在程序运行过程中动态分配与释放的。它的大小是不固定,可以动态增加或者减少,当程序调用内存分配函数(如:malloc()),它将在该区域分配一块内存,并且返回这段新分配内存的起始地址。动态分析的内存区域一般是由程序员动态释放的(如:free())。当程序运行结束,程序员没有释放某段分配的内存,通常是由操作系统回收的。(5)栈内存区域,是由编译器自动分配与释放的,主要存储的是函数调用参数,返回值和非静态局部变量。
内存错误类型:从堆内存生命周期的角度来说,基于堆内存的漏洞可以被分为以下四种类型。(1)缓冲区溢出,是由访问内存空间的大小超出了其分配内存空间而引起。(2)非法访问,主要是由于访问不是自己内存而引起的。(3)未初始化访问,是由于访问未初始化内存空间引起。(4)错误的内存管理,主要包括内存泄露和双重释放。
Concolic执行:Concolic执行的核心思想是允许运行的程序使用符号值而不仅仅是具体值作为程序的输入。程序选择性在符号执行引擎和具体执行引擎上运行,它维护每条路径的上约束信息并且能够自动遍历程序的不同路径,同时生成对应的测试输入。Concolic执行是组合动态符号执行和具体执行。众所周知,动态符号执行的一个有利因素就是尽可能多的探索程序的不同路径,它可以有效地避免相同路径的重复探索并且减少不必要的内存开销。动态符号执行另一个有利因素就是在不同执行路径上自动生成测试输入。正因为这些优势,动态符号执行被用在程序错误检测上。然而动态符号执行的缺点就是动态执行过程中由于路径爆炸而消耗大量的内存资源和符号化参数在程序执行过程中可能丢失的问题。为了解决上述问题,具体执行被引入到动态符号执行中来缓和上述问题,也即concolic执行。
本发明的面向堆内存错误检测CTHM总体框架图如图1所示,
Step1:在预处理阶段,CTHM选取不同类型和数量的程序输入参数作Concolic执行的种子,这些不同的种子作为concolic执行的初始输入。CTHM在Concolic执行中每间隔一段时间就会自动变换种子。每一组种子输入在concolic执行中生成执行跟踪路径,在生成的执行跟踪路径上执行后续step2-step4操作。
Step2:被测试程序运行在自定义的内存模型执行,该自定义的内存模型是基于现存的通用动态符号执行内存模型的扩展。被测试程序在concolic执行引擎执行过程中,每遇到一个分支会生成对应的分支约束。同时,执行引擎在遇到与堆相关操作代码块时候,将其扔给内存漏洞检测引擎,内存检测引擎会生成相应的漏洞约束。
Step3:每个分支块结束的时候就会将step2中生成的分支约束与漏洞约束组合在一起扔给求解器求解,同时判断经过这条分支的路径是否结束,如果结束,执行step4.如果没有结束,跳转到step2继续收集下一个分支块的漏洞约束和分支约束。
Step4:当单条路径分析结束时候,CTHM会依据step3求解器生成的testcase(测试用例)作为被测试程序的输入,验证漏洞的真实性,将结果以报告的形式提交给用户(即:报告程序在该testcase输入下,会出现漏洞(错误))。同时与路径选择器交互,判断是否还有其它相关路径需要分析,如果有,路径选择器选择一条新的路径跳转到step2执行。如果没有,则结束。
本发明的具体实施细节包括:
1、预处理
对于被测试的程序的分析,我们可能有许多样本集作为concolic执行的初始种子。这些输入种子主要包括输入参数的不同类型和输入参数的不同数量。一些研究表明,如果仅仅只使用一个输入种子,或者相同类型和相同数量的输入参数,concolic执行在运行一定的时间后可能会执行相同的路径。因此,本发明选择不同类型和不同数量的输入参数作为初始种子,并且在程序运行某一个固定时间后自动的变换不同种子作为初始输入,以此来增加程序的覆盖率和快速的到达堆内存操作的待分析目标点。
对于输入参数是已知的类型和数量的被测试程序,我们从发布程序软件包的测试集中选择不同类型和数量的输入参数作为输入种子。对于输入参数是位置的类型和数量的被测试程序,我们使用fuzzer来生成一系列的输入,然后使用启发式方法来选择不同类型和数量的输入参数作为后续concolic执行的种子。
2、自定义的内存模型
运行在计算机上的任意程序都是使用一种假定的内存模型,或者在某种程序上需要扩展。例如:X86处理器将flat32或者64位地址空间分割成内存页,这就是一种内存模型。在动态符号执行过程中,内存模型主要被用于负责跟踪符号状态,并且能够处理内存相关指令的语义。因此,内存模型是concolic执行的核心,是被用来辅助进行内存错误安全检测的关键组件。同时,内存模型的准确性将会影响程序分析结果的准确性,不同的内存模型实际上就是在复杂性与性能开销之间的平衡。内存模型的构建可以使用线性地址方法或数组模型方法,下面以线性地址方法进行详细说明:
本发明中自定义的内存模型是基于现有的动态符号执行内存模型的扩展。它是一种线性地址空间,采用数组模型的改进,在保证每一个内存对象在此空间上不相交的同时,能够提供高效的查找、删除、修改等操作。如图2所示。memory object是内存分配器(如GNU中 ptmalloc)从内存模型中产生的。内存对象中依据符号化标志位Sym-flag,来标志存储的是具体值还是符号值。下面对该自定义内存对象的数据结构做一下介绍,每个MemoryObject主要有一下几个变量:(1)Index:用于标志每个MemoryObject的唯一索引,(2)S-address:每个MemoryObject的起始地址;(3)size:MemoryObject对象的大小,(4)A/V:标志该 MemoryObject的属性,A表示该内存地址是否可被寻找,V表示该内存块是否初始化,用来检测内存访问时候的合法性与完整性,对于进程地址空间内存块以字节为单位,每一个字节分配一个bit的A位与一个bit的V位。在本发明中,每个进程地址空间的内存块,每一个字节都有1位来表示A,1位来表示V。
A/V标志位的管理如图3所示,CTHM采用直接映射的方法将应用程序的地址的属性映射到影子内存中。一个完整的应用程序地址空间被映射到单一的影子内存空间去,这使得影子映射的效率非常高,并且采用紧凑的影子编码方式使得影子内存空间的大小是应用程序内存空间大小的比例是1:4。
内存分配函数malloc返回的地址都是以8字节对齐,每一个字节都有一个A位与一个V 位(如图3)。
(1)A位:每个内存字节都有一个A位来表示对应的内存地址访问的合法性。A=0表示不可访问的字节,A=1表示可以访问的字节。当程序成功申请一块内存空间,它对应的内存标识为A会被设置为1。当程序释放一块内存地址空间,它对应的A标识位会被设置为0。CTHM使用该标识位来检测非法内存访问错误。
(2)V位:每个内存字节都有一个V位来标志该字节的值是否已经定义。V=1标识该字节已经定义,V=0标识该字节没有被定义,没有被定义的字节当访问的时候就会发生未知错误。CTHM使用该标志位来检测未初始化访问错误。
3、内存检测引擎
内存漏洞检测引擎是被用来在程序运行过程中,检测堆内存相关漏洞。该检测引擎主要包括三个检测模块,用来检测四种类型的堆相关的漏洞。(1)缓冲区溢出检测模块,这个模块被用来检测面向堆的缓冲区的越界访问。(2)未初始化&非法访问检测模块,这个模块被用来检测对应的堆内存没有被初始化,或者访问了不是自己的堆内存空间。(3)错误管理检测模块,这个模块被用于检测内存泄露与双重释放的堆错误。
(1)缓冲区溢出检测模块:采用地址反查技术,当进程访问某一个MemoryObject时,利用地址反向查找该MemoryObject所在的域,再利用访问的offset查找其地址是否超过 MemoryObject的边界(S-address+size)。MemoryObject采用红黑树管理方法,这样,在利用地址反查技术查找某一个MemoryObject时,其时间复杂度为O(h)。
(2)未初始化&非法访问检测模块:当程序读或者写某一块内存区域时候,CTHM首先找到该内存区域对应的影子内存,然后判断该块内存对应影子内存对应的A与V位。如果A=0, CTHM就会报告非法访问错误,当该访问内存的值被加载到CPU后,CTHM判断该V是否为0,如果V=0,CTHM就会报告该块内存没有被初始化。
(3)错误管理检测模块:为了检测堆内存管理中是否存在错误,我们使用链表结构来管理堆内存对象。在concolic执行过程中,每条路径上分配与释放的内存对象都会以链表形式串在一起,链表的表头就是路径名,当分配一块新的内存对象的时候,就会将其对应的index 挂到该链表上去,当释放一块内存对象的时候,就会从该链表上删除其对应的index。当一条路径执行完后,查看该路径对应的链表是否NULL。如果不为NULL,就会报告内存泄露的警告。同时,当释放一块内存对象的时候,在对应链表上找不到其index,就会报告双重释放的警告。
除了上述三种检测方法之外,本发明也可以仅仅通过影子内存查找与判断的方法解决内存漏洞的检测。
以上所述的实施例仅是对本发明的特定实例进行描述,并非对本发明的范围进行限定,在不脱离本发明设计精神的前提下,本领域普通技术人员对本发明的技术方案做出的各种变形和改进,均应落入本发明权利要求书确定的保护范围内。
Claims (10)
1.一种面向堆内存错误的动态检测方法,其步骤包括:
1)选取输入参数后,对被测试程序进行concolic执行;
2)当跟踪concolic执行中的每一执行跟踪路径时,对每一分支生成对应的分支约束,对每一与堆相关操作的代码块进行漏洞检测,并对存在与堆相关漏洞的代码块生成漏洞约束;
3)基于每一执行跟踪路径对应的分支约束与漏洞约束,生成该执行跟踪路径的测试用例;
4)将各测试用例分别输入被测试程序,得到经验证的被测试程序堆内存错误。
2.如权利要求1所述的方法,其特征在于,被测试程序进行concolic执行时,定时或不定时地更换不同类型与数量的输入参数;通过以下策略获取不同类型与数量的输入参数:
1)对于输入参数是已知类型与数量的被测试程序,从发布程序软件包的测试集中选择不同类型与数量的输入参数;
2)对于输入参数是位置的类型与数量的被测试程序,使用fuzzer来生成一系列的输入参数后,使用启发式方法获取不同类型与数量的输入参数。
3.如权利要求1所述的方法,其特征在于,通过以下步骤查找所述分支及与堆相关操作的代码块:
1)将被测试程序在自定义的内存模型执行,生成内存对象,其中所述内存模型是基于现有的动态符号执行内存模型的扩展,其利用内存分配器生成内存对象,所述内存对象的变量包括:内存对象索引、内存对象起始地址、内存对象大小和内存对象属性,所述内存地址是否可被寻找的属性A和内存块是否初始化的属性V;
2)执行引擎依据内存对象的各变量,查找所述分支及与堆相关操作的代码块。
4.如权利要求3所述的方法,其特征在于,与堆相关漏洞包括:缓冲区溢出漏洞、堆内存未初始化漏洞、堆内存非法访问漏洞和内存泄露与双重释放的堆错误。
5.如权利要求4所述的方法,其特征在于,通过以下步骤检测缓冲区溢出漏洞:
1)当进程访问某一个内存对象时,利用地址反向方法查找该内存对象所在的域;
2)利用访问的offset查找所在域的地址是否超过内存对象的边界:若是,则检测到缓冲区溢出漏洞,其中所述内存对象的边界通过内存对象起始地址与内存对象大小得到。
6.如权利要求4所述的方法,其特征在于,通过以下步骤检测堆内存未初始化漏洞:
1)对于读或写的内存区域,查找该内存区域对应的影子内存;
2)获取该影子内存块对应的内存对象属性;
3)将访问内存的值加载到CPU后,基于内存块是否初始化的属性V,得到堆内存未初始化漏洞的检测结果。
7.如权利要求4所述的方法,其特征在于,通过以下步骤检测堆内存非法访问漏洞:
1)对于读或写的内存区域,查找该内存区域对应的影子内存;
2)获取该影子内存块对应的内存对象属性;
3)基于内存地址是否可被寻找的属性A,得到堆内存非法访问漏洞的检测结果。
8.如权利要求4所述的方法,其特征在于,通过以下步骤检测内存泄露与双重释放的堆错误:
1)将每条执行跟踪路径上分配与释放的内存对象以链表形式串在一起,其中链表的表头就是执行跟踪路径名;
2)当分配一块新的内存对象的时候,就会将对应的内存对象索引挂到该链表上去;当释放一块内存对象的时候,就会从该链表上删除其对应的内存对象索引;
3)当一条执行跟踪路径执行完后,若该执行跟踪路径对应的链表不为NULL,则检测到内存泄露的堆错误;同时,当释放一块内存对象的时候,在对应链表上找不到相应的内存对象索引,则检测到双重释放的堆错误。
9.如权利要求3所述的方法,其特征在于,通过影子内存查找与判断的方法,检测与堆相关漏洞。
10.一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行如权利要求1-9中任一所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111202487.8A CN114065208A (zh) | 2021-10-15 | 2021-10-15 | 一种面向堆内存错误的检测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111202487.8A CN114065208A (zh) | 2021-10-15 | 2021-10-15 | 一种面向堆内存错误的检测方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114065208A true CN114065208A (zh) | 2022-02-18 |
Family
ID=80234584
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111202487.8A Pending CN114065208A (zh) | 2021-10-15 | 2021-10-15 | 一种面向堆内存错误的检测方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114065208A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114579976A (zh) * | 2022-02-25 | 2022-06-03 | 中国人民解放军国防科技大学 | 基于状态转换的堆内存破坏漏洞自动验证方法和系统 |
-
2021
- 2021-10-15 CN CN202111202487.8A patent/CN114065208A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114579976A (zh) * | 2022-02-25 | 2022-06-03 | 中国人民解放军国防科技大学 | 基于状态转换的堆内存破坏漏洞自动验证方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11061833B2 (en) | Apparatus and method for handling page protection faults in a computing system | |
Dhurjati et al. | Efficiently detecting all dangling pointer uses in production servers | |
Serebryany et al. | {AddressSanitizer}: A fast address sanity checker | |
Lee et al. | Preventing Use-after-free with Dangling Pointers Nullification. | |
Dhurjati et al. | Backwards-compatible array bounds checking for C with very low overhead | |
CN102129410B (zh) | 提供扩展的存储器保护 | |
Xu et al. | Testing for buffer overflows with length abstraction | |
Shin et al. | CRCount: Pointer Invalidation with Reference Counting to Mitigate Use-after-free in Legacy C/C++. | |
WO2012148841A1 (en) | Method and apparatus for detecting memory access faults | |
US20060277371A1 (en) | System and method to instrument references to shared memory | |
Hirzel et al. | On the usefulness of type and liveness accuracy for garbage collection and leak detection | |
Chen et al. | Runtime detection of memory errors with smart status | |
Cloosters et al. | {SGXFuzz}: Efficiently synthesizing nested structures for {SGX} enclave fuzzing | |
Pagani et al. | Back to the whiteboard: A principled approach for the assessment and design of memory forensic techniques | |
Trabish et al. | Relocatable addressing model for symbolic execution | |
Bernhard et al. | xTag: mitigating use-after-free vulnerabilities via software-based pointer tagging on Intel x86-64 | |
CN114065208A (zh) | 一种面向堆内存错误的检测方法及装置 | |
Bramley et al. | Picking a CHERI Allocator: Security and Performance Considerations | |
Milewicz et al. | Runtime checking c programs | |
Gao et al. | A comprehensive detection of memory corruption vulnerabilities for C/C++ programs | |
Wang et al. | Dangdone: Eliminating dangling pointers via intermediate pointers | |
Liu et al. | Prober: practically defending overflows with page protection | |
Ling et al. | GIANTSAN: Efficient Memory Sanitization with Segment Folding | |
Romano et al. | symMMU: Symbolically executed runtime libraries for symbolic memory access | |
Hiser et al. | Meds: The memory error detection system |
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 |