基于RISC-V与Canary机制的缓冲区溢出攻击防御方法及装置转让专利

申请号 : CN202110806892.4

文献号 : CN113536297B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘畅赵琛武延军芮志清吴敬征

申请人 : 中国科学院软件研究所

摘要 :

本发明公开一种基于RISC‑V与Canary机制的缓冲区溢出攻击防御方法及装置,包括:为程序源代码的抽象语法树赋予content属性后,生成节点调用关系图G;生成特殊数据Canary;在每一调用节点content属性所对应的代码语句之前及每一返回节点content属性所对应的代码语句之前,分别插入设置特殊数据Canary的RISC‑V扩展指令与检验特殊数据Canary的RISC‑V扩展指令;执行程序源代码,设置特殊数据Canary的RISC‑V扩展指令将特殊数据Canary写入当前栈帧,检验特殊数据Canary的RISC‑V扩展指令通过特殊数据Canary的值p与从当前栈帧中取得特殊数据Canary的值p′的对比结果,以进行防御。本发明全面覆盖堆溢出、栈溢出、BSS溢出等多种缓冲区溢出形式,可实现安全防御的软硬协同,对系统性能的影响较小,获取了更佳的防御效果。

权利要求 :

1.一种基于RISC‑V与Canary机制的缓冲区溢出攻击防御方法,其步骤包括:

1)根据程序源代码生成抽象语法树,为抽象语法树的每个节点赋予content属性后,生成节点调用关系图G=(VC,VR,R,nentry),其中content属性的属性值对应于节点所表示的代码语句,VC是若干函数调用节点组成的函数调用节点集合,VR是若干函数返回节点组成的函数返回节点集合,R是函数调用节点与函数返回节点之间的对应关系集合,nentry是程序入口节点;

2)利用程序入口节点nentry及各节点content属性,获取程序起始地址progaddr,并根据硬件安全原语PUF,输入特定刺激信号,获得唯一输出值puf,进而将程序起始地址progaddr与输出值puf进行组合,以生成特殊数据Canary;

3)在每一调用节点content属性所对应的代码语句之前及每一返回节点content属性所对应的代码语句之前,分别插入设置特殊数据Canary的RISC‑V扩展指令与检验特殊数据Canary的RISC‑V扩展指令,其中,插入设置特殊数据Canary的RISC‑V扩展指令,包括:

3.1.1)从函数调用节点集合VC中取当前控制流下一个未被取到的函数调用节点;

3.1.2)按当前控制流执行的次序,判断未被取到的函数调用节点在其之前是否已插入设置特殊数据Canary的RISC‑V扩展指令:若不是,转到步骤3.1.3);若是,转到步骤3.1.4);

3.1.3)在未被取到的函数调用节点content属性所对应的代码语句之前,插入一条设置特殊数据Canary的RISC‑V扩展指令;

3.1.4)判断函数调用节点集合VC中是否还存在未被取到的函数调用节点,若是则转入步骤3.1.1),直到每一函数调用节点之前都插入设置特殊数据Canary的RISC‑V扩展指令;

插入检验特殊数据Canary的RISC‑V扩展指令,包括:

3.2.1)从函数返回节点集合VR中取当前控制流下一个未被取到的函数返回节点;

3.2.2)按当前控制流执行的次序,判断未被取到的函数返回节点在其之前是否已插入检验特殊数据Canary的RISC‑V扩展指令,若是,转到3.2.4);若不是,转到3.2.3);

3.2.3)在未被取到的函数返回节点content属性所对应的代码语句之前,插入一条检验特殊数据Canary的RISC‑V扩展指令;

3.2.4)判断函数返回节点集合VR中是否还存在未被取到的函数返回节点,若是则转入步骤3.2.1),直到每一函数返回节点之前都插入检验特殊数据Canary的RISC‑V扩展指令;

4)执行程序源代码,利用设置特殊数据Canary的RISC‑V扩展指令,将特殊数据Canary的值写入当前栈帧底部,并通过检验特殊数据Canary的RISC‑V扩展指令,对比特殊数据Canary的值p与从当前栈帧中取得特殊数据Canary的值p′;

5)若值p与值p′不同,则进入异常处理以进行防御。

2.如权利要求1所述的方法,其特征在于,通过以下步骤生成节点调用关系图G:

1)为抽象语法树每一节点赋予type属性,其中type属性的属性值对应于对节点所表示代码的判断;

2)根据type属性,找出所有表示函数调用的语句节点,得到函数调用节点集合VC;

3)根据type属性,找出所有的函数返回语句节点,得到函数返回节点集合VR;

4)通过判断函数调用节点集合VC与函数返回节点集合VR中任一组调用‑返回节点对之间是否有控制流通路存在,得到对应关系集合R;

5)利用函数调用节点集合VC、函数返回节点集合VR、对应关系集合R及抽象语法树的程序入口节点nentry,生成节点调用关系图G。

3.如权利要求1所述的方法,其特征在于,设置特殊数据Canary的RISC‑V扩展指令的指令格式包括:

1)Opcode字段,表示自定义编码空间中的指令操作码编码;

2)Src字段,表示当前将写入Canary值的栈帧地址;

3)Canary字段,表示作为Canary来源的专用安全寄存器的地址;

4)Res字段,表示存放指令执行结果的寄存器的地址。

4.如权利要求1所述的方法,其特征在于,检验特殊数据Canary的RISC‑V扩展指令的指令格式包括:

1)Opcode字段,表示自定义编码空间中的指令操作码编码;

2)Src字段,表示当前所保护的代码片段的起始地址;

3)Canary字段,表示Canary的期望值;

4)Res字段,表示存放指令执行结果的寄存器的地址。

5.如权利要求1所述的方法,其特征在于,通过以下步骤进行缓冲区溢出攻击的防御:

1)利用检验特殊数据Canary的RISC‑V扩展指令,从当前栈帧中取得特殊数据Canary的值p′;

2)获取特殊数据Canary的值p;

3)对比特殊数据Canary的值p′与特殊数据Canary的值p:若相同,则函数正常返回;若不同,则抛出异常的函数调用节点,程序终止。

6.一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行如权利要求1‑5中任一所述方法。

7.一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行如权利要求1‑5中任一所述方法。

说明书 :

基于RISC‑V与Canary机制的缓冲区溢出攻击防御方法及装置

技术领域

[0001] 本发明属于计算机技术领域,涉及一种基于RISC‑V与Canary机制的缓冲区溢出攻击防御方法及装置。

背景技术

[0002] 随着计算机行业的发展,计算机软件已成为生产生活中不可或缺的一部分,包括医疗、教育、军事、政治和新零售等领域在内,各行各业都在广泛地应用着计算机系统。在计算机系统的迅速发展和普及之下,如何保证其行为的可信性、保护其免受恶意攻击的影响,已然成为学术界和工业界共同关注的重要问题。缓冲区溢出攻击是一种常见的恶意攻击手段,其利用内存不安全语言编写的源程序中边界检查等机制的缺失,突破缓冲区容量限制,而覆盖其它区域的数据内容,从而破坏程序的正确性和稳定性。这类攻击手段由于其操作的便捷性被广泛使用于程序控制流劫持等攻击之中。
[0003] 为有效应对针对程序控制流的缓冲区溢出攻击,学术界一直在探索新型的防御方法。鉴于缓冲区溢出攻击在形式上会突破缓冲区边界,将数据写入缓冲区以外的内存区域,已有一些基于Canary机制的防御方法被提出。Canary是一段被安置在缓冲区边界的特殊数据,又被称作“金丝雀字”、“检举字”等。当溢出发生时,Canary会被恶意攻击所填充的数据首先覆盖,使其内容发生变化;在执行程序返回等位于缓冲区之外的指令之前,检查Canary是否被更改,即可判断是否已发生溢出,防止程序被引导执行到不正确的代码片段。然而,目前存在的基于Canary的防御方法对硬件环境和系统特性的依赖较大,无法直接迁移到RISC‑V系统。例如,Crispin Cowan等人设计的StackGuard防御方法是基于对gcc编译器的改造,为其中的function_prologue和function_epilogue功能增加了特定于x86架构的变化,以安排Canary的放置和检验过程。在上述例子中,对硬件特性的依赖导致了技术方案的适用范围受限、难以推广迁移至包括RISC‑V系统在内的其它现有系统中。
[0004] 此外,中国专利申请CN112948818A公开了一种防止堆栈溢出攻击的保护方法及系统,提出了一种Canary字的构造方法及其使用方式。然而该方法仅适用于由字符串处理缺乏必要的边界检查引起的栈溢出场景,对于堆溢出、BSS(Block Started by Symbol,以符号开始的块)溢出等其它缓冲区溢出形式,以及由其它原因引起的溢出场景,缺乏同样有效的保护。同时,该方法需要额外的运算过程来构造Canary字,对系统运行效率也会有一定的影响。
[0005] 本发明为了解决基于Canary机制的缓冲区溢出攻击防御方法适用范围有限、落地困难的问题,提出了基于RISC‑V扩展指令集的实现方案。本发明可以及时发现缓冲区溢出,阻止控制流进入被篡改的内存区域,阻止程序基于错误的指令和数据执行,提升系统对缓冲区溢出攻击的防御能力,进而提高RISC‑V操作系统的安全性。

发明内容

[0006] 本发明的目的在于提供一种可应用于RISC‑V系统的基于Canary机制的缓冲区攻击防御方法及装置。该方法通过在缓冲区边界设置特定的Canary,监视越过缓冲区边界的写入行为,防止程序基于错误的指令和数据执行。该方法可以有效地阻止利用缓冲区溢出篡改程序返回地址而劫持控制流的攻击,提高RISC‑V系统的安全性。
[0007] 为实现上述目的,本发明采用如下技术方案:
[0008] 一种基于RISC‑V与Canary机制的缓冲区溢出攻击防御方法,其步骤包括:
[0009] 1)根据程序源代码生成抽象语法树,为抽象语法树的每个节点赋予content属性后,生成节点调用关系图G=(VC,VR,R,nentry),其中content属性的属性值对应于节点所表示的代码语句,VC是若干函数调用节点组成的函数调用节点集合,VR是若干函数返回节点组成的函数返回节点集合,R是函数调用节点与函数返回节点之间的对应关系集合,nentry是程序入口节点;
[0010] 2)利用硬件安全用语PUF、各节点content属性所对应的代码语句及程序入口节点nentry,共同生成一段被安置在缓冲区边界的特殊数据Canary;
[0011] 3)在每一调用节点content属性所对应的代码语句之前及每一返回节点content属性所对应的代码语句之前,分别插入设置特殊数据Canary的RISC‑V扩展指令与检验特殊数据Canary的RISC‑V扩展指令;
[0012] 4)执行程序源代码,利用设置特殊数据Canary的RISC‑V扩展指令,将特殊数据Canary的值写入当前栈帧底部,并通过检验特殊数据Canary的RISC‑V扩展指令,对比特殊数据Canary的值p与从当前栈帧中取得特殊数据Canary的值p′;
[0013] 5)若值p与值p′不同,则进入异常处理以进行防御。
[0014] 进一步地,通过以下步骤生成节点调用关系图G:
[0015] 1)为抽象语法树每一节点赋予type属性,其中type属性的属性值对应于对节点所表示代码的判断;
[0016] 2)根据type属性,找出所有表示函数调用的语句节点,得到函数调用节点集合VC;
[0017] 3)根据type属性,找出所有的函数返回语句节点,得到函数返回节点集合VR;
[0018] 4)通过判断函数调用节点集合VC与函数返回节点集合VR中任一组调用‑返回节点对之间是否有控制流通路存在,得到对应关系集合R;
[0019] 5)利用函数调用节点集合VC、函数返回节点集合VR、对应关系集合R及抽象语法树的程序入口节点nentry,生成节点调用关系图G。
[0020] 进一步地,通过以下步骤生成特殊数据Canary:
[0021] 1)利用程序入口节点nentry及各节点content属性,获取程序起始地址progaddr;
[0022] 2)根据硬件安全原语PUF,输入特定刺激信号,获得唯一输出值puf;
[0023] 3)将程序起始地址progaddr与输出值puf进行组合,生成特殊数据Canary。
[0024] 进一步地,特定刺激信号包括:电磁振荡信号。
[0025] 进一步地,通过以下步骤插入设置特殊数据Canary的RISC‑V扩展指令:
[0026] 1)从函数调用节点集合VC中取当前控制流下一个未被取到的函数调用节点;
[0027] 2)按当前控制流执行的次序,判断未被取到的函数调用节点在其之前是否已插入设置特殊数据Canary的RISC‑V扩展指令;若是,转到步骤3);若不是,转到步骤4)[0028] 3)若未插入,则在未被取到的函数调用节点content属性所对应的代码语句之前,插入一条设置特殊数据Canary的RISC‑V扩展指令;
[0029] 4)判断函数调用节点集合VC中是否还存在未被取到的函数调用节点,若是则转入步骤1),直到每一函数调用节点之前都插入设置特殊数据Canary的RISC‑V扩展指令。
[0030] 进一步地,设置特殊数据Canary的RISC‑V扩展指令的指令格式包括:
[0031] 1)Opcode字段,表示自定义编码空间中的指令操作码编码;
[0032] 2)Src字段,表示当前将写入Canary值的栈帧地址;
[0033] 3)Canary字段,表示作为Canary来源的专用安全寄存器的地址;
[0034] 4)Res字段,表示存放指令执行结果的寄存器的地址。
[0035] 进一步地,通过以下步骤插入检验特殊数据Canary的RISC‑V扩展指令:
[0036] 1)从函数返回节点集合VR中取当前控制流下一个未被取到的函数返回节点;
[0037] 2)按当前控制流执行的次序,判断未被取到的函数返回节点在其之前是否已插入检验特殊数据Canary的RISC‑V扩展指令,若是,转到4);若不是,转到3);
[0038] 3)在未被取到的函数返回节点content属性所对应的代码语句之前,插入一条检验特殊数据Canary的RISC‑V扩展指令;
[0039] 4)判断函数返回节点集合VR中否还存在未被取到的函数返回节点,若是则转入步骤1),直到每一函数返回节点之前都插入检验特殊数据Canary的RISC‑V扩展指令。
[0040] 进一步地,检验特殊数据Canary的RISC‑V扩展指令的指令格式包括:
[0041] 1)Opcode字段,表示自定义编码空间中的指令操作码编码;
[0042] 2)Src字段,表示当前所保护的代码片段的起始地址;
[0043] 3)Canary字段,表示Canary的期望值;
[0044] 4)Res字段,表示存放指令执行结果的寄存器的地址。
[0045] 进一步地,通过以下步骤进行缓冲区溢出攻击的防御:
[0046] 1)利用检验特殊数据Canary的RISC‑V扩展指令,从当前栈帧中取得特殊数据Canary的值p′;
[0047] 2)获取特殊数据Canary的值p;
[0048] 3)对比特殊数据Canary的值p′与特殊数据Canary的值p:若相同,则函数正常返回;若不同,则抛出异常的函数调用节点,程序终止。
[0049] 一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行以上所述方法。
[0050] 一种电子装置,包括存储器和处理器,其中存储器存储执行以上所述方法的程序。
[0051] 与现有技术相比,本发明具有以下优势:
[0052] 1、通过对程序源代码的完整分析,全面覆盖堆溢出、栈溢出、BSS溢出等多种缓冲区溢出形式,是一种更具有普遍适用性的保护方案。
[0053] 2、基于PUF安全原语等硬件方法生成Canary字,相比传统软件方法更有效率,对系统性能的影响更小。
[0054] 3、基于RISC‑V扩展指令设计,可以将硬件纳入防御体系,实现安全防御的软硬协同。围绕RISC‑V扩展指令定制的RISC‑V安全硬件可以提供更佳的防御效果。

附图说明

[0055] 图1是RISC‑V系统中基于Canary机制的缓冲区溢出防御方法的流程图。
[0056] 图2是对程序源代码生成节点调用关系图的流程图。
[0057] 图3是生成Canary的流程图。
[0058] 图4是向代码片段插入设置Canary指令的流程图。
[0059] 图5是向代码片段插入检验Canary指令的流程图。
[0060] 图6是进入缓冲区前,设置Canary的流程图。
[0061] 图7是离开缓冲区时,检验Canary的流程图。
[0062] 图8是用于设置Canary的RISC‑V扩展指令的指令格式设计示意图。
[0063] 图9是用于检验Canary的RISC‑V扩展指令的指令格式设计示意图。

具体实施方式

[0064] 下面结合附图,对本发明做进一步的说明。
[0065] 本实施例基于Canary机制的缓冲区攻击防御方法,其中总体流程如图1所示,主要包括以下步骤:
[0066] 1)分析程序源代码,生成节点调用关系图,确定各函数调用与返回的具体指令位置,其中,函数调用将被识别为call指令,而函数返回将被识别为ret指令。节点调用关系图是一种综合了多种节点集合、节点关系集合的联合数据结构,其结构G=(VC,VR,R,nentry),其中VC是函数调用节点的集合,VR是函数返回节点的集合,R是函数调用与返回节点之间对应关系的集合,nentry是程序的入口节点。其流程如图2所示,具体说明如下:
[0067] 1a)对程序源代码生成抽象语法树,为抽象语法树的每个节点赋予content属性,其属性值对应于节点所表示的代码语句;为每个节点赋予type属性,其属性值对应于对节点所表示代码的判断,取值范围{callstate,retstate,others},分别表示调用语句、返回语句、不关心的代码,转到1b)。
[0068] 1b)在抽象语法树中根据每个节点的type属性,找出所有的函数调用语句节点,记录为调用节点集合,转到1c)。
[0069] 1c)在抽象语法树中根据每个节点的type属性,找出所有的函数返回语句节点,记录为返回节点集合,转到1d)。
[0070] 1d)根据1b)和1c)中找出的节点,判断任意一组“调用‑返回”节点对之间是否有控制流通路存在,并将存在控制流通路的节点对记录进对应关系集合R,转到1e)。
[0071] 1e)将1b)中记录的调用节点集合、1c)中记录的返回节点集合、1d)中记录的对应关系集合R,与抽象语法树中的程序入口节点进行组合,生成对应于程序源代码的节点调用关系图。
[0072] 2)生成Canary,其中Canary将依据物理不可克隆函数(Physical Unclonable Function,PUF)与程序的起始地址共同生成。PUF是一种依赖芯片特征实现的硬件安全原语,具有唯一性、随机性和不可预测性,又被称作硬件的“数字指纹”,已广泛用于AI资产保护等安全场景。其流程如图3所示,具体说明如下:
[0073] 2a)根据1)中生成的节点调用关系图中记录的程序入口节点,通过节点content属性记录的代码语句,获得程序的起始地址,转到2b)。
[0074] 2b)利用PUF硬件安全原语,获得对应于特定刺激信号(如电磁振荡)的输出值,转到2c)。
[0075] 2c)将2a)中获得的程序起始地址和2b)中获得的PUF输出值进行组合,生成Canary,转到2d)。
[0076] 2d)记录2c)中生成的Canary。
[0077] 3)在各函数调用之前,插入Canary设置的RISC‑V扩展指令,其中函数调用时控制流将转入堆栈缓冲区,此时插入的Canary即位于该缓冲区的边界,将函数执行相关内容(位于堆栈缓冲区内)与函数返回地址(位于缓冲区外)隔开,其流程如图4所示,用于设置Canary的RISC‑V扩展指令的指令格式如图8所示,具体说明如下:
[0078] 3a)从函数调用节点集合中取当前控制流下一个未被取到的调用节点,转到3b)。
[0079] 3b)按当前控制流执行的次序,判断3a)中的调用节点在其之前是否已插入设置Canary的指令,若是,转到3d);若不是,转到3c)。
[0080] 3c)在3a)中的调用节点content属性所记录的语句之前,插入一条设置Canary的指令,转到3d)。
[0081] 3d)判断函数调用节点集合中是否还存在未被取到的节点,若是,转到3a)继续对后续节点进行处理。
[0082] 其中,本步骤中使用定制的基于RISC‑V的扩展指令实现对Canary的设置操作。所述定制的基于RISC‑V的扩展指令实现对Canary的设置操作,该定制的指令格式包括:
[0083] Opcode字段,表示自定义编码空间中的指令操作码编码;
[0084] Src字段,表示当前将写入Canary值的栈帧地址;
[0085] Canary字段,表示作为Canary来源的专用安全寄存器的地址;
[0086] Res字段,表示存放指令执行结果的寄存器的地址。
[0087] 4)在各函数返回之前,插入Canary检验的RISC‑V扩展指令,其流程如图5所示,用于检验Canary的RISC‑V扩展指令的指令格式如图9所示,具体说明如下:
[0088] 4a)从函数返回节点集合中取当前控制流下一个未被取到的返回节点,转到4b)。
[0089] 4b)按当前控制流执行的次序,判断4a)中的返回节点在其之前是否已插入检验Canary的指令,若是,转到4d);若不是,转到4c)。
[0090] 4c)在4a)中的返回节点content属性所记录的语句之前,插入一条检验Canary的指令,转到4d)。
[0091] 4d)判断函数返回节点集合中是否还存在未被取到的节点,若是,转到4a)继续对后续节点进行处理。
[0092] 其中,本步骤中使用定制的基于RISC‑V的扩展指令实现对Canary的检验操作。所述定制的基于RISC‑V的扩展指令实现对Canary的检验操作,该定制的指令格式包括:
[0093] Opcode字段,表示自定义编码空间中的指令操作码编码;
[0094] Src字段,表示当前所保护的代码片段的起始地址;
[0095] Canary字段,表示Canary的期望值;
[0096] Res字段,表示存放指令执行结果的寄存器的地址。
[0097] 5)执行代码,在函数跳转之前设置Canary,其流程如图6所示,具体说明如下:
[0098] 5a)在当前控制流因函数调用转移至堆栈缓冲区之前,将首先遇到3)中插入的Canary设置指令,执行该指令,转到5b)。
[0099] 5b)获取2)中记录的Canary的值,转到5c)。
[0100] 5c)将5b)中得到的Canary的值写入当前栈帧底部,转到5d)。
[0101] 5d)正常执行函数后续代码。
[0102] 6)执行流从函数返回前,检查Canary内容是否被改变,其流程如图7所示,具体说明如下:
[0103] 6a)在当前控制流因函数返回从堆栈缓冲区移出之前,将首先遇到4)中插入的Canary检验指令,执行该指令,转到6b)。
[0104] 6b)从当前栈帧中取得5c)中写入的Canary的值,转到6c)。
[0105] 6c)获取2)中记录的正确的Canary的值,转到6d)。
[0106] 6d)判断6b)中的Canary的值和6c)中获取的正确的Canary的值是否相同,若相同,转到6e);若不同,转到6f)。
[0107] 6e)认为程序未发生溢出,函数正常返回。
[0108] 6f)认为程序已发生溢出,抛出异常以进行防御,程序终止。
[0109] 以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。