【技术实现步骤摘要】
一种基于数据流监控的代码复用攻击防御方法及系统
本专利技术属于系统安全
,更具体地,涉及一种基于数据流监控的代码复用攻击防御方法及系统。
技术介绍
开发者在编写程序时,往往会不可避免地产生许多漏洞。代码复用攻击指在程序运行时,利用漏洞在程序的内存地址空间中,搜索可利用的代码片段,并通过修改函数指针或返回地址的方式,将它们链接成可以连续执行的代码序列(包括函数序列、指令序列),并使程序转而执行这些代码序列的攻击方式。通过代码复用攻击,攻击者能够劫持程序、获取系统权限、执行恶意代码,这给应用程序和操作系统的安全带来了极大隐患。代码复用攻击利用了程序执行时的以下特点:(1)程序在执行时,内存中有大量的返回地址和函数指针,它们暴露了代码片段的地址;(2)程序在执行时,代码页的权限是可读可执行;(3)通过修改程序中的返回地址和函数指针,可以劫持程序的执行。针对代码复用攻击,代码不可读是一类高效的防御方法。现有方法通过将代码页的权限设置为可执行、不可读,阻止攻击者读取代码页并搜索代码片段。Readactor:Practicalcoderandomizationresilienttomemorydisclosure(CraneStephen,InSecurityandPrivacy(SP),2015IEEESymposiumon,pp.763-780)一文中所提出的Readactor方法将代码页中的数据和代码分离,利用英特尔处理器的虚拟化特性,将代码页的权限设置为可执行、不可读。类似的,HideM:Protectingthecontentsofuserspacem ...
【技术保护点】
一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述方法包括:(1)在编译过程中,从目标程序和共享库源码中提取函数和数据信息;所述函数信息包括函数名、函数入口;所述数据信息包括数据名、数据位置和数据类型;(2)分析步骤(1)编译形成的中间语言代码,根据提取的函数信息和数据信息,识别所述中间语言代码中的内存访问指令;对内存读操作指令、取函数地址指令、对栈中数据进行操作的指令进行插桩,并生成所述函数对应的跳转表;所述插桩,指在不影响程序正常执行的前提下,插入新的指令,或对原有的指令进行修改;(3)识别所述中间语言代码中对数据段中内容进行访问的指令,生成指令重定位表,并在编译时添加到目标语言代码的指令重定位段中,形成包含指令重定位段的可执行文件;(4)在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间中的隔离区和数据区,利用步骤(3)中生成的重定位表对代码段中访问数据段中内容的指令进行修正,找到正确的数据地址,并初始化隔离环境;所述初始化是指对%bnd0寄存器进行设置,把它设置为隔离区的边界,启用MPX检查机制;以及为隔离栈分配空间,隔离栈用于保存返回地址和栈上的函 ...
【技术特征摘要】
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
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。