基于RISC-V与不可执行内存的缓冲区溢出攻击防御方法及系统技术方案

技术编号:30757465 阅读:24 留言:0更新日期:2021-11-10 12:11
本发明专利技术公开了一种基于RISC

【技术实现步骤摘要】
基于RISC

V与不可执行内存的缓冲区溢出攻击防御方法及系统


[0001]本专利技术属于计算机
,涉及一种基于RISC

V与不可执行内存的缓冲区溢出攻击防御方法及系统。

技术介绍

[0002]计算机系统在各行各业的数字化、信息化进程中扮演着举足轻重的角色,影响着包括经济、教育、医疗等各领域的发展和稳定。在计算机系统应用日益普及、深入生产生活方方面面的今天,如何保证其功能的有效性、数据信息的真实性、行为的可靠性,使其免受恶意攻击的影响,便成为了学术界和工业界共同关注的一大关键问题。这些恶意攻击中,缓冲区溢出攻击是一种常见的攻击手段,它针对内存不安全语言所编写的源程序中缺失边界检查等机制的漏洞,通过对缓冲区容量限制的突破,覆盖其它区域的数据内容,进而破坏程序的完整性和正确性。由于其操作难度较低,实施较为便捷,这类攻击手段被广泛使用于程序控制流劫持等攻击之中。
[0003]为了能够对抗程序控制流劫持等攻击形式,使系统免受缓冲区溢出攻击的影响,学术界一直在研究行之有效的防御方法。鉴于缓冲区溢出攻击的主要目标之一,将控制流引导到不在CFG(Control Flow Graph,控制流图)中的代码处执行,已有一些基于不可执行内存的防御方法被提出。这些基于不可执行内存的防御方法通过将内存空间划分为具有不同可执行性的区域,限制或消除易受攻击的堆栈区域的可执行权限,从而避免位于堆栈中的CFG之外代码的执行。然而,目前存在的基于不可执行内存的防御方法对硬件环境和系统特性的依赖较大,无法直接迁移到基于RISC

V指令集架构实现的系统;且会造成对系统核心的侵入式更改,使得在现有系统中的应用也受到限制。例如,Red Hat公司在2004年提出了用于Linux系统的防御机制Exec Shield,并一直沿用至今。该防御机制通过“段限制方法”(Segment Limit Approach)将进程的内存空间划分为可执行和不可执行的两段,将读取与执行权限近似于分开,来确保返回地址只指向受信任的代码。但是由于“段限制方法”属于Intel处理器中的一个模糊特性,因此Exec Shield机制也仅适用于基于Intel指令集架构(如x86)的系统;其它现有系统需要对处理器功能或指令集架构进行针对性改变,才可能达到与之近似的效果。在上述例子中,对硬件特性的依赖导致了技术方案的适用范围受限、难以推广迁移至包括RISC

V系统在内的其它现有系统中。

技术实现思路

[0004]本专利技术的目的在于提供一种可应用于RISC

V系统的基于不可执行内存的缓冲区攻击防御方法及系统。该方法通过设置页表中的特定标志位,控制对应内存区域的可执行属性,防止堆栈代码意外执行。该方法可以在不改变程序控制流的情况下,消除被恶意篡改的返回地址的执行可能性,可以有效地阻止利用缓冲区溢出在堆栈空间强制执行代码的攻击,提高RISC

V系统的安全性。
[0005]为实现上述目的,本专利技术采用如下技术方案:
[0006]一种基于RISC

V与不可执行内存的缓冲区溢出攻击防御方法,其步骤包括:
[0007]1)对程序源代码生成抽象语法树(Abstract Syntax Tree,AST),根据该抽象语法树生成控制流图(Control Flow Graph,CFG),该控制流图是有向图,表示为G=(V,E,nentry,nexit),其中V是节点的集合,每个节点对应程序中的一条语句或一个语句块;E是有向边的集合,每条边对应一条可能执行的控制流通路;nentry和nexit分别对应程序的入口节点和出口节点;
[0008]2)分析控制流图,确定待保护的涉及堆栈缓冲区的代码片段;
[0009]3)将待保护的涉及堆栈缓冲区的代码片段始末位置作为插桩点,插入开启/清除NX位(no

execute bit,非执行位)标志的RISC

V扩展指令;
[0010]4)执行程序,在当前控制流进入堆栈缓冲区之前开启NX位标志,使对应内存不可执行;
[0011]5)控制流离开堆栈缓冲区之后,清除NX位标志,恢复内存可执行状态。
[0012]进一步地,步骤1)中,包括以下步骤:
[0013]a)对程序源代码生成抽象语法树;
[0014]b)在抽象语法树中找出所有表示语句和谓词的节点;
[0015]c)根据抽象语法树和节点集合,找出任意两个节点之间的控制流通路作为有向边;
[0016]d)根据抽象语法树,找出程序的入口节点和出口节点;
[0017]e)将上述步骤找出的节点、有向边、入口节点和出口节点进行组合,生成对应于程序源代码的控制流图。
[0018]进一步地,为抽象语法树的每个节点赋予content属性,其属性值对应于节点所表示的代码语句;为每个节点赋予type属性,其属性值对应于对节点所表示代码的判断,从语句、谓语、不关心的代码中取值;在抽象语法树中根据节点的type属性,找出所有的语句和谓词节点。
[0019]进一步地,步骤2)中,包括以下步骤:
[0020]a)预先定义节点识别特征集合,包括用于识别起始节点的堆相关特征和栈相关特征,以及用于识别终止节点的识别特征;
[0021]b)遍历控制流图,找出所有进入堆栈的节点,形成起始节点集合,以及找出所有从堆栈退出的节点,形成终止节点集合;
[0022]c)根据控制流图识别堆栈相关代码片段,如果该片段的起始节点属于上述起始节点集合,该片段的终止节点属于上述终止节点集合,且在该片段的起始节点和终止节点之间存在控制流通路,则确定该片段为待保护的涉及堆栈缓冲区的代码片段。
[0023]进一步地,步骤3)中,包括以下步骤:对于待保护的涉及堆栈缓冲区的代码片段,按当前控制流执行的次序,依次判断其起始节点之前是否已插入开启NX位标志的RISC

V指令,其终止节点之后是否已插入清除NX位标志的RISC

V指令;对于没有插入开启NX位标志的RISC

V指令的,则在相应位置插入开启NX位标志的RISC

V指令;对于没有插入清除NX位标志的RISC

V指令,则在相应位置插入清除NX位标志的RISC

V指令。
[0024]进一步地,步骤4)中,包括以下步骤:
[0025]a)执行开启NX位标志的RISC

V指令;
[0026]b)根据开启NX位标志的RISC

V指令自身的代码位置,计算出当前待保护的涉及堆栈缓冲区的代码片段的起始位置;
[0027]c)根据上述起始位置,在当前进程页表项中找到对应的NX位,设置该标志,表示其对应的内存范围不可执行。
[0028]进一步地,步骤5)中,包括以下本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于RISC

V与不可执行内存的缓冲区溢出攻击防御方法,其特征在于,步骤包括:1)对程序源代码生成抽象语法树,根据该抽象语法树生成控制流图,该控制流图是有向图,表示为G=(V,E,nentry,nexit),其中V是节点的集合,每个节点对应程序中的一条语句或一个语句块;E是有向边的集合,每条边对应一条可能执行的控制流通路;nentry和nexit分别对应程序的入口节点和出口节点;2)分析控制流图,确定待保护的涉及堆栈缓冲区的代码片段;3)将待保护的涉及堆栈缓冲区的代码片段始末位置作为插桩点,插入开启/清除NX位标志的RISC

V扩展指令;4)执行程序,在当前控制流进入堆栈缓冲区之前开启NX位标志,使对应内存不可执行;5)控制流离开堆栈缓冲区之后,清除NX位标志,恢复内存可执行状态。2.如权利要求1所述的方法,其特征在于,步骤1)中根据抽象语法树生成控制流图,包括以下步骤:在抽象语法树中找出所有表示语句和谓词的节点;根据抽象语法树和节点集合,找出任意两个节点之间的控制流通路作为有向边;根据抽象语法树,找出程序的入口节点和出口节点;将上述步骤找出的节点、有向边、入口节点和出口节点进行组合,生成对应于程序源代码的控制流图。3.如权利要求1或2所述的方法,其特征在于,为抽象语法树的每个节点赋予content属性,其属性值对应于节点所表示的代码语句;为每个节点赋予type属性,其属性值对应于对节点所表示代码的判断,从语句、谓语、不关心的代码中取值;在抽象语法树中根据节点的type属性,找出所有的语句和谓词节点。4.如权利要求1所述的方法,其特征在于,步骤2)确定待保护的涉及堆栈缓冲区的代码片段,包括以下步骤:预先定义节点识别特征集合,包括用于识别起始节点的堆相关特征和栈相关特征,以及用于识别终止节点的识别特征;遍历控制流图,找出所有进入堆栈的节点,形成起始节点集合,以及找出所有从堆栈退出的节点,形成终止节点集合;根据控制流图识别堆栈相关代码片段,如果该片段的起始节点属于上述起始节点集合,该片段的终止节点属于上述终止节点集合,且在该片段的起始...

【专利技术属性】
技术研发人员:刘畅赵琛武延军芮志清吴敬征
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1