一种动态污点数据分析方法及装置的制造方法_2

文档序号:8430640阅读:来源:国知局
盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0037]在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0038]一个典型的调试器的工作原理大致包括:在调试器中使用其功能对感兴趣的代码或者数据设置断点(也称为下断点),CPU在执行或者访问到这些断点时,会触发系统的异常,操作系统捕获到这些异常并将这些异常作为事件分发给调试器进行处理。
[0039]操作系统支持的断点分为软件断点和硬件断点两类。其中,
[0040]对于软件断点这一概念,x86系列处理器从8086开始就提供了一条专门用来支持调试的指令:INT3。简单的说,就是CPU在执行过程中如果碰到INT3指令,会触发中断,并调用操作系统在中断描述表中注册的回调例程;而操作系统会在被调用的回调例程中检测调试器并将调试事件分发给调试器进行处理。
[0041]而硬件断点的实现依赖于自IA-32架构引入的DRx调试寄存器。DRx调试寄存器共有8个,硬件断点的原理就是使用其中的4个调试寄存器(DRO、DR1、DR2、DR3)来设定地址,使用DR7来设置断点类型和大小。断点类型包括硬件读、硬件写、硬件执行三种,断点的大小则分为I字节(byte)、2byte、4byte三种。由于无需人为插入INT3等类似的软件指令,所以某些情况下会有更好的效果。但是,由于DRx调试寄存器中用做地址记录用途的寄存器只有4个,也就是说同时只能设置4个硬件断点,且大小最大为4byte。
[0042]另外,操作系统支持针对内存页设置页属性,即读、写、执行的权限。如果在只读的内存页上写入数据则会引发访问违例,然后操作系统会将访问异常分发给调试器处理。这种类型的调试属性可以称为内存断点。内存断点和硬件断点均可以对内存地址设置断点,不同的是,内存断点只能以整页为单位设置断点,需要在处理例程中过滤,但是,内存断点对大小和同时设置的断点数并没有限制,而硬件断点则有数量和大小的限制。
[0043]图1为本申请动态污点数据分析方法的流程图,如图1所示,包括:
[0044]步骤100:利用软件断点引入污点数据,并建立对应污点数据的上下文。
[0045]本步骤中,只需针对关心的数据插入INT3断点,比如文件数据读取(其中的污点数据为文件内容),内存对象创建(其中的污点数据为类对象实例)等。系统在执行过程中,如果碰到INT3指令即污点数据引入点,会触发中断,并在触发断点的断点回调例程中建立污点数据的上下文。
[0046]其中,污点数据的上下文中的内容只要能体现污点数据的属性,能对污点数据进行追踪即可,比如污点数据的引入点、和/或污点数据的大小、和/或断点触发后引入污点数据的点、和/或污点数据被引入的次数等。
[0047]步骤101:利用内存断点和软件断点对污点数据进行分析。
[0048]本步骤具体包括:在断点回调例程中,根据系统的异常处理机制获取当前断点指令的异常地址、访问的内存数据等数据;确定获得的数据是否是污点数据,如果是则处理相应污点数据的上下文,否则忽略并继续执行。
[0049]其中,确定获得的数据是否是污点数据包括:对于内存断点异常,通过判断触发当前内存断点的数据是否存储在于系统预先设置的异常上下文如污点数据哈希表中的数据,如果在,确定获得的数据为污点数据,对污点数据的上下文进行处理;对于软件断点,将获得的数据作为新的污点数据存入污点数据哈希表中。其中,
[0050]所谓内存断点,指的是修改内存的某个地址范围内的页面属性,比如从只读修改为可读可写,然后在有程序试图写入这个内存区域时会发生内存访问异常,系统异常处理机制会截获这个异常并传递给调试器;所谓软件断点,则是在内存中插入INT3指令,CPU执行到INT3指令处后会发生中断异常,然后再将返回该异常。确定当前断点是内存断点还是软件断点包括:系统会将不同的异常进行分类,异常是系统已经封装好的异常数据,系统是可以很方便的识别出是内存访问异常(内存断点)还是断点异常(软件断点)的。
[0051]本申请整个污点数据处理的过程是在程序执行过程中完成的,并通过软件断点引入污点数据,只对相关指令进行污点分析,无需对全部指令集进行翻译和分析,而且,通过利用内存断点和软件断点对污点数据进行分析,高效地实现了监控污点数据的引入和传播过程,从而降低了成本,提高了污点分析效率。
[0052]在对污点数据处理完成后,本申请方法还包括:
[0053]步骤102:根据预先设置的安全策略对污点数据进行安全性分析。
[0054]其中,以对C++对象类型的污点数据为例,其安全策略可以包括:是否有的污点数据(比如C++对象)被其他内存地址引用但却已经释放掉;是否有的污点数据(比如COM对象)被其他内存地址应用后没有增加其内部的引用计数等。针对不同的污点数据类型其安全策略是不一样的。本领域技术人员按照本发明提供的方法,是很容易针对不同的污点数据建立相应的安全策略的,这里不再赘述。
[0055]本步骤检测当前污点数据的上下文是否会导致安全问题,换句话说,就是根据安全策略,符合安全策略的就认为有安全问题。具体实现属于本领域技术人员的公知技术,这里不再赘述。
[0056]本步骤的具体实现也可以在对污点数据被引入的地方设置断点,根据污点数据哈希表检测是否有安全问题。比如对于对象实例来说,可以在对象被释放(即污点数据即将被释放,释放后这个污点数据在程序内部已经不再造成安全问题)时,根据当前的引用计数查看是否会造成释放重索引(Use After Free)漏洞。其中,计数指的是针对对象类的污点数据时,其内部可以维护一个对象被引用次数的变量。用来标识这个对象是否还有效。如果这个变量不为零,则该对象有效,如果为零,则这个对象可以随时被系统释放掉。
[0057]如果当前污点数据的上下文会导致安全问题,则销毁该污点数据,即从污点数据哈希表中删除这个污点数据,具体实现属于本领域技术人员的惯用技术手段,这里不再赘述。
[0058]本步骤保证了存在安全漏洞的污点数据被及时清除。
[0059]图2为本申请动态污点数据分析装置的组成结构示意图,如图2所示,包括引入模块和分析模块;其中,
[0060]引入模块,用于利用软件断点引入污点数据,并建立对应污点数据的上下文;
[0061]分析模块,用于利用内存断点和软件断点对污点数据进行分析。具体用于:如果当前断点为内存断点,且触发当前内存断点获得的数据存在于系统预先设置的异常上下文中,确定获得的数据为污点数据,对所述污点数据的上下文进行处理;
[0062]如果当前断点是软件断点,将获得的数据作为新的污点数据存入异常上下文中。
[0063]本申请装置还进一步包括安全处理模块,用于根据预先设置的安全策略对分析模块确定的污点数据进行安全性分析,如果当前污点数据的上下文会导致安全问题,则销毁该污点数据。
[0064]下面结
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1