一种基于硬件虚拟化的RISCV内存溢出漏洞检测方法及装置

文档序号:29935469发布日期:2022-05-07 13:31阅读:199来源:国知局
一种基于硬件虚拟化的RISCV内存溢出漏洞检测方法及装置
一种基于硬件虚拟化的riscv内存溢出漏洞检测方法及装置
技术领域
1.本发明属于计算机科学与技术领域,具体涉及一种基于硬件虚拟化的riscv内存溢出漏洞检测方法及装置。


背景技术:

2.内存溢出漏洞是指针对栈内存或堆内存的写入过程超过了原始内存区域大小,导致后续的系统数据或函数指针被覆盖,进而引发程序异常的漏洞。受输入样本和程序执行的影响,内存溢出漏洞并不一定每次都会产生异常,因而部分漏洞难以准确检测。目前针对内存溢出漏洞最主要的检测方法是动态调试分析和基于编译器address sanitizer功能,在源码中嵌入检测代码的方法。基于调试分析的方法依赖人工分析,费时费力。基于源代码的方式确实在一定程度上提高了内存溢出漏洞的检测能力,但当前大量软件产品并不提供源代码,因此基于源码的分析方式具有较大的局限性,难以对二进制形态的应用软件展开分析。
3.当前在riscv平台的内存溢出漏洞检测,通常使用如下的几种方法:
4.1.基于调试器的溢出漏洞检测
5.内存溢出漏洞是软件安全的主要威胁之一,溢出漏洞通过改写超出预定内存区域的数据,覆盖程序的关键变量或控制流转移方向。由于输入样本的影响,并不一定每次内存溢出都能够充分发挥漏洞的能力,覆盖到关键数据,也不一定能够引起崩溃。因此对部分溢出漏洞的问题进行定位和排错都比较困难。目前riscv上针对代码溢出漏洞检测,主要的方法是当程序运行出现崩溃时,由开发人员通过gdb等调试工具展开分析。这种分析方法会漏掉部分内存溢出漏洞,gdb侵入目标程序本身会改变其内存布局,影响漏洞的表现和分析,具有较大的局限性。
6.2.基于编译器的溢出漏洞检测
7.目前也有部分工作基于编译器的代码优化功能,在代码优化阶段,将手写的溢出漏洞检测的代码嵌入到目标程序中,在运行阶段针对与riscv的程序开展动态分析,检测其中是否存在内存溢出漏洞。该方法确实在一定程度上能够提高代码溢出漏洞检测能力,但绝大部分软件以二进制形式发布,无法获得源代码,基于源代码的溢出漏洞检测方式具有较大的局限性。
8.综上,目前在riscv硬件之上,对程序进行动态分析的方法主要缺陷在于:由于受到输入数据的影响,部分内存溢出漏洞不会引发程序崩溃或系统崩溃,因而不容易被分析人员定位和排错。现有的基于调试工具的分析方法具有很大局限性。尽管也有部分工作使用编译器优化技术将分析代码插入到源码中,通过插入的代码实现内存溢出漏洞,但很多软件的源代码很难获取,基于源码的方式也具有较大的局限性。


技术实现要素:

9.针对现有针对riscv cpu上程序内存溢出漏洞检测依赖于手工分析或源代码实
现,需要大量人力物力、时间复杂度高、局限性大的问题。本发明的目的在于提供一种基于硬件虚拟化的riscv内存溢出漏洞检测方法及装置,该方法通过修改硬件模拟器,在翻译执行riscv指令的同时,提取并标定进程分配的内存区域,监控riscv指令的store指令,检测内存溢出漏洞。
10.本发明的技术方案包括:
11.一种基于硬件虚拟化的riscv内存溢出漏洞检测方法,其步骤包括:
12.逆向riscv上运行的操作系统内核,获取进程内核数据结构;
13.基于硬件模拟器模拟riscv cpu,并构建操作系统的基础进程列表与一内存区域占用记录表;
14.使用sptbr寄存器与进程内核数据结构,获取新进程的特征信息,并依据基础进程列表对特征信息进行筛选,得到目标进程;
15.在内存区域占用记录表建立相应表头,使用目标进程的api检测结果填充内存区域占用记录表的内容,以通过被分配内存的块占用情况,得到内存区域列表;
16.基于目标进程的指令分析结果,得到内存访问数据;
17.比对内存访问数据与内存区域列表,得到溢出漏洞检测结果。
18.进一步地,所述操作系统包括:linux操作系统或windows操作系统。
19.进一步地,所述硬件模拟器的类型包括:qemu硬件模拟器。
20.进一步地,通过以下步骤获取新进程的特征信息:
21.1)监控sptbr寄存器的变化,并当出现新的地址时,得到新进程;
22.2)然后以sptbr指向的物理页为起点,通过特征搜索进程内核数据结构,获得新进程的特征信息。
23.进一步地,所述特征信息包括:模块加载地址、长度,线程信息和内存信息。
24.进一步地,通过以下步骤得到api检测结果:
25.1)获取目标进程的进程信息与动态运行过程信息;
26.2)拦截所有的ecall指令,获得api信息,其中所述api信息包括:api调用的地址、函数名、输入/输出参数和返回值;
27.3)判断api调用地址相应的函数是否为内存申请/释放函数:
28.若是,将用户配置的进程名称、内存区域的起始地址和内存区域的长度作为api检测结果;
29.若否,则当前操作与内存无关,不做处理。
30.进一步地,目标进程的进程信息包括:进程结构地址、页表物理地址、进程名、模块结构信息列表和进程当前模块结构指针。
31.进一步地,通过以下步骤得到内存访问数据:
32.1)拦截所有的store指令;
33.2)获得指令的操作码、操作数、寄存器、内存地址和内存内容;
34.3)基于stor指令操作的内存地址位置,得到内存访问数据。
35.一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行以上所述方法。
36.一种电子装置,包括存储器和处理器,其中存储器存储执行以上所述方法的程序。
37.本发明的优点和积极效果如下:
38.本发明能够完整、透明的监控在riscv cpu上二进制程序的运行全过程,提供可配置的内存溢出漏洞配置接口,监控过程不依赖于系统提供的功能或接口,能够实现透明的进程监控和内存溢出漏洞检测,有效提高了内存溢出漏洞检测能力和准确度。
附图说明
39.图1为本发明一种基于硬件虚拟化的riscv内存溢出检测方法流程图。
具体实施方式
40.为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
41.本发明的riscv内存溢出检测方法方法,包括:
42.·
在qemu硬件模拟器上安装操作系统;
43.·
基于qemu硬件模拟器,以虚拟的sptbr寄存器为线索,区分不同的进程;
44.·
基于qemu硬件模拟器,构建虚拟的进程内核数据结构寄存器,解析物理内存内容,搜索进程内核数据结构;
45.·
基于qemu硬件模拟器,通过修改译码引擎,在用户态执行指令ecall指令时,检测是否实现了内存分配/释放操作,标定内存区域,构建内存区域列表;
46.·
基于qemu硬件模拟器,通过提供用户态接口,由用户标定需要监控的内存区域;
47.·
基于qemu硬件模拟器,通过修改译码引擎,在store指令的前后加入回调函数实施分析,基于内存区域区间和指令写入位置,检测内存溢出漏洞。
48.·
将内存溢出漏洞检测结果以json文件格式输出。
49.具体地,如图1所示,本发明方法的步骤描述如下:
50.1)手工逆向riscv上运行的操作系统内核,解析内核数据结构,相关数据结构主要用于在物理内存中,通过多级指针相互验证(操作系统内核数据结构使用双向链表连接,通过内核数据结构间两个值是否指向关联的合法地址,可以检测是否为合法的内核数据结构)的方式找到进程内核数据结构,进入步骤2)。
51.2)基于qemu硬件模拟器模拟的riscv cpu,并安装linux操作系统,记录一个通用linux操作系统所需要启动的基础进程,构建基础进程列表,在后期分析中不监控此类进程进入步骤3);
52.3)启动linux操作系统和目标进程,构建进程内核数据结构寄存器,进入步骤4);
53.4)监控系统中sptbr寄存器的变化:当出现新的地址时,认为出现了新的进程,然后以sptbr指向的物理页为起点,通过特征搜索进程内核数据结构,获得当前进程的特征信息,包括模块加载地址、长度,线程信息、内存信息等,并基于该特征信息,判定该进程是否属于基础进程列表,如果属于则忽略。如果不属于,则记录进程信息,进程信息包括:进程结构地址、页表物理地址、进程名、模块结构信息列表、进程当前模块结构指针,并进入步骤5);
54.5)对目标进程修改译码引擎,并在qemu的译码机制中加入api检测和指令分析代码,其中,在qemu实际执行时,除进程信息外,进一步提取动态运行过程信息进入步骤6);
55.6)构建进程内核数据结构寄存器,以sptbr指向的物理页为起点,通过特征搜索进程内核数据结构,获得当前进程的信息,包括模块加载地址、长度,线程信息、内存信息等,进入步骤7),
56.7)以和系统页表类似的方式构建内存区域占用记录表。通过修改qemu虚拟机的代码,监控sptbr的变化,在sptbr寄存器出现新的值时,在虚拟机中创建内存区域占用记录表的表头(表的内容通过拦截ecall指令,根据进程调用的malloc、free等内存分配、释放函数的参数和返回值进行添加、删除,并根据realloc等函数的参数和返回值进行更新),如果内存区域被占用,则将内存区域占用记录表中对应的区域全部置为1,以表示内存块被占用。该记录表的内容跟随内存的分配、释放等操作,按需进行分配和释放。进入步骤8)
57.8)针对目标进程,拦截所有的ecall指令,获得api调用的地址、函数名、输入/输出参数、返回值,判断api调用地址相应的函数是否为内存申请/释放函数:若是,根据函数的返回值更新内存区域列表,进入步骤9);若否,进入步骤10);
58.9)用户通过提供的接口,输入命令行,配置进程名称、内存区域的起始地址、内存区域的长度等信息,实现内存区域列表的添加、删除、修改、查询。进入步骤9)
59.10)针对目标进程,拦截riscv的store指令,获得指令的操作码、操作数、操作的寄存器、操作的内存地址和操作的内存内容等信息,将指令操作的内存地址位置和前面内存区域占用记录表进行对比,判定访问是否超出了占用区域范围,是否产生了内存溢出,如果是,则输出溢出漏洞检测结果,进入步骤10)
60.11)判定目标进程是否退出,若退出,将动态信息以json文件的方式输出,若没有退出,进入步骤6)
61.进一步地,所述在qemu硬件模拟器上安装操作系统,由于windows系统尚不支持riscv cpu,当前仅为linux系统。但针对windows操作系统的监控过程与linux系统监控过程原理一致,本专利方法也可支持windows操作系统。
62.进一步地,所述基于qemu硬件模拟器,以虚拟的sptbr寄存器为线索,区分不同的进程,其中sptbr为每个进程的页表物理地址,由于不同进程使用不同的页表,该页表信息能够唯一的标志进程,通过在内存中构建以页表地址为索引的hash表,记录进程信息。
63.进一步地,所述基于qemu硬件模拟器,以虚拟的内核数据结构寄存器为线索,在物理内存中遍历链表搜索内核进程数据结构,提取进程信息。
64.进一步地,所述qemu硬件模拟器,通过修改译码引擎,在程序执行指令ecall指令时,检测该指令的目标地址是否为内存分配/释放的函数,记录内存区域的地址和范围。
65.进一步地,所述qemu硬件模拟器,加入用户接口,允许用户通过输入命令的方式,定义目标进程中内存区域的地址和范围。
66.进一步地,所述基于qemu硬件模拟器,通过修改译码引擎,在store指令的前后加入回调函数实施分析,实现指令读写内存地址、长度的分析,并根据内存区域的地址和长度,判定该操作是否引发了内存溢出漏洞。本发明提出的一种通过修改硬件模拟器,针对riscv cpu,通过分析虚拟cpu中的寄存器、定位和读取物理内存中的操作系统关键数据结构,识别进程,拦截进程的函数调用和执行的指令,检测进程运行过程中发生的内存溢出漏洞的方法。本发明能够完整、透明的监控在riscv cpu上程序的运行全过程,提供可配置的内存溢出漏洞配置接口,监控过程不依赖于系统提供的功能或接口,能够实现透明的进程
监控和内存溢出漏洞检测,有效提高了内存溢出漏洞检测能力和准确度。
67.尽管为说明目的公开了本发明的具体实施例和附图,其目的在于帮助理解本发明的内容并据以实施,但是本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例和附图所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1