处理器扩展和软件验证的制作方法

文档序号:6551550
专利名称:处理器扩展和软件验证的制作方法
技术领域
本发明的领域总地涉及计算机系统,更具体地但非排他地,本发明涉及支持和非可信(untrusted)代码一起运行的可信(trusted)(例如,类型安全)语言环境的处理器扩展和软件验证。
背景技术
今天的大多数软件是用“不安全的”语言写的,例如C或C++,使用指向特定处理器指令集体系结构的编译器将所述软件编译为本机机器码。这些语言是不安全的,因为它们具有通过内置功能(即,指针间接寻址和操纵)、扩展或者内部汇编来进行直接的、未经检查的存储器操纵或访问的规定。例如,用于特定的不安全应用模块的存储器操作可能会实际上改变在被分配给另一个应用模块的一部分存储器地址空间中的存储器。这可能导致由其他应用产生的文档的损坏,或者系统崩溃,以及其他不期望的后果。因此,上述语言所生成的本机码是不值得相信的。
今天的模块化代码环境进一步加剧了代码安全性问题。随着操作系统和软件程序寻求提供更加丰富的特性,它们正变得更加模块化。它们越来越是从通常由不同的团队独立开发出来的组件中搭建而成的。这产生了从具有不同可信度级别的组件中搭建而成的程序包。例如,虽然操作系统(OS)的内核可以包含可信码,但是它与由第三方供应商编写的设备驱动程序相接口。一般而言,OS供应商无法验证第三方供应商的可信度。这造成了操作系统中信任边界的划界(delineation)。此外,运行在操作系统上的应用也可以具有这样一种信任边界的划界。
更具体地,很多大的应用都使用动态链接库(DLL),这些库通常是由独立的软件供应商开发的。例如,浏览器通常使用一定量的插件,这些插件是由完全独立的供应商开发出来的。在如今的很多程序环境中使用的大量第三方模块通常使得要确定环境是否完全安全变得不切实际,甚至不可能。
用于解决代码安全性问题的一种技术就是使用类型安全(type-safe)语言。例如,Java和C#就是类型安全语言,它们不允许直接的存储器操纵。相反,这些语言运行在平台相关的虚拟机(例如,Java虚拟机或者说JVM)上,虚拟机管理着与处理器和/或操作系统之间的所有存储器接口。虚拟机提供了平台无关的编程语言和平台专用的处理器指令集体系结构之间的抽象级。实际上,诸如JAVA的平台无关语言不支持直接的存储器操纵或访问。
虽然Java和C#不允许直接存储器操纵,但是它们经常需要与这样做的代码或模块相接口。例如,经常需要访问平台无关语言不支持的低级系统功能(例如,向监视器输出数据)。因此,Java和C#两者都提供扩展以支持对用不安全语言编写的模块或代码的调用。由此,这样一种“混合”程序代码不再被认为是固有安全的。这危及到程序代码的可信度。

发明内容
为解决以上问题,本发明公开了支持与非可信代码一起运行的类型安全语言环境的处理器扩展和软件验证。
根据本发明的一个方面,提供了一种方法,包括将分配给应用的代码空间划分成可信区和非可信区;为位于所述可信区和非可信区中的指令定义被允许的操作;确定当前指令是位于所述可信区中还是位于所述非可信区中;以及基于所述当前指令所在的区以及为这一区中的指令所定义的允许操作,确定所述当前指令所定义的操作是否被允许执行。
根据本发明的另一方面,提供了一种方法,包括将分配给应用的代码空间划分成可信区和非可信区;将分配给所述应用的数据空间划分成可信区和非可信区;基于请求存储器访问的代码在所述代码空间中的位置以及与所述存储器访问相关的数据在所述数据空间中的位置,定义可允许的存储器访问操作;确定发出存储器访问请求的代码的位置以及被请求访问的数据的位置;以及基于请求所述存储器访问的代码的位置以及被请求访问的数据的位置,如可允许的存储器访问操作所定义的那样,确定所述存储器访问请求是否将被允许。
根据本发明的又一方面,提供了一种处理器,包括指令指针;以下之一,代码空间SRR寄存器,该寄存器存储代码空间的可信区偏移或者指向所述代码空间的所述可信区偏移的指针之一,所述可信区偏移定义了所述代码空间中在可信区和非可信区之间的边界;或者,两个代码空间安全区寄存器(SRR)寄存器,所述两个寄存器存储的数据指定了与所述代码空间的所述可信区相对应的地址范围;实行代码序列真值表的机制,其中所述代码序列真值表定义了与存储在所述代码空间的所述可信区和所述非可信区中的指令相对应的可允许和不允许的指令序列;以及响应于检测到不允许的指令序列而投出安全陷阱的机制。
根据本发明的另外一方面,还提供了一种处理器,包括代码段寄存器;数据段寄存器;指令指针;代码段安全区寄存器,也被称为代码段SRR寄存器,该寄存器存储代码段的可信区偏移或指向所述代码段的所述可信区偏移的指针之一,所述可信区偏移定义了所述代码段中在可信区和非可信区之间的边界;数据段SRR寄存器,该寄存器存储数据段的可信区偏移或指向所述数据段的所述可信区偏移的指针之一,所述可信区偏移定义了所述数据段中在可信区和非可信区之间的边界;实行存储器访问真值表的机制,其中所述存储器访问真值表对应于请求所述存储器访问的代码在所述代码段中的位置以及被请求进行存储器访问的数据在所述数据段中的位置,定义了可允许的和不允许的存储器访问操作;以及响应于检测到不允许的存储器访问操作而投出安全陷阱的机制。
根据本发明的又一方面,提供了一种系统,包括主板,该主板至少包括一个可安装存储器的套接口;以及耦合到所述主板的处理器,所述处理器包括指令指针;以下之一,代码空间SRR寄存器,该寄存器存储代码空间的可信区偏移或者指向所述代码空间的所述可信区偏移的指针之一,所述可信区偏移定义了所述代码空间中在可信区和非可信区之间的边界;或者,两个代码空间SRR寄存器,所述两个寄存器存储的数据指定了与所述代码空间的所述可信区相对应的地址范围;实行代码序列真值表的机制,其中所述代码序列真值表定义了与存储在所述代码空间的所述可信区和所述非可信区中的指令相对应的可允许和不允许的指令序列;以及响应于检测到不允许的指令序列而投出安全陷阱的机制。


结合附图,参考以下详细的描述,本发明的以上方面以及相关优点将变得更加容易明白,同时将更好地得到理解,其中除非特别指出,否则在不同的图中,相同的标号代表相同的部分图1是根据本发明一种实施方案的存储器分区方案的示意图,该方案将代码空间和数据空间划分成可信区和非可信区;图2a是根据本发明一种实施方案的存储器访问真值表的图,该表与图1中的存储器分区方案一同实施;图2b是根据本发明一种实施方案的代码序列真值表的图,该表与图1中的存储器分区方案一同实施;图3a是根据本发明一种实施方案的处理器体系结构的示意图,该体系结构经由一组范围寄存器和安全区寄存器(SRR)寄存器而支持图1的存储器分区方案的各方面;图3b是根据本发明一种实施方案的处理器体系结构的示意图,该体系结构经由一组SRR寄存器而支持图1的存储器分区方案的各方面;图3c是根据本发明一种实施方案的处理器体系结构的示意图,该体系结构经由一组段寄存器和SRR寄存器而支持图1的存储器分区方案的各方面;图4a的示意图进一步图示了图3a的体系结构的细节,其中范围寄存器被用来使用线性编址定义代码空间和数据空间的基地址和偏移地址,SRR寄存器被用来定义在代码和数据空间的可信区和非可信区之间的边界的位置;图4b的示意图进一步图示了图3b的体系结构的细节,其中SRR寄存器被用来使用线性编址定义代码空间和数据空间的可信区的起始地址和结束地址;图4c的示意图进一步图示了图3c的体系结构的细节,其中段寄存器被用来使用分段编址定义代码段和数据段的基地址和偏移地址,SRR寄存器被用来定义在代码段和数据段的可信区和非可信区之间的边界的位置;
图5是图示了图1的存储器分区方案的示例性实现方式的示意图;图6a是图示了根据本发明的一种实施方案,在非可信存储器访问过程中基于所述存储器分区方案所执行的操作和逻辑的流程图;图6b是进一步图示了图6a中的非可信存储器访问过程的细节;图7是扩展Java框架的示意图,该框架进一步包括被用于应用安全策略的动态验证器,所述安全策略确定某些存储器和代码访问是否被允许;图8是根据本发明一种实施方案的、可允许的存储器访问的示意图,所述可允许的存储器访问包括安全指令访问非可信存储器;图9是根据本发明一种实施方案的、可允许的存储器访问的示意图,所述可允许的存储器访问包括安全指令访问可信存储器;图10是根据本发明一种实施方案的、可允许的存储器访问的示意图,所述可允许的存储器访问包括不安全的指令访问非可信存储器;图11a是图示了根据本发明的一种实施方案,在非可信代码序列过程中基于所述存储器分区方案而执行的操作和逻辑的流程图;图11b是进一步图示了图11a中的非可信代码序列过程的细节的示意图;图12是根据本发明的一种实施方案,进一步包括非可信区的信任粒度(granularity)的存储器分区方案的示意图;以及图13是其上可以实现本发明的各个实施方案的示例性计算机系统的示意图。
具体实施例方式
这里描述的是用于支持与非可信代码一起运行的类型安全语言环境的方法、装置和系统的实施方案。在以下描述中,阐述了很多具体的细节,以提供对本发明的实施方案的完整理解。但是本领域的技术人员将会认识到,没有这些具体细节中的一个或多个细节,或者利用其他方法、组件、材料等也可以实现本发明。此外,没有详细示出或描述公知的结构、材料或操作,以免模糊了本发明的各个方面。
在这篇说明书中提及“一种实施方案”或者“实施方案”是指与该实施方案相关描述的具体特征、结构或特性被包括在本发明的至少一种实施方案中。因此,短语“在一种实施方案中”或者“在实施方案中”在这篇说明书中不同地方的出现不一定都是指同一实施方案。此外,可以在一种或多种实施方案中,以任何适当的方式将具体的特征、结构或特性组合起来。
根据这里描述的实施方案的各个方面,公开了用于支持实现非安全代码扩展的类型安全语言环境的技术。如在此所使用,在这些环境中实现的软件被称为NUT(非一致可信)软件,它指的是从具有不同级别可信度的组件中创建的软件包。
NUT软件的潜在有害行为在受管理的运行时间环境中变得愈发显著,所述受管理的运行时间环境例如是Java和CLI(公共语言基础结构,被用在微软公司的.NET编程框架中)。这些环境主要是基于类型安全编程语言,例如Java和C#。类型安全性要求运行时间系统至少提供以下保证存储器安全性这意味着应用代码只可以进行“合法的”存储器访问。这暗示了它不能访问未分配的存储器区域,并且不能读取已被初始化的变量。这还意味着它不能用不兼容类型的值来更新变量,例如将一个浮点值写入整数变量;以及控制流安全性这意味着应用代码不能跳到任意的存储器位置,而只能跳到定义明确的入口点。这还意味着返回地址无法被仿造。
为了保证这些性质,类型安全语言必须禁止在诸如C和C++的不安全语言中可能存在的某些操作。这方面的例子包括指针算术运算、取得变量的地址、比特“弹拨”(bit fiddling)等等。另一方面,这些操作经常为低级系统功能所需要。因此,这些语言提供了一种机制(在Java中,这被称为本机方法接口),该机制让类型安全程序调用代码用不安全(例如,非类型安全的)语言来编写。用不安全语言编写的代码通常被称为本机码(native code)(但这不应该与本机机器码(native machine code)混淆,其中不安全语言最终被编译为本机机器码)。
即使并非全部,也是在绝大多数情况下,用类型安全语言编写的企业级应用使用本机码来访问系统功能。继而,这用可信组件和非可信组件的混合创建了一个软件包。虽然类型安全的部分被机械地验证并保证是安全的,但是本机码却得不到这样的保证。
任何应用仅与其最弱的链接一样安全。结果,NUT软件通常都通过它的非可信组件而受到损害。举例来说,类型安全的Java应用可以很容易地被损坏的本机码暗中破坏;编程语言的内置安全性在这里没有用。
根据一种实施方案,通过实施存储器分区方案来解决代码安全性,其中可信的类型安全代码以及该代码所操作的数据与非可信的非类型安全代码相互隔离。在一种实施方案中,存储器分区方案将代码和数据划分到独立的地址空间中,然后将这些地址空间再划分为可信区和非可信区。例如,图1示出了根据本发明一种实施方案的存储器分区方案,其中代码空间100和数据空间102中的每一个都被划分为可信区和非可信区。总地来说,代码空间100和数据空间102中的每一个占据了处理核(例如微处理器)可访问的存储器地址空间中的独立地址范围。在一种实施方案中,存储器地址空间是平坦(即,线性)地址空间,可以使用虚拟地址方案、物理地址方案或者以上两者的组合来对该空间进行编址。在另一种实施方案中,存储器地址空间采用分段地址方案。
在代码空间100和数据空间102的每一个中,非可信区占据着空间地址范围中从(相应空间的)基地址到可信区偏移(地址)之间的部分,而可信区占据着地址空间中从可信区偏移到所述空间的上限地址的部分。因此,可信区偏移代表了可信区和非可信区之间的边界。占据代码空间100的非可信区的指令被视为不安全的,因而非可信的,而占据代码空间的可信区的指令被视为安全的,因而可信的。类似地,占据数据空间102的非可信区的数据被视为非可信的,而占据数据空间的可信区的数据被视为可信的。
下面描述的技术适用于两类处理操作1)存储器(即,数据)访问;和2)代码排序。在图2a中示出了根据一种实施方案的存储器访问真值表200。所述真值表包含两列代码列和数据列。代码列表示被执行来引起存储器访问的代码的类型(即,可信的或非可信的)。数据列表示占据存储器地址空间中正被访问部分的数据的类型。
如存储器访问真值表200所示,可信代码(即存储在代码空间100的可信区中的指令)被允许直接访问数据空间102中存储的任何数据。另外,尽管非可信代码被允许直接访问数据空间102中存储的非可信区的数据,它不能直接访问在数据空间102的可信区中的数据。可替代地,首先应用安全策略来确定是否允许该存储器访问。
图2b中所示的代码序列真值表202具有相似的逻辑。在这个实例中,第二列(N)标识出当前(即,第N条)指令的信任类型,而第一列(N-1)标识出在当前指令之前的指令的信任类型。真值表逻辑如下。在可信指令之后的任何类型的指令被允许直接执行。类似地,在另一条非可信指令之后的非可信指令被允许直接执行。然而,在非可信指令之后的可信指令在不首先应用安全策略的情况下,不被允许执行。根据安全策略的结果,指令序列可能被允许,也可能不被允许继续前进。
剩余的描述和附图都和在图1、2a和2b中图示的数据访问和代码执行方案的更具体实现方式相关。总地来说,对于使得数据和代码能够占据各自地址空间的处理器而言,都可以实现所述方案。出于图示说明的目的,以下实施例定义了专用名称寄存器的使用,这些寄存器可被用在一个或多个具体的处理器中。然而将会理解,这不是限制性的,因为这里所描述的原理和技术可应用于采用不同寄存器配置的处理器。
图3a中示出了用于示例性处理器300的基本执行体系结构(有关存储器访问和通用指令执行)的一部分。所述体系结构提供了各种基本程序执行寄存器,以供在通常的系统和应用编程中使用。这些寄存器被分组为一组通用寄存器302、一组范围寄存器304、一组安全区寄存器(SRR)寄存器306、程序状态和控制寄存器(EFLAGS)308和EIP(指令指针)寄存器310。通用寄存器302可用于存储操作数和指针。范围寄存器304用于映射存储器地址空间312中的代码和数据空间,下面将更详细地解释。在EFLAGS寄存器308中的位被用来报告有关正在被执行的程序的状态,并且实现对处理器的有限(应用程序级的)控制。EIP寄存器310包含指向将要执行的下一指令的指针。在一种实施方案中,所述体系结构还包括存储器执行单元(MEU)314。
处理器在其总线上寻址的存储器被称为物理存储器。物理存储器被配置为物理地址空间(这里也被称为存储器地址空间),该空间具有总地跨越在等于0的基地址和上限地址空间之间的地址范围,所述上限地址空间取决于(当采用物理编址方案时)被用来访问物理存储器的位的数量。例如,32位编址的物理地址空间的范围从0一直到232-1的最大值(4Gbytes)。类似地,64位编址的物理地址空间的范围从0一直到264-1的最大值。
在一些情况下,操作系统(OS)或者执行程序将使用处理器的存储器管理机构来访问存储器。在一些实施方案中,这些机构提供诸如分段和分页的特性,这使得存储器可被有效并可靠地管理。在其他情况下,从OS中提取出基本的物理编址方案,其中使用虚拟地址方案来引用所有的存储器地址。至少部分地由MEU312来执行用于支持这些类型功能的存储器翻译操作。当采用处理器300的存储器管理机构时,程序并不直接对物理存储器进行寻址。相反,它们使用一种或多种存储器模型来访问存储器,例如平坦、分段或实际地址模式。
在平坦存储器模型中,如地址空间312所示,存储器对于程序而言看起来像单个连续的地址空间,被称为线性地址空间。代码、数据和过程堆栈全都包含在这个地址空间中。线性地址空间是字节可寻址的,地址从0一直持续到上限(例如,对于32位而言是232-1,对于64位而言是264-1)。用于线性地址空间中任何字节的地址都被称为线性地址。
图3b的实施方案图示了图3a中配置的一种改变。在这个实施方案中,处理器300B包括一组SRR寄存器307,其中包括被用来定义代码空间和数据空间的地址范围的各对起始和结束SRR寄存器。
除了使用平坦存储器模型外,各实施方案还可以使用分段存储器模型来实现。例如,图3c中的处理器300c具有被配置为支持分段存储器的体系结构。该体系结构与图3a中的上述结构类似,除了用段寄存器305替换范围寄存器304以外。
根据各实施方案进一步的各个方面,现在公开用于为使用线性存储器地址模型和分段存储器模型两者的NUT软件安全地管理执行和存储器访问的技术。总地来说,所述实施方案采用的寄存器机构图示了可被用来存储与所述实施方案的操作有关的信息的示例性寄存器。将会理解的是,这里所描述的特定寄存器的功能也可以用其他类型的寄存器来完成。此外,现有的及未来的处理器体系结构可被用来支持这里所描述的对安全的执行和存储器访问操作的管理。
图4a中所描绘的体系结构400A示出了图3a的范围寄存器304和SRR寄存器306如何被用来映射代码和数据空间中的可信区和非可信区的进一步细节。(为清楚起见,图4a-c的实施方案仅示出了范围寄存器或者段寄存器和/或SRR寄存器。将会理解的是,这些体系结构的实施方案在适当的地方进一步包括图3a和3b中所示出的组件。)范围寄存器304包括代码空间(CS)基址寄存器402、CS偏移寄存器404、数据空间(DS)基址寄存器406和DS偏移寄存器408。正如它们的名字所暗示的那样,CS基址寄存器402存储代码空间410的基地址,而CS偏移寄存器404存储代码空间410的范围偏移量(即,大小)。类似地,基址寄存器406存储数据空间412的基地址,而DS偏移寄存器408存储数据空间412的范围偏移量(即,大小)。
在图3a和4a的实施方案中,SRR寄存器306被用于存储在代码和数据空间中将可信区与非可信区分割开的边界的位置。这些包括CS-SRR寄存器414和DS-SRR寄存器416。CS-SRR寄存器414被用来为对应于代码空间410的地址空间定义可信区偏移418。类似地,DS-SRR寄存器416被用来为对应于数据空间412的地址空间定义可信区偏移420。总之,CS-SRR寄存器414和DS-SRR寄存器416的位宽度可以根据具体的分区方案以及所期望的地址粒度而变。在一种实施方案中,CS-SRR寄存器414和DS-SRR寄存器416是16位寄存器。此外,存储在CS-SRR寄存器414和DS-SRR寄存器416每一个当中的值可以包括线性偏移、倍乘偏移、或者指向线性偏移或倍乘偏移的存储位置的指针。
图4b中所描绘的体系结构400B示出了图3b的SRR寄存器307被用于映射代码和数据空间中的可信区的进一步细节。SRR寄存器包括可信代码空间(TCS)起始SRR寄存器430和TCS结束SRR寄存器432,其中TCS起始SRR寄存器430被用来定位代码空间410的可信区的起始处,而TCS结束SRR寄存器432被用来定位可信代码空间区的结束处。类似地,可信数据空间(TDS)起始SRR寄存器434被用来定位数据空间412的可信区的起始处,而TDS结束SRR寄存器436被用来定位可信数据空间区的结束处。
图4c中示出的体系结构400C图示了图3c的分段存储器实施方案的进一步细节。这个实施方案大致类似于图4a的实施方案,除了用段寄存器305取代了范围寄存器304之外。在图示的实施方案中,段寄存器对应于IA-32体系结构处理器的段寄存器,并且包括代码段(CS)、数据段(DS)、堆栈段(SS)和其他段寄存器ES、FS和GS。然而,这仅仅是示例性的,也可以使用其他的段寄存器体系结构。
使用分段存储器模型,存储器对于程序而言看起来像一组被称为段的独立地址空间。当使用这种模型时,代码、数据和堆栈一般都包含在单独的段中。为了寻址某个段中的一个字节,程序发出逻辑地址,该地址由段选择子(selector)和偏移组成。(逻辑地址通常被称为远指针。)段选择子标识出所要访问的段,而偏移则标识出在所述段的地址空间中的一个字节。在一些实施方案中,段可以被定义为具有不同的大小和类型。
内在地,为一个系统定义的所有段都被映射到处理器的线性地址空间中。为了访问一个存储器位置,处理器因而要将每一个逻辑地址翻译成线性地址。这个翻译过程对于应用程序而言是透明的。
当使用分段存储器模型时,一般用不同的段选择子来加载每个段寄存器,使得每个段寄存器指向线性地址空间中的不同段。为了访问未被段寄存器之一指向的段,程序必须首先将用于所要访问的段的段选择子加载到段寄存器中。
IA-32段寄存器(CD、DS、SS、ES、FS和GS)保存16位的段选择子。段选择子是标识出存储器中某个段的特殊指针。为了访问存储器的特定段,用于该段的段选择子必须存在于适当的段寄存器中。当编写应用代码时,程序员一般用汇编命令和符号来创建段选择子。汇编器和其他工具然后创建与这些命令和符号相关联的实际段选择子值。
每一个段寄存器都与三类存储之一相关联代码、数据或堆栈。例如,CS寄存器包含用于代码段的段选择子,在该寄存器中存储正在执行的指令。处理器使用由CS寄存器中的段选择子和EIP寄存器中的内容组成的逻辑地址,从代码段中取回指令。EIP寄存器包含着所要执行的下一指令的代码段内的偏移。
在图3c和4c的实施方案的技术中,代码空间由代码段450来定义,所述代码段450具有基地址和由距离基地址的偏移量所指定的上限。类似地,数据空间由数据段452来定义,所述数据段452具有基地址和由距离基地址的偏移量所指定的上限。代码段(CS)寄存器454被用来定位代码段450。更具体地,CS寄存器454中的值包含着指向以下数据结构的指针(全局描述符表(GDT)条目——未示出),所述数据结构包含代码段450的基地址并且定义了所述代码段的上限(大小)。类似地,数据段(DS)寄存器456中的值包含了指向GDT条目的指针,所述GDT条目包含数据段452的基地址和大小。
和图3a和4a的实施方案一样,CS-SRR寄存器414通过定义距离代码段450的基地址的可信区偏移418,被用来定位代码空间的可信区和非可信区之间的边界。类似地,DS-SRR寄存器416被用来定义距离数据段452的基地址的可信区偏移420。
在一种实施方案中,具有给定信任级的代码被允许直接访问具有相同信任级的数据。另外,具有更高信任级的代码被允许直接访问具有较低信任级的数据。然而,在一种实施方案中,不允许具有较低信任级的代码直接访问具有较高信任级的数据。相反,执行线程被引导来调用安全策略组件,该组件被用来确定是否允许存储器访问或代码序列操作继续。
对于以下实施例,将使用在图5中示出的代码和存储器使用情形。在这种配置下,存储器被分配为代码空间500和数据空间502。代码空间包括可信区504和非可信区506。类似地,数据空间包括可信区508和非可信区510。
正如其名称所暗示的那样,可信代码(即指令)被加载到代码空间的可信区中。在一种实施方案中,可信代码将包括由类型安全语言(例如,但不限于Java或C#)生成的代码。例如,应用代码512可以包括Java小应用程序或应用程序。同时,非可信代码被加载到代码空间的非可信区中。典型地,非可信代码将包括用不安全语言编写的代码,例如但不限于C、C++和汇编语言。另外,非可信代码可以包括由第三方编写的代码,例如动态链接库。如图5所示,在这个实施例中的非可信代码包括用于两个DLL的代码,包括DLL-1代码514和DLL-2代码516,还有本机码模块518。
当启动应用的一个实例时,操作系统将为该实例分配代码和数据空间。在未分段存储器的情况下,代码空间和数据空间将包括用于系统存储器的线性地址空间的若干部分。在存储器分段的情况下,操作系统将为所述实例分配代码和数据段。因此,代码空间500将对应于被分配给所述应用的代码空间(线性编址)或代码段(分段编址),而数据空间502将对应于被分配给所述应用的数据空间(线性编址)或数据段(分段编址)。在传统的方案下,使用全局描述符表(GDT)中由CS寄存器值(即,CS段选择子)标识的条目来指定代码段的大小以及该代码段的基地址。因而从基地址加上所述大小的结果导出对应于代码段上限的逻辑地址。在这里所教导的存储器分区技术的一种实施方案下,用于代码空间的可信区偏移的值也由操作系统来分配,并被存储在CS-SRR寄存器414中,而用于数据空间的可信区偏移的值也被分配并存储在DS-SRR寄存器416中。在一种实施方案中,应用框架(例如JVM)提供了一种用于定义代码段的哪些部分由可信区和非可信区来占据的手段。
对于未分段存储器的实现方式而言,代码空间和数据空间包括物理存储器地址空间的线性部分。由此,在图3a和4a的体系结构下,定义了代码空间和地址空间的起始和结束地址的数据被加载到范围寄存器304中。例如,代码空间的基地址被加载到CS基址寄存器402中,而代码空间的范围偏移被加载到CS偏移寄存器404中。然后用代码空间的可信区偏移来加载CS-SRR寄存器414,同时用数据空间的可信区偏移来加载DS-SRR寄存器416。
在图3b和4b的体系结构下,定义了代码和数据空间的可信区的起始和结束地址的数据被加载到SRR寄存器307中。例如,用于代码空间的起始地址被加载到TCS起始SRR寄存器530中,而用于代码空间的结束地址被加载到TCS结束SRR寄存器532中。
按照和代码空间存储器的分配相似的方式,由可信代码进行操作的数据被存储在数据空间的可信区中,如应用数据520所示。类似地,由非可信代码进行操作的数据被存储在数据空间的非可信区中,如DLL-1数据522、DLL-2数据524和本机码模块数据526所示。
在各种实施方案下,存储在SRR寄存器中的可信区偏移值被用来确定正在被执行的指令何时被定位在可信区或非可信区中。类似地,在这些寄存器中的信息被用来确定对应于一个数据事务的存储器访问请求是否包括访问数据空间的可信区或者非可信区。在一种实施方案中,响应于检测到非可信存储器访问事件或代码序列,投出一个SAP(安全访问保护)陷阱。在一种实施方案中,基于图2a和2b所示的真值表逻辑来确定是否投出SAP陷阱。
在图6a中示出了根据一种实施方案与响应于非可信存储器访问事件而执行的操作相对应的流程图。在图6b中示出了根据一种实施方案图示了如何实现所述流程图的操作和逻辑的示意图。
过程开始于框600,其中非可信代码正在执行。例如,假设包括一部分本机码模块518的指令正在执行。在这里所使用的术语中,占据代码空间的非可信区的代码被称为“不安全”指令。类似地,占据代码空间的可信区的代码被称为“安全”指令。当非可信代码正在执行时,用指向不安全指令的指针来加载EIP寄存器310,所述不安全指令例如是图6b中所示的不安全指令601。(为方便起见,指令在这里仿佛被载入EIP寄存器一样被引用。将会理解的是,EIP寄存器实际上包含指向代码段中将要执行的下一指令的指针。)指令执行什么类型的操作都无关紧要,它是否安全的定义完全取决于它被存储在哪个区中。
在框602中,指向要访问可信区中的存储器的不安全指令603的指针被加载到EIP寄存器310中。例如,假设在本机码模块518中的指令对应于具有被映射到应用数据520的地址的存储器访问,所述应用数据520占据着数据空间502的可信区508。在一种实施方案中,当每个指令指针被加载到EIP寄存器中时,执行检查以确定所述指令是否对应于存储在代码空间的可信区或非可信区中的代码。在一种实施方案中,这是通过比较所述指令的分段地址的偏移(即,基段地址+偏移)与存储在CS-SRR寄存器中的可信区偏移值而进行的。如果偏移大于CS-SRR寄存器值,则指令是可信的。如果不是,则指令是非可信的。
在对应于图3b和4b的另一种实施方案中,进行检查以确定不安全指令是否位于代码空间500的可信区504内。将所述指令的地址与代码空间的可信区的起始地址和结束地址做比较,以确定它是否落入被分配给可信代码空间区的地址范围内。
在一种实施方案中,对应于代码和存储器使用情况的处理状态信息被保存在EFLAGs寄存器308中。在传统的IA-32体系结构中,这个寄存器的第1、3、5、15位以及第22-31位被保留。由此,这些保留位中的任何位都可以实现在扩展IA-32体系结构中,而不会影响正常的IA-32操作。在一种实施方案中,第30位被用来存储指令信任信息,而第29位被用来存储存储器访问信任信息。
如图6b所示,当指向不安全指令603的指针被载入时,对CS-SRR寄存器414进行检查,以确定下一指令被认为是安全的还是不安全的。作为响应,EFLAGs寄存器308中的第30位被置位(不安全的)或者被清零(安全的)。
如图6b接下来的处理所示,图3a-c的体系结构的各种实施方案采用流水线式的体系结构。这所要做的是允许多个流水线式操作被并行实现。一种这样的操作和存储器访问有关。当处理存储器访问指令时,该存储器的逻辑地址被提供给MEU314,MEU314将逻辑地址翻译成它的物理地址,从而可以由处理器从地址空间312对它进行访问。作为这一过程的一部分,在一种实施方案中,针对存储在DS-SRR寄存器416中的用于数据空间的可信区偏移值来检查对应于数据访问请求的存储器地址605。如果所述地址对应于被映射到数据空间的非可信区地址,则EFLAGs寄存器308的第29位被置位;否则要是所述地址对应于数据空间的可信区,则使得第29位被清零。根据图3b和4b的实施方案,将用于数据访问请求的地址与用于数据空间中的可信区的起始地址和结束地址进行比较,以确定所请求的数据是否存在于数据空间的可信区中。
在一种实施方案中,第30和29位[1,0]值的组合将产生SAP陷阱。在一种实施方案中,通过观测第30和29位值的组合来报知所述陷阱。在另一种实施方案中,通过置位EFLAGS寄存器308的虚拟中断未决(VIP)标志(第20位)而报知所述陷阱。在以上任何一种情形中,目的都是生成虚拟中断。在图6a的框604中示出了投出SAP陷阱的操作。
总地来说,现今的处理器支持两种类型的中断物理中断和虚拟中断。物理中断对应于由(经由适当的总线)耦合到处理器的硬件设备生成的中断。这使得硬件设备能够请求处理器的服务。虚拟中断对应于由软件生成的中断,即响应于代码指令的执行而生成的中断。
在一种实施方案中,处理器体系结构支持虚拟中断处理程序的注册,并且将对应的指令重定向信息存储在虚拟中断向量表607中。虚拟中断向量表中的每个条目都将一种虚拟中断事件类型映射到对应中断处理程序的首指令。在当前的实施例下,中断事件类型是SAP陷阱,并且中断处理程序被称为“动态验证器”。因此,响应于框604中的SAP陷阱,通过将动态验证器的起始地址加载到EIP寄存器310中,执行线程在框606中被重新定向到动态验证器。
总地来说,动态验证器应当是一个可信模块。因此,它应当由可信组件来注册。在一种实施方案中,动态验证器由应用的可信部分来注册。这可以通过将动态验证器的首指令的地址存储在距离可信数据空间的起始处一个已知的偏移处而完成。当生成SAP陷阱时,处理器将执行重新定向到动态验证器,而不必改变特权级别。在另一种实施方案中,动态验证器由操作系统使用类似于中断描述符表(IDT)的机制来注册。当执行被重定向到动态验证器时,处理器可以改变特权级别。
在又一种实施方案中,动态验证器是虚拟机的一部分,并与加载虚拟机一起被注册。例如,图7示出了与基于Java的实施方案相对应的处理框架。该框架包括被划分为可信Java应用700和非可信本机码702的代码。Java应用和本机码的执行由Java虚拟机(JVM)704来管理,而JVM704又运行在处理器上。正如本领域所公知的那样,虚拟机是通过几个组件来实现的,例如即时(JIT)编译器706和垃圾收集器708。其他标准JVM组件由框710绘出。JVM704还包括动态验证器712。在一个方面中,动态验证器包括Java中SecurityManager(安全管理器)级用硬件实现的扩展。
返回图6a的流程图,在框610中,将非可信代码原先试图访问的变量的地址提供给动态验证器。动态验证器然后基于它所施行的预定义的安全策略来决定所述访问是否应被允许。如判决框612所示,如果访问是合法的,则根据框614,执行从SAP出错指令处继续前进,允许存储器被访问。如果所述访问被安全策略确定为非法的,则在框616中发出一个存储器访问例外。然后,在框618中通过使用适当的例外处理程序来处理这个例外。
在图8、9和10中示出了可允许的存储器访问过程的实施例。例如,图8图示了可信代码被允许访问存储在数据空间的非可信区中的数据的场景。该过程从执行与存储在代码空间的可信部分中的应用或模块(例如应用代码512)相对应的安全指令开始。这是通过安全指令800来描绘的。将被加载到EIP寄存器310中的下一指令是与对存储在数据空间502的非可信区510中的数据的存储器访问相对应的安全指令802。作为响应,CS-SRR寄存器414检查指示出所述指令是安全的,并且EFLAGs寄存器308的第30位被清零。接下来,根据由MEU314执行的存储器地址操作804,DS-SRR寄存器416检查指示出所述存储器访问是针对数据空间的非可信区中的地址。由此,EFLAGs寄存器308的第29位被置位。根据图2a的真值表,在寄存器30和29中的
值对应于可允许的操作。因此,VIP位20被清零,不投出SAP陷阱,并且所述存储器访问操作被允许进行。
在图9中所示的场景中,可信代码被允许访问存储在数据空间的可信区中的数据。该过程从执行与存储在代码空间的可信部分中的应用或模块相对应的安全指令(如安全指令900所示)开始。将被加载到EIP寄存器310中的下一指令是与对存储在数据空间502的可信区508中的数据的存储器访问相对应的安全指令902。作为响应,CS-SRR寄存器414检查指示出所述指令是安全的,并且EFLAGs寄存器308的第30位被清零。接下来,根据由MEU314执行的存储器地址操作904,DS-SRR寄存器416检查指示出所述存储器访问是针对数据空间的可信区中的地址。由此,EFLAGs寄存器308的第29位也被清零。根据图2a的真值表,在寄存器30和29中的
值对应于可允许的操作。因此,不投出SAP陷阱,并且所述存储器访问操作被允许进行。
在图10中所示的场景中,非可信代码被允许访问存储在数据空间的非可信区中的数据。该过程从执行与存储在代码空间的非可信部分中的模块(例如,本机码或DLL)相对应的不安全指令(如不安全指令1000所示)开始。将被加载到EIP寄存器310中的下一指令是与对存储在数据空间502的非可信区510中的数据的存储器访问相对应的不安全指令1002。作为响应,CS-SRR寄存器414检查指示出所述指令是不安全的,并且EFLAGs寄存器308的第30位被置位。接下来,根据由MEU314执行的存储器地址操作1004,DS-SRR寄存器416检查指示出所述存储器访问是针对数据空间的非可信区中的地址。由此,EFLAGs寄存器308的第29位也被置位。根据图2a的真值表,在寄存器30和29中的[1,1]值对应于可允许的操作。因此,不投出SAP陷阱,并且所述存储器访问操作被允许进行。
如上所述,某些代码序列也可能导致SAP陷阱。例如,在一种实施方案中,如果不先应用安全策略,则从非可信代码到可信代码的序列不允许进行。在图11a和11b中分别示出了对应于这一代码序列的流程图和示意图。
该过程从框1100开始,其中执行包括不安全指令1101的非可信代码。在框1100之后,将不安全指令1103加载到EIP寄存器310中,所述不安全指令1103使得执行线程被定向到可信区中的代码。例如,这一状况可能由调用或跳到可信区中的指令而产生,或者可能只是由在非可信本机码过程或子例程结束时发出的返回指令而产生的。如前所述,CS-SRR寄存器414检查的结果由EFLAGs寄存器308的第30位值来指示。除了对当前指令的CS-SRR寄存器414检查值外,对紧邻当前指令之前的指令的CS-SRR寄存器检查值也被存储在EFLAGs寄存器308中。在一种实施方案中,这个值被存储在EFLAGs寄存器的第31位中。
就在指向不安全指令1103的指针一旦被加载到EIP寄存器310后,这产生了对应于时间实例的EFLAGs寄存器配置1105。在这种EFLAGs寄存器配置中,对应于两条不安全指令的执行序列,第31和30位都被置位。根据图2b的代码序列真值表,如果第31和30位的值是[1,1],则操作被允许,并且对应于EFLAGs寄存器308的第20位的VIP标志被清零。这一操作被允许进行。
继执行序列之后,定向到可信区中的指令将会使得用于下一指令的指针被加载到EIP寄存器310中,该指针将指向代码空间的可信区中的地址。这一指令被描绘为安全指令1107。再次,一旦将这一指令指针加载到EIP寄存器310中,则执行CS-SRR寄存器检查。在这个实例中,所述指令处于可信区中,因此第30位被清零。就在更新第30位的值之前,第30位的前一值被左移一位,移到第31位。如上所述,这代表前一指令的代码信任类型。这导致了EFLAGs寄存器配置1109。
在这种配置下,第31和30位的值是[1,0]。如图2b的代码序列真值表所定义的,这代表了需要安全策略评估的非可信序列。因此,VIP位20被置位,以告知处理器一个未决的SAP陷阱,如图11a的流程图的框1104中所示。响应于SAP陷阱,按照大体上类似于上面针对非可信存储器访问所讨论的方式来执行操作。
首先,在框1106中,执行线程被重新定向到动态验证器712。在框1108中,动态验证器应用其针对代码序列的安全策略。在一种实施方案中,识别出使执行线程被定向到可信区中的指令。例如,由非可信DLL或本机码模块发起的动作可能会试图调用或跳到可信区中的指令。这一般会产生有问题的结果,因此这一类型的访问可能会在安全策略的一种实施方案下被拒绝。同时,所述定向可能仅仅会针对从包括本机码或DLL的调用子例程或过程的返回而发生。在这种条件下,期望定向回代码空间的可信区,并且所述定向代表了正常的代码序列。在一种实施方案下,这一类型的代码序列是合法的。
如果所述序列被视为合法的,如判决框1110所示,则指令序列被允许前进,从出错指令处继续。如果所述序列是非法的,则在框1114中发出代码访问例外,并且在框1116中由适当的例外处理程序来处理所述例外。
除了将代码空间和数据空间划分成可信区和非可信区的存储器分区方案之外,通过进一步将非可信区划分为具有不同信任级的子区,可以实现额外的信任粒度。例如,图12示出了代码空间1200的存储器分区方案,其包括可信区1202和非可信区1204。按照上述实施方案中所使用的类似方式,用可信区偏移来定义这些区之间的边界。然而,非可信区被进一步划分成具有不同信任级的三个子区第1级、第2级和第3级。在图示的实施方案中,第1级和非可信区1204中最可信的代码有关,而第2级代码不那么可信,第3级代码最不可信。
在一种实施方案中,从处理器的角度看,支持图12的实施方案的操作与上面讨论的那些实施方案是一样的——它不知道非可信区的进一步划分。相反,分区是由软件完成的,或者更具体地说,是由动态验证器完成的。当执行线程被交给动态验证器时,它通过执行地址定位检查来确认出错指令被指派给哪一个信任级。在一种实施方案中,动态验证器(和/或应用或操作系统)保存一份非可信区查找表,该表定义了非可信区中由相应的级占据的每一子区的偏移。举例来说,在对代码空间1200的配置下,所述查找表将保存第1级和第2级偏移。
在这种方案下,动态验证器可以对驻留在不同信任级处的代码施行不同的访问策略。由于动态验证器是软件实体,所以所述方案是非常灵活的。可以由软件设计者来选定信任级的粒度,使得信任区的连续性能够得到支持。此外,可以对数据空间施行类似的分区方案。如前所述,这种进一步的分区对于处理器操作是透明的,它是由动态验证器来处理的。
图13图示了实现本发明上述实施方案的示例性计算机系统1300的实施方案。计算机系统1300一般代表了各种类型的计算机设备,包括个人计算机、膝上型计算机、工作站、服务器等。为简化起见,这里只讨论计算机系统的基本组件。计算机系统1300包括机箱1302,其中容纳着各种组件,包括软件驱动器1304、硬盘1306、电源(未示出)和主板1308。硬盘1306可以包括单个单元或者多个单元,并且可选地可以存在于计算机系统1300之外。主板1308包括经由适当的总线和/或芯片组元件与一个或多个处理器1312相互通信耦合的存储器1310。存储器1310可以包括但不限于动态随机访问存储器(DRAM)、静态随机访问存储器(SRAM)、同步动态随机访问存储器(SDRAM)、Rambus动态随机访问存储器(RDRAM)等。处理器1312可以是传统的微处理器,包括但不限于CISC(复杂指令集计算机)处理器或RISC(精简指令集计算机)处理器,所述CISC处理器例如是Intel公司的x86、Pentium或者Itanium系列微处理器,Motorola系列微处理器,所述RISC处理器例如是SUN SPARC处理器等。总之,处理器1312将具有与这里所描述的扩展处理器体系结构之一相对应的结构。
监视器1314被包括进来,用于显示由计算机系统1300运行的软件程序和程序模块所生成的图形和文本。鼠标1316(或者其他指示设备(pointing device))可被连接到串行端口、USB(通用串行总线)端口或者通信地耦合到处理器1312的类似总线端口。键盘1318以类似于鼠标1316的方式被通信地耦合到主板1308,以供用户输入文本和命令。在一种实施方案中,计算机系统1300还包括网络接口卡(NIC)1320或内置NIC接口(未示出),用于将计算机系统1300连接到计算机网络1330,例如局域网(LAN)、广域网(WAN)或因特网。
计算机系统1300还可以可选地包括压缩盘-只读存储器(CD-ROM)驱动器1328,可以将CD-ROM盘插入其中,使得可执行文件,例如操作系统以及Java或C#组件,还有该盘上的数据可被读取或转移到存储器1310和/或硬盘1306中。在计算机系统1300中还可以包括其他大容量存储器存储设备。
在另一种实施方案中,计算机系统1300是手持或掌上型计算机,它们有时被称为个人数字助手(PDA)。手持计算机可能不包括硬盘或其他大容量存储设备,并且可执行程序从有线或无线网络连接被载入到存储器1310中,以供处理器1312来执行。典型的计算机系统1300通常将包括至少一个处理器1312、存储器1310以及将存储器1310耦合到处理器1312的总线(未示出)。
将可以理解的是,在一种实施方案中,计算机系统1300由包括文件管理系统的操作系统软件来控制,所述文件管理系统例如是盘操作系统,它是操作系统软件的一部分。例如,本发明的一种实施方案对于计算机系统1300采用Microsoft Windows操作系统。在另一种实施方案中,根据本发明的教导也可以使用其他的操作系统,例如但不限于AppleMacintosh操作系统、基于Linux的操作系统、Microsoft Windows CE操作系统、基于Unix的操作系统、3Com Palm操作系统等等。
因此,本发明的实施方案可被用作或者支持在某种形式的处理核(例如处理器1312)上执行的固件和软件代码,或者在机器可读介质之上或之内实施或实现的固件和软件代码。机器可读介质包括提供(即,存储和/或传输)机器(例如计算机、网络设备、个人数字助手、制造工具、具有一组一个或多个处理器的任何设备,等等)可读形式的信息的任何机制。除了可记录的介质,例如基于盘的介质之外,机器可读介质可以包括传播信号,例如电、光、声或其他形式的传播信号(例如,载波、红外线、数字信号等)。
对本发明图示实施方案的以上描述,包括在说明书摘要中描述的内容在内,都不想是穷尽性的或者将本发明限制到所公开的精确形式。虽然这里出于图示说明的目的描述了本发明的特定实施方案和实施例,但是相关领域的技术人员将会认识到,各种等同修改都可能位于本发明的范围之内。
按照上面的详细描述,可以对本发明实行这些修改。在所附权利要求中使用的术语不应被解释为将本发明限制到在说明书和权利要求书中所公开的具体实施方案。相反,本发明的范围将完全由所附权利要求来确定,将根据已有的权利要求的解释原则来解释这些权利要求。
权利要求
1.一种方法,包括将分配给应用的代码空间划分成可信区和非可信区;为位于所述可信区和非可信区中的指令定义被允许的操作;确定当前指令是位于所述可信区中还是位于所述非可信区中;以及基于所述当前指令所在的区以及为这一区中的指令所定义的允许操作,确定所述当前指令所定义的操作是否被允许执行。
2.如权利要求1所述的方法,其中确定所述当前指令是位于所述可信区中还是位于所述非可信区中的操作包括以下操作存储可信区偏移,该偏移定义了划分所述代码空间的所述可信区和所述非可信区的边界的位置,所述可信区偏移包括距离所述代码空间的起始地址的偏移;获得所述当前指令的地址,该地址指定了所述当前指令所在的、距离所述代码空间的起始地址的偏移;以及将所述当前指令的地址的偏移与所述可信区偏移进行比较,以确定所述当前指令所在的区。
3.如权利要求2所述的方法,进一步包括将所述可信区偏移或者指向所述可信区偏移的指针之一存储在处理器寄存器中;响应于用于所述当前指令的指针被加载到所述处理器的指令指针寄存器中,将所述当前指令的地址的偏移与所述可信区偏移进行比较。
4.如权利要求1所述的方法,其中确定所述当前指令是位于所述可信区中还是位于所述非可信区中的操作包括以下操作存储所述可信区的起始地址和结束地址;获得所述当前指令的地址;以及确定所述地址是否落入所述可信区的所述起始地址和所述结束地址之内。
5.如权利要求1所述的方法,其中确定所述当前指令是位于所述可信区中还是位于所述非可信区中的操作包括以下操作存储所述可信区的起始地址和大小;获得所述当前指令的地址;以及确定所述地址是否落入由所述可信区的所述起始地址和所述大小所指定的地址范围之内。
6.如权利要求1所述的方法,进一步包括响应于检测到不允许的操作,投出安全陷阱;以及对所述操作应用安全策略,以确定所述操作是否被允许继续进行。
7.如权利要求6所述的方法,进一步包括响应于被投出的安全陷阱,将执行线程重新定向到动态验证器,所述动态验证器包括基于软件的组件,该组件具有应用所述安全策略的逻辑。
8.如权利要求7所述的方法,进一步包括执行例外处理过程,以从与不被所述安全策略允许的操作相对应的指令错误中恢复。
9.如权利要求7所述的方法,其中所述动态验证器是虚拟机框架中的组件。
10.如权利要求9所述的方法,进一步包括执行基于虚拟机的例外处理过程,以从与不被所述安全策略允许的操作相对应的指令错误中恢复。
11.如权利要求6所述的方法,进一步包括执行用于代码访问序列的基于硬件的代码序列真值表,其中不允许的代码访问序列引起安全陷阱被投出。
12.如权利要求11所述的方法,其中所述代码序列真值表指定响应于包括后面跟随着安全指令的不安全指令的代码序列,投出安全陷阱。
13.如权利要求12所述的方法,其中所述安全策略可允许到位于所述可信区中的调用程序的返回指令继续进行,但是不会允许从不安全指令访问位于所述可信区中的代码的调用或跳转继续进行。
14.如权利要求1所述的方法,进一步包括将类型安全代码加载到所述代码空间的所述可信区中;将非类型安全代码加载到所述代码空间的所述非可信区中;以及初始化为所述可信区和所述非可信区划界的机制。
15.如权利要求14所述的方法,其中所述类型安全代码包括与用类型安全语言编写的应用相对应的代码,并且所述非类型安全代码包括可由用类型安全语言编写的应用来调用的本机码。
16.如权利要求14所述的方法,其中所述非类型安全代码包括动态链接库。
17.如权利要求1所述的方法,进一步包括将所述非可信区划分成具有不同信任级的多个子区。
18.一种方法,包括将分配给应用的代码空间划分成可信区和非可信区;将分配给所述应用的数据空间划分成可信区和非可信区;基于请求存储器访问的代码在所述代码空间中的位置以及与所述存储器访问相关的数据在所述数据空间中的位置,定义可允许的存储器访问操作;确定发出存储器访问请求的代码的位置以及被请求访问的数据的位置;以及基于请求所述存储器访问的代码的位置以及被请求访问的数据的位置,如可允许的存储器访问操作所定义的那样,确定所述存储器访问请求是否将被允许。
19.如权利要求18所述的方法,其中确定发出所述存储器访问请求的代码的位置的操作包括以下操作存储所述代码空间的可信区偏移,该偏移定义了划分所述代码空间的所述可信区和所述非可信区的边界的偏移位置;获得对应于所述存储器访问请求的当前指令的地址,该地址指定了所述当前指令所在的、距离被指派给所述代码空间的起始地址的偏移;以及将所述当前指令的地址的偏移与所述代码空间的所述可信区偏移进行比较,以确定在所述代码空间中所述当前指令所在的区。
20.如权利要求19所述的方法,进一步包括将所述代码空间的所述可信区偏移或者指向所述代码空间的所述可信区偏移的指针之一存储在处理器寄存器中;以及响应于用于所述当前指令的指针被加载到所述处理器的指令指针寄存器中,将所述当前指令的地址的偏移与所述代码空间的所述可信区偏移进行比较。
21.如权利要求18所述的方法,其中确定发出所述存储器访问请求的代码的位置的操作包括以下操作存储所述可信区的起始地址和结束地址;获得所述当前指令的地址;以及确定所述地址是否落入所述可信区的所述起始地址和所述结束地址之内。
22.如权利要求18所述的方法,其中确定发出所述存储器访问请求的代码的位置的操作包括以下操作存储所述可信区的起始地址和大小;获得所述当前指令的地址;以及确定所述地址是否落入由所述可信区的所述起始地址和所述大小所指定的地址范围之内。
23.如权利要求18所述的方法,其中确定被请求访问的数据的位置的操作包括以下操作存储数据空间的可信区偏移,该偏移定义了划分所述数据空间的所述可信区和所述非可信区的边界的偏移位置;获得对应于所述存储器请求的数据所在的地址,该地址指定了所述数据所在的、距离被指派给所述数据空间的起始地址的偏移;以及将对应于所述存储器请求的数据所在的地址的偏移与所述数据空间的所述可信区偏移进行比较,以确定在所述数据空间中所述数据所在的区。
24.如权利要求18所述的方法,进一步包括响应于检测到不允许的存储器访问操作,投出安全陷阱;以及对所述存储器访问操作应用安全策略,以确定所述存储器访问操作是否被允许进行。
25.如权利要求24所述的方法,进一步包括响应于被投出的安全陷阱,将执行线程重新定向到动态验证器,所述动态验证器包括基于软件的组件,该组件具有应用所述安全策略的逻辑。
26.如权利要求24所述的方法,进一步包括执行例外处理过程,以从与不被所述安全策略允许的存储器访问操作相对应的指令错误中恢复。
27.如权利要求24所述的方法,进一步包括执行基于硬件的存储器访问真值表,其中不允许的存储器访问操作引起安全陷阱被投出。
28.如权利要求27所述的方法,其中所述存储器访问真值表指定来自所述代码空间的所述非可信区中的代码的存储器请求不被允许访问所述数据空间的所述可信区中的数据。
29.如权利要求24所述的方法,进一步包括执行虚拟机例外处理过程,以从与不被所述安全策略允许的存储器访问操作相对应的指令错误中恢复。
30.如权利要求18所述的方法,进一步包括将类型安全代码加载到所述代码空间的所述可信区中;将非类型安全代码加载到所述代码空间的所述非可信区中;在所述数据空间的所述可信区中分配对应于类型安全代码的数据存储;在所述数据空间的所述非可信区中分配对应于非类型安全代码的数据存储;以及初始化为所述可信区和所述非可信区划界的机制。
31.如权利要求30所述的方法,其中所述类型安全代码包括与用类型安全语言编写的应用相对应的代码,并且所述非类型安全代码包括可由用类型安全语言编写的应用来调用的本机码。
32.如权利要求18所述的方法,进一步包括将所述代码空间的所述非可信区划分成具有不同信任级的多个子区;以及将所述数据空间的所述非可信区划分成具有不同信任级的多个子区。
33.一种处理器,包括指令指针;以下之一,代码空间SRR寄存器,该寄存器存储代码空间的可信区偏移或者指向所述代码空间的所述可信区偏移的指针之一,所述可信区偏移定义了所述代码空间中在可信区和非可信区之间的边界;或者两个代码空间SRR寄存器,所述两个寄存器存储的数据指定了与所述代码空间的所述可信区相对应的地址范围;实行代码序列真值表的机制,其中所述代码序列真值表定义了与存储在所述代码空间的所述可信区和所述非可信区中的指令相对应的可允许和不允许的指令序列;以及响应于检测到不允许的指令序列而投出安全陷阱的机制。
34.如权利要求33所述的处理器,其中所述的实行代码序列真值表的机制包括确定当前指令是位于所述代码空间的所述可信区中还是所述非可信区中的已编程逻辑;第一寄存器位,该位存储的数据指示出在执行线程中紧邻所述当前指令之前的前一指令是被存储在所述代码空间的所述可信区中还是所述非可信区中;以及定义了代码序列真值表的已编程逻辑,所述代码序列真值表基于所述前一指令和所述当前指令被存储在什么区中来指定代码序列是否可允许。
35.如权利要求34所述的处理器,进一步包括程序状态和控制寄存器,其中所述第一寄存器位包括位于所述程序状态和控制寄存器中第一位置处的第一位。
36.如权利要求35所述的处理器,进一步包括存储以下数据的已编程逻辑,通过置位或清零位于所述程序状态和控制寄存器中第二位置处的第二位,所述数据指示出所述当前指令是被存储在所述代码空间的可信区中还是非可信区中。
37.如权利要求33所述的处理器,进一步包括存储用于定位所述代码空间的段选择子的代码段寄存器;以及存储用于定位所述数据空间的段选择子的数据段寄存器。
38.一种处理器,包括代码段寄存器;数据段寄存器;指令指针;代码段安全区寄存器,也被称为代码段SRR寄存器,该寄存器存储代码段的可信区偏移或指向所述代码段的所述可信区偏移的指针之一,所述可信区偏移定义了所述代码段中在可信区和非可信区之间的边界;数据段SRR寄存器,该寄存器存储数据段的可信区偏移或指向所述数据段的所述可信区偏移的指针之一,所述可信区偏移定义了所述数据段中在可信区和非可信区之间的边界;实行存储器访问真值表的机制,其中所述存储器访问真值表对应于请求所述存储器访问的代码在所述代码段中的位置以及被请求进行存储器访问的数据在所述数据段中的位置,定义了可允许的和不允许的存储器访问操作;以及响应于检测到不允许的存储器访问操作而投出安全陷阱的机制。
39.如权利要求38所述的处理器,其中所述的实行存储器访问真值表的机制包括确定当前指令是位于所述代码段的所述可信区中还是所述非可信区中的已编程逻辑;第一寄存器位,该位存储的数据指示出所述当前指令是位于所述代码段的所述可信区中还是所述非可信区中;确定与所述存储器请求相对应的数据是位于所述数据段的所述可信区中还是所述非可信区中的已编程逻辑;第二寄存器位,该位存储的数据指示出与所述存储器请求相对应的数据是位于所述数据段的所述可信区中还是所述非可信区中;以及定义了存储器访问真值表的已编程逻辑,所述存储器访问真值表基于请求存储器访问的代码在所述代码段中所在的区以及与所述存储器访问相对应的数据在所述数据段中所在的区,指定所述存储器访问操作是否可允许。
40.如权利要求39所述的处理器,进一步包括程序状态和控制寄存器,其中所述第一寄存器位包括位于所述程序状态和控制寄存器中第一位置处的第一位,并且所述第二寄存器位包括位于所述程序状态和控制寄存器中第二位置处的第二位。
41.一种系统,包括主板,该主板至少包括一个可安装存储器的套接口;以及耦合到所述主板的处理器,所述处理器包括指令指针;以下之一,代码空间SRR寄存器,该寄存器存储代码空间的可信区偏移或者指向所述代码空间的所述可信区偏移的指针之一,所述可信区偏移定义了所述代码空间中在可信区和非可信区之间的边界;或者两个代码空间SRR寄存器,所述两个寄存器存储的数据指定了与所述代码空间的所述可信区相对应的地址范围;实行代码序列真值表的机制,其中所述代码序列真值表定义了与存储在所述代码空间的所述可信区和所述非可信区中的指令相对应的可允许和不允许的指令序列;以及响应于检测到不允许的指令序列而投出安全陷阱的机制。
42.如权利要求41所述的系统,其中所述的实行代码序列真值表的机制包括确定当前指令是位于所述代码空间的所述可信区中还是所述非可信区中的已编程逻辑;第一寄存器位,该位存储的数据指示出在执行线程中紧邻所述当前指令之前的前一指令是被存储在所述代码空间的所述非可信区中还是所述可信区中;以及定义了代码序列真值表的已编程逻辑,所述代码序列真值表基于所述前一指令和所述当前指令被存储在什么区中来指定代码序列是否可允许。
43.如权利要求41所述的系统,其中所述处理器进一步包括以下之一数据空间SRR寄存器,该寄存器存储数据空间的可信区偏移或指向所述数据空间的所述可信区偏移的指针之一,所述可信区偏移定义了所述数据空间中在可信区和非可信区之间的边界;或者两个数据空间SRR寄存器,所述两个寄存器存储的数据指定了与所述数据空间的所述可信区相对应的地址范围;实行存储器访问真值表的机制,其中所述存储器访问真值表对应于请求所述存储器访问的代码在所述代码空间中的位置以及被请求进行存储器访问的数据在所述数据空间中的位置,定义了可允许的和不允许的存储器访问操作;以及响应于检测到不允许的存储器访问操作而投出安全陷阱的机制。
44.如权利要求43所述的系统,其中所述的实行存储器访问真值表的机制包括确定当前指令是位于所述代码空间的所述可信区中还是所述非可信区中的已编程逻辑;第一寄存器位,该位存储的数据指示出所述当前指令是位于所述代码空间的所述可信区中还是所述非可信区中;确定与所述存储器请求相对应的数据是位于所述数据空间的所述可信区中还是所述非可信区中的已编程逻辑;第二寄存器位,该位存储的数据指示出与所述存储器请求相对应的数据是位于所述数据空间的所述可信区中还是所述非可信区中;以及定义了存储器访问真值表的已编程逻辑,所述存储器访问真值表基于请求存储器访问的代码在所述代码空间中所在的区以及与所述存储器访问相对应的数据在所述数据空间中所在的区,指定所述存储器访问操作是否可允许。
全文摘要
公开了支持与非可信代码一起运行的类型安全语言环境的处理器扩展和软件验证。代码和数据空间被划分成可信区和非可信区。类型安全代码被载入代码空间的可信区,非类型安全代码被载入其非可信区。数据空间的可信区被分配给类型安全代码。数据空间的非可信区被分配给非类型安全代码。采用基于硬件的真值表来定义可允许和不允许的代码序列和存储器访问操作。对于代码序列,可允许操作是基于包括当前指令和前面指令的代码序列的位置(即,区)。对于存储器访问,考虑发出请求的指令和所请求数据的位置。不允许的代码序列或存储器访问操作使得处理器生成安全访问保护陷阱。响应于该陷阱,基于软件的动态验证器应用安全策略来确定是否允许操作继续进行。
文档编号G06F21/00GK1700136SQ200510070869
公开日2005年11月23日 申请日期2005年5月20日 优先权日2004年5月20日
发明者布拉廷·萨哈, 韦尔登·沃什伯恩, 詹姆斯·赫尔德 申请人:英特尔公司
再多了解一些
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1