CN113392395A - 一种栈保护的方法及装置 - Google Patents
一种栈保护的方法及装置 Download PDFInfo
- Publication number
- CN113392395A CN113392395A CN202010179849.5A CN202010179849A CN113392395A CN 113392395 A CN113392395 A CN 113392395A CN 202010179849 A CN202010179849 A CN 202010179849A CN 113392395 A CN113392395 A CN 113392395A
- Authority
- CN
- China
- Prior art keywords
- stack
- value
- working state
- state
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本申请公开了一种栈保护的方法,可应用于任何包含操作系统的设备或系统中,该方法包括:获取请求,该请求用于触发处理器从用户态切换到内核态,处理器根据该请求,从用户态切换到内核态;将内核态下用于保护栈的参数值从第一值随机更新为第二值;根据第二值对栈进行保护。本申请技术方案由于在从用户态切换到内核态之后,才随机更新canary值,就会让攻击者无法预先获取到该随机更新的canary值,从而无法攻击高特权的内核态的栈,从而保证了高管理级别工作态中栈保护的安全性。
Description
技术领域
本申请涉及计算机技术领域,具体涉及一种栈保护的方法及装置。
背景技术
栈保护(stack canary),也叫stack cookie,是一种针对栈缓冲区溢出(stackbuffer overflow)攻击的保护技术。栈缓冲区溢出攻击即通过越界访问保存在栈中的缓冲区,实现对栈中关键信息的修改。举例来说,攻击者可以通过修改保存在栈缓冲区中的函数返回地址,实现对函数行为的修改,使得原本应该返回第一地址的函数返回到了攻击者修改后的第二地址,这样攻击者就可以利用该函数盗取数据或者攻击该计算机系统。
Stack canary是针对这种非法修改行为的一种保护机制。Stack canary保护机制是在运行函数执行压栈操作时从用于存放canary值的结构体中获取一个canary值写入栈(stack)中。压栈操作完成后,在运行函数返回时,通过比对栈中的canary值和结构体中的canary值是否一致,来判断栈是否被攻击。
Stack canary被广泛部署在各类软件中,是应用最广泛的栈保护技术。Stackcanary机制有效的前提是攻击者无法知道canary值。然而,当前攻击手段愈发多样,攻击者可以通过多种方法获取到canary值,从而使得stack canary机制失效。
发明内容
本申请实施例提供一种栈保护的方法,用于保证了高管理级别的工作态中栈保护的安全性。本申请实施例还提供了相应的装置。
本申请第一方面提供一种栈保护的方法,该方法可以应用于各种类型的处理器中,如:中央处理器(central processing unit,CPU)和图形处理器(graphics processingunit,GPU)等,该处理器可以包含于例如:手机、平板电脑、个人计算机(personalcomputer,PC)等终端设备,以及其他服务器类的设备中。该方法包括:获取请求,请求用于触发处理器从第一工作态切换到第二工作态,第二工作态的管理级别高于第一工作态的管理级别;根据请求,从第一工作态切换到第二工作态;将第二工作态下用于保护栈的参数值从第一值更新为第二值;根据第二值对栈进行保护。
上述第一方面中,“栈”(stack)是操作系统中的一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。数据进栈的过程可以称为“压栈”,也可以称为入栈。反之,数据弹出栈的过程被称为“出栈”。操作系统通常包括至少两种工作态,若该操作系统包括两种工作态,则这两种工作态分别为用户态和内核态。若该操作系统包括三种工作态,则这三种工作态分别为用户态、内核态和虚拟化监控态(hypervisor)。若该操作系统包括四种工作态,则这四种工作态分别为用户态、内核态、虚拟化监控态(hypervisor)和安全监控态(secure monitor)。这四个工作态,从用户态、内核态、虚拟化监控态(hypervisor)到安全监控态的管理级别依次增高,也可以理解为这四个级别的特权依次增大。第一方面中获取的请求可以是系统调用请求,也可以是其他类型的可以用于触发工作态切换的请求。栈保护(stack canary)指的是针对栈缓冲区溢出(stack buffer overflow)攻击的保护技术。栈保护的原理是在运行函数执行压栈操作时向栈中写入一个用于保护栈的参数值,也可以称为canary值,在运行函数返回时,比对栈中的canary值与栈外用于存储该canary值的结构体中canary值是否一致,若一致,则说明栈未被攻击,若不一致,则说明栈被攻击。该第一方面中,请求是在第一工作态获取的,第一工作态的管理级别低于第二工作态的管理级别。因为,低管理级别请求高管理级别为其服务时,必须要先设置好所有的请求参数和数据,若攻击者想要借用该请求攻击第二工作态的栈,则在第一工作态请求服务前也需要准备好写入第二工作态的栈中的canary值,然后才能向第二工作态请求高管理级别的服务,基于此特点,在从低管理级别的第一工作态切换到高管理级别的第二工作态之后,在第二工作态更新canary值,就会导致攻击者在第一工作态预先准备的canary值无法与更新后的canary值相同,导致攻击者预先准备好用于伪装的canary值失效,从而保证了高管理级别工作态中栈的安全性。
在第一方面的一种可能的实现方式中,上述将第一值更新为第二值的过程可以是随机更新的。这样第一值与第二值之间没有推导规律,攻击者也无法通过规律化的推导预估到在第二工作态更新后的canary值,从而进一步保证了高管理级别的工作态中栈保护的安全性。
在第一方面的一种可能的实现方式中,上述步骤:将第二工作态下用于保护栈的参数值从第一值更新为第二值,包括:在运行所述第二工作态的函数执行压栈操作之前,将第二工作态下用于保护栈的参数值从第一值随机更新为第二值。
该种可能的实现方式中,数据压栈和出栈都需要处理器运行函数来执行,运行第二工作态的函数执行压栈操作之前,因为处理器刚切换到第二工作态,而且还没有开始执行压栈操作,栈内不存在旧的canary值,此时对canary值进行更新,处理器为更新canary值的所花费的性能开销最小。
在第一方面的一种可能的实现方式中,上述步骤:根据第二值对栈进行保护,包括:在运行函数执行压栈操作时,将第二值写入栈中作为保护栈的参数值;在运行函数返回时,根据栈中的参数值与第二值的比较结果对栈进行保护。
该种可能的实现方式中,栈中的参数值在写入第二值后为第二值,若栈被攻击者攻击,则该栈的参数值就不再是第二值了,而是攻击者在第一工作态请求时所准备的一个值。处理器运行执行压栈的函数,在压栈完成后就需要返回,在运行函数返回时可以比对栈中的canary值与用于存储更新的canary的结构体中的第二值,根据比对结果确定栈是否被攻击,从而进行相应的保护。
在第一方面的一种可能的实现方式中,根据栈中的参数值与第二值的比较结果对栈进行保护,包括:将栈中的参数值与第二值进行比较;若栈中的参数值与第二值相同,则将函数返回到该栈中该函数的返回地址所指示的位置;或者,若栈中的参数值与第二值不相同,则确定栈受到攻击。
该种可能的实现方式中,若栈中的参数值与第二值相同,则表示栈未受到攻击,栈中的该函数的返回地址未被修改,则在函数返回时可以直接按照该返回地址返回到相应位置。若栈中的参数值与第二值不相同,则表示栈受到攻击,该函数的返回地址可能被修改,可以通过停止函数来保护栈。
在第一方面的一种可能的实现方式中,第一工作态为用户态,第二工作态为内核态;或者,第一工作态为内核态,第二工作态为虚拟化监控态;或者,第一工作态为虚拟化监控态,第二工作态为安全监控态。
该种可能的实现方式中,关于操作系统的几种工作态可以参阅第一方面进行理解,用户态、内核态、虚拟化监控态和安全监控态在不同的处理器架构中的称呼可以不相同。以精简指令集机器(advanced RISC machine,ARM)架构和(The X86 architecture,x86)架构为例,在ARM架构中,从用户态、内核态、虚拟化监控态到安全监控态可以表示为特权级别(exception level,EL)0->EL1->EL2->EL3。在x86架构中,从用户态、内核态、虚拟化监控态到安全监控态可以表示为Ring3->Ring2->Ring1->Ring0。在其他架构或者未来的处理器架构中对这几个工作态可能还会有其他的表示方式。
在第一方面的一种可能的实现方式中,上述步骤:将第二工作态下用于保护栈的参数值从第一值随机更新为第二值,包括:使用伪随机数生成函数生成第二值;将第二工作态下用于保护栈的参数值从第一值更新为第二值。
该种可能的实现方式中,伪随机数生成函数生成的随机数可以称为伪随机数,伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。所以采用伪随机数生成函数生成第二值,可以降低随机数生成的计算量,提高随机数更新的效率。
在第一方面的一种可能的实现方式中,将第二工作态下用于保护栈的参数值从第一值随机更新为第二值,包括:从性能管理计数器的寄存器中随机读取第二值;将第二工作态下用于保护栈的参数值从第一值更新为第二值。
该种可能的实现方式中,性能管理计数器的寄存器中可以预先存储随机生成的随机数,这样就不需要临时生成随机数,可以提高随机数更新的效率。
本申请第二方面提供一种栈保护的装置,该栈保护的装置具有实现上述第一方面或第一方面任意一种可能实现方式的方法的功能。该功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块,例如:获取单元、切换单元、更新单元和栈保护单元。
本申请第三方面提供一种计算机设备,该计算机设备包括至少一个处理器、存储器、输入/输出(input/output,I/O)接口以及存储在存储器中并可在处理器上运行的计算机执行指令,当所述计算机执行指令被所述处理器执行时,所述处理器执行如上述第一方面或第一方面任意一种可能的实现方式所述的方法。
本申请第四方面提供一种存储一个或多个计算机执行指令的计算机可读存储介质,当所述计算机执行指令被处理器执行时,所述处理器执行如上述第一方面或第一方面任意一种可能的实现方式所述的方法。
本申请第五方面提供一种存储一个或多个计算机执行指令的计算机程序产品,当所述计算机执行指令被所述处理器执行时,所述处理器执行上述第一方面或第一方面任意一种可能实现方式的方法。
本申请第六方面提供了一种芯片系统,该芯片系统包括处理器,用于支持栈保护的装置实现上述第一方面或第一方面任意一种可能的实现方式中所涉及的功能。在一种可能的设计中,芯片系统还可以包括存储器,存储器,用于保存训练节点必要的程序指令和数据。该芯片系统,可以由芯片构成,也可以包含芯片和其他分立器件。
其中,第二方面和第六方面或者其中任一种可能实现方式所带来的技术效果可参见第一方面或第一方面不同可能实现方式所带来的技术效果,此处不再赘述。
本申请实施中,第一工作态的管理级别低于第二工作态的管理级别。因为,低管理级别请求高管理级别为其服务时,必须要先设置好所有的请求参数和数据,若攻击者想要借用该请求攻击第二工作态的栈,则在第一工作态请求服务前也需要准备好写入第二工作态的栈中的canary值,然后才能向第二工作态请求高管理级别的服务,基于此特点,在从低管理级别的第一工作态切换到高管理级别的第二工作态之后,在第二工作态更新canary值,就会导致攻击者在第一工作态预先准备的canary值无法与更新后的canary值相同,导致攻击者预先准备好用于伪装的canary值失效,从而保证了高管理级别工作态中栈的安全性。
附图说明
图1是栈的一结构示意图;
图2是本申请实施例提供的栈保护原理的一示意图;
图3是本申请实施例提供的精简指令集机器ARM架构的一示意图;
图4是本申请实施例提供的x86架构的一示意图;
图5是本申请实施例提供的栈保护的方法的一实施例示意图;
图6是本申请实施例提供的栈保护的方法的另一实施例示意图;
图7是本申请实施例提供的栈保护的方法的另一实施例示意图;
图8是本申请实施例提供的栈保护的方法的另一实施例示意图;
图9是本申请实施例提供的栈保护的方法的一场景示例意图;
图10是本申请实施例提供的栈保护的在装置的一实施例示意图;
图11是本申请实施例提供的计算机设备的一结构示意图。
具体实施方式
下面结合附图,对本申请的实施例进行描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。本领域普通技术人员可知,随着技术的发展和新场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本申请实施例提供一种栈保护的方法,用于保证了高管理级别的工作态中栈保护的安全性。本申请实施例还提供了相应的装置。以下分别进行详细说明。
“栈”(stack)是操作系统中的一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。数据进栈的过程可以称为“压栈”,也可以称为入栈。反之,数据弹出栈的过程被称为“出栈”。压栈和出栈的过程都会由处理器运行函数来执行,在压栈或出栈的过程中可能会使用到一个函数,也可能会使用到多个函数,函数在执行过程中也常会被描述为函数压栈或函数出栈。被使用后的栈的结构可以参阅图1所示的栈结构图进行理解。如图1所示,栈中可以存放缓存(buffer)数据、canary、返回地址(return adress)和本地变量(local variables)等。
栈保护(stack canary)指的是针对栈缓冲区溢出(stack buffer overflow)攻击的保护技术。栈保护的原理可以参阅图2所示的栈保护原理示意图进行理解。该栈保护的过程以一次压栈操作的保护过程为例进行说明。处理器运行函数100执行压栈操作时在该函数100的返回地址200上方写入一个用于保护栈的参数值,该参数值也可以称为canary值,该写入的canary值可以是从结构体300中获取的。在压栈完成后处理器运行函数100返回,为了确认函数100的返回地址200是否安全,处理器运行函数100比对栈中的canary值与结构体300中的canary值是否一致,若一致,则说明栈未被攻击,返回地址200未被修改,则函数100可以返回到该返回地址的位置。若不一致,则说明栈被攻击,返回地址200可能被修改了,这时则需要终止该函数100。
上述图2中用于保护返回地址200的canary值在返回地址200的上方,实际上,该canary值的位置也不限于在返回地址200的上方,也可以是在返回地址200的下方,对于canary值与返回地址200的位置关系,本申请中不做限定。
上述描述的只是一次压栈过程,该栈中可以存储多次压栈的数据、返回地址以及canary值,无论可以执行多少次压栈,原理都与前面的过程相同,可以参阅上述过程进行理解。
操作系统通常包括至少两种工作态,若该操作系统包括两种工作态,则这两种工作态分别为用户态和内核态。若该操作系统包括三种工作态,则这三种工作态分别为用户态、内核态和虚拟化监控态(hypervisor)。若该操作系统包括四种工作态,则这四种工作态分别为用户(user)态、内核(kernal)态、虚拟化监控态(hypervisor)和安全监控态(securemonitor)。这四个工作态,从用户态、内核态、虚拟化监控态(hypervisor)到安全监控态的管理级别依次增高,也可以理解为这四个级别的特权依次增大。
用户态、内核态、虚拟化监控态和安全监控态在不同的处理器架构中的称呼可以不相同。以精简指令集机器(advanced RISC machine,ARM)架构和(The X86architecture,x86)架构为例。
图3为ARM架构的一示意图。如图3所示,在ARM架构中,从用户态、内核态、虚拟化监控态到安全监控态可以表示为特权级别(exception level,EL)0->EL1->EL2->EL3,特权级别也就是管理级别。其中,EL0的特权级别最低,EL1的特权级别高于EL0的特权级别,EL2的特权级别高于EL1的特权级别,EL3的特权级别高于EL2的特权级别。
图4为x86架构的一示意图。如图4所示,在x86架构中,从用户态、内核态、虚拟化监控态到安全监控态可以表示为环Ring3->Ring2->Ring1->Ring0。其中,Ring3的特权级别最低,Ring2的特权级别高于Ring3的特权级别,Ring1的特权级别高于Ring2的特权级别,Ring0的特权级别高于Ring1的特权级别。
本申请实施例中只是以图3所示的ARM架构以及图4所示的x86架构为例进行说明,在其他架构或者未来的处理器架构中对这几个工作态可能还会有其他的表示方式,本申请要表达的只是不同的工作态对应的特权级别(管理级别)不同,对工作态的具体表现形式本申请中不做限定。
以上,对本申请中涉及到的一些概念做了介绍,下面介绍本申请实施例提供的栈保护的方法。需要说明的是本申请实施例提供的栈保护的方法可以应用于各种类型的处理器中,如:中央处理器(central processing unit,CPU)和图形处理器(graphicsprocessing unit,GPU)等。该处理器可以包含于终端设备中,以及其他服务器类的设备中。终端设备例如:手机(mobile phone)、平板电脑(pad)、带无线收发功能的电脑、虚拟现实(virtual reality,VR)终端、增强现实(augmented reality,AR)终端、工业控制(industrial control)中的无线终端、无人驾驶(self driving)中的无线终端、远程医疗(remote medical)中的无线终端、智能电网(smart grid)中的无线终端、运输安全(transportation safety)中的无线终端、智慧城市(smart city)中的无线终端、智慧家庭(smart home)中的无线终端等。
图5为本申请实施例提供的栈保护的方法的一实施例示意图。
如图5所示,本申请实施例提供的栈保护的方法的一实施例包括:
101、获取请求,该请求用于触发处理器从第一工作态切换到第二工作态,第二工作态的管理级别高于第一工作态的管理级别。
该请求可以是系统调用请求,也可以是其他类型的可以用于触发工作态切换的请求。
102、根据请求,从第一工作态切换到第二工作态。
当第一工作态为用户态时,第二工作态为内核态。当第一工作态为内核态时,第二工作态为虚拟化监控态。当第一工作态为虚拟化监控态时,第二工作态为安全监控态。
若是在ARM架构下,则可以表示为,若第一工作态为EL0,则第二工作态为EL1,若第一工作态为EL1,则第二工作态为EL2,若第一工作态为EL2,则第二工作态为EL3。
若是在x86架构下,则可以表示为,若第一工作态为Ring3,则第二工作态为Ring2,若第一工作态为Ring2,则第二工作态为Ring1,若第一工作态为Ring1,则第二工作态为Ring0。
103、将第二工作态下用于保护栈的参数值从第一值更新为第二值。
参数值可以表示为canary值,第一值和第二值,例如:第一值可以表示为123,第二值可以表示为053872,当然此处的第一值和第二值只是举例,实际上,该第一值和第二值可以是其他任何数值,也可以通过字符的形式来表示第一值或第二值。
104、根据第二值对栈进行保护。
本申请实施例中,请求是在第一工作态获取的,第一工作态的管理级别低于第二工作态的管理级别。因为,低管理级别请求高管理级别为其服务时,必须要先设置好所有的请求参数和数据,若攻击者想要借用该请求攻击第二工作态的栈,则在第一工作态请求服务前也需要准备好写入第二工作态的栈中的canary值,然后才能向第二工作态请求高管理级别的服务,基于此特点,在从低管理级别的第一工作态切换到高管理级别的第二工作态之后,在第二工作态更新canary值,就会导致攻击者在第一工作态预先准备的canary值无法与更新后的canary值相同,导致攻击者预先准备好用于伪装的canary值失效,从而保证了高管理级别工作态中栈的安全性。
一种可能的实施例中,第一值更新为第二值的过程可以是随机更新的。这样第一值与第二值之间没有推导规律,攻击者也无法通过规律化的推导预估到在第二工作态更新后的canary值,从而进一步保证了高管理级别的工作态中栈保护的安全性。
一种可能的实施例中,上述步骤103包括:在运行所述第二工作态的函数执行压栈操作之前,将第二工作态下用于保护栈的参数值从第一值随机更新为第二值。
运行第二工作态的函数执行压栈操作之前是一个时机,也可以将该时机称为特权级切换入口,如图6所示,在随机更新时,处理器从随机数源获取随机数,将结构体200中canary值从第一值更新为第二值。
需要说明的是,处理器可以只从随机数源获取一个随机数,该结构体200中可以只存储更新后的一个第二值,这样,结合上述图2的过程,在后续压栈过程中,每次写入栈中的第二值都是相同的,这样可以方便函数返回时的比对过程,可以减少处理器的性能开销。
当然,处理器也可以从随机数源获取多个随机数,该结构体200中可以存储更新后的多个第二值,这样,结合上述图2的过程,在后续压栈过程中,每次写入栈中的第二值可以是不相同的,比对时可以通过配置的索引或者标识找到结构体中相应的第二值,这种方式对栈保护的安全性更好。
本申请实施例中,运行第二工作态的函数执行压栈操作之前,因为处理器刚切换到第二工作态,而且还没有开始执行压栈操作,栈内不存在旧的canary值,此时对canary值进行更新,处理器为更新canary值的所花费的性能开销最小。
一种可能的实施例中,上述步骤104包括:在运行函数执行压栈操作时,将第二值写入栈中作为保护栈的参数值;在运行函数返回时,根据栈中的参数值与第二值的比较结果对栈进行保护。
该种可能实施例中,栈中的参数值在写入第二值后为第二值,若栈被攻击者攻击,则该栈的参数值就不再是第二值了,而是攻击者在第一工作态请求时所准备的一个值。处理器运行执行压栈的函数,在压栈完成后就需要返回,在运行函数返回时可以比对栈中的canary值与用于存储更新的canary的结构体中的第二值,根据比对结果确定栈是否被攻击,从而进行相应的保护。
进一步的,步骤:根据栈中的参数值与第二值的比较结果对栈进行保护,包括:将栈中的参数值与第二值进行比较;若栈中的参数值与第二值相同,则将函数返回到该栈中该函数的返回地址所指示的位置;若栈中的参数值与第二值不相同,则确定栈受到攻击。
该种可能实施例中,若栈中的参数值与第二值相同,则表示栈未受到攻击,栈中的该函数的返回地址未被修改,则在函数返回时可以直接按照该返回地址返回到相应位置。若栈中的参数值与第二值不相同,则表示栈受到攻击,该函数的返回地址可能被修改,可以通过停止函数来保护栈。
为了更好的理解上述过程,下面结合图6的场景描述本申请的栈保护过程。
S1、处理器在第一工作态获取一个请求,该请求可以为系统调用请求。
若攻击者要攻击第二工作态的栈,则会在该请求中插入用于伪装用的canary值,例如:该伪装用的canary值为123。
S2、处理器从第一工作态切换到第二工作态。
S3、在特权切换入口,也就是运行所述第二工作态的函数执行压栈操作之前,处理器从随机数源获取第二值,该第二值为随机数。
该第二值例如可以为053872。
S4、处理器使用该第二值更新结构体中作为canary值的第一值。
若第一值为123,之前预先已经被攻击者获取,所以攻击者在上述请求中插入用于伪装用的canary值为123。
S5、处理器运行函数100执行压栈操作时,从结构体中获取第二值,并将该第二值写入到栈中,可以将该第二值写入到函数100的返回函数200上方。
例如:在栈中写入053872。
S6、在压栈完成后,处理器运行函数100返回,为了确认函数100的返回地址200是否安全,处理器运行函数100比对栈中的canary值与结构体300中的第二值是否一致,若一致,则说明栈未被攻击,返回地址200未被修改,则函数100可以返回到该返回地址的位置。若不一致,则说明栈被攻击,返回地址200可能被修改了,这时则需要终止该函数100。
若栈中canary值为123,则将123与结构体中的第二值053872进行比较,两者不相同,则表明该栈受到了攻击,返回地址200可能被修改了,需要终止函数100,不能再返回到栈中返回地址200所指示的位置。若若栈中canary值为053872,则将053872与结构体中的第二值053872进行比较,两者相同,则表明该栈没有受到攻击,函数100可以按照返回地址200的指示返回到相应位置。
另外,上述图6所描述的随机更新过程可以通过软件的方式来实现,也可以通过硬件的方式来实现,下面分别进行介绍。
一、软件的实现方式。
如图7所示,随机数源中的随机数是通过伪随机数生成函数产生的。伪随机数生成函数生成的随机数可以称为伪随机数,伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。
在本申请的随机更新过程中,使用伪随机数生成函数生成第二值;将第二工作态下用于保护栈的参数值从第一值更新为第二值。
该方案,采用伪随机数生成函数生成第二值,可以降低随机数生成的计算量,提高随机数更新的效率。
二、硬件的实现方式。
如图8所示,随机数源中的随机数是存储在性能管理计数器的寄存器,这样,在本申请的随机更新过程中,从性能管理计数器的寄存器中随机读取第二值;将第二工作态下用于保护栈的参数值从第一值更新为第二值。
该方案,可以预先存储随机生成的随机数,这样就不需要临时生成随机数,可以提高随机数更新的效率。
为了便于理解,下面以图9所示的应用场景为例进行介绍。
如图9所示,用户态的进程需要进行写操作时的执行过程可以包括:
201、处理器运行在写函数write(fd,buf,count)中配置好相应的系统调用参数。
202、处理器通过write(fd,buf,count)函数调用系统调用函数syscall(fd,buf,count),通过syscall(fd,buf,count)函数来请求内核提供相应的服务。
203、处理器切换到内核态,进入内核入口。
204、处理器在内核入口判断该系统调用是否来自用户态。
205、对于来自用户态的系统调用,处理器随机更新canary值。
若不是系统调用则不必更新canary。该随机更新过程可以参阅上述图6至图8的相应内容进行理解。
206、处理器通过系统调用调度器派发并完成用户态的系统调用请求,在该过程中,处理器会从进程的结构体,也可以称为任务结构体(task_struct)中取出更新后的canary值并写入到栈中函数的返回地址前,并在函数返回时对canary的值进行检查,判断栈中的canary的值与结构体中的canary值是否相等,若相等,则正常执行,若不相等,则终止函数。
该步骤206可以参阅上述实施例根据第二值进行栈保护的相应内容进行理解,此处不再重复赘述。
以上描述了本申请实施例提供的栈保护的方法,下面结合附图介绍本申请实施例提供的栈保护的装置。
如图10所示,本申请实施例提供的栈保护的装置30的一实施例包括:
获取单元301,用于获取请求,请求用于触发处理器从第一工作态切换到第二工作态,第二工作态的管理级别高于第一工作态的管理级别。
切换单元302,用于根据获取单元301获取的请求,从第一工作态切换到第二工作态。
更新单元303,用于将切换单元302切换后的第二工作态下用于保护栈的参数值从第一值更新为第二值。
栈保护单元304,用于根据更新单元303更新的第二值对栈进行保护。
本申请实施例中,请求是在第一工作态获取的,第一工作态的管理级别低于第二工作态的管理级别。因为,低管理级别请求高管理级别为其服务时,必须要先设置好所有的请求参数和数据,若攻击者想要借用该请求攻击第二工作态的栈,则在第一工作态请求服务前也需要准备好写入第二工作态的栈中的canary值,然后才能向第二工作态请求高管理级别的服务,基于此特点,在从低管理级别的第一工作态切换到高管理级别的第二工作态之后,在第二工作态更新canary值,就会导致攻击者在第一工作态预先准备的canary值无法与更新后的canary值相同,导致攻击者预先准备好用于伪装的canary值失效,从而保证了高管理级别工作态中栈的安全性。
一种可能的实施例中,更新单元303,将第一值随机更新为第二值。这样第一值与第二值之间没有推导规律,攻击者也无法通过规律化的推导预估到在第二工作态更新后的canary值,从而进一步保证了高管理级别的工作态中栈保护的安全性。
一种可能的实施例中,更新单元303,用于在运行所述第二工作态的函数执行压栈操作之前,将第二工作态下用于保护栈的参数值从第一值随机更新为第二值。
一种可能的实施例中,栈保护单元304,用于在运行函数执行压栈时,将第二值写入栈中作为保护栈的参数值;在运行函数返回时,根据栈中的参数值与第二值的比较结果对栈进行保护。
一种可能的实施例中,栈保护单元304,用于将栈中的参数值与第二值进行比较;若栈中的参数值与第二值相同,则将函数返回到该栈中该函数的返回地址所指示的位置;若栈中的参数值与第二值不相同,则确定栈受到攻击。
一种可能的实施例中,第一工作态为用户态,第二工作态为内核态;或者,第一工作态为内核态,第二工作态为虚拟化监控态;或者,第一工作态为虚拟化监控态,第二工作态为安全监控态。
一种可能的实施例中,更新单元303,用于使用伪随机数生成函数生成第二值;将第二工作态下用于保护栈的参数值从第一值更新为第二值。
一种可能的实施例中,更新单元303,用于将第二工作态下用于保护栈的参数值从第一值随机更新为第二值,包括:从性能管理计数器的寄存器中随机读取第二值;将第二工作态下用于保护栈的参数值从第一值更新为第二值。
该实施例所提供的获取单元301、切换单元302、更新单元303和栈保护单元304都可以通过处理器来实现。该处理器可以安装在任何可能的计算机设备中。
上述栈保护的装置30可以参阅上述栈保护的方法部分的实施例进行理解,本处不再过多赘述。
图11所示,为本申请的实施例提供的计算机设备40的一种可能的逻辑结构示意图。计算机设备40包括:处理器401、通信接口402、存储器403以及总线404。处理器401、通信接口402以及存储器403通过总线404相互连接。在本申请的实施例中,处理器401用于对计算机设备40的动作进行控制管理,例如,处理器401用于执行图5中的步骤101至104,以及图9中的步骤201至206,和/或用于本文所描述的技术的其他过程。通信接口402用于支持计算机设备40进行通信。存储器403,用于存储计算机设备40的程序代码和数据。
其中,处理器401可以是中央处理器单元,通用处理器,数字信号处理器,专用集成电路,现场可编程门阵列或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。所述处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,数字信号处理器和微处理器的组合等等。总线404可以是外设部件互连标准(PeripheralComponent Interconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图11中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
在本申请的另一实施例中,还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,当设备的至少一个处理器执行该计算机执行指令时,设备执行上述图5至图9部分实施例所描述的栈保护的方法。
在本申请的另一实施例中,还提供一种计算机程序产品,该计算机程序产品包括计算机执行指令,该计算机执行指令存储在计算机可读存储介质中;设备的至少一个处理器可以从计算机可读存储介质读取该计算机执行指令,至少一个处理器执行该计算机执行指令使得设备执行上述图5至图9部分实施例所描述的栈保护的方法。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请实施例的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请实施例所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请实施例各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请实施例各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请实施例的具体实施方式,但本申请实施例的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请实施例揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请实施例的保护范围之内。因此,本申请实施例的保护范围应以所述权利要求的保护范围为准。
Claims (13)
1.一种栈保护的方法,其特征在于,包括:
获取请求,所述请求用于触发处理器从第一工作态切换到第二工作态,所述第二工作态的管理级别高于所述第一工作态的管理级别;
根据所述请求,从所述第一工作态切换到所述第二工作态;
将所述第二工作态下用于保护栈的参数值从第一值更新为第二值;
根据所述第二值对所述栈进行保护。
2.根据权利要求1所述的方法,其特征在于,所述将所述第二工作态下用于保护栈的参数值从第一值更新为第二值,包括:
在运行所述第二工作态的函数执行压栈操作之前,将所述第二工作态下用于保护栈的参数值从第一值随机更新为第二值。
3.根据权利要求2所述的方法,其特征在于,所述根据所述第二值对所述栈进行保护,包括:
在运行所述函数执行压栈操作时,将所述第二值写入所述栈中作为保护栈的参数值;
在运行所述函数返回时,根据所述栈中的参数值与所述第二值的比较结果对所述栈进行保护。
4.根据权利要求3所述的方法,其特征在于,所述根据所述栈中的参数值与所述第二值的比较结果对所述栈进行保护,包括:
将所述栈中的参数值与所述第二值进行比较:
若所述栈中的参数值与所述第二值相同,则将所述函数返回到所述栈中所述函数的返回地址所指示的位置;或者,
若所述栈中的参数值与所述第二值不相同,则确定所述栈受到攻击。
5.根据权利要求1-4任一项所述的方法,其特征在于,
所述第一工作态为用户态,所述第二工作态为内核态;或者,
所述第一工作态为内核态,所述第二工作态为虚拟化监控态;或者,
所述第一工作态为虚拟化监控态,所述第二工作态为安全监控态。
6.一种栈保护的装置,其特征在于,包括:
获取单元,用于获取请求,所述请求用于触发处理器从第一工作态切换到第二工作态,所述第二工作态的管理级别高于所述第一工作态的管理级别;
切换单元,用于根据所述获取单元获取的请求,从所述第一工作态切换到所述第二工作态;
更新单元,用于将所述切换单元切换后的第二工作态下用于保护栈的参数值从第一值更新为第二值;
栈保护单元,用于根据所述更新单元更新的第二值对所述栈进行保护。
7.根据权利要求6所述的装置,其特征在于,
所述更新单元,用于在运行所述第二工作态的函数执行压栈操作之前,将所述第二工作态下用于保护栈的参数值从第一值随机更新为第二值。
8.根据权利要求7所述的装置,其特征在于,
所述栈保护单元,用于在运行所述函数执行压栈操作时,将所述第二值写入所述栈中作为保护栈的参数值;在运行所述函数返回时,根据所述栈中的参数值与所述第二值的比较结果对所述栈进行保护。
9.根据权利要求8所述的装置,其特征在于,
所述栈保护单元,用于将所述栈中的参数值与所述第二值进行比较;若所述栈中的参数值与所述第二值相同,则将所述函数返回到所述栈中所述函数的返回地址所指示的位置;或者,若所述栈中的参数值与所述第二值不相同,则确定所述栈受到攻击。
10.根据权利要求6-9任一项所述的装置,其特征在于,
所述第一工作态为用户态,所述第二工作态为内核态;或者,
所述第一工作态为内核态,所述第二工作态为虚拟化监控态;或者,
所述第一工作态为虚拟化监控态,所述第二工作态为安全监控态。
11.一种计算设备,其特征在于,包括处理器和存储有计算机程序的计算机可读存储介质;
所述处理器与所述计算机可读存储介质耦合,所述计算机程序被所述处理器执行时实现如权利要求1-5任一项所述的方法。
12.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-5任一项所述的方法。
13.一种芯片系统,其特征在于,包括处理器,所述处理器被调用用于执行如权利要求1-5任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010179849.5A CN113392395A (zh) | 2020-03-13 | 2020-03-13 | 一种栈保护的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010179849.5A CN113392395A (zh) | 2020-03-13 | 2020-03-13 | 一种栈保护的方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113392395A true CN113392395A (zh) | 2021-09-14 |
Family
ID=77616275
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010179849.5A Pending CN113392395A (zh) | 2020-03-13 | 2020-03-13 | 一种栈保护的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113392395A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118012675A (zh) * | 2024-04-10 | 2024-05-10 | 麒麟软件有限公司 | 虚拟化保护GuestOS中断栈的方法、装置及存储介质 |
-
2020
- 2020-03-13 CN CN202010179849.5A patent/CN113392395A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118012675A (zh) * | 2024-04-10 | 2024-05-10 | 麒麟软件有限公司 | 虚拟化保护GuestOS中断栈的方法、装置及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11748468B2 (en) | Dynamic switching between pointer authentication regimes | |
CN102592082B (zh) | 通过操作码随机化的安全 | |
JP6185487B2 (ja) | ドメイン間で切り替わる際のセキュアなデータの非セキュアなアクセスから隔離された状態での維持 | |
CN105723348B (zh) | 使用事务性存储器检测未授权存储器修改及访问 | |
US10095862B2 (en) | System for executing code with blind hypervision mechanism | |
EP3761208A1 (en) | Trust zone-based operating system and method | |
US20230016904A1 (en) | Separate branch target buffers for different levels of calls | |
CN105393255A (zh) | 用于虚拟机中的恶意软件检测的过程评估 | |
EP2842041B1 (en) | Data processing system and method for operating a data processing system | |
JP6984710B2 (ja) | コンピュータ装置およびメモリ管理方法 | |
US20130024930A1 (en) | Executing Functions of a Secure Program in Unprivileged Mode | |
CN107066887A (zh) | 具有敏感数据访问模式的处理装置 | |
CN112818327A (zh) | 基于TrustZone的用户级代码和数据安全可信保护方法及装置 | |
CN114710263B (zh) | 密钥管理方法、密钥管理装置、密钥管理设备及存储介质 | |
CN112000484A (zh) | 栈帧地址随机化方法及相关设备 | |
CN113467981A (zh) | 异常处理的方法和装置 | |
US20140025903A1 (en) | Multi-core processor system | |
CN109154895B (zh) | 上下文数据控制 | |
JP2013101550A (ja) | 情報処理空間管理方法、外部デバイス及び情報処理装置 | |
Kim et al. | Ileakage: Browser-based timerless speculative execution attacks on apple devices | |
CN113392395A (zh) | 一种栈保护的方法及装置 | |
CN115964758A (zh) | 一种基于TrustZone的内核数据完整性保护方法 | |
EP2533131B1 (en) | Management of the interaction between security and operating system power management unit | |
WO2022135686A1 (en) | Method for securing a computing device from memory corruption and computing device | |
CN108459899B (zh) | 信息保护方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |