首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

基于LBR的栈缓冲区溢出攻击防御方法 

申请/专利权人:中国人民解放军战略支援部队信息工程大学

申请日:2019-01-08

公开(公告)日:2019-06-07

公开(公告)号:CN109858253A

主分类号:G06F21/57(2013.01)I

分类号:G06F21/57(2013.01)I;G06F21/56(2013.01)I

优先权:

专利状态码:有效-授权

法律状态:2021.04.20#授权;2019.07.02#实质审查的生效;2019.06.07#公开

摘要:本发明提供一种基于LBR的栈缓冲区溢出攻击防御方法。通过使用设定的指令集替代原来的call指令和ret指令,将硬件因素引入到栈中返回地址的保护,存放到栈中的“地址”实际上是生成真正返回地址的软件因子,只有与处理器LBR所提供的硬件因子相结合以后,才能得到真正的返回地址,使得攻击者直接攻击栈中数据的方法失效。由于攻击者不具备直接攻击物理系统的能力,本发明可以合理的假设硬因子是无法被攻击篡改的。基于硬因子的可信性,结合随机因子防重放的设计,使得本发明所提出的栈数据保护方案的有效。不同于影子栈或者加密返回地址的方法,本发明不依赖过多的计算复杂性和冗余空间,只是增加若干条指令,运行效率得到了保证。

主权项:1.一种基于LBR的栈缓冲区溢出攻击防御方法,其特征在于,包括:步骤11、在进程初始化时随机生成随机参数,将所述随机参数作为所述进程当前整个生命周期的随机因子;步骤12、当父函数调用子函数时,获取返回地址;步骤13、当确定待调用子函数时,获取返回父函数指令的地址,将所述返回父函数指令的地址作为硬因子;步骤14、根据所述随机因子、返回地址和硬因子计算软因子,并将所述软因子替代返回地址存储在栈中;步骤15、使用jmp指令替代call指令,从父函数跳转至子函数。

全文数据:基于LBR的栈缓冲区溢出攻击防御方法技术领域本发明涉及计算机操作系统技术领域,尤其涉及一种基于LBR的栈缓冲区溢出攻击防御方法。背景技术栈缓冲区溢出漏洞是软件系统十分普遍的一种安全漏洞,它通过向栈不断注入数据覆盖函数返回地址来达到控制软件控制流的目的。利用栈缓冲区溢出漏洞,攻击者可以绕开防病毒之类的安全措施,进入操作系统窃取用户隐私。对于栈缓冲区溢出攻击,最为经典的防御方法是StackGuard。简单来说,StackGuard是在栈中插入一个标志字作为“哨兵”,当攻击者通过持续注入非法地址篡改返回地址时,会覆盖“哨兵”。这样,当程序从子函数中返回时,会首先检查“哨兵”是否正常,如果“哨兵”被覆盖,那么就意味着发生攻击。为了防止“哨兵”被攻击者猜测,还需要对“哨兵”进行必要的处理,典型的方法是随机化。由于非法输入的数据通常都是字符串,那么也可以使“哨兵”包含字符串结束字符,使其无法覆盖“哨兵”。StackShield采用的是备份的方法来保护栈中的返回地址。每次产生返回地址时,StackShield会将返回地址存储到其它地方。当程序从子函数中返回时,会首先读取备份的返回地址,是否栈中的返回地址一致。如果不匹配,则意味着出现了溢出攻击行为。这一类方法有时也称为“影子栈”。此类防御方法的重点是如何保证“影子栈”不被攻击者所破坏。PointGuard采用加密方法保护返回地址,在栈中存放的是返回地址的密文。这样攻击者即使以非法地址篡改了返回地址,系统也会对非法地址进行解密,返回的是攻击者未知的地址。攻击者即使溢出成功,也无法达到劫持软件控制流的目的。这种防御方法是利用加密算法改变返回地址的形态。改变返回地址形态的方法有多种,PointGuard所采用的加密算法是常见的一种。采用加密算法改变栈中返回地址的方法主要面临着效率问题。虽然待加密的内容很短少只有一个地址,但是仍然需要处理器读取密钥、实施加解密运算等耗费处理器资源的操作。在程序执行过程中,引入加解密运算,还可能破坏局部性原理,导致TLBTranslationLookasideBuffer;转换检测缓冲区命中率降低,分支预测准确率下降等问题,再次影响到系统整体性能。除了性能开销问题外,PointGuard仍然面临着密钥保护问题。PointGuard防御方法成立的前提是:攻击者不能获知密钥。如果攻击者获知密钥,可以用非法地址的密文覆盖返回地址的密文,栈溢出攻击有效。如果密钥存储位置是安全的,那么可以直接将返回地址备份到密钥所在存储空间,采用“影子栈”的方法实施保护,同时还避免加解密运算所带来的性能开销。发明内容为解决现有技术中存在的上述不足,本发明提供一种基于LBR的栈缓冲区溢出攻击防御方法,通过硬件信息和软件信息共同协作得到真正的返回地址。这样,攻击者即使通过溢出篡改栈中的数据,也无法改变成功劫持软件控制流。一方面,本发明提供一种基于LBR的栈缓冲区溢出攻击防御方法,主要包括以下步骤:步骤11、在进程初始化时随机生成随机参数,将所述随机参数作为所述进程当前整个生命周期的随机因子;步骤12、当父函数调用子函数时,获取返回地址;步骤13、当确定待调用子函数时,获取返回父函数指令的地址,将所述返回父函数指令的地址作为硬因子;步骤14、根据所述随机因子、返回地址和硬因子计算软因子,并将所述软因子替代返回地址存储在栈中;步骤15、使用jmp指令替代call指令,从父函数跳转至子函数。进一步地,在步骤14中,所述软因子具体为:进一步地,在步骤11之前还包括:在由源代码初步编译得到的RTL指令集中插入随机因子发生函数,得到新的RTL指令集;通过修改指令模板,使用设定的指令集替代call指令,并采用修改后的指令模板将新的RTL指令集转换为汇编指令;其中,所述设定的指令集用于执行所述步骤11至步骤15。另一方面,本发明提供又一种基于LBR的栈缓冲区溢出攻击防御方法,主要包括以下步骤:步骤21、使用jmp指令从子函数跳转至设定的跳板函数;步骤22、在跳板函数内从处理器LBR硬件特性中获取硬因子,所述硬因子指返回父函数指令的地址;步骤23、在跳板函数内获取随机因子,所述随机因子指在进程初始化时随机生成的随机参数;步骤24、使用pop指令使软因子出栈,所述软因子指替代返回地址存储在栈中的参数;步骤25、根据所述硬因子、随机因子和软因子计算返回地址;步骤26、根据所述返回地址,使用jmp指令从跳板函数跳转至父函数。进一步地,在步骤25中,所述返回地址具体为:返回地址=软因子⊕硬因子⊕随机因子。进一步地,在步骤21之前还包括:在由源代码初步编译得到的RTL指令集中插入跳板函数,得到新的RTL指令集;通过修改指令模板,使用设定的指令集替代ret指令,并采用修改后的指令模板将新的RTL指令集转换为汇编指令;其中,所述设定的指令集用于执行步骤21至步骤26。本发明的有益效果:本发明提供的基于LBR的栈缓冲区溢出攻击防御方法,提出利用处理器LBR硬件特性,改变原来完全依赖返回地址的函数调用返回方式,通过硬件信息和软件信息共同协用得到真正的返回地址。这样,攻击者即使通过溢出篡改栈中的数据,也无法改变成功劫持软件控制流。也就是说,通过将硬件因素引入到栈中返回地址的保护,使得攻击者直接攻击栈中数据的方法失效。由于攻击者不具备直接攻击物理系统的能力,本发明可以合理的假设硬因子是无法被攻击篡改的。基于硬因子的可信性,结合随机因子防重放的设计,使得本发明所提出的栈数据保护方案的有效。不同于影子栈或者加密返回地址的方法,本发明不依赖过多的计算复杂性和冗余空间,只是增加若干条指令,运行效率得到了保证。附图说明图1为本发明实施例提供的基于LBR的栈缓冲区溢出攻击防御方法的流程示意图;图2为本发明实施例提供的返回地址和返回父函数指令地址示意图;图3为本发明实施例提供的入栈操作指令集替代示意图;图4为本发明又一实施例提供的基于LBR的栈缓冲区溢出攻击防御方法的流程示意图;图5为本发明实施例提供的跳板示意图;图6为本发明实施例提供的出栈指令集替代示意图;图7为本发明实施例提供的gcc编译器优化示意图;图8为本发明实施例提供的指令变化示意图;图9为本发明实施例提供的基于LBR的栈缓冲区溢出攻击防御方法的原理示意图。具体实施方式为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。LBR:Intel处理器所具备的一种硬件特性,从本质上讲,就是处理器增加了若干个寄存器,每个寄存器记录最近处理器执行的某次控制转移信息。处理器将这些寄存器组织成一个环状存储池,采用新值覆盖旧值的方法循环记录。Intel处理器所支持的LBR存储容量有限,一般在几组到十几组之间;ASLRAddressSpaceLayoutRandomization:是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的;跳板:本发明所使用的指令片段,用于函数返回时使用;RTL:RegisterTransferLanguage的缩写,是gcc编译器所使用的一种硬件平台无关的语言,是承接源程序和硬件相关的汇编语言之间的中间语言。换言之,gcc编译器首先将源程序转换为RTL指令,再转换为汇编指令。软因子:本发明中专有概念。存储在栈中,参与返回地址拆分和恢复的因子。在传统的栈缓冲区溢出攻击中,存储在栈中的返回地址是攻击目标。在本发明中,软因子就是替代返回地址存储在栈中,是攻击者可以篡改的目标。硬因子:本发明中专有概念。由处理器LBR硬件特性提供的,参与返回地址拆分和恢复的因子。随机因子:本发明中专有概念。由进程所持有的,参与返回地址拆分和恢复的因子。当操作系统装载可执行程序构建新进程过程中,会自动生成一个随机数,作为进程本次生命周期所持有的随机因子。随机因子对进程内所有返回地址拆分和恢复均有效。图1为本发明实施例提供的基于LBR的栈缓冲区溢出攻击防御方法的流程示意图。如图1所示,该方法包括以下步骤:S101、在进程初始化时随机生成随机参数,将所述随机参数作为所述进程当前整个生命周期的随机因子;具体地,本发明设置随机因子的目的是为了阻止攻击者猜测软因子。在没有随机因子情况下,返回地址和硬因子是不变的如果没有采用地址随机对进程实行保护的话,即ASLR,攻击者可以推测出软因子,并且可以刻意伪造溢出的字段串,劫持软件控制流至恶意指令。增加随机因子可以在上述过程中引入随机因素,增加攻击者猜测的难度。随机因子的作用与ASLR类似,但是如果随机因子与ASLR协作,可以进一步提高攻击者的攻击难度。S102、当父函数调用子函数时,获取返回地址;S103、当确定待调用子函数时,获取返回父函数指令的地址,将所述返回父函数指令的地址作为硬因子;具体地,子函数尾部地址实际上就是恢复返回地址时的硬因子。S104、根据所述随机因子、返回地址和硬因子计算软因子,并将所述软因子替代返回地址存储在栈中;具体地,计算软因子的公式如下:结合图2说明,返回地址是jmp指令的下一条指令的地址,是子函数返回时跳转的目的地址。返回父函数指令地址是指子函数内部,执行完相应指令集后,执行返回父函数的那条指令的地址。返回地址在父函数地址范围内,返回父函数指令在子函数地址范围内。由于使用jmp指令替代call指令,所以需要增加压栈指令,将软因子压栈。S105、使用jmp指令替代call指令,从父函数跳转至子函数。由上可知,步骤S101至步骤S105实际上为父函数调用子函数过程,也称为本发明提供的基于LBR的栈缓冲区溢出攻击防御方法中的入栈操作,主要包括:生成软因子、软因子入栈以及控制转移。如图3,传统方法只需要使用call指令即可实现函数调用,本发明使用一组指令替代call指令。为了获取对入栈数据的控制,本发明使用jmp指令替换call指令。为了保证软因子出栈时,能够辅助还原返回地址,我们增加相应指令获取计算软因子所必要的元素。待软因子就绪后,再将软因子压栈。最后使用jmp指令跳转目标函数。图4为本发明又一实施例提供的基于LBR栈缓冲区溢出攻击防御方法的流程示意图。如图4所示,主要包括以下步骤:S201、使用jmp指令从子函数跳转至设定的跳板函数;具体地,由于LBR硬件特性只能记录处理器最近执行的控制转移信息,所以为了获得返回父函数指令的地址,我们要求首先执行该步骤。不过,本步骤的跳转目的地址不是父函数,而是跳板。跳板是本发明在程序中,以函数的形式引入的一段固定指令片段。其设计目的是为了从处理器LBR硬件特性中获得返回父函数指令的地址。引入跳板后,从子函数返回父函数的流程如图5所示。本发明用jmp替代ret作为返回父函数的指令,该指令的目的地址为跳板。这样,后继的操作都将在跳板内完成,所以真正在子函数内部的替代操作只有将ret指令替代为jmp指令。跳板并非由单个子函数使用,可以由多个函数共享,所以在进程内部只需要开设一个跳板。跳板的最后指令是跳转到父函数返回地址。S202、在跳板函数内从处理器LBR硬件特性中获取硬因子,所述硬因子指返回父函数指令的地址;具体地,硬因子为子函数返回父函数指令的地址,该地址依赖IntelLBR获取。由于刚刚执行过该jmp指令,那么可以通过读取LBR寄存器来获得该地址信息。处理器将所有LBR存储寄存器组织成环形存储池,并另使用寄存器来指示哪个存储寄存器是记录最新的控制转移记录。这样,需要读取两次LBR寄存器:首先明确哪个记录是最新的,然后再读取获取返回父函数指令的地址。S203、在跳板函数内获取随机因子,所述随机因子指在进程初始化时随机生成的随机参数;具体地,随机因子在进程生周期内是唯一确定的。所以此时所获得的随机因子与压栈时所获得的随机因子是一致的。随机因子在进程初始化时,由进程随机生成。当进程消亡后,随机因子也失效。进程重新启动后,随机因子重新生成。S204、使用pop指令使软因子出栈,所述软因子指替代返回地址存储在栈中的参数;S205、根据所述硬因子、随机因子和软因子计算返回地址;具体地,计算返回地址的公式:S206、根据所述返回地址,使用jmp指令从跳板函数跳转至父函数。由上述实施例可知,步骤S201至步骤S205实际上为子函数返回父函数过程,也称为本发明提供的基于LBR的栈缓冲区溢出攻击防御方法中的出栈操作。由于栈中不再是返回地址,不能再使用ret从子函数直接返回,所以本发明仍然使用jmp指令替代ret指令。为了从子函数正确返回至父函数,必须计算返回地址。返回地址由随机因子、硬因子和软因子共同计算而得到。所以,如图6所示,本发明增加了相应的指令来还原返回地址,并使用jmp跳转到父函数指定位置。在上述实施例的基础上,为了方便用户使用,需要对编译器进行优化,以便支持本发明。编译器优化主要包括:在由源代码初步编译得到的RTL指令集中插入随机因子发生函数和跳板函数,得到新的RTL指令集;通过修改指令模板,使用设定的指令集替代call指令和ret指令,并采用修改后的指令模板将新的RTL指令集转换为汇编指令;其中,所述设定的指令集用于执行所述步骤S101至步骤S105,以及执行步骤S201至步骤S206。具体地,本发明改变了软件子函数调用和子函数返回的指令集,如果依赖用户在源码层面上适应这种变化,无疑会极大的限制本发明的可接受性。一种替代的方法是:保持用户源码不变,通过优化编译器,使最终输出的可执行代码符合本发明的要求。这样,可执行代码的变换对用户透明,不需要用户过多参与。本发明以gcc编译器为例说明编译器优化的要点,可以扩展到其它编译器。gcc编译器编译过程可以用图7来表示。源代码经过初步编译后,得到RTL中间形式结果。RTL是gcc所采用的一种与硬件无关的、描述编译阶段性结果的中间语言,汇编指令就是基于RTL指令生成的。本发明就是围绕RTL环节来实施优化。本发明的编译器优化分为两个部分:函数修正方案和指令替代方案。如图7所示,函数修正方案是对RTL本身的修正,指令替代方案是影响RTL转变成汇编的过程。函数修正方案主要完成:插入随机因子发生函数和跳板函数。对于编译器优化而言,两者都是新添加函数,只是添加的函数内容不一致。随机因子发生函数可以插入到main函数头部,以确保软件正常工作前,完成随机因子的初始化。需要手动构造随机因子发生函数以及跳板函数的RTL形式,以确保gcc编译器能够正确理解两个函数,并借助gcc内部API例如emit_library_call添加至RTL指令链表中。指令替代方案主要完成:用特定指令集替代call指令和ret指令。gcc使用指令模板的方法来将RTL指令转变为汇编指令。在转换过程,可以通过修改指令模板,使用新的指令集替代原有的call指令和ret指令,从而改变软件的指令结构。指令替代方案与函数修正方案共同作用,使得软件新的可执行指令符合本发明的要求。由上述实施例可知,本发明存储在栈中的不再是返回地址,而是参与计算返回地址的软因子。这样,攻击者即使篡改了栈中的软因子,也无法劫持软件控制流。参与返回地址计算的有:软因子、硬因子以及随机因子。硬因子由处理器LBR硬件特性提供,它根据处理器当前执行的控制转移情况而得到,对某次函数调用和返回有效。随机因子由进程初始化时随机生成,对整个进程有效。并且,本发明通过优化编译器,在原有指令的基础上,采用插入新指令以及指令替代的方法,来构建具有防御缓冲区溢出能力的软件。如图8所示,我们使用jmp指令替代call指令和ret指令,并增加相应的指令,如图中深色阴影部分。当我们使用jmp指令替代call指令后,需要增加新的指令来完成压栈操作,与此同时还需要增加指令计算需要压入栈中的软因子。当使用jmp指令替代ret指令后,类似的也需要增加恢复返回地址的操作。在整个过程中,暴露给攻击者的栈中数据始终是软因子。攻击者无法通过篡改软因子来劫持软件的控制流。如图9中a所示,攻击者通过不断向栈中写入非法数据,用于覆盖正常的返回地址如图中阴影所示,如果非法数据为恶意代码,那么就可以使进程跳转到非法地址继续执行,从而实现攻击目的。为此,如图9b所示,本发明利用处理器LBR特性,将硬件因素引入到这一过程:存放到栈中的“地址”实际上是生成真正返回地址的软件因子,只有与处理器LBR所提供的硬件因子相结合以后,才能得到真正的返回地址。这样,即使攻击者如传统攻击方法那样,篡改了栈中的“地址”,也无法使进程转向非法地址,从而阻止攻击的进一步进行。本发明实施例提供的基于LBR的栈缓冲区溢出攻击防御方法,通过将硬件因素引入到栈中返回地址的保护,使得攻击者直接攻击栈中数据的方法失效。由于攻击者不具备直接攻击物理系统的能力,本发明可以合理的假设硬因子是无法被攻击篡改的。基于硬因子的可信性,结合随机因子防重放的设计,使得本发明所提出的栈数据保护方案的有效。不同于影子栈或者加密返回地址的方法,本发明不依赖过多的计算复杂性和冗余空间,只是增加若干条指令,运行效率得到了保证。最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

权利要求:1.一种基于LBR的栈缓冲区溢出攻击防御方法,其特征在于,包括:步骤11、在进程初始化时随机生成随机参数,将所述随机参数作为所述进程当前整个生命周期的随机因子;步骤12、当父函数调用子函数时,获取返回地址;步骤13、当确定待调用子函数时,获取返回父函数指令的地址,将所述返回父函数指令的地址作为硬因子;步骤14、根据所述随机因子、返回地址和硬因子计算软因子,并将所述软因子替代返回地址存储在栈中;步骤15、使用jmp指令替代call指令,从父函数跳转至子函数。2.根据权利要求1所述的方法,其特征在于,在步骤14中,所述软因子具体为:软因子=硬因子⊕返回地址⊕随机因子。3.根据权利要求1所述的方法,其特征在于,在步骤11之前还包括:在由源代码初步编译得到的RTL指令集中插入随机因子发生函数,得到新的RTL指令集;通过修改指令模板,使用设定的指令集替代call指令,并采用修改后的指令模板将新的RTL指令集转换为汇编指令;其中,所述设定的指令集用于执行所述步骤11至步骤15。4.一种基于LBR的栈缓冲区溢出攻击防御方法,其特征在于,包括:步骤21、使用jmp指令从子函数跳转至设定的跳板函数;步骤22、在跳板函数内从处理器LBR硬件特性中获取硬因子,所述硬因子指返回父函数指令的地址;步骤23、在跳板函数内获取随机因子,所述随机因子指在进程初始化时随机生成的随机参数;步骤24、使用pop指令使软因子出栈,所述软因子指替代返回地址存储在栈中的参数;步骤25、根据所述硬因子、随机因子和软因子计算返回地址;步骤26、根据所述返回地址,使用jmp指令从跳板函数跳转至父函数。5.根据权利要求4所述的方法,其特征在于,在步骤25中,所述返回地址具体为:返回地址=软因子⊕硬因子⊕随机因子。6.根据权利要求3所述的方法,其特征在于,在步骤21之前还包括:在由源代码初步编译得到的RTL指令集中插入跳板函数,得到新的RTL指令集;通过修改指令模板,使用设定的指令集替代ret指令,并采用修改后的指令模板将新的RTL指令集转换为汇编指令;其中,所述设定的指令集用于执行步骤21至步骤26。

百度查询: 中国人民解放军战略支援部队信息工程大学 基于LBR的栈缓冲区溢出攻击防御方法

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。