一种基于数据流监控的代码复用攻击防御方法及系统技术方案

技术编号:18084373 阅读:93 留言:0更新日期:2018-05-31 12:46
本发明专利技术公开了一种基于数据流监控的代码复用攻击防御方法及系统,属于系统安全技术领域。本发明专利技术方法首先由目标程序和共享库源码提取函数、数据信息,再对中间语言代码进行分析,识别目标程序和共享库中的内存访问指令,对指令进行插桩并生成函数跳转表和指令重定位信息。在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间的对应区域,并设置隔离环境。在目标程序运行时,通过监控异常数据流的方式,防止攻击者对隔离区内部进行搜索,从而防止代码复用攻击。本发明专利技术还实现了一种基于数据流监控的代码复用攻击防御系统。本发明专利技术适用于X86_64平台上的代码复用攻击防御,能避免由攻击造成的巨大损失。

【技术实现步骤摘要】
一种基于数据流监控的代码复用攻击防御方法及系统
本专利技术属于系统安全
,更具体地,涉及一种基于数据流监控的代码复用攻击防御方法及系统。
技术介绍
开发者在编写程序时,往往会不可避免地产生许多漏洞。代码复用攻击指在程序运行时,利用漏洞在程序的内存地址空间中,搜索可利用的代码片段,并通过修改函数指针或返回地址的方式,将它们链接成可以连续执行的代码序列(包括函数序列、指令序列),并使程序转而执行这些代码序列的攻击方式。通过代码复用攻击,攻击者能够劫持程序、获取系统权限、执行恶意代码,这给应用程序和操作系统的安全带来了极大隐患。代码复用攻击利用了程序执行时的以下特点:(1)程序在执行时,内存中有大量的返回地址和函数指针,它们暴露了代码片段的地址;(2)程序在执行时,代码页的权限是可读可执行;(3)通过修改程序中的返回地址和函数指针,可以劫持程序的执行。针对代码复用攻击,代码不可读是一类高效的防御方法。现有方法通过将代码页的权限设置为可执行、不可读,阻止攻击者读取代码页并搜索代码片段。Readactor:Practicalcoderandomizationresilienttomemorydisclosure(CraneStephen,InSecurityandPrivacy(SP),2015IEEESymposiumon,pp.763-780)一文中所提出的Readactor方法将代码页中的数据和代码分离,利用英特尔处理器的虚拟化特性,将代码页的权限设置为可执行、不可读。类似的,HideM:Protectingthecontentsofuserspacememoryinthefaceofdisclosurevulnerabilities(GiontaJason等人,InProceedingsofthe5thACMConferenceonDataandApplicationSecurityandPrivacy,pp.325-336)一文中所提出的Hidem方法利用高速缓存将代码页的权限设置为不可读。现有方法还需要对程序中的所有控制流转移进行插桩,通过加密函数指针和返回地址的方式,防止它们暴露代码片段的地址。这样攻击者在程序执行时,既不能直接搜索代码片段,又不能利用返回地址和函数指针推测代码片段,这样就阻止了攻击者构造代码序列,从而达到防御代码复用攻击的目的。然而,上述方法存在一定的不足和局限性:(1)以页为保护粒度,由于代码页中包含部分数据,因此必须将代码页中的数据和代码分离。(2)需要对所有控制流转移进行插桩,开销较大。(3)只对代码进行了保护,没有对数据进行保护,如某些敏感的数据:指针和返回地址,新型代码复用攻击利用数据中的内容(栈上已被加密的函数指针和返回地址),依然能够推测代码片段的位置。
技术实现思路
针对现有技术的缺陷或改进需求,本专利技术提供了一种基于数据流监控的代码复用攻击防御方法及系统,其目的在于,防止攻击者对隔离区内进行搜索,在防御代码复用攻击的同时,保证程序的运行效率。为实现上述目的,按照本专利技术的一个方面,提出了一种基于数据流监控的代码复用攻击防御方法,包括如下步骤:(1)在编译过程中,从目标程序和共享库源码中提取函数和数据信息;所述函数信息包括函数名、函数入口;所述数据信息包括数据名、数据位置和数据类型;系统中,所有内存访问都是由函数中的指令来实现;(2)分析步骤(1)编译形成的中间语言代码,根据提取的函数信息和数据信息,识别所述中间语言代码中的内存访问指令;对内存读操作指令,不包括对数据段中内容进行访问的指令、取函数地址指令、对栈中数据进行操作的指令进行插桩,并生成所述函数对应的跳转表;所述插桩,指在不影响程序正常执行的前提下,在内存读操作指令前插入新的检查指令,或对原有的指令进行修改;修改包括将取函数地址的指令,替换为取函数对应的跳转表入口的地址;修改对栈中数据进行访问的指令,保证在运行时程序能够正常访问隔离栈和数据区栈中的数据;插桩的目的是增强程序的安全性;(3)识别所述中间语言代码中对数据段中内容进行访问的指令,生成指令重定位表,并在编译时添加到目标语言代码的指令重定位段中,形成包含指令重定位段的可执行文件;这一步编译是生成可执行代码,前一步编译是生成中间代码;(4)在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间中的隔离区和数据区;利用步骤(3)中生成的重定位表对代码段中访问数据段中内容的指令进行修正,对指令中的偏移量进行修改,让它能够找到正确的数据地址并正常的访问数据,并初始化隔离环境;所述初始化是指对%bnd0寄存器进行设置,把它设置为隔离区的边界,启用MPX检查机制;以及为隔离栈分配空间;隔离栈用于保存返回地址和栈上的函数指针;MPX是Intel的内存保护拓展指令集;所述隔离区是本专利技术定义的安全区域,是需要进行保护的;数据区指的是除了隔离区以外的所有数据区域,该区域只有数据,没有代码;在目标程序加载时,在保证隔离区和数据区足够大的前提下,可随机选择一个地址,将内存地址空间划分为隔离区和数据区;(5)在目标程序运行时,检测异常数据流,通过检查触发异常指令的访问地址判定其合法性;判定规则为:如果访问的地址内容为代码或隔离栈数据,则判定为真非法,报出异常,并生成日志信息;否则判定为假非法;此时对内存读操作指令前由步骤(2)插桩的检查指令进行修改,将检查指令替换成无操作指令,防止假非法情况继续出现;这是由于编译器在编译时,可能会把一部分数据嵌入在代码中,所以可能会出现对代码段进行读取的情况,我们把这种情况定义为假非法;所述异常数据流指内存读操作指令,不包括对数据段中内容进行访问的指令,对隔离区内的内存进行了访问。进一步的,所述步骤(2)包括以下子步骤:(21)根据步骤(1)中提取的函数信息,构造函数跳转表,跳转表中的表项和函数一一对应,表项的内容为跳转到函数;此处步骤(23)中的取函数地址的指令对应的,是所有被取地址的函数入口;(22)识别内存读操作指令,根据读取内存的地址,插入检查指令,检查这条读操作指令是否访问了隔离区内的内容;(23)识别取函数地址的指令,将其修改为取函数对应跳转表项的地址;也就是取了一个函数的入口地址,把它放在了一个指针里面;(24)根据步骤(1)中提取的数据信息,识别对栈中数据进行操作的指令;此时,这里的栈中数据还没有分离开,目前只有一个栈,但是程序运行时,栈上的返回地址和函数指针会被放在隔离栈上,其他数据会被放在数据区的栈上,所以这里进行替换,实际上就是为之后的隔离进行准备,这里栈中数据既包含了数据区也包含了隔离区中的数据;将使用%rsp寄存器、访问除返回地址和函数指针外其他数据的指令,替换为使用保留的其他通用寄存器,优选%r15寄存器;在编译的时候,通过对编译器进行设置,使其保留这个寄存器;(25)对指令进行优化:如果多条内存读操作指令使用了同一个寄存器,而该寄存器的值没有改变,则将这些读操作的检查指令合并;对于使用%rip寄存器进行访问的指令,删除其检查指令;其中,因为%rip寄存器是PC寄存器,它保存的是当前执行的指令地址,是不能被篡改的,所以它一定不会访问隔离区内的内容;所述寄存器是intelx86_64的CPU本文档来自技高网
...
一种基于数据流监控的代码复用攻击防御方法及系统

【技术保护点】
一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述方法包括:(1)在编译过程中,从目标程序和共享库源码中提取函数和数据信息;所述函数信息包括函数名、函数入口;所述数据信息包括数据名、数据位置和数据类型;(2)分析步骤(1)编译形成的中间语言代码,根据提取的函数信息和数据信息,识别所述中间语言代码中的内存访问指令;对内存读操作指令、取函数地址指令、对栈中数据进行操作的指令进行插桩,并生成所述函数对应的跳转表;所述插桩,指在不影响程序正常执行的前提下,插入新的指令,或对原有的指令进行修改;(3)识别所述中间语言代码中对数据段中内容进行访问的指令,生成指令重定位表,并在编译时添加到目标语言代码的指令重定位段中,形成包含指令重定位段的可执行文件;(4)在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间中的隔离区和数据区,利用步骤(3)中生成的重定位表对代码段中访问数据段中内容的指令进行修正,找到正确的数据地址,并初始化隔离环境;所述初始化是指对%bnd0寄存器进行设置,把它设置为隔离区的边界,启用MPX检查机制;以及为隔离栈分配空间,隔离栈用于保存返回地址和栈上的函数指针;(5)在目标程序运行时,检测异常数据流,通过检查触发异常指令的访问地址判定其合法性;判定规则为:如果访问的地址内容为代码或隔离栈数据,则判定为真非法,报出异常,并生成日志信息;否则判定为假非法;此时对内存读操作指令前由步骤(2)插桩的检查指令进行修改,将检查指令替换成无操作指令,防止假非法情况继续出现;所述异常数据流指内存读操作指令,对隔离区内的内存进行了访问。...

【技术特征摘要】
1.一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述方法包括:(1)在编译过程中,从目标程序和共享库源码中提取函数和数据信息;所述函数信息包括函数名、函数入口;所述数据信息包括数据名、数据位置和数据类型;(2)分析步骤(1)编译形成的中间语言代码,根据提取的函数信息和数据信息,识别所述中间语言代码中的内存访问指令;对内存读操作指令、取函数地址指令、对栈中数据进行操作的指令进行插桩,并生成所述函数对应的跳转表;所述插桩,指在不影响程序正常执行的前提下,插入新的指令,或对原有的指令进行修改;(3)识别所述中间语言代码中对数据段中内容进行访问的指令,生成指令重定位表,并在编译时添加到目标语言代码的指令重定位段中,形成包含指令重定位段的可执行文件;(4)在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间中的隔离区和数据区,利用步骤(3)中生成的重定位表对代码段中访问数据段中内容的指令进行修正,找到正确的数据地址,并初始化隔离环境;所述初始化是指对%bnd0寄存器进行设置,把它设置为隔离区的边界,启用MPX检查机制;以及为隔离栈分配空间,隔离栈用于保存返回地址和栈上的函数指针;(5)在目标程序运行时,检测异常数据流,通过检查触发异常指令的访问地址判定其合法性;判定规则为:如果访问的地址内容为代码或隔离栈数据,则判定为真非法,报出异常,并生成日志信息;否则判定为假非法;此时对内存读操作指令前由步骤(2)插桩的检查指令进行修改,将检查指令替换成无操作指令,防止假非法情况继续出现;所述异常数据流指内存读操作指令,对隔离区内的内存进行了访问。2.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(2)包括以下子步骤:(21)根据步骤(1)中提取的函数信息,构造函数跳转表,跳转表中的表项和函数一一对应,表项的内容为跳转到函数入口;(22)识别内存读操作指令,根据读取内存的地址,插入检查指令,检查这条读操作指令是否访问了隔离区内的内容;(23)识别取函数地址的指令,将其修改为取函数对应跳转表项的地址;(24)根据步骤(1)中提取的数据信息,识别对栈中数据进行操作的指令;将使用%rsp寄存器、访问除返回地址和函数指针外其他数据的指令,替换为使用保留的其他通用寄存器,优选%r15寄存器;(25)对指令进行优化:如果多条内存读操作指令使用了同一个寄存器,而该寄存器的值没有改变,则将这些读操作的检查指令合并;对于使用%rip寄存器进行访问的指令,删除其检查指令;所述寄存器是intelx86_64的CPU上特有的。3.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(3)包括以下子步骤:(31)识别代码中对数据段中内容进行访问的指令,也即使用%rip寄存器对数据段中内容进行访问的指令;(32)根据(31)中识别的指令在代码段中的位置,以及指令所访问的数据相对于指令的偏移量,生成指令重定位信息;(33)在编译过程中,将指令重定位信息编译为指令重定位段,生成包含指令重定位段的可执行文件。4.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(4)包括以下子步骤:(41)在目标程序加载时,设置隔离区的边界,将内存地址空间划分为隔离区和数据区;(42)加载目标程序和共享库,将代码段映射到隔离区内,将数据段、堆、栈映射到数据区内;(43)根据代码段、数据段映射的地址,以及(3)中生成的指令重定位信息,修正代码段中对数据段中内容进行访问的指令,将指令所访问的数据相对于指令的偏移量,修改为新的偏移量;(44)为隔离栈分配空间,初始化寄存器的值,将%rsp寄存器设置为隔离区栈顶的地址,将%bnd0寄存器设置为隔离区边界的地址,将保留的其他通用寄存器,如%r15设置为数据区栈顶的地址,并设置%bndcfg寄存器,启用MPX检查机制。5.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(5)包括以下子步骤:(51)监控运行时的读取数据流,如果内存读操作指令,对隔离区内部的内存进行了访问,则被视为异常数据流,并判定其合法性:(52)通过检查触发异常指令的访问地址判定其合法性:如果该指令访问的地址内容为代码或隔离栈数据,则为真非法情况,报出异常,并生成日志信息;否则为假非法情况,对步骤(2)插桩的检查指令进行修改,将其替换为无操作指令,避免假非法情况继续出现。6.一种基于数据流监控的代码复用攻击防御系统,其特征在于,所述系统包括:信息提取模块,用于从目标程序和共享库源码,提取函数、数据信息,函数信息包括函数名和函数入口;数据信息包括数据名、数据位置和数据类型;指令插桩模块,用于分析中间语言代码,结合信息提取模块提取的函数信息和数据信息,识别代码中的内存访问指令;对内...

【专利技术属性】
技术研发人员:金海邹德清刘本熙
申请(专利权)人:华中科技大学
类型:发明
国别省市:湖北,42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1