CN106295354B - 一种Android系统堆溢出漏洞验证方法及装置 - Google Patents
一种Android系统堆溢出漏洞验证方法及装置 Download PDFInfo
- Publication number
- CN106295354B CN106295354B CN201610645266.0A CN201610645266A CN106295354B CN 106295354 B CN106295354 B CN 106295354B CN 201610645266 A CN201610645266 A CN 201610645266A CN 106295354 B CN106295354 B CN 106295354B
- Authority
- CN
- China
- Prior art keywords
- heap
- overflow
- function
- input sample
- loophole
- 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.)
- Active
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/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
- 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/034—Test or assess a computer or a system
Abstract
本发明提供一种Android系统的堆溢出漏洞验证装置和方法,包括:漏洞检测模块,用于向堆缓冲区填写第一输入样本,检测是否发生堆溢出,以确定堆溢出漏洞的存在性;利用判定模块,用于根据漏洞检测模块的结果,向堆缓冲区填写第二输入样本,通过执行漏洞引发Android系统的系统进程崩溃,以确定堆溢出漏洞被利用的可能性;利用验证模块,用于根据利用判定模块的结果,向堆缓冲区填写第三输入样本,通过执行漏洞控制Android系统的系统进程的执行流程,以验证堆溢出漏洞的可利用性。本申请可以有效判断Android系统是否存在特定的堆溢出漏洞,能否被攻击者利用,评估堆溢出漏洞给Android系统带来的安全风险,提升系统安全性。
Description
技术领域
本发明涉及信息安全技术领域,涉及一种移动智能终端的操作系统的堆溢出漏洞验证方法,更具体地,涉及一种Android系统的堆溢出漏洞验证方法。
背景技术
随着移动互联网的快速发展,Android系统已经成为目前全球市场占比最高的移动智能终端操作系统。基于Android系统的智能设备作为用户日常社交通信和移动办公的媒介,存储了大量的用户隐私信息和敏感数据,因此很容易成为恶意攻击的主要目标。
近年来,Android系统不断曝光各种漏洞,严重影响了系统自身的安全性,进而威胁到上层应用软件的数据、业务和代码安全。Android系统更新机制慢、更新周期长和版本碎片化问题,使得系统漏洞的补丁无法及时有效地部署到用户的终端设备上,这在无形中提升了系统漏洞的利用价值,为攻击者提供了可乘之机。
其中,堆溢出漏洞是一类危害很大的Android系统漏洞。堆溢出漏洞能导致堆内存空间中的缓冲区溢出,覆盖一些关键数据,让攻击者有机会篡改系统的执行流程,控制系统去执行恶意代码,达到窃取隐私信息和敏感数据的目的。为了提升系统安全性,有必要对各个版本的Android系统中的堆溢出漏洞进行验证,以判断Android系统是否存在特定的堆溢出漏洞,并且这些漏洞能否被攻击者利用。
中国发明专利CN104751056A披露了一种基于攻击库的漏洞验证系统与方法,该方法以漏洞扫描结果为基础设计验证方法,在虚拟机中构建合适的模拟攻击环境,编写漏洞验证脚本进行测试,以验证目 标漏洞的存在性和危害性。多个漏洞验证脚本形成一个攻击库,当新的漏洞出现时,匹配攻击库中的漏洞验证脚本进行验证。该方案是在Windows平台上实现的,Windows是电脑操作系统,而Android是移动智能终端操作系统,二者实现机制完全不一样,因此该方案不适用于Android系统。另外,该方案需要在虚拟机中构建合适的模拟攻击环境,配置模拟环境的过程需要人工进行,开发成本高。此外,Android模拟器虽然支持在电脑上模拟终端设备的运行环境,但是它受限于硬件配置,无法完全还原出真实设备的环境,因此该方案并不适用于Android系统。
Ke Yan等人在论文《A Highly Automated Binary Software VulnerabilityRisk Evaluation Method For Off-by-one Stack Based Buffer Overflow》中提出了一个栈缓冲区溢出漏洞的验证方案。该漏洞验证方案会构造畸形的输入数据,触发栈内存空间的缓冲区溢出,覆盖函数返回地址;当程序完成函数调用后尝试返回时,被覆盖的函数返回地址会将程序控制流引导到其它地址,执行注入的漏洞验证代码;通过确定目标漏洞的存在性和可利用性,完成漏洞验证。该方案是在Windows平台上实现的;Windows是电脑操作系统,而Android是移动智能终端操作系统,二者实现机制完全不一样,因此该方案不适用于Android系统。该方案针对二进制软件的栈溢出漏洞进行验证,栈内存空间与堆内存空间的实现机制和内存布局有很大差别,因此该方案不适用于堆溢出漏洞。
发明内容
为了克服上述问题,本发明提供一种Android系统的堆溢出漏洞验证方法。根据本发明的一个方面,提供一种Android系统的堆溢出漏洞验证装置,包括漏洞检测模块、利用判定模块和利用验证模块;
其中,漏洞检测模块,用于向堆缓冲区填写第一输入样本,检测是否发生堆溢出,以确定堆溢出漏洞的存在性;
利用判定模块,用于根据漏洞检测模块的结果,向堆缓冲区填写第二输入样本,通过执行漏洞引发Android系统的系统进程崩溃,以确定堆溢出漏洞被利用的可能性;
利用验证模块,用于根据利用判定模块的结果,向堆缓冲区填写第三输入样本,通过执行漏洞控制Android系统的系统进程的执行流程,以验证堆溢出漏洞的可利用性。
根据本发明的另一方面,提供一种Android系统的堆溢出漏洞验证方法,包括:
步骤1,向堆缓冲区填写第一输入样本,检测是否发生堆溢出,以确定Android系统是否存在堆溢出漏洞;
步骤2,基于堆溢出漏洞存在的检测结果,向堆缓冲区填写第二输入样本,执行漏洞引发Android系统的系统进程崩溃,确定堆溢出漏洞被利用的可能性;
步骤3,基于堆溢出漏洞可能可利用,向堆缓冲区填写第三输入样本,执行漏洞控制Android系统的系统进程的执行流程,验证堆溢出漏洞的可利用性。
本申请提出的装置和方法对Android系统中存在的堆溢出漏洞进行验证,以确定漏洞的存在性和可利用性,所述方法针对Android系统漏洞,不需要构建模拟环境,可以直接在真实的终端设备中进行验证。
本发明提出的Android系统堆溢出漏洞验证装置和方法可以有效判断Android系统是否存在特定的堆溢出漏洞,并且这些漏洞能否被攻击者利用,从而评估堆溢出漏洞给Android系统带来的安全风险,促使安全研究人员及时采取保护措施来加固系统,提升系统安全性。该装置和方法的针对性强,准确度高,可扩展性良好。
附图说明
图1为含虚函数的C++对象的内存布局示意图;
图2为根据本发明实施例的Android系统堆溢出漏洞验证装置的示 意图;
图3为根据本发明实施例的堆溢出漏洞验证的利用判定步骤的流程图;
图4为根据本发明实施例的堆溢出漏洞验证的利用验证步骤的流程图;
图5为根据本发明实施例的缓冲区输入样本的结构示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
在Android系统中,一个C++对象的实例通常被分配在堆内存空间中。如果这个C++对象实现了虚函数,那么它在内存中的基本布局如图1所示,图1为含虚函数的C++对象的内存布局的示意图。
可见,这个C++对象的实例被分配在堆内存空间中,其内存起始位置存放四字节长度的虚函数表指针。成员变量等其它数据被分配在这个虚函数表指针的后面。虚函数表指针指向代码段中的一个虚函数表。这个虚函数表默认由构造函数进行初始化,包含这个C++对象所有虚函数的函数指针。这些函数指针指向代码段中对应的函数片段。
当Android系统中的某个系统进程调用这个C++对象的虚函数时,它会通过对象实例在堆内存空间中的地址得到虚函数表指针,根据虚函数表指针找到代码段中对应的虚函数表,然后遍历其中的函数指针,找到对应的函数片段并执行相应的函数。如果虚函数表指针被非法破坏,这个C++对象的虚函数调用就会出现异常。
如下可以知道,Android系统堆溢出漏洞的成因。向堆缓冲区填写数据时,没有正确检查缓冲区的边界,导致填写的数据长度超过了缓冲区的大小。超出的数据会覆盖堆缓冲区后面的内存区域。如果C++ 对象的虚函数表指针恰好被溢出的数据覆盖,指向了堆缓冲区所在的内存区域,那么系统进程在调用这个C++对象的虚函数时,会被错误地引导到堆缓冲区,去寻找虚函数表和函数指针并执行相应函数。
由于Android系统默认将堆内存标记为不可执行,因此堆溢出后的虚函数调用过程会发生错误,抛出违反执行约束的异常信息,导致系统进程崩溃。
本申请的实施例将利用上述原理进行漏洞验证,提供一种Android系统的堆溢出漏洞验证装置和方法。图2示出根据本发明实施例的Android系统堆溢出漏洞验证装置的运行示意图,如图2所示,该装置包括三个功能模块:漏洞检测模块、利用判定模块以及利用验证模块。其中,漏洞检测模块用于向堆缓冲区填写第一输入样本,检测是否发生堆溢出,以确定堆溢出漏洞的存在性;利用判定模块用于根据漏洞检测模块的结果,向堆缓冲区填写第二输入样本,通过执行漏洞引发Android系统的系统进程崩溃,以确定堆溢出漏洞被利用的可能性;利用验证模块用于根据利用判定模块的结果,向堆缓冲区填写第三输入样本,通过执行漏洞控制Android系统的系统进程的执行流程,以验证堆溢出漏洞的可利用性。其中,本申请的漏洞验证结果有三种:漏洞不存在、漏洞存在但不可利用、漏洞存在且可利用,分别可以在三个模块的结果中得到。漏洞是否可利用的依据是:攻击者可以通过执行漏洞控制Android系统的系统进程的执行流程。
其中,漏洞检测模块用于向堆缓冲区填写合适的第一输入样本,检测是否发生堆溢出,以确定Android系统是否存在堆溢出漏洞。
其中,漏洞检测模块中所构造的第一输入样本比缓冲区大小多四个字节。多出的该四个字节为溢出值value1,用来精确覆盖堆中C++对象的虚函数表指针。
其中,在漏洞检测模块中,堆溢出的检测方法是:创建C++对象后,监控该对象所在的堆内存区域;该内存区域的前四个字节存放的是虚函数表指针,记录该值为vftp1;向堆缓冲区填写第一输入样本后,记录该内存区域的前四个字节的值为vftp2;如果满足条件vftp2!=vftp1,且vftp2=value1,说明这个C++对象的虚函数表指针被第一输入样本的溢出值value1覆盖,证明堆溢出漏洞存在,进入利用判定模块。反之,说明没有发生堆溢出,直接得出漏洞不存在的验证结果。
在一个实施例中,利用动态调试工具IDA Pro远程附加Android系统的系统进程,实现对C++对象堆内存区域的监控。
其中,利用判定模块在漏洞存在的基础上,进一步判定堆溢出漏洞是否可利用。漏洞是否可利用的依据是:攻击者可以通过执行漏洞控制Android系统的系统进程的执行流程。图3为根据本发明实施例的堆溢出漏洞验证的利用判定模块的运行流程图,如图3所示。
首先,模块构造一个缓冲区第二输入样本。所构造的第二输入样本比缓冲区大小多四个字节,多出的该四个字节为溢出值,并且该值恰好位于堆缓冲区的内存地址区间内,用来精确覆盖堆中C++对象的虚函数表指针。然后,向堆缓冲区填写该第二输入样本,判断Android系统进程是否崩溃。如果堆溢出后引发系统进程崩溃,说明这个堆溢出漏洞能够影响系统进程,进行下一步判定。否则,分析原因,重新构造缓冲区输入样本。Android系统进程崩溃的判断方法是:使用Android调试桥(ADB)运行logcat命令访问系统日志,观察是否有关于系统进程的崩溃日志。如果有该系统进程的崩溃日志,说明发生了进程崩溃,反之则没有。
如果Android系统进程发生崩溃,通过分析崩溃日志,判断这个系统进程是否在虚函数调用点崩溃。如果这个系统进程在虚函数调用点崩溃,得出一个漏洞验证的中间结果:漏洞存在且可能可利用,进入 利用验证模块。否则,得到最终的漏洞验证结果:漏洞存在但不可利用。
Android系统进程是否在虚函数调用点崩溃的判断方法是:如果崩溃日志中含有违反执行约束的异常信息,并且崩溃地址位于堆缓冲区的内存地址区间内,说明系统进程被错误地引导到堆缓冲区去寻找虚函数表和函数指针并执行相应函数,则认为系统进程是在虚函数调用点崩溃;否则不是。
其中,利用验证模块用于在漏洞存在且可能可利用的基础上,对这个堆溢出漏洞的可利用性进行验证。图4为根据本发明实施例的堆溢出漏洞验证的利用验证模块的运行图,如图4所示。
首先,构造一个缓冲区第三输入样本;所构造的第三输入样本比缓冲区大小多四个字节,包含四部分内容:溢出值、伪造的虚函数表、伪造的函数以及填充数据,如图5所示。多出的该四个字节为溢出值,并且该值恰好是伪造的虚函数表在堆内存空间中的起始地址,用来精确覆盖堆中C++对象的虚函数表指针。
其中,如图5所示,伪造的虚函数表中含有一个伪造的函数指针,其值被设置为伪造的函数在堆内存空间中的起始地址,用来误导系统进程调用相应的虚函数,执行伪造的函数。
其中,伪造的函数由多个汇编指令组成,实现了两个功能:1,将堆缓冲区的内存区域标记为可执行,允许系统进程在堆缓冲区中执行指令,避免违反执行约束;2,实现一个显式的功能,例如在Android文件系统/sdcard/目录下创建新文件newfile.txt。
其中,如果伪造的虚函数表和伪造的函数不是四字节对齐的,需要在其后放置填充数据,以保证堆内存空间的字节对齐。同时,填充数据还需要保证所构造的第三输入样本的大小比缓冲区大小多四个字节。
如图4所示,然后,向堆缓冲区填写该第三输入样本,触发堆缓冲区溢出;溢出后,C++对象的虚函数表指针将会被溢出值覆盖,指向堆内存空间中伪造的虚函数表;随后系统进程在调用虚函数时,会根据被覆盖的虚函数表指针找到伪造的虚函数表,然后被伪造的函数指针错误地引导到伪造的函数处去执行汇编指令。
最后,通过查看显式的功能是否被执行,来判断Android系统的系统进程是否执行了伪造的函数。例如查看Android文件系统/sdcard/目录下是否已创建了新文件newfile.txt。如果已执行,说明已成功利用这个堆溢出漏洞,得到漏洞验证结果:漏洞存在且可利用。否则,分析原因,重新构造堆缓冲区输入样本。
根据本申请的另一个实施例,提供一种Android系统的堆溢出漏洞验证方法,该方法包括:步骤1,向堆缓冲区填写第一输入样本,检测是否发生堆溢出,以确定Android系统是否存在堆溢出漏洞;步骤2,基于堆溢出漏洞存在的检测结果,向堆缓冲区填写第二输入样本,执行漏洞引发Android系统的系统进程崩溃,以确定堆溢出漏洞被利用的可能性;步骤3,基于堆溢出漏洞可能可利用,向堆缓冲区填写第三输入样本,通过执行漏洞控制Android系统的系统进程的执行流程,以验证堆溢出漏洞的可利用性。
其中,本申请的漏洞验证结果有三种:漏洞不存在、漏洞存在但不可利用、漏洞存在且可利用,分别可以在三个步骤的结果中得到。漏洞是否可利用的依据是:攻击者可以通过执行漏洞控制Android系统进程的执行流程。
其中,步骤1中,所构造的第一输入样本比缓冲区大小多四个字节。多出的该四个字节为溢出值value1,用来精确覆盖堆中C++对象的虚函数表指针。其中,步骤1中,堆溢出的检测方法是:创建C++对象后,监控该对象所在的堆内存区域;该内存区域的前四个字节存 放的是虚函数表指针,记录该值为vftp1;向堆缓冲区填写第一输入样本后,记录该内存区域的前四个字节的值为vftp2;如果满足条件vftp2!=vftp1,且vftp2=value1,说明这个C++对象的虚函数表指针被第一输入样本的溢出值value1覆盖,证明堆溢出漏洞存在,进入步骤2。反之,说明没有发生堆溢出,直接得出漏洞不存在的验证结果。
在一个实施例中,利用动态调试工具IDA Pro远程附加Android系统的系统进程,实现对C++对象堆内存区域的监控。
其中,步骤2中,基于漏洞存在的基础上,进一步判定堆溢出漏洞是否可利用。漏洞是否可利用的依据是:攻击者可以通过执行漏洞控制Android系统进程的执行流程,具体包括如下步骤。
步骤21,构造一个缓冲区第二输入样本。所构造的第二输入样本比缓冲区大小多四个字节。多出的该四个字节为溢出值,并且该值恰好位于堆缓冲区的内存地址区间内,用来精确覆盖堆中C++对象的虚函数表指针。
步骤22,向堆缓冲区填写该第二输入样本,判断Android系统进程是否崩溃。如果堆溢出后引发系统进程崩溃,说明这个堆溢出漏洞能够影响系统进程,进入步骤3判定。否则,分析原因,重新构造缓冲区输入样本。Android系统进程崩溃的判断方法是:使用Android调试桥(ADB)运行logcat命令访问系统日志,观察是否有关于系统进程的崩溃日志。如果有该系统进程的崩溃日志,说明发生了进程崩溃,反之则没有。
如果Android系统进程发生崩溃,通过分析崩溃日志,判断这个系统进程是否在虚函数调用点崩溃。如果这个系统进程在虚函数调用点崩溃,得出一个漏洞验证的中间结果:漏洞存在且可能可利用,进入步骤3。否则,得到最终的漏洞验证结果:漏洞存在但不可利用。
Android系统进程是否在虚函数调用点崩溃的判断方法是:如果崩溃日志中含有违反执行约束的异常信息,并且崩溃地址位于堆缓冲区的内存地址区间内,说明系统进程被错误地引导到堆缓冲区去寻找虚函数表和函数指针并执行相应函数,则认为系统进程是在虚函数调用点崩溃;否则不是。
其中,步骤3进一步包括如下步骤:
步骤31,构造一个缓冲区第三输入样本;所构造的第三输入样本比缓冲区大小多四个字节,包含四部分内容:溢出值、伪造的虚函数表、伪造的函数以及填充数据,如图5所示。多出的该四个字节为溢出值,并且该值恰好是伪造的虚函数表在堆内存空间中的起始地址,用来精确覆盖堆中C++对象的虚函数表指针。
其中,伪造的虚函数表中含有一个伪造的函数指针,其值被设置为伪造的函数在堆内存空间中的起始地址,用来误导系统进程调用相应的虚函数,执行伪造的函数。其中,伪造的函数由多个汇编指令组成,实现了两个功能:1,将堆缓冲区的内存区域标记为可执行,允许系统进程在堆缓冲区中执行指令,避免违反执行约束;2,实现一个显式的功能,例如在Android文件系统/sdcard/目录下创建新文件newfile.txt。其中,如果伪造的虚函数表和伪造的函数不是四字节对齐的,需要在其后放置填充数据,以保证堆内存空间的字节对齐。同时,填充数据还需要保证所构造的第三输入样本的大小比缓冲区大小多四个字节。
步骤32,向堆缓冲区填写该第三输入样本,触发堆缓冲区溢出;溢出后,C++对象的虚函数表指针将会被溢出值覆盖,指向堆内存空间中伪造的虚函数表;随后系统进程在调用虚函数时,会根据被覆盖的虚函数表指针找到伪造的虚函数表,然后被伪造的函数指针错误地引导到伪造的函数处去执行汇编指令。最后,通过查看显式的功能是否 被执行,来判断Android系统的系统进程是否执行了伪造的函数。例如查看Android文件系统/sdcard/目录下是否已创建了新文件newfile.txt。如果已执行,说明已成功利用这个堆溢出漏洞,得到漏洞验证结果:漏洞存在且可利用。否则,分析原因,重新构造堆缓冲区输入样本。
最后,本申请的装置和方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种Android系统的堆溢出漏洞验证装置,其特征在于,所述装置包括漏洞检测模块、利用判定模块和利用验证模块;
其中,漏洞检测模块,用于向堆缓冲区填写第一输入样本,检测是否发生堆溢出,以确定堆溢出漏洞的存在性;
利用判定模块,用于根据漏洞检测模块的结果,向堆缓冲区填写第二输入样本,通过执行漏洞引发Android系统的系统进程崩溃,以确定堆溢出漏洞被利用的可能性;
利用验证模块,用于根据利用判定模块的结果,向堆缓冲区填写第三输入样本,通过执行漏洞控制Android系统的系统进程的执行流程,以验证堆溢出漏洞的可利用性;
其中,所述第一输入样本比堆缓冲区大小多四个字节,多出的该四个字节为溢出值value1,用来覆盖堆中C++对象的虚函数表指针;
所述漏洞检测模块用于:创建C++对象,监控该对象所在的堆内存区域;该内存区域的前四个字节存放虚函数表指针,记录该值为vftp1;向堆缓冲区填写第一输入样本,记录该内存区域的前四个字节的值为vftp2;如果满足条件vftp2!=vftp1且vftp2=value1,确定C++对象的虚函数表指针被第一输入样本的溢出值覆盖,确定堆溢出漏洞存在;
所述创建C++对象,监控该对象所在的堆内存区域,具体为:利用动态调试工具IDA Pro远程附加Android系统的系统进程,实现对C++对象堆内存区域的监控。
2.根据权利要求1所述的装置,其特征在于,所述利用判定模块用于:构造第二输入样本,所述第二输入样本比缓冲区大小多四个字节,多出的该四个字节为溢出值,并且该值位于堆缓冲区的内存地址区间内,用来覆盖堆中C++对象的虚函数表指针;
向堆缓冲区填写所述第二输入样本,堆溢出后引发系统进程崩溃,基于系统进程在虚函数调用点崩溃,确定堆溢出漏洞利用可能性。
3.根据权利要求1所述的装置,其特征在于,所述利用验证模块用于构造第三输入样本,所述第三输入样本比缓冲区大小多四个字节,包含:溢出值、伪造虚函数表、伪造函数以及填充数据;
其中,多出的该四个字节为溢出值,其值被设置为伪造虚函数表在堆内存空间中的起始地址,用于覆盖C++对象的虚函数表指针;
其中,伪造虚函数表中含有一个伪造函数指针,其值被设置为伪造函数在堆内存空间中的起始地址,用来误导系统进程调用相应的虚函数,执行伪造函数;
其中,伪造函数由多个汇编指令组成,用于将堆缓冲区的内存区域标记为可执行,并且实现一个显式的功能;
其中,填充数据,用于追加在伪造虚函数表和伪造函数之后,以实现堆内存空间的字节对齐,并保证所述第三输入样本的大小比缓冲区大小多四个字节。
4.根据权利要求3所述的装置,其特征在于,所述利用验证模块用于:
向堆缓冲区填写第三输入样本,触发堆缓冲区溢出;
C++对象的虚函数表指针将会被溢出值覆盖,指向堆内存空间中伪造虚函数表;
系统进程调用虚函数,根据被覆盖的虚函数表指针找到伪造虚函数表,被伪造函数指针错误地引导到伪造函数处执行指令;
基于执行伪造的函数,确定堆溢出漏洞可利用性。
5.一种Android系统的堆溢出漏洞验证方法,其特征在于,包括:
步骤1,向堆缓冲区填写第一输入样本,检测是否发生堆溢出,以确定Android系统是否存在堆溢出漏洞;
步骤2,基于堆溢出漏洞存在的检测结果,向堆缓冲区填写第二输入样本,执行漏洞引发Android系统的系统进程崩溃,确定堆溢出漏洞被利用的可能性;
步骤3,基于堆溢出漏洞可能可利用,向堆缓冲区填写第三输入样本,执行漏洞控制Android系统的系统进程的执行流程,验证堆溢出漏洞的可利用性;
其中,所述第一输入样本比缓冲区大小多四个字节,多出的该四个字节为溢出值value1,用来覆盖堆中C++对象的虚函数表指针;
所述步骤1进一步包括:
创建C++对象,监控该对象所在的堆内存区域,该内存区域的前四个字节存放的是虚函数表指针,记录该值为vftp1;
向堆缓冲区填写第一输入样本,记录该内存区域的前四个字节的值为vftp2;如果满足条件vftp2!=vftp1且vftp2=value1,确定C++对象的虚函数表指针被第一输入样本的溢出值覆盖,确定堆溢出漏洞存在;
所述创建C++对象,监控该对象所在的堆内存区域,具体为:利用动态调试工具IDA Pro远程附加Android系统的系统进程,实现对C++对象堆内存区域的监控。
6.根据权利要求5所述的方法,其特征在于,所述步骤2进一步包括:
构造第二输入样本,所述第二输入样本比缓冲区大小多四个字节,多出的该四个字节为溢出值,并且该溢出值位于堆缓冲区的内存地址区间内,用来覆盖堆中C++对象的虚函数表指针;
向堆缓冲区填写所述第二输入样本,堆溢出后引发系统进程崩溃,基于系统进程在虚函数调用点崩溃,确定堆溢出漏洞利用可能性。
7.根据权利要求5所述的方法,其特征在于,所述第三输入样本比缓冲区大小多四个字节,包含:溢出值、伪造虚函数表、伪造函数以及填充数据;
其中,多出的该四个字节为溢出值,其值被设置为伪造虚函数表在堆内存空间中的起始地址,用于覆盖C++对象的虚函数表指针;
其中,伪造虚函数表中含有一个伪造函数指针,其值被设置为伪造函数在堆内存空间中的起始地址,用来误导系统进程调用相应的虚函数,执行伪造函数;
其中,伪造的函数由多个汇编指令组成,用于将堆缓冲区的内存区域标记为可执行,并且实现一个显式的功能;
其中,填充数据,用于追加在伪造虚函数表和伪造函数之后,以实现堆内存空间的字节对齐,并保证所述第三输入样本的大小比缓冲区大小多四个字节。
8.根据权利要求7所述的方法,其特征在于,所述步骤3进一步包括:
向堆缓冲区填写第三输入样本,触发堆缓冲区溢出;
C++对象的虚函数表指针将会被溢出值覆盖,指向堆内存空间中伪造虚函数表;
系统进程调用虚函数,根据被覆盖的虚函数表指针找到伪造虚函数表,被伪造的函数指针错误地引导到伪造函数处执行指令;
基于执行伪造的函数,确定堆溢出漏洞可利用性。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610645266.0A CN106295354B (zh) | 2016-08-08 | 2016-08-08 | 一种Android系统堆溢出漏洞验证方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610645266.0A CN106295354B (zh) | 2016-08-08 | 2016-08-08 | 一种Android系统堆溢出漏洞验证方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106295354A CN106295354A (zh) | 2017-01-04 |
CN106295354B true CN106295354B (zh) | 2019-09-27 |
Family
ID=57666987
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610645266.0A Active CN106295354B (zh) | 2016-08-08 | 2016-08-08 | 一种Android系统堆溢出漏洞验证方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106295354B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106991324B (zh) * | 2017-03-30 | 2020-02-14 | 兴华永恒(北京)科技有限责任公司 | 一种基于内存保护类型监控的恶意代码跟踪识别方法 |
CN108664390B (zh) * | 2017-03-31 | 2021-10-01 | 华为技术有限公司 | 一种内存泄露检测方法及设备 |
CN110837644B (zh) * | 2019-10-15 | 2021-07-30 | 深圳开源互联网安全技术有限公司 | 一种系统渗透测试方法、装置及终端设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103116529A (zh) * | 2011-07-18 | 2013-05-22 | 英飞凌科技股份有限公司 | 用于实时检测缓冲区溢出致堆内存损坏的方法和设备 |
CN103975337A (zh) * | 2011-12-09 | 2014-08-06 | 迈克菲公司 | 预测性堆溢出保护 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7941631B2 (en) * | 2007-12-28 | 2011-05-10 | Intel Corporation | Providing metadata in a translation lookaside buffer (TLB) |
US10152409B2 (en) * | 2012-04-30 | 2018-12-11 | Vmware, Inc. | Hybrid in-heap out-of-heap ballooning for java virtual machines |
-
2016
- 2016-08-08 CN CN201610645266.0A patent/CN106295354B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103116529A (zh) * | 2011-07-18 | 2013-05-22 | 英飞凌科技股份有限公司 | 用于实时检测缓冲区溢出致堆内存损坏的方法和设备 |
CN103975337A (zh) * | 2011-12-09 | 2014-08-06 | 迈克菲公司 | 预测性堆溢出保护 |
Non-Patent Citations (2)
Title |
---|
可信执行环境下缓冲区溢出攻击防范的研究;张会洁;《中国优秀硕士论文库》;20140215(第2期);第3、43页 * |
堆溢出的攻击演变与防范;李国乐 等;《计算机工程与应用》;20060901(第25期);第105-106页 * |
Also Published As
Publication number | Publication date |
---|---|
CN106295354A (zh) | 2017-01-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Hao et al. | Puma: Programmable ui-automation for large-scale dynamic analysis of mobile apps | |
CN106445508B (zh) | 一种游戏引擎 | |
CN102567166B (zh) | 一种显卡测试方法及测试系统 | |
CN111597109B (zh) | 一种跨架构固件堆内存的缺陷检测方法及系统 | |
CN108989355B (zh) | 一种漏洞检测方法和装置 | |
CN106295354B (zh) | 一种Android系统堆溢出漏洞验证方法及装置 | |
CN106548076A (zh) | 检测应用漏洞代码的方法和装置 | |
Chen et al. | Conformance testing for OSEK/VDX operating system using model checking | |
US20060129880A1 (en) | Method and system for injecting faults into a software application | |
CN105320595A (zh) | 一种应用测试方法和装置 | |
Cho et al. | Anti-debugging scheme for protecting mobile apps on android platform | |
CN106897607A (zh) | 一种应用程序监控方法及装置 | |
CN111859380A (zh) | Android App漏洞的零误报检测方法 | |
CN108197476A (zh) | 一种智能终端设备的漏洞检测方法及装置 | |
US10823782B2 (en) | Ensuring completeness of interface signal checking in functional verification | |
CN105589928A (zh) | 用于分布式数据处理系统的模拟测试方法 | |
CN114969760A (zh) | 漏洞检测方法及装置、计算机可读介质和电子设备 | |
CN111523097A (zh) | 基于安卓系统的app刷子用户识别方法、设备及存储介质 | |
Antunes et al. | Evaluating and improving penetration testing in web services | |
Wi et al. | DiffCSP: Finding Browser Bugs in Content Security Policy Enforcement through Differential Testing | |
CN111563260B (zh) | 一种面向安卓应用程序的Web注入代码执行漏洞检测方法及系统 | |
CN108038378A (zh) | 云端检测函数被恶意修改的方法、终端设备及存储介质 | |
Peng et al. | Research on android malware detection and interception based on behavior monitoring | |
US11934534B2 (en) | Vulnerability analysis of a computer driver | |
CN110011964A (zh) | 一种网页环境检测方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |