首页> 中国专利> 一种基于RET指令与JMP指令的ROP攻击检测方法

一种基于RET指令与JMP指令的ROP攻击检测方法

摘要

一种基于RET指令与JMP指令的ROP攻击检测方法,本发明涉及软件安全领域,其旨在解决现有应对ROP攻击的方法只有一种类型或一个步骤的ROP攻击检测验证,不能够充分地识别ROP攻击指令的本质性特征,不能够检测到深度隐藏的ROP攻击指令,并存在匹配精度低,误判率高且检测通用性差等技术问题。采用插桩工具跟踪目标程序,匹配相应指令,得到指令流,以此为依据,将疑似符合ROP攻击特征的指令加入循环队列。利用数学方法,对循环队列中的指令进行进一步判定,根据输出结果与ROP攻击特征进行再一次匹配,由此判定ROP攻击。本发明用于ROP攻击的全面检测。

著录项

  • 公开/公告号CN105138903A

    专利类型发明专利

  • 公开/公告日2015-12-09

    原文格式PDF

  • 申请/专利权人 电子科技大学;

    申请/专利号CN201510498408.0

  • 申请日2015-08-14

  • 分类号G06F21/52(20130101);

  • 代理机构成都弘毅天承知识产权代理有限公司;

  • 代理人杨保刚

  • 地址 611731 四川省成都市高新区西源大道2006号

  • 入库时间 2023-12-18 12:45:22

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-07-10

    授权

    授权

  • 2016-01-06

    实质审查的生效 IPC(主分类):G06F21/52 申请日:20150814

    实质审查的生效

  • 2015-12-09

    公开

    公开

说明书

技术领域

本发明涉及软件安全领域,具体涉及一种基于RET指令与JMP指令的ROP攻击检测方法。

背景技术

缓冲区溢出(BufferOverflow)是普遍且危害巨大的漏洞,它源于程序设计的缺陷,发生在进程试图向缓冲区存储超过其容量的数据时,超出容纳范围的额外信息可能导致该缓冲区的正常数据被覆盖。额外的数据可能就是攻击代码,其触发某些恶意行为,可能会窃取用户数据、阻碍程序运行以及使系统崩溃等,更严重的情况下,可能得到系统权限,对系统进行进一步破坏。

ROP攻击便是基于缓冲区溢出漏洞的攻击。返回导向编程(ROP)是一种代码重用的安全开发技术。通过从目标程序中链接已存在的短小指令,ROP允许远程攻击者在不注入任何恶意代码的情况下去执行图灵完备计算。ROP攻击主要的思路是复用已存在的代码空间中的指令去实施恶意行为。ROP攻击主要分两个步骤:1)从完整的代码片段中确定一系列有用的指令语句,称为Gadget。例如,应用程序代码和共享库。2)通过精心设计的有效载荷去将选中的Gadget存入Gadgets链。值得注意的是,这些Gadgets没有被限制使用对齐指令,例如在x86平台上,一串非对齐指令可能会转换成可用的指令。一个典型的Gadget有代码片段去完成计算操作(例如,分配给通用CPU寄存器一个值),另外,一个连接片段通过操作控制流去连接Gadget。通过间接跳转指令例如RET和JMP/CALL指令去实现控制流操作。根据不同的连接片段,ROP攻击可以分为基于RET的攻击,基于JMP的攻击和ROP。在现实的ROP攻击中,攻击者可能会综合各类ROP攻击。用于ROP攻击的Gadgets有以下几个典型特点。

小尺寸。Gadget的代码段通常是很小的,例如,由2至5个指令组成,这导致单一的Gadget缺乏功能性。虽然有大段代码的Gadget可以进行更多的操作,但是必然导致更多的副作用,其中一些将会与其它的Gadget发生冲突。例如,一个Gadget意外地改变栈指针,这可能导致下一个Gadget的执行失败。事实上,攻击者通常倾向于收集只与预期操作相关的Gadget,而不是使用长的Gadgets。因此,一个真正的ROP攻击通常需要许多这样的Gadget。

分布稀疏。虽然Gadget分布在整个代码空间,但是由于分布稀疏,存在那些满足攻击者需求却得不到确认的Gadget。为了有较高的成功率,攻击者通常需要一个大的代码库,收集到足够的Gadgets去执行恶意操作。实验结果表明,在任何时间内,如果能够限制可执行代码的大小在20KB以内,将会降低攻击者去触发一个有意义的ROP攻击的概率。如果能进一步减少其大小,可能性会持续下降。

由于ROP攻击的巨大威胁,近几年,已经有许多的方法建议被见证用于防御ROP攻击。DROP,ROPDefender,ROPGuard和返回少许内核等方法只是关注ROP指令的结束返回指令(例如,基于RET的指令),其允许攻击者去利用其它指令(例如,基于JMP的指令)。

DROP通过设定Gadget数目的阀值,利用DynamicBinaryInstrumentation——Valgrind获取RET指令,若连续Gadget的数目超过阀值,则判定为ROP攻击。

DROP仅以连续Gadget的数目作为判定是否存在ROP攻击的依据,会产生较高的误报率。ROPDefender基于影子栈利用DynamicBinaryInstrumentation实现ROP攻击检。当进程执行过程中发生函数调用时,返回地址被保存在影子栈当中。ROPDefender截获到RET指令后,将ShadowStack栈顶内容弹出,并与实际返回地址的值进行比较,如果两者不相同则说明检测到ROP攻击。但是,函数的调用与返回存在着多种复杂情况,某些时候,并不遵循后进先出原则,因此检测结果的准确性不能得到保证。

发明内容

针对上述现有技术,本发明目的在于提供一种基于RET指令与JMP指令的ROP攻击检测方法,其旨在解决现有应对ROP攻击的方法只有一种类型或一个步骤的ROP攻击检测验证,不能够充分地识别ROP攻击指令的本质性特征,不能够检测到深度隐藏的ROP攻击指令,并存在匹配精度低,误判率高且检测通用性差等技术问题。

为达到上述目的,本发明采用的技术方案如下:

一种基于RET指令与JMP指令的ROP攻击检测方法,包括创建循环队列;利用二进制插桩工具启用目标程序;跟踪目标程序并进行指令匹配;加载对应指令的检测模块以及检测模块生成疑似ROP攻击指令;将疑似ROP攻击指令加入循环队列并判断其是否超出阀值。

上述方法中,进一步地,所述的利用二进制插桩工具启用目标程序,包括插入器通过Ptrace函数获取目标进程的控制权限和上下文;加载插桩动态链接库至地址空间;二进制插桩工具启动目标程序;调度器启动编译器,编译器编译插桩代码,完成后并存储;执行已存储的插桩代码并输出。

优选地,二进制插桩工具选用二进制动态插桩工具Pin,获取目标进程的当前指令,并从此条指令起生成线型代码序列,随后将控制权转移至新生成的代码序列上;Pin不需要再次重复编写源代码并能够支持插桩程序生成动态代码。

上述方法中,进一步地,所述的跟踪目标程序并进行指令匹配,包括将目标程序进行RET指令匹配和/或JMP指令匹配。显著地并实质地,增加了匹配精度,拓展了被检测特征范围,实现了深度ROP攻击特征匹配。

上述方法中,进一步地,所述的加载对应指令的检测模块以及检测模块生成疑似ROP攻击指令,包括利用二进制插桩工具加载基于RET指令的检测模块和/或基于JMP指令的检测模块。对疑似ROP攻击指令进行进一步检测,并不是直接将疑似ROP攻击直接判断为ROP攻击,显著地并实质地,提升了判别精度。

上述方法中,进一步地,所述的加载对应指令的检测模块以及检测模块生成疑似ROP攻击指令,疑似ROP攻击指令包括基于异常事件的RET指令和/或JMP指令。对疑似ROP攻击进行分类,进行两次事件检测;对于高伪装性特征的ROP攻击进行本质性特征检验;显著地并实质地,深度拓展了检测范围且提升了检测精度。

上述方法中,进一步地,所述的疑似ROP攻击指令包括基于异常事件的RET指令和/或JMP指令,异常事件包括在RET指令执行跳转后,目标地址单元的上一单元格内不是CALL指令。提供ROP攻击的本质性特征检验标准。

上述方法中,进一步地,所述的疑似ROP攻击指令包括基于异常事件的RET指令和/或JMP指令,异常事件还包括基于JMP指令的检测模块所获取JMP指令目标地址与当前地址的差值较大。提供ROP攻击的本质性特征检验标准。

上述方法中,进一步地,所述的将疑似ROP攻击指令加入循环队列并判断其是否超出阀值,包括在异常事件出现后,基于RET指令的和/或基于JMP指令的检测模块将疑似ROP攻击指令加入对应指令的循环队列,对应的检测模块判断其是否超出阀值。根据上述方法中提供的ROP攻击本质性特征检验标准,对疑似ROP攻击指令进行循环反复的验证,反复检验是否存在ROP攻击指令的本质性特征以暴露高伪装性的ROP攻击指令;显著地并实质地,彻底解决了深度隐藏ROP攻击指令的检测问题。

上述方法中,进一步地,所述的将疑似ROP攻击指令加入循环队列并判断其是否超出阀值,包括,在循环队列中,存在至少2个RET指令和/或存在JMP指令目标地址与当前地址差值的方差超过10。

与现有技术相比,本发明的优点在于:

在不影响兼容性情况下,实现两种类型指令的匹配、检测、识别和验证循环;充分地检验是否存在ROP攻击指令的本质性特征以暴露高伪装性的ROP攻击指令;显著地并实质地,提升了匹配、检测和识别精度,并且彻底解决了深度隐藏ROP攻击指令的检测问题。

附图说明

图1为插桩模块整体架构。

图2为基于RET指令检测模块设计图。

图3为基于JMP指令检测的流程图。

具体实施方式

本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。

本发明所述的ROP攻击检测方法,包括以下步骤:

图1为插桩模块整体架构,二进制插桩模块启动目标程序且调用基于RET指令的检测模块以及基于RET指令的检测模块,具体方式如下所示:

实施例1

a)Injector使用ptrace来获取目标进程的控制权限和上下文;

b)加载PINTOOL.DLL到地址空间;

c)PIN.EXE启动目标程序;

d)Dispatcher启动Compiler编译插桩代码,并将编译好的代码放入代码缓存(CodeCache)中;

e)执行CodeCache中的插桩代码;

f)输出结果。

图2为基于RET指令检测模块设计图,基于RET指令的检测模块,检测插桩工具匹配到的RET指令的行为特征。当满足特定特征的指令达到一定的阀值,则认定存在ROP攻击。

循环队列的构建。基于RET与JMP指令的检测模块共同维护一个循环队列;

实施例2

此循环队列容量为10个指令,用于存放满足特征的指令。队列初始为空,设置int类型标志位location用于记录当前队尾地址。当需要存放的指令大于10时,新插入的指令将按照插入顺序由早到晚覆盖之前的指令,使得循环队列中维护的都是最新运行的指令,以保证ROP攻击检测的准确性。

基于RET指令的特征匹配。RET指令为返回指令,根据程序运行规则,当CALL指令调用某一函数时,系统会自动将CALL指令的下一个地址压入栈以保存现场,函数运行完成后,利用RET返回到当前栈顶指针指向的地址,返回现场;

实施例3

基于RET的ROP攻击检测便基于此特征,利用插桩工具Pin,调用LEVEL_CORE::INS_IsRet(INSins)函数,匹配到RET指令,跟踪其执行流程,观察其跳转后的地址。随后,利用LEVEL_PINCLIENT::INS_Prev(INSx)找寻返回地址的上一个地址单元的内容,若上一个单元的指令为CALL,则此时程序不存在异常。若上一个单元格的内容不为CALL,则表明此RET返回存在异常,很可能是ROP攻击中用于连接各个gadget的RET指令,此时便将此RET指令插入到循环队列中。

ROP攻击判定。ROP攻击的判定基于当前循环队列中RET指令的个数;

实施例4

设定2为RET指令的阀值,阀值的设定来源于对正常程序实验结果的分析,同时设置标志位Flagret用于记录当前队列中RET的个数。Falgret初始值为0,当匹配到即将插入新指令的Location所指单元格中为RET指令时,在插入新指令后将Flagret自减1;当匹配到有RET指令插入时,Flagret自加1。此步骤按照先减后加的顺序,否则可能造成判定的错误。当Flagret达到阀值,则说明当前目标程序中存在多次RET异常返回,根据ROP攻击测特征,判定此时存在ROP攻击。

图3为基于JMP指令检测的流程图,基于JMP指令的检测模块与基于RET指令的检测模块共同维护一个循环队列。因此,循环队列的建立与之前一样。JMP指令用于程序间的跳转,当JMP的目标地址与当前地址之差过大时,说明程序的跳转相当不稳定,其跳转有可能是由ROP攻击代码中的JMP指令为链接各个gadget而造成;

实施例5

根据正常程序的实验结果,设定8页为阀值,当跳转之差超过阀值时,则将此JMP插入到循环队列中,每个单元格为一个结构体,记录JMP指令类型以及JMP跳转的页面之差。设置Flagjmp记录循环队列中JMP指令的个数,Flagjmp初始值为0,当出队列的值为JMP时,Flagjmp自减1;当入队列的值为JMP时,Flagjmp自加1。与Flagret不同,Flagjmp记录的JMP个数用于计算循环队列中JMP跳转页面的方差。

方差是各个数据分别与其平均数之差的平方的和的平均数,在概率论和数理统计中,方差用来度量随机变量和其数学期望之间的偏离程度。此处,引入方差的计算是为了衡量JMP跳转的波动幅度,方差计算公式如下:

实施例6

设置10为s2的阀值,当队列中JMP跳转之差的方差超过10时,根据ROP攻击的特征,判定此时存在ROP攻击。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何属于本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号