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

用于加强硬件辅助内存安全的装置和方法

文献发布时间:2023-06-19 11:26:00


用于加强硬件辅助内存安全的装置和方法

技术领域

所公开实施例的各方面涉及移动计算装置,尤其涉及移动计算装置内的软件安全性。

背景技术

过去十年,计算机处理器中的内存安全一直是其攻击和防范双方的重点工作。攻击方已经开发了病毒和根套件,使用代码覆盖和数据区执行,如利用缓冲超限的缺陷,来攻击计算设备。保护功能,如写异或执行(W^X)或更普遍的数据执行保护(data executionprevention,DEP),已经减轻了这些攻击中的大多数有害影响。作为回应,攻击方正在开发针对DEP保护工作的较新的“返回到libc”,或更普遍的“返回导向编程”(return orientedprogramming,ROP)和“数据导向编程”(data oriented programming,DOP)攻击。

当前提高内存安全性的方法侧重于增强调用流完整性。这可以通过硬件方法来实现,如使用某些ARM架构中可用的指针验证,使用硬件支持的影子堆栈来跟踪英特尔公司正在研究的调用,以及纯软件解决方案。然而,这些保护方法通常无法保证调用流之外的内存安全。此外,很多解决方案都会产生非常高的性能开销,有时高达400%。对于很多应用而言,这些解决方案是不满足需求的或不切实际的。

一些研究工作的重点是构建针对内存安全的硬件平台。剑桥大学的CHERI(capability hardware enhanced RISC instructions)项目就是其中之一。CHERI将所谓的胖指针引入MIPS架构中,从而将指针完整性与内存分段相结合。这些功能可用于实现针对内存安全的架构。然而,这些方法尚处于研究阶段的初期,无法普遍使用。

因此,希望提供解决上述至少一些问题的方法和装置。

发明内容

所公开实施例的目的是提供一种改进的方法和装置,能够在产生很少计算或内存开销的情况下,提高计算装置内的接近全内存安全性和调用流完整性。通过独立权利要求的主题实现该目的。在从属权利要求中可以找到进一步的有利修改。

第一方面,通过一种装置实现上述和进一步的目的和优点。所述装置包括与存储器耦合的处理器,其中,所述处理器和所述存储器用于提供分支目标指令保护和内存着色保护。所述处理器用于使用不可访问颜色值对与第一函数相关联的第一内存区域进行着色并分支到第二函数,从所述第一函数调用所述第二函数。当在第二函数内执行时,所述处理器用于使用第二颜色值对与所述第二函数相关联的第二内存区域进行着色,在所述第二内存区域上进行操作,并使用所述不可访问颜色值对所述第二内存区域进行着色。然后,所述处理器将控制返回给所述第一函数,并使用第一颜色值对所述第一内存区域进行着色。所述第一颜色值、所述第二颜色值和所述不可访问颜色值各自表示不同的颜色值。所述着色包括分支到着色例程,其中,所述着色例程包括以单个分支目标指令开始的基本块。通过着色识别和授权调用例程,使用硬编码内存颜色值对与所述调用例程相关联的内存区域进行着色,并返回到所述调用例程。所述着色与BTI组合保证了接近全内存安全性,并确保所述装置内的调用流完整性。

根据第一方面,在所述装置的第一种可能的实现形式中,所述着色例程位于仅执行内存区域中,所述处理器用于防止写入所述仅执行内存区域。保护所述着色例程不被修改,可防止恶意应用控制着色从而访问机密或敏感信息。

根据第一方面,在所述装置的一种可能的实现形式中,所述第一内存区域和所述第二内存区域分配在存储器的读/写部分中,并包括堆栈帧和堆区域中的至少一个。所述处理器用于防止执行所述第一内存区域或所述第二内存区域中的数据。内存安全有利地应用于所有类型的内存空间,并且不限于对堆栈的保护。

在所述装置的一种可能的实现形式中,一个或多个堆栈参数从所述第一函数传递到所述第二函数,所述一个或多个堆栈参数使用第三颜色值着色。所述第三颜色值不同于所述不可访问颜色值或所述第一颜色值中的任何一个,所述处理器用于读取和/或写入所述一个或多个堆栈参数。堆栈参数使用的颜色与所述第一或第二函数使用的颜色不同,使得所述参数与代码的其它部分隔离开。

在所述装置的一种可能的实现形式中,所述第二堆栈帧中存储有一个或多个存储对象,所述一个或多个存储对象中的每一个都使用不同的颜色值着色。所述处理器用于读取和/或写入所述一个或多个存储对象。使用较小的颗粒,如单个存储对象,可提高安全性,因为攻击一个着色的内存区域所提供数据访问更少。

在所述装置的一种可能的实现形式中,所述第二函数包括多个基本块,与每个基本块相关联的存储对象使用不同的颜色值着色。使用较小的颗粒,例如单个基本块,可提高安全性,因为攻击一个着色的内存区域所提供的数据访问更少。

在一种可能的实现形式中,与一个应用相关联的程序指令使用第四颜色值着色,与所述应用访问的软件库相关联的所有例程使用第五颜色值着色。所述第四颜色值不同于所述第五颜色值,所述处理器用于执行所述应用。对所述软件库进行与其余应用代码不同的着色,可保护所述应用免受库的影响,并且不会产生不必要的开发开销。

在一种可能的实现形式中,所述第二内存区域包括堆栈帧,所述使用所述不可访问颜色值对所述第二内存区域进行着色包括:所述处理器将所述第二内存区域重置为零值。将所述内存区域重置为零将永久删除其中可能已存储的所有敏感数据。

在一种可能的实现形式中,所述装置包括移动通信设备。鉴于存储在移动通信设备上的银行、支付和个人信息应用的使用越来越多,接近全内存安全性和调用流完整性对于移动通信设备尤为重要。

第二方面,通过一种计算机实现的方法实现上述和进一步的目的和优点,其中,所述计算机用于提供分支目标指令保护和内存着色保护。所述方法包括:使用不可访问颜色值对与第一函数相关联的第一内存区域进行着色;分支到第二函数;使用第二颜色值对与所述第二函数相关联的第二内存区域进行着色;基于所述第二函数在所述第二内存区域上进行操作。然后,该方法使用所述不可访问颜色值对所述第二内存区域进行着色;返回到第一函数;并使用所述第一颜色值对所述第一内存区域进行着色。所述第一颜色值、所述第二颜色值和所述不可访问颜色值各自包括不同的颜色值。所述着色包括:分支到着色例程,其中,所述着色例程包括以分支目标指令开始的单个基本块。通过着色识别和授权调用例程,使用硬编码内存颜色值对与所述调用例程相关联的内存区域进行着色,并返回到所述调用例程。所述着色与BTI组合保证了内存安全性,并确保所述装置内的调用流完整性。

在所述方法的第一种可能的实现形式中,所述着色例程位于仅执行内存区域中。将着色例程存储在仅执行内存区域中,可防止攻击者通过修改着色例程来控制着色。

在所述方法的一种可能的实现形式中,一个或多个堆栈参数从所述第一函数传递到所述第二函数,所述一个或多个堆栈参数使用第四颜色值着色。所述第三颜色值不同于所述不可访问颜色值、所述第一颜色值和所述第二颜色值中的任何一个。对所述参数进行与所述第一函数或所述第二函数中的任何一个都不同的着色,可以独立于与任何一个函数相关联的内存访问要控制的参数。

在所述方法的一种可能的实现形式中,第二堆栈帧中存储有一个或多个存储对象,并且所述一个或多个存储对象中的每一个都使用不同的颜色值着色。通过限制攻击特定内存区域的攻击者可访问的数据量,缩小着色的内存区域的大小,以降低风险。

在所述方法的一种可能的实现形式中,所述第二函数包括多个基本块,与每个基本块相关联的存储对象使用不同的颜色值着色。每个基本块使用不同的内存颜色,限制攻击基本块的攻击者的可用的数据。

第三方面,通过包括非瞬时性计算机程序指令的计算机程序产品实现上述和进一步的目的和优点,当被处理器执行时,所述非瞬时性计算机程序指令使得所述处理器执行第二方面的方法。

示例性实施例的这些方面、其它方面、实现方式和优点将从结合附图考虑的本文描述的实施例中变得显而易见。但应理解,此类描述和附图仅用于说明的目的,而不能作为对本发明的限制;对本发明的任何限制,应参考所附权利要求书。本发明的附加方面和优点将在随后的说明书阐述,并且,部分方面和优点在说明书中显而易见,或者可以通过实施本发明而了解。此外,本发明的方面和优点可以通过所附权利要求书中特别指出的手段或结合方式实现和获得。

附图说明

在本公开的以下详述部分中,将参考附图中所示出的示例实施例来更详细地解释本发明,其中:

图1示出了所公开实施例的各方面提供的用于提供接近全内存安全性的计算装置的框图;

图2示出了所公开实施例的各方面提供的用于提供接近全内存安全性的机制的代码概述;

图3示出了所公开实施例的各方面提供的计算装置中提供内存保护和调用流完整性的示例性方法的流程图;

图4示出了所公开实施例的各方面提供的用于对内存区域进行安全着色的示例性着色例程的流程图。

具体实施方式

现在参考图1,所示为装置100的框图,装置100用于提供根据所公开实施例的各方面的接近全内存安全性。装置100适用于多种通用的计算装置,如移动通信设备、智能手机、平板电脑、平板手机、笔记本电脑或将受益于内存安全性提高的其它计算装置。装置100包括与计算机存储器152通信耦合的处理器150。存储器152可以是任何适当类型的计算机可读和可写存储器,例如RAM、DRAM或其它类型的物理存储器。存储器152可以由处理器150或由与处理器150一起工作的其它支持内存管理的硬件和软件来管理,从而有益地管理计算机存储器152。

如下文将进一步描述,通过新颖地使用装置100支持的硬件特征,可以实现接近全内存安全性和调用流完整性。这些特征有助于安全并可以保护装置100免受恶意软件攻击,包括支持写异或执行(W^X)保护、内存着色和分支目标指示(branch target indication,BTI)机制的计算硬件。

参考图1和2,在一个实施例中,处理器100和存储器152用于提供分支目标指令保护和内存着色保护。例如,处理器150用于通过使用不可访问颜色值220对与第一函数202相关联的第一内存区域216进行着色,分支226到第二函数208,使用第二颜色值250对与第二函数206相关联的第二内存区域218进行着色,从第一函数202调用248第二函数208。在第二内存区域218上进行操作(242),使用不可访问颜色值220对第二内存区域218进行着色,返回228到第一函数202,并使用第一颜色值252对第一内存区域216进行着色。第一颜色值252、第二颜色值250和不可访问颜色值220各自包括不同的颜色值。

在一个实施例中,所述着色包括分支到着色例程204、206、210和212,其中,所述着色例程包括以单个分支目标指令开始的基本块,识别和授权调用例程,使用硬编码颜色值对与调用例程相关联的内存区域进行着色,以及返回到所述调用例程。

为了帮助理解,将参考ARMv8.5处理器架构和特征来描述所公开实施例的某些特征。ARMv8.5架构是由ARM HOLDINGS plc开发的精简指令集计算机(reduced instructionset computer,RISC)架构。仅为了帮助理解,本文提供了对ARMv8.5架构或其它特定处理器或架构的参考。本领域技术人员将容易地认识到,在不背离本公开的精神和范围的情况下,本文提出的实施例可以有利地在其它合适的计算装置内采用,所述其它合适的计算装置备可以包括以上列举的保护特征的替代实现。

装置100结合了有时被称为写异或执行(W^X)或防止数据执行的安全特征。W^X是一种内存保护方法,其中,内存中的每个页面都是可写的或可执行的,但不能同时可写或可执行。如果没有W^X保护,一个程序可以利用软件缺陷(如缓冲区溢出缺陷),控制处理器150。W^X保护有时称为数据保护,可防止此类攻击。

在装置100中,可执行程序指令或可执行代码被加载到正在运行应用可以执行的但不能写入或修改的内存区域中。这些仅执行内存区域在本文中称为代码空间。在应用执行期间,为期望被修改或更改值的数据或变量保留其它内存区域。这些内存区域可以称为数据空间。W^X允许执行存储在代码空间中的指令,但如果试图写入代码空间(即仅执行代码空间),则会产生处理异常。类似地,如果程序试图执行从数据空间(即可以写入但不能执行的数据空间)读取的指令,则会产生处理异常。

本文中使用的术语“处理异常”是指一种改变程序或执行流程的方式,使得处理器150可以适当地处理异常条件。例如,如果一个程序试图写入代码空间,则可以使用硬件中断机制来生成处理异常。

代码生成时间或编译时间是指程序代码生成的时间。例如,当编译器用于从高级语言生成程序代码时,或者当程序员手动制作程序代码时,可以生成程序代码。在计算装置中执行应用时,生成的程序代码被加载到代码空间中。通常情况下,可以在代码生成时设置某些数据值或常量,并与可执行指令一起存储在代码空间中。在代码生成时设置并存储在代码空间中的值在本文中称为硬编码值或预定值。目的是使预定值在应用执行过程中永不改变。通过在代码空间中存储这些预定值,在装置100中实现的W^X保护机制将确保预定值在整个应用执行过程中保持不变。

装置100支持称为内存着色或内存标记的内存安全特征。通过内存着色,可以将内存块与某个值(称为颜色值或标签)相关联或标记。每个内存块(有时称为颗粒)被标记为特定值,本文中称为颜色值。每个内存块中的字节大小或数量称为标记粒度。当分配内存时,内存管理单元或其它计算装置选择颜色值,并将该颜色值与分配的内存相关联。选定的颜色值还与返回到请求内存分配的应用的内存指针相关联。每次访问内存时,如通过加载或存储操作,都会将与内存指针相关联的颜色值与正在访问的内存相关联的颜色值进行比较。装置100中的处理器150或其它内存管理组件用于:当指针颜色和内存颜色不匹配时,生成处理异常。

每种颜色所使用的比特数(称为标签大小)应足够大,从而允许足够数量的不同颜色值(例如,4比特允许16个不同的值),但又应足够小,从而容易在硬件和软件中处理。例如,标签大小可以被配置成适合指针的高未用位,该指针例如可以是8比特或16比特。标签粒度的选择是标签大小、对齐要求和硬件配置之间的权衡。

通过使用内存着色来检测时间或空间缺陷或其它内存违规是概率性的并且是基于标签大小的。例如,一些计算预测使用标签大小为4比特时,发现缺陷的可能性为94%。

为了帮助理解,表1列出了ARMv8.5架构提供的一些内存着色或标记操作的列表。如表1所示,内存着色或标记操作包括特权操作,用于对内存进行着色的命令集,用于对地址和指针进行着色的命令集,以及用于对具有标签的指针执行算术运算的命令。管理标签阵列、在不正确的取消引用操作时中断执行以及控制着色机制(如打开或关闭着色)等功能由系统寄存器和微码管理。

着色指令主要用于支持以下基本程序流程:保留内存颗粒,获取内存指针的颜色值,并使用针对内存指针获得的相同颜色值对保留内存进行着色或标记。可以参考图1中所示的示例性实施例100来理解该基本流程,其中,加载在代码空间130内的程序组件126想要访问128内存区域106。示例性内存区域106被示为内存堆栈154上的帧。或者,可以从堆空间或配置为数据空间或读/写内存区域的任何合适类型的内存区域中分配内存区域106。内存区域106可以通过标签阵列156与颜色值138相关联。标签阵列中的每个表项,例如表项120,通过内存指针118将颜色值138与内存区域106相关联。标签阵列156可以包括多个表项122和120,每个表项具有其自己的颜色值138和124和指针114和118。当代码模块126使用的内存指针包括与正在访问128的内存区域106相同的颜色值138时,内存访问成功。不正确的取消引用是指在运行时捕获使用与正在访问的内存不同的颜色值的指针访问内存,并导致处理异常。

通过本文称为分支目标指令保护的特征增强装置100内的调用流完整性。在提供分支目标指令(branch target instruction,BTI)保护的装置(100)中,某些指令被标记为分支目标。每当编程分支或跳转操作将执行控制传递给标记为分支目标的指令时,程序继续正常执行。当编程分支或跳转操作将执行控制传递给未正确标记为分支目标的指令时,就会引发处理异常。如本文所使用,术语“分支目标指令”是指已经标记为分支目标的指令。

可以通过多种方式实现分支目标指令保护。例如,ARMv8.架构管理特别保护的内存区域134并提供BTI虚拟汇编指令。在受保护的内存区域134内,分支或跳转到大多数指令将引发处理异常。然而,在某些条件下,在受保护内存区域内跳转或分支132到BTI指令将不会引发分支目标异常,并将允许继续执行内存区域134内的后续指令。装置100包括受保护的内存区域134,其中,BTI机制是激活的,使得只有BTI指令可以成为编程分支或跳转的目标。分支132到BTI指令后,BTI指令后的后续指令将按顺序执行。

或者,BTI机制可以通过任何预期的方式实现,例如,通过在代码中放置标记或特殊指令,或通过维护容许分支目标或入口点的表,或其它仅强制某些指令作为容许分支目标的适当方式。本领域普通技术人员将容易认识到,在不背离本公开的精神和范围的情况下,可以有利地采用任何确保只能对某些定义明确的指令执行程序化跳转或分支操作的分支目标保护机制。

可以通过将分支目标指令放置在例程或函数的开头,而不将例程或函数中的任何其余指令标记为BTI来强制实施执行流。这样可以保证必须始终在所需的入口点或开始指令处输入例程或函数,并且任何试图在函数主体内其它位置输入例程的尝试都会产生处理异常。因此,BTI保护可防止恶意应用出于其自身目的而使用或访问例程或函数中的部分指令或序列指令。

图2示出了所公开实施例的各方面提供的用于提供接近全内存安全性的机制的代码概述200。图2中所示的特征适用于在如上述图1中示出的装置100的计算设备内提供内存安全性和调用流完整性。

出于说明的目的,通过阴影来表示具有相同颜色值的内存区域和可执行代码,其中,使用相同阴影图案的区域具有相似的颜色值。第一图案250将表示如红色的第一颜色值,第二图案252表示如蓝色的其它颜色值,第三图案220表示如灰色的第三其它颜色值。

在函数202和208和着色例程204、206、210和212中使用的颜色值是预先确定的,并且在代码生成时设置。使得这些颜色值进行硬编码,即在运行时加载这些颜色值到代码段中,从而保护它们在程序执行期间不被篡改。

概述200描述了一个软件调用流场景,其中,第一函数202func1()进行编程调用或分支到第二函数208func2()。还示出了内存堆栈214的一部分,其中,分配有时称为堆栈帧216和218的部分内存分别供第一函数202和第二函数208使用。概述200示出了在第二函数208的主体部分246内执行程序的时间点的内存着色的状态,即颜色值的分配。

在所示的实施例200中,当第一函数202到达需要调用或分支226到第二函数208的点248时,第一函数202将控制222或执行流传递给着色例程204。图2中的箭头,如箭头222和224描绘了在不同软件例程或函数之间传递程序执行流。一个例程(如第一函数202)通过对着色例程204进行编程调用,将执行流222传递给着色例程204。当着色例程204已经完成其处理时,如箭头224所示,将执行流程返回224给调用例程或函数。

如下文将进一步讨论的,在程序执行期间,通过用于保护着色操作免受篡改或误用的着色例程修改内存着色。四个着色例程204、206、210和212都是相似的,但其应用的颜色值和对其进行操作的内存区域有所不同。四个着色例程204、206、210和212用于按以下顺序执行以下步骤:标识调用例程,验证调用例程是否被授权使用此着色例程,将预定颜色应用于所需的内存区域,并返回到调用函数或例程。

着色例程204、206、210和212应用的颜色值是预先确定的,并通过在代码空间内对它们进行硬编码来保护它们不被修改。但是,攻击者仍然可以通过修改程序流来控制着色,从而在未先执行标识和授权检查的情况下执行着色指令。为了防止滥用着色指令,如上所述,使用分支目标指令保护来保护每个着色例程204、206、210和212。

每个着色例程204、206、210和212都包含一个以单个分支目标指令开头的基本块,这意味着分支目标指令保护用于确保着色例程204、206、210和212只能在其开始或预定义的入口点输入,并且必须依次执行着色例程204、206、210和212中包括的所有处理步骤,从而防止未经授权的恶意应用跳过识别和授权步骤并在未经授权的情况下执行着色指令。

术语“脱色”是指将保留或不可访问颜色值220与内存区域相关联,其中,保留颜色值220不用于访问任何内存区域,并且当不可访问颜色值与内存区域相关联时,脱色的内存区域不能被任何程序代码访问。如本文所使用,术语“不可访问颜色值220”用于指使任何程序代码都无法访问内存区域的颜色值220,例如,概述200中所示的保留或不可访问颜色值220。用于用不可访问颜色220对内存进行着色的着色例程204和212在本文中可以称为脱色例程。

当在ARMv8.5类型处理器中实现时,通过将着色例程204、206、210和212加载到受保护的内存区域中,并将BTI虚拟汇编指令放置在例程的开头来实现分支目标指令保护。在每个着色例程204、206、210和212中只有一个BTI指令,位于该例程的开头,从而防止除了通过例程开头的BTI指令之外的方法进入着色例程。

上述着色例程204、206、210和212可用于在第一函数202调用第二函数208时提供接近全内存安全性并降低ROP攻击的风险。在分支226到第二函数208之前,第一函数202调用着色例程204以对与第一函数202相关联的内存区域216进行脱色。脱色例程204用预定义的不可访问颜色值220进行硬编码,并用于将内存区域216与不可访问颜色值220相关联。用不可访问颜色对内存区域216进行着色,可防止在将控制传递给第二函数208时,对第一函数202使用的内存区域216进行任何访问或修改。

在接收到控制226之后,第二函数开始调用234着色例程210,用于使用颜色值250对内存进行着色,该颜色值250使第二函数208可访问第二函数208使用的内存区域218。完成后,着色例程210返回到第二函数208,其中,第二函数可以在与着色的内存区域218交互的同时继续其预期的处理240。一旦第二函数208完成其处理240,并且在返回到第一函数202之前,第二函数208调用238脱色例程212,该对脱色例程212进行硬编码,使得不可访问颜色值220与内存区域218相关联,从而使任何代码模块都不可访问内存区域218。

在某些实施例中,如当内存区域218已经填充有高度敏感数据时,可以通过将存储在内存区域218中的内存值重置为全零值,来提供额外的安全性。此步骤完全擦除数据,使其无法恢复,即使是设法绕过内存着色保护的程序也是如此。

从第二函数208返回后,第一函数202准备通过调用230着色例程206来恢复执行,其中,着色例程206用于使用预定的第一颜色值252重新对内存区域216进行着色。然后,第一函数202可以在访问其分配的内存区域216的同时恢复其处理。

有利地,所使用的颜色值,例如红色250、蓝色252和表示不可访问颜色值的灰色220,都是不同的,并且彼此不同。每个内存颜色使用不同的颜色值,可防止第一函数202访问属于第二函数208的内存218,并防止第二函数208访问属于第一函数202的内存216。不可访问颜色值220与第一颜色值250或第二颜色值252不同,可防止第一函数202或第二函数208在内存受到保护的期间(即,该内存被脱色或分配了不可访问颜色值220)访问脱色的内存。

通过考虑风险模型可以认识到上述实施例的优点,即,攻击者获得了对着色的控制,从而可以访问包含敏感数据的内存区域。由于装置100中内置了W^X保护,因此将颜色值硬编码并将颜色值合并到代码空间中可防止攻击者修改在每个着色例程中硬编码的颜色值。用分支目标指令保护保护着色例程204、206、210和212,并使用BTI标记每个着色例程204、206、210和212的入口点或开始指令,以防止攻击者绕过每个着色例程204、206、210和212中包括的识别和授权步骤,并将着色操作用作恶意目的的小工具。因此,以公开的方式组合两个硬件基元,即内存着色和分支目标指令保护,提供了一种简单而有效的增强内存安全性和调用流完整性的方法。

由于内存着色和分支目标指令保护这两个基元都是非常轻量级的,因此所公开的实施例预期的唯一系统计算开销来自操纵颜色值和保护着色例程所需的额外代码指令。因此,可以估计计算和内存使用开销约为百分之一到百分之三(1%-3%)。相比之下,提供内存安全和调用流完整性的传统解决方案需要约400%的计算和内存使用开销。

与特定实施例相关的攻击面或风险与每个正在着色的内存区域的粒度或大小成反比。攻击者攻击更大的内存区域,则需要访问更多的数据。更多的小内存区域会增加将不同颜色值应用到很多小内存区域相关的复杂性和开销。因此,风险和开销之间存在权衡。

低风险实施例可以在进入和退出代码中的每个基本块后使用更细粒度的方法应用不同的颜色值。函数中的每个基本块都使用不同的内存颜色值,而不是整个函数使用相同的内存颜色值。本文使用的术语“基本块”是指直线代码序列,或软件指令序列,除入口外没有入分支,除出口外没有出分支。每个基本块使用不同的颜色值,可防止破坏一个基本块或颜色值的攻击者访问与同一函数中的其它基本块相关联的数据。

在对象尺寸较大的实施例中,用于存储每个存储对象的内存区域使用不同的颜色值,即每个存储对象与其自己的颜色值相关联,可能是有利的。如本文所使用,术语“存储对象”是指存储在计算机存储器中的数据结构或类的实例。

在某些实施例中,从调用函数传递给被调用函数的参数或值可以由调用函数放置在堆栈上,其中,该参数或值可以由被调用函数访问。如本文所使用,术语“堆栈参数”是指在调用函数和被调用函数之间开始传递时放置在堆栈上的参数或存储对象。将与调用函数或被调用函数使用的颜色值不同的颜色值应用于这些堆栈参数可能是有利的。通过为堆栈参数使用不同的颜色值,可以独立于调用函数或被调用函数使用的其它内存区域来管理堆栈参数的访问。

一种更粗粒度的着色方法类似于上述图2所示的通过函数执行着色的实施例。例如,在执行第一函数202期间使用第一颜色值(如蓝色252),并且在执行第二函数208期间使用第二颜色值(如红色250)。在实施例200中,与第二函数相关联的整个堆栈帧218以及由第二函数分配的任何其它内存区域接收相同的颜色值250。

一家公司开发的应用利用另一家公司的库,是一种常见的软件开发。应用开发人员对第三方库的了解和信任程度通常低于他们自己的应用代码。库的源代码可能不可用,或者修改和验证库的成本可能会令人望而却步,因此,如上所述,修改库以使用逐个函数的方法来进行内存着色可能是不可取的。然而,上述使用内存着色和分支目标指令保护的方法仍然可以应用于在不修改库本身的情况下提高整体系统安全性。通过对应用中的代码使用第一颜色值,对库中的所有函数和例程使用第二颜色值,可以提高内存安全性和调用流完整性。尽管此方法比本文中描述的其它方法更粗糙或粒度更小,但在保持较低的开发和实施成本的同时,仍提供了明显的优势。

图3示出了所公开实施例的各方面提供的计算装置中提供内存保护和调用流完整性的示例性方法300的流程图。方法300适用于在广泛的现代计算装置,例如,上述参考图1描述的计算装置100。方法300利用提供内存着色和分支目标指令保护两个硬件基元的计算装置,这在很多现代移动通信装置中是常见的,如手机、移动电话、平板电脑和很多无线网络计算装置。

当第一函数320准备分支到第二函数322时,方法开始。在分支到第二函数322之前,使用第一颜色值对第一函数320使用的内存和嵌在第一函数320的代码中的内存指针进行着色,从而使第一函数320完成其预期处理。当准备分支时,通过将内存区域与不可访问颜色值相关联,对与第一函数320相关联的内存进行脱色302,使得无法从任何代码段访问该内存。如下文将进一步讨论的,通过分支到专门配置的着色例程来完成着色和脱色。

然后,第一函数320分支304到第二函数322。在启动第二函数322内的处理之前,使用第二颜色值306对内存区域和相关联的内存指针进行着色。内存区域可以是任何预期类型的计算机可访问存储器,例如堆栈帧、堆空间或其它目标内存区域。一旦通过第二颜色着色完成,第二函数322可以访问相关联的内存区域以完成任何预期处理和软件操作308。

在返回到第一函数320之前,第二函数322通过将其相关联的内存区域标记为不可访问颜色值或将其相关联的内存区域与不可访问颜色值相关联来对该内存区域进行脱色310,以保护该内存区域免受未经授权的访问。返回控制给第一函数320,其中,在继续任何处理之前,使用第一颜色值314对与第一函数相关联的内存进行着色,而使第一函数320可以访问相关联的内存区域。然后,第一函数320可以继续其处理316。

图4示出了结合所公开实施例的各方面的示例性着色例程400的流程图。着色例程400适合于执行上述参考图3描述的示例性方法300中包括的着色或脱色步骤。

通过分支目标指令保护和W^X或数据执行防止机制有利地保护着色例程400。着色例程400的入口点或开始指令450通过如上所述的任一适当的BTI方法标记为分支目标。在进入时,处理器或其它BTI机制验证402分支到的指令是有效的分支目标。如果试图对着色例程400内的除预定义和适当标记的入口点450以外的任何指令进行分支,则产生处理异常,并且可以启动适当的异常处理。

接下来,着色例程标识404调用例程。可以通过任何预期的方式来完成识别,例如检查返回地址或其它方式。然后进行检查406以确保已授权调用例程或函数使用该着色例程400。当未授权(406-N)该调用例程或函数时,则退出408着色例程,并且不执行着色操作。在返回到调用函数之前,在某些实施例中,可能需要执行错误处理,或返回错误代码,或以其它方式指示发生了异常,从而可以采取适当的措施。

当确定已授权(406-Y)该调用例程时,使用硬编码内存颜色对内存区域进行着色410。使用硬编码颜色值,通过防止攻击者在攻击期间利用着色指令来提高安全性。对内存进行着色可以使调用例程在完成所需处理的同时访问内存。然后,返回412控制到调用例程。

出于安全考虑,保护硬编码颜色值不被修改是非常重要的。如上所述,在代码生成时设置硬编码的颜色值,并将其与程序指令一起存储在代码空间中。在运行时,加载着色例程400到仅执行代码区域中,在该区域中,着色例程400可以通过使用数据执行保护机制对其进行保护。

因此,尽管文中已示出、描述和指出应用于本发明的示例性实施例的本发明的基本新颖特征,但应理解,本领域技术人员可以在不脱离本发明的精神和范围的情况下,对所示出的装置和方法的形式和细节以及装置操作进行各种省略、取代和改变。进一步,明确地希望以大体相同的方式执行大体相同的功能以实现相同结果的那件元件的所有组合均在本发明的范围内。此外,应认识到,结合所公开的本发明的任何形式或实施例进行展示和/或描述的结构和/或元件可作为设计选择的通用项而并入所公开或描述或建议的任何其它形式或实施例中。因此,本发明仅由所附权利要求的范围所限定。

相关技术
  • 用于加强硬件辅助内存安全的装置和方法
  • 基于硬件辅助虚拟化技术的进程内存保护方法
技术分类

06120112919221