一种完全上下文敏感的程序控制流完整性保护方法和系统与流程

文档序号:11287151阅读:234来源:国知局
一种完全上下文敏感的程序控制流完整性保护方法和系统与流程

本发明属于软件完整性保护领域,更具体地,涉及一种完全上下文敏感的程序控制流完整性保护方法和系统。



背景技术:

现在的软件普遍存在缓冲区溢出漏洞。通过利用缓冲区溢出漏洞,攻击者能对内存任意读写,从而修改代码指针,最终劫持控制流以完成攻击意图。为了保护内存安全,学术和工业界不断研究并部署有效的保护措施。但仍有多项攻击技术,可以绕过以上已有的保护措施。为此,控制流完整性的概念被提出。控制流完整性保护不直接保护内存安全,而是检查控制流是否被劫持,从而判断是否受到攻击。控制流完整性保护方案通常会在程序运行之前为程序生成一个控制流图,在程序运行时利用已生成的控制流图来监控程序的行为,以确保程序控制流符合控制流图。当发现程序控制流不符合控制流图时,通常的做法就是发出警告并终止程序。

现有的针对二进制程序的控制流完整性保护方法中,大体上可以分为两种。一种是上下文不敏感的控制流完整性保护方法,即通过人为地建立规则,对执行路径中单个控制流边或部分控制流边进行相对独立的检查。另一种是部分上下文敏感的控制流完整性保护方法,即对执行路径中部分控制流边进行相互关联的检查。

然而,上述两种方法都存在一定的不足和局限性。上下文不敏感的控制流完整性保护方法通常采用人为指定的规则,有可能会忽略特殊的控制流转移,导致保护方法不兼容这些特殊的控制流转移,因此难以适用于复杂的大型项目。其次,上下文不敏感的控制流完整性保护方法仅独立地检查执行路径中单个控制流边或部分控制流边,没有考虑执行路径中所有边的相关性,因此不能生成精确性高的控制流图,导致控制流图中包含许多不合法的边,这会被攻击者利用从而绕过检查以实现最终的攻击。另一方面,部分上下文敏感的控制流完整性保护方法对控制流上下文的考虑仅局限于执行路径中所检查的控制流边的个数。而执行路径中某条控制流边的合法性是与该执行路径中的所有边都相关。因此,部分上下文敏感的控制流完整性保护方法生成的控制流图仍然包含许多不合法的边能被攻击者利用。此外,这两种控制流完整性保护方法在运行时都采用插桩技术插入检查代码,这破坏了保护方法的透明性,因此攻击者能够感知保护方案的存在,然后利用被保护程序的漏洞篡改检查逻辑,从而绕过检查。

综上所述,现有的针对二进制程序的控制流完整性保护方法存在以下不足:

现在的控制流完整性保护方法没有考虑上下文敏感性或只考虑了部分上下文敏感性,导致生成的控制流图包含了许多不合法的控制流边,能够被攻击者利用从而绕过检查。现在的控制流完整性保护方法在运行时都采用了插桩技术插入检查代码,破坏了保护方法的透明性,导致攻击者能够感知到保护方法的存在,并且利用被保护程序的漏洞来篡改检查逻辑。有些控制流完整性保护方法不兼容特殊的控制流转移,因此不适用于复杂的大型项目。



技术实现要素:

针对现有技术的以上缺陷或改进需求,本发明提供了一种完全上下文敏感的程序控制流完整性保护方法和系统,其目的是在离线分析阶段通过模拟执行和污点分析收集程序的控制流信息,然后在运行时跟踪执行路径,控制流检查模块将控制流信息和进程跟踪信息进行匹配,匹配成功后,检查目标地址是否合法,如果发现不合法,就表示遇到控制流劫持攻击,进而终止进程执行。由此解决现有针对二进制程序的控制流保护方法中出现的上述局限和不足,保证保护方法的透明性、兼容性和模块化支持,并且能实现完全上下文敏感的控制流完整性检查。

为实现上述目的,按照本发明的一个方面,提供了一种完全上下文敏感的程序控制流完整性保护方法,该方法包括以下步骤:

(1)模拟执行:输入预设的测试用例到目标程序,模拟执行目标程序,获取目标程序的控制流信息;

(2)基本块信息收集:对目标程序进行文件格式分析和反汇编,识别并保存目标程序二进制文件中的基本块信息;

(3)进程跟踪:启动目标程序进程,跟踪目标程序进程的执行路径,并获取进程跟踪信息;

(4)控制流检查:根据进程跟踪信息查找基本块,由基本块信息生成路径信息,通过匹配控制流信息和路径信息,实现完整指令路径的合法性检查。

进一步地,所述步骤(1)包括以下子步骤:

(11)对目标程序指令进行插桩,输入预设的测试用例,启动程序;

(12)判断当前插桩点指令是否为目标程序主函数返回指令或结束进程相关的系统调用,若是则结束模拟执行;否则进行污点传播分析,根据指令表达式标记或清除污点数据;

(13)判断插桩点指令类型,若是预定义的敏感系统调用的入口,则将敏感系统调用的返回值或被敏感系统调用修改的数据标记为污点数据,运行到下一个插桩点,回到步骤(12);若是分支指令,则进入下一步骤;

(14)判断分支指令类型,若是直接无条件分支,则运行到下一个插桩点,回到步骤(12);若是间接分支,则进入步骤(16);若是直接条件分支,则进入步骤(15);

(15)计算条件分支指令的目标地址,生成执行路径信息,计算其哈希值作为控制流信息并保存;运行到下一个插桩点,回到步骤(12);

(16)判断间接分支指令的目标地址变量是否为污点数据,若是,则丢弃本次模拟执行获取的信息,结束模拟执行;否则,进入步骤(15)。

进一步地,所述步骤(2)包括以下子步骤:

(21)分析目标程序二进制文件的文件格式,找到代码段的地址范围;

(22)对目标程序代码段进行反汇编,获得目标程序代码;

(23)对代码进行遍历,分析分支指令并识别基本块:若是直接分支指令,则提取出以该指令结尾的基本块,同时提取出以目标地址指令开头的基本块;若是间接分支指令,提取出以该指令结尾的基本块;

(24)当所有代码都已遍历完,保存所有基本块信息。

进一步地,所述步骤(3)包括以下子步骤:

(31)在目标程序上设置分析起始点和终止点,运行目标程序,当程序运行到分析起点时,配置处理器进程跟踪功能,启动进程跟踪,获取进程跟踪信息;

(32)当程序运行到分析终止点时,结束进程跟踪。

进一步地,所述步骤(4)包括以下子步骤:

(41)判断是否还有进程跟踪信息,是则进入下一步骤;否则结束;

(42)根据当前进程跟踪信息查找对应基本块,判断是否能找到,是则由基本块信息生成路径信息,否则更新基本块信息,再由更新的基本块信息生成路径信息;计算路径信息的哈希值;

(43)根据路径信息判断执行路径是否达到间接分支,否则寻找下一个进程跟踪信息,回到步骤(41);是则进入下一步骤;

(44)在控制流信息的哈希值中匹配当前路径信息的哈希值,若匹配成功则进入下一步骤;若不成功则结束;

(45)判断目标地址是否合法;若合法,则寻找下一个进程跟踪信息,回到步骤(41);若不合法,则判断受到攻击,终止程序执行。

按照本发明的另一方面,提供了一种完全上下文敏感的程序控制流完整性保护系统,该系统包括:

模拟执行模块,用于输入预设的测试用例到目标程序,模拟执行目标程序,获取目标程序的控制流信息;

基本块信息收集模块,用于对目标程序进行文件格式分析和反汇编,识别并保存目标程序二进制文件中的基本块信息;

进程跟踪模块,用于启动目标程序进程,跟踪目标程序进程的执行路径,并获取进程跟踪信息;

控制流检查模块,用于根据进程跟踪信息查找基本块,由基本块信息生成路径信息,通过匹配控制流信息和路径信息,实现完整指令路径的合法性检查。

进一步地,所述模拟执行模块包括:

插桩单元,用于对目标程序指令进行插桩,输入预设的测试用例,启动程序;

结束判断单元,用于判断当前插桩点指令是否为目标程序主函数返回指令或结束进程相关的系统调用,若是则结束模拟执行;否则进行污点传播分析,根据指令表达式标记或清除污点数据;

插桩类型判断单元,用于判断插桩点指令类型,若是预定义的敏感系统调用的入口,则将敏感系统调用的返回值或被敏感系统调用修改的数据标记为污点数据,运行到下一个插桩点,回到结束判断单元;若是分支指令,则进入下一步骤;

指令类型判断单元,用于判断分支指令类型,若是直接无条件分支,则运行到下一个插桩点,回到结束判断单元;若是间接分支,则进入污点数据判断单元;若是直接条件分支,则进入控制流信息生成单元;

控制流信息生成单元,用于计算条件分支指令的目标地址,生成执行路径信息,计算其哈希值作为控制流信息并保存;运行到下一个插桩点,回到结束判断单元;

污点数据判断单元,用于判断间接分支指令的目标地址变量是否为污点数据,若是,则丢弃本次模拟执行获取的信息,结束模拟执行;否则,进入控制流信息生成单元。

进一步地,所述基本块信息收集模块包括:

程序分析单元,用于分析目标程序二进制文件的文件格式,找到代码段的地址范围;

反汇编单元,用于对目标程序代码段进行反汇编,获得目标程序代码;

基本块提取单元,用于对代码进行遍历,分析分支指令并识别基本块:若是直接分支指令,则提取出以该指令结尾的基本块,同时提取出以目标地址指令开头的基本块;若是间接分支指令,提取出以该指令结尾的基本块;

基本块保存单元,用于当所有代码都已遍历完,保存所有基本块信息。

进一步地,所述进程跟踪模块包括:

进程跟踪用户组件,用于在目标程序上设置分析起始点和终止点,运行目标程序,当程序运行到分析起点时,通知进程跟踪内核组件启动进程跟踪,获取进程跟踪信息;当程序运行到分析终止点时,通知进程跟踪内核组件结束进程跟踪;同时实时将进程跟踪内核组件转发的进程跟踪信息进行转存;

进程跟踪内核组件,用于负责配置处理器进程跟踪功能,申请内存缓冲区,等待进程跟踪用户组件的通知;当收到进程跟踪用户组件的启动进程跟踪请求时启动进程跟踪,并将进程跟踪信息存入缓存区;当收到进程跟踪用户组件的结束进程跟踪请求时结束进程跟踪;当缓存区满时向跟踪用户组件转发进程跟踪信息。

进一步地,所述控制流检查模块包括:

进程判断单元,用于判断是否还有进程跟踪信息,是则进入下一步骤;否则结束;

路径信息生成单元,用于根据当前进程跟踪信息查找对应基本块,判断是否能找到,是则由基本块信息生成路径信息,否则更新基本块信息,再由更新的基本块信息生成路径信息;计算路径信息的哈希值;

间接分支判断单元,用于根据路径信息判断执行路径是否达到间接分支,否则寻找下一个进程跟踪信息,回到进程判断单元;是则进入下一步骤;

匹配单元,用于在控制流信息的哈希值中匹配当前路径信息的哈希值,若匹配成功则进入下一步骤;若不成功则结束;

合法判断单元,用于判断目标地址是否合法;若合法,则寻找下一个进程跟踪信息,回到进程判断单元;若不合法,则判断受到攻击,终止程序执行。

总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下技术特征及有益效果:

(1)本技术方案在目标程序离线时采用模拟测试数据运行程序,对程序二进制码插桩分析其控制流信息,不再目标程序运行时对程序代码进行插桩,而将检查代码与被保护程序相互分离,将检查代码作为独立的进程,并且通过进程间通信来触发检查,因此攻击者不能感知到本保护方法的存在,也无法通过被保护程序中的漏洞来影响到检查逻辑的状态;

(2)本技术方案不采用任何人为制定的规则,而是通过模拟执行收集控制流信息以生成控制流图,能兼容任何形式的控制流转移,而不必区别对待不同形式的控制流转移;

(3)本技术方案支持完全上下文敏感的控制流完整性检查,将执行路径作为整体来检查,而不同于已有的控制流完整性方法对每一条控制流边分别进行检查,控制流完整性检查考虑了执行路径的所有控制流边,能够生成精确性高的控制流图,从而实现了完全上下文敏感的控制流完整性检查;

(4)本技术方案在运行时利用硬件特性跟踪执行路径,因此引入的运行时开销非常低,能够忽略不计,此外,由于本发明在目标程序运行时没有对被保护程序进行插桩,且检查过程发生在另一个进程中,因此检查也不会给进程带来运行时开销;

(5)本技术方案采用模块设计,对进程主模块和不同的共享库模块的信息分别存储,且采用独立于进程空间布局的形式保存信息,当同一进程重新启动或同一共享库模块被不同进程共同使用时,本技术方案收集的信息能够被重复使用,而不必重新收集,从而实现了模块化支持。

附图说明

图1是本发明系统的系统结构示意图;

图2是本发明方法步骤(1)模拟执行的详细流程图;

图3是本发明方法步骤(2)基本块信息收集执行的详细流程图;

图4是本发明进程跟踪用户组件运行流程示意图;

图5是本发明进程跟踪内核组件运行流程示意图;

图6是本发明方法步骤(4)控制流检查执行的详细流程图;

图7是本发明用于计算哈希值的记录格式;

图8是本发明的控制流检查方法。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

如图1所示,本发明系统包括:

模拟执行模块,用于输入预设的测试用例到目标程序,模拟执行目标程序,获取目标程序的控制流信息;这里的测试用例指测试输入参数;

基本块信息收集模块,用于对目标程序进行文件格式分析和反汇编,识别并保存目标程序二进制文件中的基本块信息;

进程跟踪模块,用于启动目标程序进程,跟踪目标程序进程的执行路径,并获取进程跟踪信息;

控制流检查模块,用于根据进程跟踪信息查找基本块,由基本块信息生成路径信息,通过匹配控制流信息和路径信息,实现完整指令路径的合法性检查。

如图2所示,模拟执行模块利用插桩、标准数据流重定向和污点跟踪技术,对程序进行模拟执行,能够自动、无交互、渐增式地获取正确的控制流信息,模拟执行模块首先对程序指令进行插桩;之后将标准输入流重定向至预定义的测试用例;再之后启动程序,等待被插桩指令的执行,针对不同的插桩点进行不同的分析工作:如果是主函数返回指令或结束进程相关的系统调用,则结束模拟执行;对于除主函数返回指令和结束进程相关的系统调用以外的所有插桩点,进行污点分析;如果是预定义的敏感系统调用的入口,将系统调用的返回值或被系统调用修改的数据设置为污点数据;如果是分支指令,按照不同类型的分支指令,进行不同的工作:如果是直接无条件分支,不进行多余的工作;如果是直接条件分支,计算其目标地址,并生成执行路径信息,计算哈希值作为控制流信息并保存;如果是间接分支,首先判断其目标地址变量是否为污点数据:如果目标地址变量是污点数据,则丢弃本次模拟执行获取的信息,并结束模拟执行;如果目标地址变量不是污点数据,则计算其目标地址,并生成执行路径信息,计算哈希值作为控制流信息并保存。

如图3所示,基本块信息收集模块利用文件格式分析和反汇编,识别并保存二进制文件中的基本块信息;

首先分析二进制文件的文件格式,找到代码段的地址范围;随后对代码段进行反汇编;再之后对代码进行遍历,分析分支指令并识别基本块:如果是直接分支指令,提取出以该指令结尾的基本块,同时提取出以目标地址指令开头的基本块;如果是间接分支指令,提取出以该指令结尾的基本块;最后当所有代码都已遍历完,保存所有基本块信息。

如图4所示,进程跟踪用户组件负责与进程跟踪内核组件进行通信以控制处理器进程跟踪功能的开启或关闭,以及负责进程跟踪信息的转储;

首先设置分析起始点和终止点;之后启动进程,等待特定的进程跟踪事件发生并进行不同的响应工作:当到达分析起始点时,通知进程跟踪内核组件启用处理器进程跟踪功能;当接收到进程跟踪内核组件发来的信号时,转储进程跟踪信息;当到达分析终止点时,通知进程跟踪内核组件禁用处理器进程跟踪功能。

如图5所示,进程跟踪内核组件负责配置处理器进程跟踪功能,等待进程跟踪用户组件的请求,实时跟踪进程的执行路径,并生成进程跟踪信息;

首先检查硬件环境,确定当前环境支持的进程跟踪能力;之后申请内存缓冲区;再之后配置性能监控中断功能;随后配置处理器进程跟踪功能;最后等待特定事件并进行不同的响应工作:当进程跟踪用户组件请求启用处理器进程跟踪功能时,重新配置处理器进程跟踪功能,启动进程跟踪;当进程跟踪用户组件请求禁用处理器进程跟踪功能时,结束进程跟踪;当收集到足够的进程跟踪信息导致缓冲区满时,向进程跟踪用户组件发送转储信号。

如图6所示,控制流检查模块通过比较模拟执行获取的控制流信息和运行时获取的进程跟踪信息,实现完整指令路径的合法性检查,从而检查控制流的合法性;首先遍历进程跟踪信息,进行以下工作:查找基本块,如果没有找到,则及时生成新的基本块信息,更新基本块信息;生成路径信息;计算哈希值;与模拟执行模块收集到的控制流信息进程匹配:如果匹配失败,则表示相应的控制流信息在离线阶段未收集,结束检查;如果匹配成功,则继续判断目标地址是否合法;如果发现目标地址不合法,则判断受到攻击,通知进程跟踪模块以终止程序执行。

如图7所示,用于计算哈希值的记录格式为三元组:(先前已到达的执行路径的哈希值,后续基本块所在的二进制文件路径,后续基本块在文件中的偏移)。每当执行到分支指令时,都要计算当前已执行到的路径的哈希值,并保存用以计算之后的哈希值。采用这种格式,不仅能够快速计算,而且计算得到的哈希值包含当前已执行到的完整路径的信息。

基本块信息收集模块通过遍历指令并分析指令类型来收集基本块信息。定义两种基本块类型:

(1)条件基本块:该类基本块的入口指令是其它基本块的目标指令,终止指令是直接条件分支指令。该类基本块具有两个合法的目标地址,按照运行时的条件满足情况确定当前的目标地址。

(2)间接基本块:该类基本块的入口指令是其它基本块的目标指令,终止指令是间接分支指令。该类基本块的目标地址在运行时才可确定。

按照基本块类型识别基本块,并生成基本块信息,用于控制流检查模块。

如图8所示,本发明通过哈希匹配和控制流信息比较的方法完成控制流完整性检查工作。具有以下步骤:

(1)在离线分析阶段,模拟执行目标程序,并计算生成执行路径的哈希值并保存;

(2)在运行时阶段,跟踪执行路径,并计算生成哈希值;

(3)当执行到间接分支时,匹配运行时生成的哈希值和线下分支阶段得到的哈希值;

(4)比较线下分析得到的该执行路径的目标地址和运行时得到的该执行路径的目标地址,如果相同,则表示安全;否则,说明遇到攻击。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1