本发明专利技术公开了一种设计在CPU里的侦测缓冲区溢出的方法。它用于抑制互联网上越来越多的利用缓冲区溢出进行的恶意攻击。对于网络安全和计算机安全具有重要的意义。这个设计的主要特点是在栈帧和栈帧之间插入加密的返回地址作为安全备份,通过比较加密返回地址和明文返回地址来可靠地侦测攻击者对返回地址的覆盖。同时,针对RISCCPU和CISCCPU特点,提出不同的方法来优化指令和执行单元。这个设计的优点是无需改变编译器和链接器,硬件改动小,可行性强,几乎不影响代码的执行效率,另一个优点是它允许系统设计者在不改变程序的情况下,在节省内存和提高安全性之间做出合适的选择。(*该技术在2023年保护过期,可自由使用*)
【技术实现步骤摘要】
本专利技术涉及一种设计在CPU里的侦测缓冲区溢出的方法。
技术介绍
缓冲区溢出(又称堆栈溢出)攻击是最常用的黑客技术之一。缓冲区溢出是一些程序设计语言本身所决定的,如C语言。C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区,引起“缓冲区溢出”。一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误,但是,如果输入的数据是经过“黑客”精心设计的,覆盖缓冲区的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。为了实现缓冲区溢出,必须满足两个条件1输入攻击代码;2迫使处理器执行攻击代码。利用堆栈摧毁攻击可以比较容易地满足这两个条件,这也是堆栈摧毁攻击成为缓冲区溢出攻击的主要方式的原因。堆栈摧毁攻击的原理如下,图1a所示是程序堆栈的结构,图1b所示是堆栈摧毁攻击的示意图1.黑客找出一个可以发生溢出的堆栈分配的缓冲区。2.黑客将攻击代码放入内存,以便当函数返回时可以跳至该攻击代码。3.黑客覆盖堆栈上的返回地址,将控制转移至攻击代码,程序执行攻击代码来获取超级用户权限或进行其它恶意操作。由于从代码执行效率方面的考虑,操作系统本身以及其上的许多应用程序都是用C语言编写的,这极大地影响了计算机的安全性。随着互联网的普及,利用缓冲区溢出(又称蠕虫程序)进行的攻击占了网络攻击的一半左右。所以急需一种方法来侦测缓冲区溢出攻击并做出反应。现有的对付缓冲区溢出的方法大都是用软件实现的。用软件方法实现的缺点要重写代码或重新编译,而且不可避免地对代码执行效率产生较大的影响。也有一些硬件方法,但是这些方法仍然存在漏洞或过于复杂而难于实现。
技术实现思路
本专利技术的目的是提供一种设计在CPU里的侦测缓冲区溢出的方法。它的步骤如下1)在CPU里定义一个秘钥寄存器;2)在栈帧之间插入用秘钥寄存器进行加密的返回地址作为安全备份;3)比较加密的返回地址和明文的返回地址来侦测缓冲区溢出;4)如果发现缓冲区溢出攻击,就触发缓冲区溢出异常处理;5)在程序不作改动的情况下,支持缓冲区保护功能的使能或禁止。本专利技术的优点是方法简单可靠;硬件代价小;充分利用了执行单元的并行性,几乎不影响代码的执行效率;完全由硬件解决,不需要修改软件,而且这部分硬件结构的改变对软件工程师是完全透明的。附图说明图1a是堆栈结构图;图1b是堆栈缓冲区溢出示意图;图2是显示了一个简化的CPU的内部结构框图;图3a是一个简化的CPU的流水线示意图;图3b是跳转指令产生的流水线空缺的示意图;图4是侦测缓冲区溢出内存示意图;图5是RISC CPU进入子程序后的流程图。具体实施例方式为对本专利技术做更好的说明,本说明书将对CPU的结构及流水线作一个简短的介绍,并以它作为本专利技术的解析。但本专利技术对各种CPU具有通用性。图2显示了一个简化的CPU的内部结构框图。一个CPU大致由CPU控制寄存器组单元2、指令提取单元3、指令解码和指令发射单元4、功能模块组5和数据写回单元6组成。单元2主要用于控制了CPU的操作。以下对CPU里一条指令的操作做一个简短的介绍。其步骤可大致分为1)单元3从内存(或片上高速缓存区)提取指令,交给单元4。2)单元4通过解码来决定指令所要去的功能模块,当指令不存在和前面指令的依赖关系以及功能模块可以接受新的指令时,单元4将指令交给单元5中的某一模块。3)单元5执行指令,根据CPU的不同,对指令执行单元的划分也不同,一般而言包括算术逻辑单元、内存存储单元、乘除器和浮点运算单元等。当功能模块执行完指令后,执行结果会交给单元6。4)单元6将数据结果写回到CPU的通用寄存器组里,改变CPU的状态,从而完成了一个指令的操作。为了提高CPU执行程序的效率,通常CPU采取流水线结构的执行方式。图2a显示了图1的CPU的指令流水线操作,其中,IF指令提取;DE指令解码和发射;EX指令运算;WB结果写回。由图3a可以看出在某一个时钟周期里可以有4条指令同时进行,它们分布在不同的单元里。因此实际上CPU可以在一个时钟周期里完成一条指令。但是当CPU有转移控制指令时,一般需要在解码后才能获得跳转目标地址,这时CPU的流水线会有一个空缺,如图3b所示。本专利技术的基本特点是在栈帧和栈帧之间多插入加密的返回地址作为安全备份。如果黑客利用缓冲区溢出覆盖了加密地址或者明文地址,甚至两个地址同时被覆盖,该安全备份解密后的结果只有极小的概率会与明文返回地址相同,对于32位CPU,该概率为1/232。这基本保证了缓冲区溢出能被可靠地侦测到。本专利技术是通过在CPU中增加加密单元和堆栈管理逻辑,从而提供一种硬件实现方法;同时增加指令包含的信息量,充分利用指令执行单元的并行性来保证程序的执行效率。为了发现缓冲区溢出,如图4所示,在栈帧间插入加密的返回地址。首先在CPU中设置一个秘钥寄存器,这个寄存器的值可以由代码直接加载一个随机数入CPU;也可以由CPU内部自己产生。这个值在不同的CPU之间是不确定的,在同一CPU的不同程序堆栈间也是不一致的,但是在同一程序堆栈中应保持不变。在控制寄存器组中加入一个新的控制域,标志缓冲区溢出使能。在缓冲区溢出使能时,才能进行下述的各项操作。由于CISC和RISC指令集不同,以下将分为两部分对执行过程进行陈述。在RISC CPU中,其步骤如下1)在CPU中保存一个加密秘钥寄存器。2)在控制跳入子程序的同时(如MCORE的jsri指令),将用秘钥加密的返回地址压入堆栈顶部(如在MCORE中为r0+1)。但不改变堆栈指针(如在MCORE中的r0)。CPU中放置一个寄存器来记录该特殊状态。由于转移控制和存储内存是由不同的执行模块来完成的,所以该操作不会影响指令的执行效率。3)如果子程序没有自身栈帧,那么堆栈指针保持不变。如果子程序有自身的栈帧,编译器能够保证如果要对堆栈进行操作,应先移动堆栈指针。基于这一假设,在子程序中,当遇到改变堆栈指针的指令时,如果寄存器M在特殊状态,则将堆栈指针多移动一个存储空间,以保证步骤二中压入堆栈的的加密返回地址不被子程序的栈帧覆盖。这些操作对编译器是透明的,硬件保证了操作的正确性。4)在子程序中,原来放置返回地址的堆栈空间仍然放入明文函数返回地址。在子程序返回前,仍然把明文返回地址取回CPU内部通用寄存器。也就是说完全不需要改变子程序的汇编代码。5)在子程序返回时(如在MCORE中的jmp r15),把加密的返回地址取回(即当前堆栈指针所在的存储单元),并将堆栈指针减去一个存储单元。将加密的返回地址解密后与明文的返回地址作比较,如果不相符合,则表示发生了缓冲区溢出。由于转移控制和读取内存是由不同的执行模块来完成的,这一步骤也不会影响执行效率。6)在子程序返回的同时,将加密的返回地址解密后与明文的返回地址作比较,如果不相符合,则表示发生了缓冲区溢出。7)在缓冲区溢出时触发缓冲区异常处理。当堆栈缓冲区溢出发生时,即加密返回地址和明文返回地址不一致,就保存当前PC,同时硬件触发缓冲区溢出异常,在异常向量表中添加缓冲区溢出异常,在异常处理程序中可以由程序员决定针对缓冲区溢出攻击的对策。在CISC CPU中,其步骤如下1)在CPU中保存一个加密秘钥寄存器。2)当控制跳入子程序同时,将用秘钥加密本文档来自技高网...
【技术保护点】
一种设计在CPU里的侦测缓冲区溢出的方法,其特征在于:它的步骤如下1)在CPU里定义一个秘钥寄存器;2)在栈帧之间插入用秘钥寄存器进行加密的返回地址作为安全备份;3)比较加密的返回地址和明文的返回地址来侦测缓冲区溢出;4)如 果发现缓冲区溢出攻击,就触发缓冲区溢出异常处理;5)在程序不作改动的情况下,支持缓冲区保护功能的使能或禁止。
【技术特征摘要】
【专利技术属性】
技术研发人员:张宇弘,王界兵,严晓浪,
申请(专利权)人:杭州中天微系统有限公司,
类型:发明
国别省市:86[中国|杭州]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。