1.本技术涉及通信安全技术领域,特别是涉及一种
虚拟机内部栈溢出识别方法及系统。
背景技术:
2.本部分的陈述仅仅是提到了与本技术相关的背景技术,并不必然构成现有技术。
3.在当前云计算普及的状况下,栈溢出攻击依然是一种非常常见的攻击方法,对操作系统的运行效率和安全性有着很大的影响。
4.现有技术,常见的栈溢出攻击的检查方法有检测canary栈溢出保护和栈区域执行权限限制。
5.检测canary栈溢出保护,当启用栈保护后,
函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回
地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。通常将cookie信息称为canary。这种机制过于简单且为业界熟知,攻击者很容易避开对canary区域的破坏而使检测机制失效。
6.栈区域执行权限限制,利用体系架构和编译器的内存区权限支持,设置用户栈范围内不可执行代码,从而避免攻击者嵌入的恶意代码被执行。必须依赖于硬件体系结构的支持,并且需要修改操作系统以实现相关能力,这会显著增加操作系统维护的复杂性。
7.因此,不显著影响效率的状况下,有效的防范栈溢出攻击显得尤为重要。
技术实现要素:
8.为了解决现有技术的不足,本技术提供了一种虚拟机内部栈溢出识别方法,该方法在虚拟机管理器中实施,不需要修改现有操作系统和客户进程,即可识别虚拟机内部针对客户操作系统和客户应用进程的栈溢出攻击,具有较高的可靠性、安全性和运行效率。
9.第一方面,本技术提供了一种虚拟机内部栈溢出识别方法;
10.一种虚拟机内部栈溢出识别方法,该虚拟机内部栈溢出识别方法在虚拟机管理器中执行,包括如下步骤:
11.监控虚拟机执行的
指令流,判断每条指令的执行状态;
12.若指令为函数调用的开始指令,为该函数所属进程设置一个函数返回地址跟踪栈;其中,所述函数返回地址跟踪栈用于存储原始函数返回地址;
13.若指令为函数调用的完成指令,将原始函数返回地址与实际函数返回地址比较,判断是否发生栈溢出攻击。
14.进一步的,所述监控虚拟机执行的指令流,判断每条指令的执行状态的具体步骤为:
15.获取虚拟机执行的指令流,根据指令模式,判断指令为函数调用的开始指令或函数调用的完成指令。
16.进一步的,所述若指令为函数调用的开始指令,为每一个进程设置一个函数返回地址跟踪栈的具体步骤包括:
17.若指令为函数调用的开始指令,查询进程表中该函数的进程,判断是否设置函数返回地址跟踪栈;
18.若未设置函数返回地址跟踪栈,则新建一个空的函数返回地址跟踪栈,将该函数的函数返回地址存储至函数返回地址跟踪栈;
19.若已设置函数返回地址跟踪栈,获取该函数的原始函数返回地址并存储至函数返回地址跟踪栈。
20.进一步的,若指令为函数调用的完成指令,查询进程表中该函数的进程,获取函数返回地址跟踪栈中的原始函数返回地址。
21.进一步的,若该函数的原始函数返回地址与实际函数返回地址一致,则进行下一条指令的检测;
22.若该函数的原始函数返回地址与实际函数返回地址不一致,则该函数的实际函数返回地址被栈溢出攻击篡改,向虚拟机管理器发送该进程信息。
23.优选的,该进程信息包括虚拟机编号或虚拟机名称、该进程的标识、实际函数返回地址和函数返回地址。
24.进一步的,函数返回地址为函数调用开始时,目标寄存器存储的值;实际函数返回地址为函数调用完成时,源寄存器存储的值。
25.第二方面,本技术提供了一种虚拟机内部栈溢出识别系统;
26.一种虚拟机内部栈溢出识别系统,该该虚拟机内部栈溢出识别系统设置于虚拟机管理器,包括:
27.指令流监控模块,被配置为:监控虚拟机执行的指令流,判断每条指令的执行状态;
28.函数返回地址跟踪栈设置模块,被配置为:若指令为函数调用的开始指令,为函数所属进程设置一个函数返回地址跟踪栈;其中,所述函数返回地址跟踪栈用于存储原始函数返回地址;
29.栈溢出攻击检测模块,被配置为:若指令为函数调用的完成指令,将原始函数返回地址与实际函数返回地址比较,判断是否发生栈溢出攻击。
30.第三方面,本技术提供了一种电子设备;
31.一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成上述虚拟机内部栈溢出识别方法的步骤。
32.第四方面,本技术提供了一种计算机可读存储介质;
33.一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成上述虚拟机内部栈溢出识别方法的步骤。
34.与现有技术相比,本技术的有益效果是:
35.1、本技术提供的技术方案,从虚拟机管理器层面实现,即从虚拟机外部检测识别虚拟机内部的栈溢出攻击,不需要修改虚拟机内部的操作系统和应用,在虚拟机管理器层面以自省方式实现,对虚拟机内部的操作系统和应用程序都是无感知的,因而对攻击者来说,也难以绕过本方法的识别;
36.2、本技术提供的技术方案,直接通过指令模式匹配来识别函数调用的开始和完成,既不需要了解也不需要修改操作系统和应用程序的源代码,只过滤检测对应函数开始和完成的标志性指令,效率高;
37.3、本技术提供的技术方案,在虚拟机管理器层面实时报告栈溢出攻击的发生以及相关信息,支持虚拟机管理器实时决策和采取进一步干预措施。
附图说明
38.构成本技术的一部分的说明书附图用来提供对本技术的进一步理解,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。
39.图1为本技术实施例提供的流程示意图;
40.图2为本技术实施例提供的函数返回地址跟踪栈设置的逻辑示意图;
41.图3为本技术实施例提供的栈溢出监测的逻辑示意图。
具体实施方式
42.应该指出,以下详细说明都是示例性的,旨在对本技术提供进一步的说明。除非另有指明,本技术使用的所有技术和科学术语具有与本技术所属技术领域的普通技术人员通常理解的相同含义。
43.需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本技术的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
44.在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
45.实施例一
46.现有技术中的栈溢出攻击识别方法,有的机制过于简单且为业界熟知,攻击者很容易避开,有的必须依赖于硬件体系结构的支持,并且需要修改操作系统以实现相关能力,显著增加操作系统维护的复杂性;因此,本技术提供了一种在不显著影响效率的状况下,有效的防范栈溢出攻击的虚拟机内部栈溢出识别方法。
47.接下来,结合图1-3对本实施例公开的一种虚拟机内部栈溢出识别方法进行详细说明。该虚拟机内部栈溢出识别方法,在虚拟机管理器中执行,包括如下步骤:
48.s1、获取虚拟机执行的指令流,根据指令模式,判断指令为函数调用的开始指令或完成指令;若为开始指令,则执行步骤s2,若为完成指令,则执行步骤s3。
49.s2、为该函数所属的进程设置一个函数返回地址跟踪栈;其中,函数返回地址跟踪栈用于存储原始函数返回地址,便于跟踪函数返回地址;包括如下步骤:
50.s201、根据该函数所属进程的编号,查询进程表,判断是否设置函数返回地址跟踪栈;若未设置函数返回地址跟踪栈,执行步骤s202;若已设置函数返回地址跟踪栈,执行步骤s203;
51.s202、新建一个空的函数返回地址跟踪栈,加入到该函数所属的进程中;具体的,
以该函数所属进程的编号为主键,以函数返回地址跟踪栈的位置作为值,加入进程表。
52.s203、获取该函数的原始函数返回地址并存储至函数返回地址跟踪栈;其中,函数返回地址为此时目标寄存器存储的值;
53.返回步骤s1,进行下一条指令的检测。
54.s3、将原始函数返回地址与实际函数返回地址比较,判断是否发生栈溢出攻击;包括如下步骤:
55.s301、根据该函数所属进程的编号,查询进程表,获取函数返回地址跟踪栈中的原始函数返回地址;
56.s302、将该函数的原始函数返回地址与实际函数返回地址比较;其中,实际函数返回地址为此时源寄存器存储的值;若该函数的函数返回地址与实际函数返回地址一致,则执行步骤s1,继续下一条指令的检测;若该函数的原始函数返回地址与实际函数返回地址不一致,则执行步骤s303;
57.s303、该函数的实际函数返回地址被栈溢出攻击篡改,向虚拟机管理器报告,发送该进程信息;其中,该进程信息包括虚拟机编号或虚拟机名称、该进程的标识、实际函数返回地址和原始函数返回地址。
58.接下来,以risc-v体系结构为例,对本技术实施例所述的虚拟机内部栈溢出识别方法作进一步说明。
59.在指令执行层面,一次函数调用过程示意如下:
60.……
;使用a0等寄存器准备函数参数
61.jalra,《func0》;开始:调用函数func0,同时保存函数返回地址到寄存器ra
62.……
;下一条指令即函数func0的返回地址
63.func0:;函数func0入口
64.addi sp,sp,-n;建立n个字节的栈帧,以容纳ra和本地变量
65.sd ra,offset(sp);暂存ra寄存器的值(即当前函数返回地址)到栈帧中
66./*业务代码:
67.栈溢出风险区*/
68.ld ra,offset(sp);恢复栈帧中暂存的函数返回地址到ra
69.addi sp,sp,n;撤销本级栈帧
70.jalr x0,ra,0;完成:函数func0返回,跳转到ra保存的地址
71.上述函数调用的过程中,业务代码是应用开发者根据业务逻辑的需要而编写的。如果对边界检查不严格,攻击者就可以采用栈溢出方式覆盖栈帧中暂存的ra寄存器值,导致函数返回时跳转到攻击者预定的地址,影响系统安全。
72.针对上述函数调用的过程,本方法的原理可以概括为:在虚拟机管理器层面,监控虚拟机执行的指令流,识别函数调用的开始和完成指令。为每个函数所属的进程维护一个用于跟踪函数返回地址的数据结构,称之为“函数返回地址跟踪栈”。当发现函数调用开始时,把ra寄存器值压入到函数返回地址跟踪栈;在函数调用结束时,从函数返回地址跟踪栈弹出栈顶,与当前ra寄存器的值进行比较;如果不一致,就说明这个函数返回地址被栈溢出攻击篡改了。
73.虚拟机内部栈溢出识别方法的具体流程如下:
74.步骤1、获取虚拟机执行的指令流,检查当前指令;如果指令符合模式【指令是jal且目标寄存器是ra】,判断是一次函数调用的开始指令,跳转到步骤201;如果指令符合模式【指令是jalr且目标寄存器是x0且源寄存器是ra且立即数0】,判断是一次函数调用的完成指令,跳转到步骤301;
75.步骤201、把任务指针寄存器tp作为当前进程的唯一标识和主键,查询进程表;如果查到对应的函数返回地址跟踪栈,则跳转到步骤203;
76.步骤202、新建一个空的函数返回地址跟踪栈,以它的地址为值,tp寄存器值为主键,加入到进程表中该函数所属的进程中;
77.步骤203、把ra寄存器中的值,即本函数的原始函数返回地址,压入到函数返回地址跟踪栈;返回步骤1,继续下一条指令的检测。
78.步骤301、把任务指针寄存器tp的值作为主键,从进程表中查询函数返回地址跟踪栈的地址;
79.步骤302、原始函数返回地址从函数返回地址跟踪栈弹出栈顶,与当前ra寄存器的值(实际函数返回地址)进行比较;如果一致,说明函数返回地址正常,跳转步骤1,继续下一条指令检测;如果不一致,跳转步骤303;
80.步骤303、判断函数返回地址被栈溢出攻击所篡改,向虚拟机管理器报告,信息包括:虚拟机编号或名称、进程的标识(tp寄存器值)、被栈溢出攻击篡改的函数返回地址(当前ra寄存器值)和原始备份的正常地址(从函数返回地址跟踪栈中弹出的地址)。
81.除risc-v体系结构外,本方法对当前所流行的x86、arm等体系结构平台同样适用。区别在于二点:
82.(1)函数调用开始和完成的标志性指令不同,x86采用call/ret指令对,而arm采用bl/ret指令对。因而在1中要匹配对应的指令模式。
83.(2)保存函数返回地址的寄存器不同。arm使用的是lr(即x30)寄存器;x86没有此类寄存器,保存函数返回地址到栈帧的固定偏移位置。相应的,函数返回地址跟踪栈保存和用于校验的是对应的寄存器或栈帧位置的值。
84.实施例二
85.本实施例公开了一种虚拟机内部栈溢出识别系统,该虚拟机内部栈溢出识别系统设置于虚拟机管理器,包括:
86.指令流监控模块,被配置为:监控虚拟机执行的指令流,判断每个进程的执行状态;
87.函数返回地址跟踪栈设置模块,被配置为:在进程开始时,为每一个进程设置一个函数返回地址跟踪栈;其中,所述函数返回地址跟踪栈存储有理想函数返回地址;
88.栈溢出攻击检测模块,被配置为:在进程结束时,将函数返回地址跟踪栈的值与实际函数返回地址比较,判断该进程是否被栈溢出攻击篡改。
89.此处需要说明的是,上述指令流监控模块、函数返回地址跟踪栈设置模块、栈溢出攻击检测模块对应于实施例一中的步骤,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为系统的一部分可以在诸如一组计算机可执行指令的计算机系统中执行。
90.实施例三
91.本发明实施例三提供一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,计算机指令被处理器运行时,完成上述虚拟机内部栈溢出识别方法的步骤。
92.实施例四
93.本发明实施例四提供一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成上述虚拟机内部栈溢出识别方法的步骤。
94.本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
95.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
96.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
97.上述实施例中对各个实施例的描述各有侧重,某个实施例中没有详述的部分可以参见其他实施例的相关描述。
98.以上所述仅为本技术的优选实施例而已,并不用于限制本技术,对于本领域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。
技术特征:
1.一种虚拟机内部栈溢出识别方法,其特征是,该虚拟机内部栈溢出识别方法在虚拟机管理器中执行,包括如下步骤:监控虚拟机执行的指令流,判断每条指令的执行状态;若指令为函数调用的开始指令,为该函数所属进程设置一个函数返回地址跟踪栈;其中,所述函数返回地址跟踪栈用于存储原始函数返回地址;若指令为函数调用的完成指令,将原始函数返回地址与实际函数返回地址比较,判断是否发生栈溢出攻击。2.如权利要求1所述的虚拟机内部栈溢出识别方法,其特征是,所述监控虚拟机执行的指令流,判断每条指令的执行状态的具体步骤为:获取虚拟机执行的指令流,根据指令模式,判断指令为函数调用的开始指令或函数调用的完成指令。3.如权利要求1所述的虚拟机内部栈溢出识别方法,其特征是,所述若指令为函数调用的开始指令,为每一个进程设置一个函数返回地址跟踪栈的具体步骤包括:若指令为函数调用的开始指令,查询进程表中该函数的进程,判断是否设置函数返回地址跟踪栈;若未设置函数返回地址跟踪栈,则新建一个空的函数返回地址跟踪栈,将该函数的函数返回地址存储至函数返回地址跟踪栈;若已设置函数返回地址跟踪栈,获取该函数的原始函数返回地址并存储至函数返回地址跟踪栈。4.如权利要求1所述的虚拟机内部栈溢出识别方法,其特征是,若指令为函数调用的完成指令,查询进程表中该函数的进程,获取函数返回地址跟踪栈中的原始函数返回地址。5.如权利要求1所述的虚拟机内部栈溢出识别方法,其特征是,若该函数的原始函数返回地址与实际函数返回地址一致,则进行下一条指令的检测;若该函数的原始函数返回地址与实际函数返回地址不一致,则该函数的实际函数返回地址被栈溢出攻击篡改,向虚拟机管理器发送该进程信息。6.如权利要求5所述的虚拟机内部栈溢出识别方法,其特征是,该进程信息包括虚拟机编号或虚拟机名称、该进程的标识、实际函数返回地址和原始函数返回地址。7.如权利要求1所述的虚拟机内部栈溢出识别方法,其特征是,原始函数返回地址为函数调用开始时,目标寄存器存储的值;实际函数返回地址为函数调用结束时,源寄存器存储的值。8.一种虚拟机内部栈溢出识别系统,其特征是,该虚拟机内部栈溢出识别系统设置于虚拟机管理器,包括:指令流监控模块,被配置为:监控虚拟机执行的指令流,判断每条指令的执行状态;函数返回地址跟踪栈设置模块,被配置为:若指令为函数调用的开始指令,为函数所属进程设置一个函数返回地址跟踪栈;其中,所述函数返回地址跟踪栈用于存储原始函数返回地址;栈溢出攻击检测模块,被配置为:若指令为函数调用的完成指令,将原始函数返回地址与实际函数返回地址比较,判断是否发生栈溢出攻击。9.一种电子设备,其特征在于,包括存储器和处理器以及存储在存储器上并在处理器
上运行的计算机指令,所述计算机指令被处理器运行时,完成权利要求1-7任一项所述的步骤。10.一种计算机可读存储介质,其特征在于,用于存储计算机指令,所述计算机指令被处理器执行时,完成权利要求1-7任一项所述的步骤。
技术总结
本发明公开了一种虚拟机内部栈溢出识别方法、系统、电子设备及计算机可读存储介质,属于通信安全技术领域。包括监控虚拟机执行的指令流,判断每条指令的执行状态;若指令为函数调用的开始指令,为该函数所属进程设置一个函数返回地址跟踪栈;其中,所述函数返回地址跟踪栈用于存储原始函数返回地址;若指令为函数调用的完成指令,将原始函数返回地址与实际函数返回地址比较,判断是否发生栈溢出攻击。能够显著影响效率的状况下,有效的防范栈溢出攻击;解决了现有技术中存在“有的机制过于简单且为业界熟知,攻击者很容易避开,有的必须依赖于硬件体系结构的支持,并且需要修改操作系统以实现相关能力,显著增加操作系统维护的复杂性”的问题。的问题。的问题。
技术研发人员:
吴瑞 解瑞成 石磊 贾立平 安章 马亮
受保护的技术使用者:
山东可信云信息技术研究院
技术研发日:
2022.10.31
技术公布日:
2022/12/23