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

【发明授权】基于新增指令的检测堆栈中返回地址被篡改的装置_中国科学院信息工程研究所_201811109582.1 

申请/专利权人:中国科学院信息工程研究所

申请日:2018-09-21

公开(公告)日:2021-04-13

公开(公告)号:CN109409086B

主分类号:G06F21/54(20130101)

分类号:G06F21/54(20130101);G06F16/901(20190101)

优先权:

专利状态码:有效-授权

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

摘要:本发明实施例提供一种基于新增指令的检测堆栈中返回地址被篡改的装置,本发明将返回地址和哈希值都通过一个链式结构来存储并验证,本发明实施例具有安全性高、性能损耗小、设计复杂度低等有益效果。

主权项:1.一种检测堆栈中返回地址被篡改的装置,其特征在于,包括hash值计算模块、验证模块和Top寄存器:hash值计算模块,用于根据堆栈中栈顶帧中所存储的待验证返回地址和待验证返回地址所对应的hash值,基于任一hash值生成算法,获得待验证hash值;其中,所述堆栈中的第i帧中存储了第i个返回地址和一个随机数;所述堆栈中第i+1帧至栈顶帧中的任一帧中存储了所述任一帧所对应的返回地址和返回地址所对应的hash值,其中,返回地址所对应的hash值为根据栈中所述任一帧的前一帧中存储的返回地址和返回地址所对应的hash值,基于所述任一hash值生成算法,获得的hash值;j>i≥1,其中j为栈顶帧的序号;验证模块,用于若待验证hash值与预先生成的正确hash值不同,则确认待验证返回地址被篡改;其中,所述正确hash值为预先根据栈中栈顶帧的未被篡改的返回地址和未被篡改的返回地址所对应的hash值,基于所述任一hash值生成算法获得的;Top寄存器,用于存储所述正确hash值,且Top寄存器中所存储的正确hash值只能通过预设指令修改;所述装置至少包含一组不同于所述堆栈所在系统中原生的调用指令和返回指令的指令集,用于在堆栈中执行调用和返回操作。

全文数据:基于新增指令的检测堆栈中返回地址被篡改的装置技术领域本发明涉及计算机技术领域,更具体地,涉及基于新增指令的检测堆栈中返回地址被篡改的装置。背景技术计算机技术和互联网的建设和发展,对整个社会的经济、文化、科技等各方面带来了巨大的推动和冲击,大量电信、电子商务、金融网络等信息化系统已经成为国家和政府的关键基础设施,因此如何确保计算机系统的安全已成为摆在我们面前迫切需要解决的难题。堆栈溢出漏洞是一个极其严重的系统安全漏洞,它是通过向一个有限的内存空间写入过长的数据,破坏系统的内存空间,导致系统运行异常、死机或重启。通过堆栈溢出攻击,使用攻击代码的地址覆盖函数指针,可以让攻击者获取部分或全部的系统控制权,这是一种极具威胁的安全隐患。现有技术中,对于堆栈溢出攻击主要的阻止和防御方式为通过影子栈和栈保护技术,保证返回地址不被恶意篡改。但影子栈和栈保护的安全性都不够,攻击者仍能找到一些办法来绕过上述两种防御技术进行攻击。发明内容为了解决上述问题,本发明实施例提供一种克服上述问题或者至少部分地解决上述问题的基于新增指令的检测堆栈中返回地址被篡改的装置。根据本发明实施例的第一方面,提供了一种基于新增指令的检测堆栈中返回地址被篡改的装置,其特征在于,包括hash值计算模块、验证模块和Top寄存器:hash值计算模块,用于根据堆栈中栈顶帧中所存储的待验证返回地址和待验证返回地址所对应的hash值,基于任一hash值生成算法,获得待验证hash值;其中,所述堆栈中的第i帧中存储了第i个返回地址和一个随机数;所述堆栈中第i+1帧至栈顶帧中的任一帧中存储了所述任一帧所对应的返回地址和返回地址所对应的hash值,其中,返回地址所对应的hash值根据栈中所述任一帧的前一帧中存储的返回地址和返回地址所对应的hash值,基于所述任一hash值生成算法,获得的hash值;j>i≥1,其中j为栈顶帧的序号;验证模块,用于若待验证hash值与预先生成的正确hash值不同,则确认待验证返回地址被篡改;其中,所述正确hash值预先根据栈中栈顶帧的未被篡改的返回地址和未被篡改的返回地址所对应的hash值,基于所述任一hash值生成算法获得的;Top寄存器,用于存储所述正确hash值,且Top寄存器中所存储的正确hash值只能通过预设指令修改;至少包含一组不同于所述堆栈所在系统中原生的调用指令和返回指令的指令集,用于在堆栈中执行调用和返回操作。所述装置还包括:计数器,用于对堆栈执行一次调用操作时计数加一,对所述堆栈执行一次返回操作时计数减一;当进程结束时,若计数器的计数数量不为0或Top寄存器中正确hash值被修改,则进行报错。进一步,至少包含的一组不同于所述堆栈所在系统中原生的调用指令和返回指令的指令集。进一步,至少包含的一组不同于所述Top寄存器所在系统中原生的读取指令和写入指令的指令集,用于在Top寄存器中执行读取操作和写入操作;至少包含的一组不同于所述Top寄存器所在系统中原生的读取指令和写入指令的指令集,中包含的读取指令和写入指令为特权指令。进一步,至少包含的一组不同于所述计数器所在系统中原生的读取指令和写入指令的指令集,用于在计数器中执行读取操作和写入操作;至少包含的一组不同于所述计数器所在系统中原生的读取指令和写入指令的指令集,中包含的读取指令和写入指令为特权指令。进一步,所述装置还包括Salt寄存器:Salt寄存器用于存储一个挑战值,所述挑战值作为哈希函数的另一个输入,且所述挑战值只能通过预设指令修改。进一步,所述装置还包括一个用于执行所述任一hash值生成算法的hash计算模块;相应地,所述Salt寄存器中存储的正确hash值无法通过预设特权指令外的指令读取。进一步,所述验证模块还用于:若确认待验证返回地址被篡改,出现异常并中断程序。进一步,验证模块还用于判断若待验证hash值与预先生成的正确hash值相同,则确认待验证返回地址没有被篡改。本发明上述实施例提供一种基于新增指令的检测堆栈中返回地址被篡改的装置,本发明将返回地址和哈希值都通过一个链式结构来存储并验证,本发明实施例具有安全性高、性能损耗小、设计复杂度低等有益效果。附图说明图1为利用本发明实施例的一种基于新增指令的检测堆栈中返回地址被篡改的装置检测堆栈中返回地址被篡改的方法的整体流程示意图;图2为本发明实施例的一种基于新增指令的检测堆栈中返回地址被篡改的装置中链式哈希堆栈的示意图;图3为本发明实施例的一种基于新增指令的检测堆栈中返回地址被篡改的装置中链式哈希堆栈的结构示意图;图4为本发明实施例的现有技术中堆栈的结构示意图;图5为利用本发明实施例的一种基于新增指令的检测堆栈中返回地址被篡改的装置检测堆栈中返回地址被篡改的方法中调用指令执行与现有技术调用指令的区别示意图;图6为利用本发明实施例的一种基于新增指令的检测堆栈中返回地址被篡改的装置检测堆栈中返回地址被篡改的方法中返回指令执行与现有技术返回指令的区别示意图;图7为本发明实施例的一种检测堆栈中链式哈希堆栈的非压缩结构和压缩存储结构的示意图;图8为本发明实施例的一种基于新增指令的检测堆栈中返回地址被篡改的装置的整体框架示意图。具体实施方式下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。下面,本发明说明书首先对各个基本概念和现有技术及缺陷作一个清楚的解释。内存漏洞:是指程序员在软件编写的过程中,对内存的操作上有时间上或者空间上的设计失误,产生使得程序可能做出违反程序本身设计的行为的问题。攻击者利用程序的内存漏洞,可以构造出各种攻击,执行恶意行为。缓冲区溢出:是最为常见的内存漏洞,向一个缓冲区中拷入超过该缓冲区长度的数据,即会产生缓冲区溢出,从而覆盖缓冲区以外的其他数据。而栈溢出漏洞又是缓冲区溢出漏洞中最为常见的一种,即向栈中拷入一个过长的数据,导致栈上的缓冲区数据溢出,从而覆盖栈上其他关键的数据。栈stack:又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或调用,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈溢出:是缓冲区溢出的一种。由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。函数调用:计算机编译或运行时,使用某个函数来完成相关命令。返回地址:栈中存储的数据中一个最为重要的数据就是函数返回地址。当调用一个函数时,调用指令例如Call指令会将函数返回地址压入栈中。当函数返回时,返回指令例如Return指令会读取栈中保存的返回地址,根据返回地址跳转到原来调用函数的位置,继续往下执行。利用栈溢出漏洞进行攻击最常用的方法就是利用栈溢出,覆盖返回地址,将返回地址改为一个攻击者设置的地址。当函数返回时,就会跳转到攻击者设置好的位置,执行攻击者希望执行的代码。ROP攻击:一种经典的利用内存漏洞构造攻击行为的技术,因为不可执行位技术DEP或NX的普及,直接注入代码执行恶意攻击变得困难,而ROP攻击则可以利用程序本身的代码,以返回地址作为连接,构造出攻击行为。ROP攻击的原理主要是使用程序本身的代码中以返回指令例如Return指令结尾的代码片段成为配件,配合对栈空间的控制,不断的使程序运行这些配件。当程序执行一次Return时,CPU从当前的栈上取出一个地址,并且跳转到这一地址指向的代码处开始运行。攻击者将一系列配件的地址先放入栈中,CPU运行到Return时,会取出第一个地址并跳转到这个配件开始执行,当第一个配件执行结束时,结尾的返回指令例如Return指令会取出第二个地址并跳转到第二个配件开始执行,如此循环,构造出任意恶意行为。ROP攻击等攻击的关键点都在于篡改返回地址,目前现有的一些技术也都是通过保护返回地址来阻止这些攻击。主要相关的工作是影子栈ShadowStack和栈保护stackcookie,也叫stackcanary。影子栈通过不同的实现方式,将栈中的返回地址在内存的另一个区域中存储一个备份该内存区域就叫影子栈,并在栈中的返回地址被使用前将地址与备份做对比,如果地址不同,则说明栈中的地址被篡改过。简单来说,影子栈的本质就是将返回地址在另外一个地方存一个备份,这样就不担心攻击者修改栈中的返回地址。Intel公司于2016年提出了CET技术Control-flowEnforcementTechnology,主要包含两项技术,其中一项就是影子栈。栈保护是gcc编译器等许多主流编译器中采用的一项实用技术。返回地址保存在栈中,在返回地址的前面插入一个canary金丝雀,即保护值,是一个随机数。如果攻击者想利用栈溢出覆盖返回地址,则必然会覆盖保护值。而保护值是一个随机数,攻击者无法获知,因此保护值也会改变。函数返回时检查一下保护值是否被改变,就可以发现返回地址是否被恶意篡改。然后,上述现有技术方法存在以下技术缺陷。影子栈方法存在若干问题:1、影子栈中的备份必须绝对安全,这在实际实现中是非常困难的。例如Intel的CET技术就提出,使用了一个新的页属性来标记单独的页为“影子栈”页来保护。但是这个页属性是可以被更改的,这在之前实际攻击中绕过DEP的实例中有过先例。所以在内存上一段区域做保护安全性是不足的。如果攻击者能够同时修改影子栈和栈上的返回地址,就能破解影子栈的保护。2、影子栈中的备份需要一个单独的页来存储,因此会增加访存,降低性能,也会增加内存开销。3、影子栈的实现较为复杂。如果不考虑影子栈本身的安全,可以设计比较简单,但安全性不够。如果考虑影子栈本身的安全,就需要对影子栈所在的内存添加额外的保护机制,大大增加了设计复杂性,导致实用性不高。栈保护方法存在若干问题:1、栈保护需要在返回地址前插入一个保护值随机数。一旦攻击者获知保护值,就能轻易的覆盖返回地址和保护值,同时保证保护值不会发生变化。2、栈保护只能防御栈溢出覆盖返回地址,而不能防御其他攻击。比如,利用任意地址写,直接点对点修改返回地址。总之,影子栈和栈保护的安全性都不够,攻击者仍能找到一些办法来绕过。本发明具体实施例提出一种检测堆栈中返回地址被篡改的方法。如图1,示出利用本发明实施例的一种链式哈希堆栈检测堆栈中返回地址被篡改的方法的方法的整体流程示意图,包括:S1,根据堆栈中栈顶帧中所存储的待验证返回地址和待验证返回地址所对应的hash值,基于任一hash值生成算法,获得待验证hash值;其中,所述堆栈中的第i帧中存储了第i个返回地址和一个随机数;所述堆栈中第i+1帧至栈顶帧中的任一帧中存储了所述任一帧所对应的返回地址和返回地址所对应的hash值;其中,返回地址所对应的hash值根据栈中所述任一帧的前一帧中存储的返回地址和返回地址所对应的hash值,基于所述任一hash值生成算法,获得的hash值;j>i≥1,其中j为栈顶帧的序号;S2,若待验证hash值与预先生成的正确hash值不同,则确认待验证返回地址被篡改;其中,所述正确hash值预先根据栈中栈顶帧的未被篡改的返回地址和未被篡改的返回地址所对应的hash值,基于所述任一hash值生成算法获得的。具体地,本发明实施例利用主要hash算法来保护返回地址。hash算法具有一些独有的优点,例如很难通过hash的输出反推hash的输入,攻击者也很难通过控制输入来输出一个希望获得的输出值。本发明提出将返回地址和哈希值都通过一个链式结构来维护。如图2所示,最新的Hash值是根据最新的堆栈中栈顶帧中所存储的返回地址和前一个堆栈中栈顶帧中所存储的hash值计算得到。栈顶帧中的hash值是根据其前一个帧中存储的返回地址和Hash值计算得到。因此,堆栈中各帧中的返回地址和Hash值形成了一条链。其中,图3展示了本发明实施例的堆栈结构。与图4的正常栈结构相比,本发明实施例的栈结构将返回地址和其所对应的Hash值存储在了同一帧中。值得注意的是,同一帧中所存储的Hash值和返回地址是错开的,即第一个返回地址Address1和一个随机数RAND存储在一起;第一个Hash值Hash1根据第一个返回地址和随机数计算得到,和第二个返回地址存储在一起;依次类推,第二个Hash值和第三个返回地址存在一起;而最新的Hash值Hash3保存在一个特殊的寄存器中称之为Top寄存器。其中,随机数RAND是Top寄存器的初始值。进一步,介绍本发明实施例中以call和return指令为例介绍调用指令和返回指令的具体执行过程。首先介绍一下正常调用指令和返回指令的执行过程,然后介绍本发明中调用指令和返回指令的执行过程,图5展示了本发明中调用指令和正常执行过程不同的特殊过程,图6展示了本发明中返回指令和正常执行过程不同的特殊过程。正常调用指令Call指令执行:1将返回地址调用,2将调用指令Call指令的目标地址存入PC相当于跳转到目标地址执行。正常返回指令return指令执行:1将返回地址出栈,2将返回地址存入PC相当于跳转到返回地址执行。本发明的调用指令Call指令执行:1将Top寄存器中的hash值和返回地址栈顶帧的未被篡改的返回地址一起调用,2将调用的数据即第1步中的hash值和返回地址当做hash函数的输入,计算得到新的hash值正确hash值,将新的hash值存入Top寄存器中,3将调用指令Call指令的目标地址存入PC。本发明实施例的返回指令return指令执行:1将栈顶帧中的hash值和返回地址待验证返回地址出栈,计算出栈的hash值和返回地址待验证返回地址的hash值待验证hash值,2将计算得到的hash值待验证hash值,与Top寄存器中保存的hash值正确hash值进行对比。如果两者不相等,说明出现异常,应该报警并中断程序运行。如果两者相等,则正常,继续执行。3将出栈的hash值存入Top寄存器中出栈的hash值,而不是待验证hash值。4当待验证hash值与正确hash值相等时,将待验证返回地址返回地址存入PC;当待验证hash值与正确hash值不相等时,出现异常并中断程序。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,用于执行所述检测堆栈中返回地址被篡改的方法的处理器中,还包括一个Salt寄存器,用于存储一个挑战值,所述挑战值作为哈希函数的另一个输入,所述挑战值只能通过预设指令修改。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,用于执行所述检测堆栈中返回地址被篡改的方法的处理器中,还包括一个Salt寄存器,中所存储的正确hash值只能通过预设指令修改;所述Salt寄存器用于存储待验证返回地址所对应的hash值,且Salt寄存器中所存储的正确hash值只能通过预设指令修改。其中,为了实现上述具体实施例,实际开发中需要在执行本发明实施例一种检测堆栈中返回地址被篡改的方法的处理器中增加至少一个寄存器,至少包括Top寄存器,还可能包括Salt寄存器。Top寄存器用于保存最新的hash值,Salt寄存器中所存储的挑战值是hash函数的另一个输入,一般为一个随机值、也可以是其他类型的值,进一步加大hash函数被猜测破解的难度。在一个进程最开始,分别将Top寄存器和Salt寄存器设置为随机数或者是通过其他方式生成的非随机数,其中,随机数为最优选的。硬件应该确保Top寄存器中所存储的正确hash值和Salt寄存器中所存储的挑战值只能通过预设指令修改,否则本发明就失去了防御效果。而保护几个特殊的寄存器不被攻击者修改是很容易实现的。就算攻击者读取了Salt寄存器,本发明仍能保证攻击者无法轻易篡改返回地址,仍然具有较高的安全性。硬件无需保证Top寄存器不被攻击者读取。攻击者能否读取Top寄存器,对本发明的安全性没有影响。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,所述Salt寄存器中存储的挑战值和Top寄存器中所存储的正确hash值无法通过预设特权指令外的指令读取。其中,硬件应该尽量保证Salt寄存器不被攻击者读取,这在技术上也是比较容易实现的。此外,就算攻击者读取了Salt寄存器,本发明仍能保证攻击者无法轻易篡改返回地址,仍然具有较高的安全性。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,用于执行所述检测堆栈中返回地址被篡改的方法的处理器中,还包括一个用于执行所述任一hash值生成算法的hash计算模块。其中,本发明实施例对hash算法的选择没有太多要求,可以使用任意的hash算法,甚至可以使用其他加解密算法。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,所述堆栈中任一返回地址,和与所述任一返回地址所对应的hash值分别单独保存在所述堆栈中同一栈帧内的不同位置位置上。如图7所示,在本发明具体实施例中,将返回地址和hash值分开不同位置进行存储称之为非压缩结构或者正常结构。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,在64位操作系统中,所述堆栈中任一返回地址正常保存在所述堆栈中的任一位置位置上,与所述任一返回地址所对应的hash值保存在所述任一位置位置的高位空间中。具体地,发现在64位系统中,返回地址占用了64位,但是实际上真实的返回地址并没有这么长,一般只有40多位。所以,64位的高位是空闲的。因此,可以将hash值保存到64位中的高位。这种存储结构称之为压缩结构,如图7所示。压缩结构相较于原始的栈结构区别只有栈中返回地址的值而在布局上是完全一致的。这带来了一个最主要的有益效果是可以兼容之前的二进制,这是因为多数程序遵循下列规律:1调用指令和返回指令是匹配的;2只有调用指令和返回指令使用返回地址,其他指令不使用;3栈中的其他值都是根据偏移来确定位置的,保持布局的话其他栈中数据都能直接被正确使用。相应地,同时为了达到上述有益效果,需要配套的操作为:达到这一目标需要的操作是:将原程序中的所有或匹配的部分调用指令和返回指令替换为本发明实施例中的调用指令和返回指令,并使用压缩结构。同时,采用压缩结构相比不压缩结构还具有节省空间的有益效果。当然,除了返回地址,还有一些数据可能保存在64位的高位,比如ASLR的随机数等。但是,无论如何,这些数据都没有将64位的空间全部用完,往往能剩下20多位的空闲空间,足够用于保存hash值。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,所述S2之后还包括:中断程序运行并将待验证返回地址所对应的hash值存储在Top寄存器中。如果确认待验证返回地址被篡改,说明出现异常,应该报警并中断程序运行。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,若待验证hash值与预先生成的正确hash值相同,则确认待验证返回地址没有被篡改。在本发明另一个具体实施例中,提供一种检测堆栈中返回地址被篡改的方法,用于执行所述检测堆栈中返回地址被篡改的方法的处理器中,还包括一个计数器,用于对所述堆栈执行一次调用指令例如Call指令时计数加一,对所述堆栈执行一次返回指令例如return指令时计数减一;当进程结束时,若计数器的计数数量不为0或Top寄存器中正确hash值被修改,则进行报错。本发明具体实施例考虑到假设攻击者的能力极强,拥有无限的计算能力,那么攻击者可能通过hash碰撞强行篡改返回地址,并且构造相同的hash值。对于这种极端情况,本发明实施例仍然有办法发现,即攻击者无法控制Top寄存器的值,无法保证攻击结束后的Top寄存器的值和初始值是一样的,就必然会留下攻击的痕迹。本发明实施例中再增加一个Number计数器,记录调用指令和返回指令的执行次数,确保调用指令和返回指令的数量是一样的。进程开始,将Number计数器初始化为0;执行一次调用指令,将计数number加一;执行一次返回指令,将计数number减一;如果进程结束,number应该为0,否则报错,终止程序运行。同样,进程结束退出时,Top寄存器的值应该等于进程最开始时Top寄存器的初始值,否则就认为发生了攻击,报错并终止运行。如果考虑到进程可能中途退出,还需要保存并监控Top寄存器和Number寄存器的值,确保中途退出时Top寄存器和Number寄存器的值是匹配的。如图8所示,示出本发明一种基于新增指令的检测堆栈中返回地址被篡改的装置的整体框架示意图,总体上,包括:hash值计算模块A1,用于根据堆栈中栈顶帧中所存储的待验证返回地址和待验证返回地址所对应的hash值,基于任一hash值生成算法,获得待验证hash值;其中,所述堆栈中的第i帧中存储了第i个返回地址和一个随机数;所述堆栈中第i+1帧至栈顶帧中的任一帧中存储了所述任一帧所对应的返回地址和返回地址所对应的hash值,其中,返回地址所对应的hash值根据栈中所述任一帧的前一帧中存储的返回地址和返回地址所对应的hash值,基于所述任一hash值生成算法,获得的hash值;j>i≥1,其中j为栈顶帧的序号;验证模块A2,用于若待验证hash值与预先生成的正确hash值不同,则确认待验证返回地址被篡改;其中,所述正确hash值预先根据栈中栈顶帧的未被篡改的返回地址和未被篡改的返回地址所对应的hash值,基于所述任一hash值生成算法获得的;Top寄存器A3,用于存储所述正确hash值,且Top寄存器A3中所存储的正确hash值只能通过预设指令修改;至少包含一组不同于所述堆栈所在系统中原生的调用指令和返回指令的指令集,用于在堆栈中执行调用和返回操作。其中,在原有的call调用指令和ret返回指令的基础上,增加新的类型的调用指令和返回指令来完成对应的操作;或者,增加两个新的指令,每条新的指令加上一条原有的指令组成一个新的调用指令或者返回指令。例如,可以使用一个pcall代替call,pret代替ret名字是任意的;也可以使用call+pac代替call,pbr+ret代替ret。其中call,ret都是指令集原有的指令,其他是新加的指令。两种方法都可以完成对应的需求。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,所述装置还包括:计数器,用于对堆栈执行一次调用操作时计数加一,对所述堆栈执行一次返回操作时计数减一;当进程结束时,若计数器的计数数量不为0或Top寄存器中正确hash值被修改,则进行报错。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,至少包含的一组不同于所述堆栈所在系统中原生的调用指令和返回指令的指令集。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,至少包含的一组不同于所述Top寄存器所在系统中原生的读取指令和写入指令的指令集,用于在Top寄存器中执行读取操作和写入操作;至少包含的一组不同于所述Top寄存器所在系统中原生的读取指令和写入指令的指令集,中包含的读取指令和写入指令为特权指令。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,至少包含的一组不同于所述计数器所在系统中原生的读取指令和写入指令的指令集,用于在计数器中执行读取操作和写入操作;至少包含的一组不同于所述计数器所在系统中原生的读取指令和写入指令的指令集,中包含的读取指令和写入指令为特权指令。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,还包括Salt寄存器:Salt寄存器用于存储一个挑战值,所述挑战值作为哈希函数的另一个输入,且所述挑战值只能通过预设指令修改。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,还包括一个用于执行所述任一hash值生成算法的hash计算模块;相应地,所述Salt寄存器中存储的正确hash值无法只能通过相应预设指令读取。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,所述验证模块还用于:若确认待验证返回地址被篡改,中断程序运行并将待验证返回地址所对应的hash值存储在Top寄存器中。在本发明上述任一具体实施例的基础上,示出一种基于新增指令的检测堆栈中返回地址被篡改的装置,验证模块还用于判断若待验证hash值与预先生成的正确hash值相同,则确认待验证返回地址没有被篡改。在本发明另一个具体实施例中,提供一种基于新增指令的检测堆栈中返回地址被篡改的装置,所述用于执行所述检测堆栈中返回地址被篡改的方法的处理器中,还包括一个Top寄存器和一个Salt寄存器:其中,所述Top寄存器用于存储所述正确hash值,且中所存储的正确hash值只能通过预设指令修改;所述Salt寄存器用于存储待验证返回地址所对应的hash值,且中所存储的正确hash值只能通过预设指令修改。为了让上述本发明真正应用于真实系统,还需要编译器、操作系统等各方面的支持。操作系统需要知道几个特殊寄存器的存在包括Top寄存器和Salt寄存器等。在每一个进程开始,初始化这些寄存器的值,设置为随机数。在进程切换时,保存这些寄存器的值,确保每一个进程都有自己的相关信息,不会相互影响。编译器也需要知道这些特殊寄存器。如果是非压缩结构,需要编译器添加一些代码,用于操作使用这些寄存器。如果是压缩结构,编译器需要知道64位返回地址的具体布局,哪些位是返回地址,哪些位是hash值,方便编译器向程序中添加专门的处理代码。如果编译器有足够的支持,本发明也可以使用编译器来实现而不需要硬件的支持。但是,这样实现的效率相比单纯硬件实现低,性能损耗约3%。本发明具有很高的灵活性和兼容性。比如采用多链的结构,每隔一定数量的返回地址采用不同的链来保护;某些地址保护,某些地址不保护。从而加大攻击者破解的难度。本发明和其他防御方法也不冲突,可以联合使用。和其他技术相比,本上述各具体实施例采用了链式技术,即将返回地址和哈希值作为一个链连起来,是本发明最核心的思想。本发明利用哈希计算来保护返回地址,哈希计算具有独有的一些优点。比如知道最终的哈希值,但很难以此推导原始值。但是,值得注意的是,仍然存在利用其它加解密算法来替代哈希算法的可能性。链式哈希带来了各方面的优点,比如安全性高、性能损耗小、设计复杂度低等。同时,本发明上述实施例优于现有方法,从安全性、性能、设计复杂度、兼容性、实用性等各方面。与某一个具体技术相比,本发明在某些方面更好,而其他方面也能确保不差于该技术。首先,本发明能够严格保证返回地址不会被恶意篡改,安全性比其他方法都高。比如,影子栈无法避免影子栈的备份数据不被修改,而栈保护无法避免保护值的泄露。其次,根据实验,使用硬件支持的本发明的性能损耗只有0.15%,低于现有的各种方法。在硬件上,本发明只需要增加几个寄存器和一个哈希运算模块,设计复杂度很低,容易实现。而其他方法,如影子栈,可能要修改页表管理机制,复杂度比本发明要高很多。本发明通用性高,能用于任何主流的计算机系统。函数调用和返回是最基本的程序功能,所有计算机都支持,而本发明能用于所有支持函数调用和返回的计算机系统。本发明兼容性高,对系统的改动很小,能够很好的加入现有的计算机系统。总之,本发明是一个非常实用的技术,能够非常容易的应用到真实的系统中。此外,本发明还有一些独有的优点。比如,一旦攻击成功,现有的防御方法都无法发现。而本发明就算真的被攻击者破解,但是攻击者必然会留下攻击痕迹,从而必然会被我们发现。最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明实施例的保护范围。凡在本发明实施例的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明实施例的保护范围之内。

权利要求:1.一种检测堆栈中返回地址被篡改的装置,其特征在于,包括hash值计算模块、验证模块和Top寄存器:hash值计算模块,用于根据堆栈中栈顶帧中所存储的待验证返回地址和待验证返回地址所对应的hash值,基于任一hash值生成算法,获得待验证hash值;其中,所述堆栈中的第i帧中存储了第i个返回地址和一个随机数;所述堆栈中第i+1帧至栈顶帧中的任一帧中存储了所述任一帧所对应的返回地址和返回地址所对应的hash值,其中,返回地址所对应的hash值根据栈中所述任一帧的前一帧中存储的返回地址和返回地址所对应的hash值,基于所述任一hash值生成算法,获得的hash值;j>i≥1,其中j为栈顶帧的序号;验证模块,用于若待验证hash值与预先生成的正确hash值不同,则确认待验证返回地址被篡改;其中,所述正确hash值预先根据栈中栈顶帧的未被篡改的返回地址和未被篡改的返回地址所对应的hash值,基于所述任一hash值生成算法获得的;Top寄存器,用于存储所述正确hash值,且Top寄存器中所存储的正确hash值只能通过预设指令修改;至少包含一组不同于所述堆栈所在系统中原生的调用指令和返回指令的指令集,用于在堆栈中执行调用和返回操作。2.根据权利要求1所述的装置,其特征在于,所述装置还包括:计数器,用于对堆栈执行一次调用操作时计数加一,对所述堆栈执行一次返回操作时计数减一;当进程结束时,若计数器的计数数量不为0或Top寄存器中正确hash值被修改,则进行报错。3.根据权利要求1所述的装置,其特征在于,至少包含的一组不同于所述堆栈所在系统中原生的调用指令和返回指令的指令集。4.根据权利要求1所述的装置,其特征在于,至少包含的一组不同于所述Top寄存器所在系统中原生的读取指令和写入指令的指令集,用于在Top寄存器中执行读取操作和写入操作;至少包含的一组不同于所述Top寄存器所在系统中原生的读取指令和写入指令的指令集,其中包含的读取指令和写入指令为特权指令。5.根据权利要求2所述的装置,其特征在于,至少包含的一组不同于所述计数器所在系统中原生的读取指令和写入指令的指令集,用于在计数器中执行读取操作和写入操作;至少包含的一组不同于所述计数器所在系统中原生的读取指令和写入指令的指令集,其中包含的读取指令和写入指令为特权指令。6.根据权利要求1所述的装置,其特征在于,所述装置还包括Salt寄存器:Salt寄存器用于存储一个挑战值,所述挑战值作为哈希函数的另一个输入,且所述挑战值只能通过预设指令修改。7.根据权利要求6所述的装置,其特征在于,所述装置还包括一个用于执行所述任一hash值生成算法的hash计算模块;相应地,所述Salt寄存器中存储的正确hash值无法通过预设特权指令外的指令读取。8.根据权利要求1所述的装置,其特征在于,所述验证模块还用于:若确认待验证返回地址被篡改,出现异常并中断程序。9.根据权利要求1所述的装置,其特征在于,验证模块还用于判断若待验证hash值与预先生成的正确hash值相同,则确认待验证返回地址没有被篡改。

百度查询: 中国科学院信息工程研究所 基于新增指令的检测堆栈中返回地址被篡改的装置

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