掌桥专利:专业的专利平台
掌桥专利
首页

一种缓冲区溢出的确定方法及装置

文献发布时间:2023-06-19 19:30:30


一种缓冲区溢出的确定方法及装置

技术领域

本申请涉及处理器内存安全技术领域,尤其涉及一种缓冲区溢出的确定方法及装置。

背景技术

由于大多数像C语言的等编程语言不会进行边界检查,因此,当一个超过数组大小的数据写入到该数组中时,数据会覆盖堆栈中与该数据相邻位置的数据,这种行为被称为缓冲区溢出。黑客可以通过缓冲区溢出进行攻击,其中最多的是对于函数调用返回地址的篡改,这是缓冲区溢出能够引发安全问题的主要原因之一。

由于缓冲区溢出攻击关键步骤在于篡改堆栈中保存的返回地址,因此在函数调用返回之前,对返回地址进行检查,目前,对于保护堆栈中返回地址的检测方法主要是通过编译器的扩展工具,但是都属于软件检测范围,因此会增加多余的代码用于检测,影响使用性能。

发明内容

有鉴于此,本申请实施例提供了一种缓冲区溢出的确定方法及装置,旨在不影响代码性能的情况下确定发生缓冲区溢出的情况。

第一方面,本申请实施例提供了一种缓冲区溢出的确定方法,由处理器执行,所述方法包括:

通过函数调用指令将返回地址写入到预设寄存器;

通过所述调用指令将所述返回地址保存到预设地址堆栈;

通过函数调用返回指令,将写入到所述预设寄存器的返回地址和保存到所述预设地址堆栈的返回地址进行比较,获得比较结果;

若所述比较结果为不同且所述预设地址堆栈不为空,则检测为确定缓冲区溢出。

可选地,所述通过所述调用指令将所述返回地址保存到预设地址堆栈,包括:

通过所述调用指令,向所述预设地址堆栈传输所述返回地址和调用指令标志信号;

在所述预设地址堆栈将所述返回地址压栈保存。

可选地,所述通过函数调用返回指令,将写入到所述预设寄存器的返回地址和保存到所述预设地址堆栈的返回地址进行比较,获得比较结果,包括:

通过所述返回指令,向所述预设地址堆栈传输返回指令标志信号;

获取所述预设地址堆栈弹出的栈顶的返回地址;

将写入到所述预设寄存器的返回地址和所述预设地址堆栈弹出的栈顶的返回地址进行比较,获得所述比较结果。

可选地,所述方法还包括:

若检测到存储指令和加载指令,清空所述预设地址堆栈。

可选地,所述存储指令包括检测上下文切换的保存现场,所述加载指令包括检测上下文切换的恢复现场。

第二方面,本申请实施例提供了一种缓冲区溢出的确定装置,部署于处理器,所述装置包括:

写入模块,用于通过函数调用指令将返回地址写入到预设寄存器;

保存模块,用于通过所述调用指令将所述返回地址保存到预设地址堆栈;

比较模块,用于通过函数调用返回指令,将写入到所述预设寄存器的返回地址和保存到所述预设地址堆栈的返回地址进行比较,获得比较结果;

检测模块,用于若所述比较结果为不同且所述预设地址堆栈不为空,则检测为确定缓冲区溢出。

可选地,所述保存模块,包括:

第一传输单元,用于通过所述调用指令,向所述预设地址堆栈传输所述返回地址和调用指令标志信号;

保存单元,用于在所述预设地址堆栈将所述返回地址压栈保存。

可选地,所述比较模块,包括:

第二传输单元,用于通过所述返回指令,向所述预设地址堆栈传输返回指令标志信号;

获取单元,用于获取所述预设地址堆栈弹出的栈顶的返回地址;

比较单元,用于将写入到所述预设寄存器的返回地址和所述预设地址堆栈弹出的栈顶的返回地址进行比较,获得所述比较结果。

可选地,所述装置还包括:

清空单元,用于若检测到存储指令和加载指令,清空所述预设地址堆栈。

可选地,所述存储指令包括检测上下文切换的保存现场,所述加载指令包括检测上下文切换的恢复现场。

第三方面,本申请实施例提供了一种缓冲区溢出的确定设备,所述设备包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序,以使所述设备执行前述第一方面所述的缓冲区溢出的确定方法。

第四方面,本申请实施例提供了一种计算机存储介质,所述计算机可读存储介质上存储有计算机程序,当所述计算机程序被运行时,运行所述计算机程序的设备实现前述第一方面所述的缓冲区溢出的确定方法。

相较于现有技术,本申请实施例具有以下有益效果:

本申请实施例提供了一种缓冲区溢出的确定方法及装置,由处理器执行,首先,通过函数调用指令将返回地址写入到预设寄存器,通过调用指令将返回地址保存到预设地址堆栈。然后,通过函数调用返回指令,将写入到预设寄存器的返回地址和保存到预设地址堆栈的返回地址进行比较,获得比较结果。最后,若比较结果为不同且预设地址堆栈不为空,则检测为确定缓冲区溢出。可见,通过调用指令将返回地址写入到预设寄存器,并通过调用指令将返回地址备份保存到预设地址堆栈中,通过返回指令,可以将写入到预设寄存器的返回地址和备份的返回地址进行比较,若两个返回地址不同并且预设地址堆栈不为空,则说明发生了缓冲区溢出,上述方法是基于处理器实现的,是一种硬件的检测方法,不需要额外增加代码,结构简单,避免了对代码性能造成影响。

附图说明

为更清楚地说明本实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例提供的一种缓冲区溢出的确定方法的流程图;

图2为本申请实施例提供的一种缓冲区溢出的确定装置的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

由于缓冲区溢出攻击关键步骤在于篡改堆栈中保存的返回地址,因此在函数调用返回之前,对返回地址进行检查,目前,对于保护堆栈中返回地址的检测方法主要是通过编译器的扩展工具,但是都属于软件检测范围,因此会增加多余的代码用于检测,影响使用性能。

基于此,为了解决上述问题,在本申请实施例中,由处理器执行,首先,通过函数调用指令将返回地址写入到预设寄存器,通过调用指令将返回地址保存到预设地址堆栈。然后,通过函数调用返回指令,将写入到预设寄存器的返回地址和保存到预设地址堆栈的返回地址进行比较,获得比较结果。最后,若比较结果为不同且预设地址堆栈不为空,则检测为确定缓冲区溢出。可见,通过调用指令将返回地址写入到预设寄存器,并通过调用指令将返回地址备份保存到预设地址堆栈中,通过返回指令,可以将写入到预设寄存器的返回地址和备份的返回地址进行比较,若两个返回地址不同并且预设地址堆栈不为空,则说明发生了缓冲区溢出,上述方法是基于处理器实现的,是一种硬件的检测方法,不需要额外增加代码,结构简单,避免了对代码性能造成影响。

下面结合附图,通过实施例来详细说明本申请实施例中缓冲区溢出的确定方法及装置的具体实现方式。

参见图1,该图为本申请实施例提供的一种缓冲区溢出的确定方法的流程图,结合图1所示,由处理器执行,具体可以包括:

S101:通过函数调用指令将返回地址写入到预设寄存器。

函数调用指令可以是call指令,预设寄存器可以是ra,在函数调用时,可以通过call指令将函数调用返回地址写入到预设寄存器ra中。

S102:通过调用指令将返回地址保存到预设地址堆栈。

可以在写回阶段通过call指令将写入到预设寄存器ra中的返回地址保存到用于备份的预设地址堆栈中。其中,可以通过call指令,向预设地址堆栈传输返回地址数据和call指令标志信号,在预设地址堆栈将返回地址压栈保存。

另外,在写回阶段,检测流水线指令译码信息,可以通过译码信息判断指令类型,当指令类型是jalr且目的寄存器是ra寄存器,则说明该指令是一条函数调用指令call。

S103:通过函数调用返回指令,将写入到预设寄存器的返回地址和保存到预设地址堆栈的返回地址进行比较,获得比较结果。

函数调用返回指令可以是ret指令,当检测到ret指令时,将写入到预设寄存器ra中的返回地址和保存到预设地址堆栈中的返回地址进行比较,获得比较结果。其中,可以通过ret指令,向预设地址堆栈传输ret指令标志信号,获取预设地址堆栈弹出的栈顶的返回地址,再将写入到预设寄存器ra中的返回地址和预设地址堆栈弹出的栈顶的返回地址进行比较,获得比较结果。

另外,在写回阶段,当指令类型是jalr且源寄存器地址是ra寄存器,则说明该指令是一条函数调用返回指令ret。

S104:若比较结果为不同且预设地址堆栈不为空,则检测为确定缓冲区溢出。

若写入到预设寄存器ra中的返回地址和备份保存在预设地址堆栈中返回地址不同并且预设地址堆栈不为空,则表示返回地址被篡改,确定为缓冲区溢出。在确定发生了缓冲区溢出后,可以触发异常处理流程。

另外,若检测到存储指令store和加载指令load,清空预设地址堆栈,其中,存储指令store用于检测上下文切换的保存现场,加载指令load用于检测上下文切换的恢复现场。

在写回阶段,当指令是store且源寄存器地址是sp寄存器,则说明正在进行上下文切换的保存现场过程,当指令是load且目的寄存器地址是sp寄存器,则说明正在进行上下文切换的恢复现场过程。当检测到上下文切换的保存现场后又检测到上下文切换的恢复现场,则表示此时发生了上下文切换,此时的返回地址应该发生了变化,因此对预设地址堆栈进行清空处理。

本申请实施例发生在处理器RISCV的五级流水线,IF取指、ID译码、EX执行、MEM访存和WB写回中的写回阶段,在写回阶段有效的指令是真正完成执行进行提交的指令,在这之前,流水线中执行的指令都存在被冲刷的情况,因为在写回阶段进行返回地址的备份。

以上为本申请实施例提供的一种缓冲区溢出的确定方法,由处理器执行,首先,通过函数调用指令将返回地址写入到预设寄存器,通过调用指令将返回地址保存到预设地址堆栈。然后,通过函数调用返回指令,将写入到预设寄存器的返回地址和保存到预设地址堆栈的返回地址进行比较,获得比较结果。最后,若比较结果为不同且预设地址堆栈不为空,则检测为确定缓冲区溢出。可见,通过调用指令将返回地址写入到预设寄存器,并通过调用指令将返回地址备份保存到预设地址堆栈中,通过返回指令,可以将写入到预设寄存器的返回地址和备份的返回地址进行比较,若两个返回地址不同并且预设地址堆栈不为空,则说明发生了缓冲区溢出,上述方法是基于处理器实现的,是一种硬件的检测方法,不需要额外增加代码,结构简单,避免了对代码性能造成影响。

以上为本申请实施例提供缓冲区溢出的确定方法的一些具体实现方式,基于此,本申请还提供了对应的装置。下面将从功能模块化的角度对本申请实施例提供的装置进行介绍。

参见图2,该图为本申请实施例提供的一种缓冲区溢出的确定装置200的结构示意图,该装置200可以包括:

写入模块201,用于通过函数调用指令将返回地址写入到预设寄存器;

保存模块202,用于通过调用指令将返回地址保存到预设地址堆栈;

比较模块203,用于通过函数调用返回指令,将写入到预设寄存器的返回地址和保存到预设地址堆栈的返回地址进行比较,获得比较结果;

检测模块204,用于若比较结果为不同且预设地址堆栈不为空,则检测为确定缓冲区溢出。

在本申请实施例中,通过写入模块201、保存模块202、比较模块203和检测模块204的配合,通过调用指令将返回地址写入到预设寄存器,并通过调用指令将返回地址备份保存到预设地址堆栈中,通过返回指令,可以将写入到预设寄存器的返回地址和备份的返回地址进行比较,若两个返回地址不同并且预设地址堆栈不为空,则说明发生了缓冲区溢出,上述方法是基于处理器实现的,是一种硬件的检测方法,不需要额外增加代码,结构简单,避免了对代码性能造成影响。

作为一种实施方式,保存模块202,包括:

第一传输单元,用于通过调用指令,向预设地址堆栈传输返回地址和调用指令标志信号;

保存单元,用于在预设地址堆栈将返回地址压栈保存。

作为一种实施方式,比较模块203,包括:

第二传输单元,用于通过返回指令,向预设地址堆栈传输返回指令标志信号;

获取单元,用于获取预设地址堆栈弹出的栈顶的返回地址;

比较单元,用于将写入到预设寄存器的返回地址和预设地址堆栈弹出的栈顶的返回地址进行比较,获得比较结果。

作为一种实施方式,缓冲区溢出的确定装置200,还包括:

清空单元,用于若检测到存储指令和加载指令,清空预设地址堆栈。

作为一种实施方式,存储指令包括检测上下文切换的保存现场,加载指令包括检测上下文切换的恢复现场。

本申请实施例还提供了对应的设备以及计算机存储介质,用于实现本申请实施例提供的方案。

其中,所述设备包括存储器和处理器,所述存储器用于存储计算机程序,所述处理器用于执行所述计算机程序,以使所述设备执行本申请任一实施例所述的缓冲区溢出的确定方法。

所述计算机存储介质中存储有计算机程序,当所述代码被运行时,运行所述计算机程序的设备实现本申请任一实施例所述的缓冲区溢出的确定方法。

本申请实施例中提到的“第一”、“第二”(若存在)等名称中的“第一”、“第二”只是用来做名字标识,并不代表顺序上的第一、第二。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如只读存储器(英文:read-only memory,ROM)/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如路由器等网络通信设备)执行本申请各个实施例或者实施例的某些部分所述的方法。

需要说明的是,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元提示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述,仅为本申请的一种具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应该以权利要求的保护范围为准。

技术分类

06120115931644