CN109409084B - 一种检测返回地址被篡改的链式数据存储结构 - Google Patents

一种检测返回地址被篡改的链式数据存储结构 Download PDF

Info

Publication number
CN109409084B
CN109409084B CN201811108333.0A CN201811108333A CN109409084B CN 109409084 B CN109409084 B CN 109409084B CN 201811108333 A CN201811108333 A CN 201811108333A CN 109409084 B CN109409084 B CN 109409084B
Authority
CN
China
Prior art keywords
return address
stack
hash value
stored
storage structure
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201811108333.0A
Other languages
English (en)
Other versions
CN109409084A (zh
Inventor
陈李维
李锦峰
史岗
孟丹
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Institute of Information Engineering of CAS
Original Assignee
Institute of Information Engineering of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Institute of Information Engineering of CAS filed Critical Institute of Information Engineering of CAS
Priority to CN201811108333.0A priority Critical patent/CN109409084B/zh
Publication of CN109409084A publication Critical patent/CN109409084A/zh
Application granted granted Critical
Publication of CN109409084B publication Critical patent/CN109409084B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • G06F21/54Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Abstract

本发明上述实施例提供一种检测返回地址被篡改的链式数据存储结构,本发明将返回地址和哈希值都通过一个链式数据存储结构来存储并验证,本发明实施例具有安全性高、性能损耗小、设计复杂度低等有益效果。

Description

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

Claims (3)

1.一种链式数据存储结构,其特征在于:
所述链式数据存储结构中包含了依次连续关联的多个数据帧;所述多个数据帧中任意连续的两个数据帧能够以以下任意一种方式存放:分别存放在不同的堆或栈中、分别存放在相同的堆或栈中、一个存放在堆中另一个存放在栈中;
所述链式数据存储结构中的第i个数据帧中存储了第i个返回地址和一个随机数;所述链式数据存储结构中第i+1个数据帧至链式数据存储结构的顶层数据帧中的任一数据帧中存储了所述任一数据帧所对应的返回地址和返回地址所对应的hash值;其中,返回地址所对应的hash值根据栈中所述任一数据帧的前一数据帧中存储的返回地址和返回地址所对应的hash值,基于任一hash值生成算法,获得的hash值;j>i≥1,其中j为链式数据存储结构的顶层数据帧的序号;
若待验证hash值与预先生成的正确hash值不同,则确认待验证返回地址被篡改;其中,所述正确hash值预先根据栈中栈顶帧的未被篡改的返回地址和未被篡改的返回地址所对应的hash值,基于所述任一hash值生成算法获得的;其中,所述正确hash值存储在Top寄存器中,且所述Top寄存器中所述存储的正确hash值只能通过预设指令修改;
其中,所述hash值保存至64位操作系统中的高位,堆栈中增加一个Number计数器,记录调用指令和返回指令的执行次数;
其中,所述Top寄存器还用于在进程结束退出时,检测Top寄存器的值与进程最开始时Top寄存器的初始值,若不相等,则认为发生了攻击,报错并停止运行。
2.根据权利要求1所述的链式数据存储结构,其特征在于,所述链式数据存储结构中任一返回地址,和与所述任一返回地址所对应的hash值分别单独保存在所述链式数据存储结构中同一数据帧内的不同位置上。
3.根据权利要求1所述的链式数据存储结构,其特征在于,在64位操作系统中,所述链式数据存储结构中任一返回地址正常保存在所述链式数据存储结构中的任一位置上,与所述任一返回地址所对应的hash值保存在所述任一位置的高位空间中。
CN201811108333.0A 2018-09-21 2018-09-21 一种检测返回地址被篡改的链式数据存储结构 Active CN109409084B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811108333.0A CN109409084B (zh) 2018-09-21 2018-09-21 一种检测返回地址被篡改的链式数据存储结构

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811108333.0A CN109409084B (zh) 2018-09-21 2018-09-21 一种检测返回地址被篡改的链式数据存储结构

Publications (2)

Publication Number Publication Date
CN109409084A CN109409084A (zh) 2019-03-01
CN109409084B true CN109409084B (zh) 2021-06-25

Family

ID=65465226

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811108333.0A Active CN109409084B (zh) 2018-09-21 2018-09-21 一种检测返回地址被篡改的链式数据存储结构

Country Status (1)

Country Link
CN (1) CN109409084B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110362502B (zh) * 2019-06-26 2021-05-04 中国科学院信息工程研究所 链式哈希栈的影子缓存优化方法和装置
CN110362503B (zh) * 2019-06-26 2021-03-26 中国科学院信息工程研究所 链式哈希栈的优化方法及优化系统
CN110363006B (zh) * 2019-06-26 2020-12-18 中国科学院信息工程研究所 多链哈希栈结构及检测函数返回地址被篡改的方法
CN112256357B (zh) * 2020-10-19 2023-03-24 海光信息技术股份有限公司 数据保护系统、方法和计算机可读介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101233755A (zh) * 2005-07-14 2008-07-30 塞库斯特里姆技术公司 多媒体数据保护
US8196110B2 (en) * 2007-11-30 2012-06-05 International Business Machines Corporation Method and apparatus for verifying a suspect return pointer in a stack
CN103001923A (zh) * 2003-06-05 2013-03-27 英特特拉斯特技术公司 用于对等服务编排的可互操作系统和方法
CN103841198A (zh) * 2014-03-07 2014-06-04 中南大学 一种净室云计算数据处理方法及系统

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103001923A (zh) * 2003-06-05 2013-03-27 英特特拉斯特技术公司 用于对等服务编排的可互操作系统和方法
CN101233755A (zh) * 2005-07-14 2008-07-30 塞库斯特里姆技术公司 多媒体数据保护
US8196110B2 (en) * 2007-11-30 2012-06-05 International Business Machines Corporation Method and apparatus for verifying a suspect return pointer in a stack
CN103841198A (zh) * 2014-03-07 2014-06-04 中南大学 一种净室云计算数据处理方法及系统

Also Published As

Publication number Publication date
CN109409084A (zh) 2019-03-01

Similar Documents

Publication Publication Date Title
CN109409084B (zh) 一种检测返回地址被篡改的链式数据存储结构
CN109409086B (zh) 基于新增指令的检测堆栈中返回地址被篡改的装置
De Clercq et al. A survey of hardware-based control flow integrity (CFI)
US8881137B2 (en) Creating a relatively unique environment for computing platforms
US8583939B2 (en) Method and apparatus for securing indirect function calls by using program counter encoding
WO2020057603A1 (zh) 检测堆栈中返回地址被篡改的方法及装置
US20160028767A1 (en) Method for Preventing Information Leaks on the Stack Smashing Protector Technique
US11372969B1 (en) Randomized canary and shadow stack for JIT-ROP defense
Ruan et al. Survey of return‐oriented programming defense mechanisms
US10572666B2 (en) Return-oriented programming mitigation
US11003430B2 (en) Method of enforcing control flow integrity in a monolithic binary using static analysis
CN109409085A (zh) 处理堆栈中返回地址被篡改的方法及装置
CN109508537A (zh) 检测堆栈中返回地址被篡改的方法及装置
CN109508539A (zh) 检测堆栈中返回地址被篡改的链式堆栈结构
CN109409083B (zh) 检测堆栈中返回地址被篡改的装置
Maunero et al. Cfi: Control flow integrity or control flow interruption?
CN109446797A (zh) 检测堆栈中返回地址被篡改的装置
US8392714B2 (en) Secure overlay manager protection
US10776460B2 (en) Proactive security system based on code polymorphism
CN111898119A (zh) 控制流完整性保护方法、装置、设备及存储介质
CN109508538A (zh) 一种检测堆栈中返回地址被篡改的堆栈结构
CN109446798A (zh) 检测堆栈中返回地址被篡改历史的装置
KR101986028B1 (ko) 코드 포인터 보수를 사용하여 프로세싱 흐름에 대한 공격에 대해 장치를 보호하기 위한 시스템 및 방법
Karwayun et al. War of Control Hijacking: Attacks and Defenses
EP4357957A1 (en) Method for securing against physical or logical attacks an execution of a machine language instructions code

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant