安全区分叉支持的制作方法

文档序号:23067994发布日期:2020-11-25 17:55阅读:153来源:国知局
安全区分叉支持的制作方法

相关申请的交叉引用

本申请是2018年10月5日提交的美国专利申请no.16/153,039的继续申请,该申请的公开内容以引用的方式并入本文。



背景技术:

软件应用可以存储敏感数据,诸如密码、账号、财务和健康记录。各种保护措施可以用于保护此类敏感数据,例如,主机操作系统可以防止未经核准的用户访问操作系统资源,并且应用可以对敏感数据进行加密,但该应用不具有针对具有较高特权的进程(包括主机操作系统自身)的保护措施。安全执行技术提供了用于在不需要对系统管理员或系统软件自身(诸如主机操作系统或管理程序(“主机”))的受信任的的情况下运行应用的能力。为此,可以使用安全区(enclave)。安全区可以是非受信任的主机内的“受保护的环境”,在此环境中,安全区内的数据与系统的其余部分(包括非受信任的主机)隔离。安全区内部的代码和数据是不可见的并且无法被安全区外部的非受信任的进程(包括非受信任的主机)操纵。

在一些实例中,为了使应用在安全区内部正常运行,应用可能需要通常由主机提供以便执行某些函数调用的功能性。例如,fork()是在许多常见应用中使用的posix函数调用。fork()在被调用时复制应用(包括其存储器状态),并且从该时间点起,所复制的应用与原始应用分开运行。例如,web浏览器应用可以复制其自身的实例。fork()通常使用由主机提供的功能性来实现。



技术实现要素:

本公开提供了包括:通过第一安全区的主机计算设备的一个或多个处理器接收对复制在第一安全区内部运行的应用的请求;通过一个或多个处理器生成第一安全区的包括应用的快照;通过一个或多个处理器利用快照密钥在第一安全区内部对快照进行加密;通过一个或多个处理器将加密的快照从第一安全区拷贝到主机的非受信任的存储器;通过一个或多个处理器生成第二安全区;通过一个或多个处理器通过安全通信信道将快照密钥从第一安全区发送到第二安全区;通过一个或多个处理器将加密的快照从主机的非受信任的存储器拷贝到第二安全区中;以及通过一个或多个处理器利用快照密钥在第二安全区内部对加密的快照进行解密。

该方法可以进一步包括:通过一个或多个处理器创建针对第一安全区的入口,该入口允许快照线程从主机进入第一安全区,其中,快照是由快照线程在第一地址指定空间内部获取的。该方法可以进一步包括:通过一个或多个处理器为针对第一安全区创建的入口生成入口屏障,并且其中,该入口屏障防止除快照线程以外的主机侧线程进入第一安全区。

该方法可以进一步包括:通过一个或多个处理器在第一安全区内部生成分叉(fork)指示,该分叉指示指示了可以获取第一安全区的一个快照,并且其中,分叉指示仅准许一个快照线程获取快照。该方法可以进一步包括:通过一个或多个处理器响应于一个快照线程进入第一安全区而去除第一安全区内部的分叉指示,其中,响应于去除了分叉指示而获取一个快照。

将加密的快照从主机的非受信任的存储器拷贝到第二安全区中可以进一步包括:通过一个或多个处理器将加密的快照从第一安全区拷贝到主机的第一进程,并且其中,可以使用第一进程来生成第一安全区。将加密的快照从主机的非受信任的存储器拷贝到第二安全区中可以进一步包括:通过一个或多个处理器将加密的快照从第一进程拷贝到主机的第二进程,其中,第二安全区是使用第二进程生成的;以及通过一个或多个处理器将加密的快照从第二进程拷贝到第二安全区中。可以通过在第一进程上调用主机侧分叉函数来生成第二进程。

该方法可以进一步包括:通过一个或多个处理器在第一安全区内部生成第一密钥对,该第一密钥对包括第一公钥和第一私钥;通过一个或多个处理器在第二安全区内部生成第二密钥对,该第二密钥对包括第二公钥和第二私钥;通过一个或多个处理器使用第一私钥和第二公钥在第一安全区内部生成秘密密钥;以及通过一个或多个处理器使用第二私钥和第一公钥在第二安全区内部生成秘密密钥,其中,安全通信信道是使用秘密密钥在第一安全区与第二安全区之间建立的。

该方法可以进一步包括:通过一个或多个处理器在第一安全区内部生成第一断言,该第一断言与第一公钥绑定;通过一个或多个处理器将第一断言发送到第二安全区;通过一个或多个处理器验证第一断言是否与第一公钥绑定;通过一个或多个处理器在第二安全区内部生成第二断言,该第二断言与第二公钥绑定;通过一个或多个处理器将第二断言发送到第一安全区;以及通过一个或多个处理器验证第二断言是否与第二公钥绑定,并且其中,该生成秘密密钥是基于第一断言和第二断言已经过验证。

该方法可以进一步包括:通过一个或多个处理器在第一安全区内部生成第一断言,该第一断言与第一公钥绑定;通过一个或多个处理器将第一断言发送到第二安全区;通过一个或多个处理器使用第一断言来验证第一安全区的第一身份;通过一个或多个处理器在第二安全区内部生成第二断言,该第二断言与第二公钥绑定;通过一个或多个处理器将第二断言发送到第一安全区;以及通过一个或多个处理器使用第二断言来验证第二安全区的第二身份,并且其中,该生成秘密密钥是基于第一身份和第二身份已经过验证。第一身份可以与第二身份相同。

该方法可以进一步包括:通过一个或多个处理器创建针对第一安全区的入口,该入口允许证明线程从主机进入第一安全区,并且其中,响应于证明线程的请求而生成第一断言。该方法可以进一步包括:通过一个或多个处理器创建针对第一安全区的入口,该入口允许认证线程从主机进入第一安全区,并且其中,第二断言是由第一安全区响应于认证线程的请求而验证的。

该方法可以进一步包括:通过一个或多个处理器在第一安全区内部生成第一密钥对,该第一密钥对包括第一公钥和第一私钥;通过一个或多个处理器在第二安全区内部生成第二密钥对,该第二密钥对包括第二公钥和第二私钥;通过一个或多个处理器使用第一私钥和第二公钥在第一安全区内部生成秘密密钥;通过一个或多个处理器使用秘密密钥对第一安全区中的快照密钥进行加密。该方法可以进一步包括:通过一个或多个处理器创建针对第一安全区的入口,该入口允许加密线程从主机进入第一安全区,以利用秘密密钥对快照密钥进行加密。

该方法可以进一步包括:通过一个或多个处理器使用第一公钥和第二私钥在第二安全区内部生成秘密密钥;以及通过一个或多个处理器使用秘密密钥在第二安全区内部对加密的快照密钥进行解密。该方法可以进一步包括:通过一个或多个处理器创建针对第二安全区的入口,该入口允许恢复线程从主机进入第二安全区,并且其中,快照密钥是由恢复线程在第二地址指定空间内部来解密的。

第一安全区和第二安全区可以具有相同的虚拟存储器地址。

本公开进一步提供了一种系统,该系统包括:存储器,该存储器存储第一安全区;以及一个或多个处理器,该一个或多个处理器与存储器通信,一个或多个处理器配置为:接收对复制在第一安全区内部运行的应用的请求;生成第一安全区的包括应用的快照;利用快照密钥在第一安全区内部对快照进行加密;将加密的快照从第一安全区拷贝到存储器的、在第一安全区外部的非受信任的部分;生成第二安全区;通过安全通信信道将快照密钥从第一安全区发送到第二安全区;将加密的快照从非受信任的存储器拷贝到第二安全区中;以及利用快照密钥在第二安全区内部对加密的快照进行解密。

附图说明

图1是根据本公开的方面的示例系统的功能图。

图2是图1的系统的方面的功能图。

图3是根据本公开的方面的流程图。

图4是图示了根据本公开的方面的获取快照的示例时序图。

图5a和5b是图示了根据本公开的方面的证明和认证的示例时序图。

图6是图示了根据本公开的方面的恢复加密的快照的示例时序图。

具体实施方式

概述

技术大体上涉及实现用于在安全安全区内部运行的应用的fork()。如上文所提及,安全区内部的代码和数据是不可见的并且无法被非受信任的主机的非受信任的进程操纵,因此,非受信任的主机无法访问安全区内部的应用以提供fork()所需的功能性。因此,针对在安全区内部运行的应用实现fork()带来了特殊挑战。另外,为了确保所复制的应用可以在与原始应用相同的安全环境中运行,也需要复制安全区自身。更进一步地,复制进程必须确保安全区内部的数据在任何时候都不会泄露到安全区外部。

就这一点而言,可以提供安全区分叉支持来解决这些挑战。使用分叉支持的fork()的实现可以开始于来自在第一安全区内部运行的应用的、对复制该应用自身的请求。第一安全区可以由第一主机进程托管。为了制作第一安全区内部的应用的副本,可以生成第一安全区的包括第一安全区内部的应用的快照。就这一点而言,在第一安全区内部运行应用的线程可以退出第一安全区,以请求主机侧函数来帮助进行分叉。来自主机的新线程然后可以进入针对分叉支持保留的新线程控制结构中,以便获取第一安全区内部的快照。一旦生成了快照,就可以在第一安全区内部运用快照密钥对快照进行加密,以确保当在第一安全区外部拷贝快照时,非受信任的主机无法访问快照中的数据。

在一些示例中,第一安全区可以设置一个或多个标记,以确保快照的安全性和准确性。例如,为了防止其它主机侧线程进入第一安全区且在获取快照时修改第一安全区内部的存储器状态——这会导致快照的不准确(即,并非精确地拷贝),第一安全区可以创建入口屏障。入口屏障可以仅允许一个快照线程进入第一安全区,这降低了非受信任的线程可潜入获取快照的可能性。

针对另一实例,为了防止敏感数据在第一安全区内泄漏,第一安全区需要指示fork()请求实际上源自第一安全区内部的应用,而非源自非受信任的主机的非受信任的进程。就这一点而言,可以在第一安全区内部生成分叉指示,以指示fork()在第一安全区中正在进行,并且指示可以获取快照。可以通过进入第一安全区的第一快照线程(该第一快照线程然后被允许获取快照)去除分叉指示。这样,确保了一个快照线程只能获取一个快照,并且确保了另一非受信任的线程即使以某种方式进入安全区中也无法获取第二快照。

接下来,可以将加密的快照拷贝到非受信任的主机的非受信任的存储器(诸如分配给第一主机进程的非受信任的存储器),以使得非受信任的主机的功能性可以支持fork()的其它步骤。由此,可以使第一主机进程分叉,从而创建第二主机进程,该第二主机进程是第一主机进程的子进程。因为第二主机进程是第一主机进程的副本,所以分配给第二主机进程的非受信任的存储器还包括加密的快照。可以在两个主机进程之间建立不安全的通信信道,并且第二主机进程可以生成第二安全区,可以运用与第一安全区相同的身份和相同的虚拟存储器地址来创建该第二安全区。

为了使第二安全区对加密的快照进行解密,第一安全区需要经由安全通信信道将快照密钥发送到第二安全区。因而,可以根据由两个安全区进行的相互证明(attestation)和认证来建立安全通信信道。可以经由两个主机进程之间的不安全的通信信道来进行证明和认证。在一些示例中,在证明期间,每个安全区可以生成包括相应公钥和相应私钥的相应密钥对,并且然后可以分别生成与相应公钥绑定的相应断言。如上文所提及,如果两个安全区都以相同身份进行创建,那么在认证期间,每个安全区都将能够验证另一安全区是否正在对相同身份进行有效断言。

在一些示例中,第一安全区和第二安全区可以生成经由安全通信信道发送和接收数据的共享秘密。例如,第一密钥对和第二密钥对可以是diffie-hellman密钥对,这意味着可以使用来自每个安全区的公钥和私钥来生成两个安全区之间的共享秘密,然后可以将该共享秘密用作用于推导相同的对称秘密密钥的密钥推导函数的输入。因而,使用对称秘密密钥,可以使用秘密密钥在第一安全区内部对快照密钥进行加密,并且可以使用秘密密钥在第二安全区内部对快照密钥进行解密。一旦第二安全区具有快照密钥,就可以将加密的快照拷贝到第二安全区中,第二安全区然后可以对加密的快照进行解密,并且访问快照内部的数据,以使其自身作为第一安全区(包括在第一安全区内部运行的应用)的副本。

本文中所描述的特征提供了框架以针对在安全区内部运行的应用实现fork(),从而在主机实际上将不具有访问安全区内的信息的权限,且因此将无法以其它方式实现fork()时提供安全区分叉支持。此外,包括各种保护措施是为了允许非受信任的主机协助进行分叉进程,而从不允许主机访问安全区内部的未经加密的数据。通过复制安全区,框架使得所复制的应用能够在相同安全环境内部与原始应用分开运行。

示例系统

图1包括可以实现本文中所描述的特征的示例安全区系统100。不应将其视为限制本公开的范围或本文中所描述的特征的有用性。在该示例中,安全区系统100可以包括经由网络150连接的计算设备110、120、130以及存储系统140。每个计算设备110、120、130都可以包含一个或多个处理器112、存储器114以及通常存在于通用计算设备中的其它组件。

尽管在系统100中仅描绘了几个计算设备和存储系统,但该系统可以扩展到任何数量的附加设备。除了包括经由网络连接的多个计算设备和存储系统的系统之外,本文中所描述的特征还可以等同地适用于其它类型的设备,诸如可以包括一个或多个安全区的单独芯片,包括包含片上系统(soc)或其它芯片与存储器的那些芯片。

计算设备110、120、130中的每一者的存储器114可以存储可由一个或多个处理器112访问的信息,包括可以由一个或多个处理器执行的指令。存储器还可以包括可以由处理器检索、操纵或存储的数据。存储器可以属于能够存储可由处理器访问的信息的任何非暂时性类型,诸如硬盘驱动器、存储卡、rom、ram、dvd、cd-rom、可写入存储器以及只读存储器。

指令可以是要由一个或多个处理器直接执行的任何指令集,诸如机器代码;或要由一个或多个处理器间接执行的任何指令集,诸如脚本。就此而言,术语“指令”、“应用”、“步骤”以及“程序”在本文中可以互换地使用。指令可以目标代码格式存储以供处理器直接处理,或以任何其它计算设备语言存储,包括按需解释或预先编译的脚本或独立源代码模块的集合。下文更详细地说明了指令的功能、方法和例程。

数据可以由一个或多个处理器112根据指令进行检索、存储或修改。例如,尽管本文中所描述的主题不受任何特定数据结构的限制,但可以将数据存储在计算机寄存器中、存储在关系数据库中作为具有许多不同字段和记录的表或xml文档。还可以任何计算设备可读格式(诸如但不限于二进制值、ascii或unicode)将数据格式化。此外,数据可以包括足以识别相关信息的任何信息,诸如数字、描述性文本、专有代码、指针、对存储在其它存储器中(诸如存储在其它网络位置处)的数据的引用或由用于计算相关数据的函数使用的信息。

一个或多个处理器112可以是任何常规处理器,诸如可商购cpu。替选地,处理器可以是专用组件,诸如专用集成电路(“asic”)或其它基于硬件的处理器。尽管不是必需的,但计算设备110中的一者或多者可以包括专门硬件组件以进行特定计算进程,诸如更快或更高效地对视频进行解码,将视频帧与图像进行匹配,使视频失真,对失真的视频进行编码等。

尽管图1在功能上将处理器、存储器以及计算设备110的其它元件图示为在相同块内,但处理器、计算机、计算设备或存储器实际上可以包括可以或可以不存储在相同物理外壳内的多个处理器、计算机、计算设备或存储器。例如,存储器可以是位于与计算设备110的外壳不同的外壳中的硬盘驱动器或其它存储介质。因此,对处理器、计算机、计算设备或存储器的引用将被理解为包括对可以或可以不并行操作的处理器、计算机、计算设备或存储器的集合的引用。例如,计算设备110可以包括作为负载均衡服务器群、分布式系统等而操作的服务器计算设备。又进一步地,尽管将下文描述的一些功能指示为发生在具有单个处理器的单个计算设备上,但本文中所描述的主题的各个方面可以由例如通过网络150传送信息的多个计算设备来实现。

计算设备110、120、130中的每一者可以在网络150的不同节点处,并且能够与网络150的其它节点直接和间接地通信。尽管在图1中仅描绘了几个计算设备,但应了解,典型系统可以包括大量连接的计算设备,其中,每个不同计算设备都在网络150的不同节点上。可以使用各种协议和系统将本文中所描述的网络150和中间节点互连,以使得网络可以是互联网、万维网、专用内联网、广域网或局域网的一部分。网络可以利用标准通信协议,诸如以太网、wifi和http、一个或多个公司专有的协议以及前述的各种组合。尽管如上文所提到一般在传输或接收信息时获得了某些优点,但本文中所描述的主题的其它方面不限于信息的任何特定传输方式。

如同上文所讨论的存储器,存储系统140也可以存储可由计算设备110、120、130访问的信息。然而,在这种情况下,存储系统140可以存储可以通过网络150访问的信息。如同存储器,存储系统可以包括能够存储可由处理器访问的信息的任何非暂时性类型,诸如硬盘驱动器、存储卡、rom、ram、dvd、cd-rom、可写存储器以及只读存储器。

在该示例中,计算设备110、120、130中的每一者的指令可以包括一个或多个进程。这些进程可以在存储器114内(在存储器114处以本地方式或在存储系统140处以远程方式中任一者)定义或“加载”一个或多个安全区,诸如安全区a160、安全区b170、安全区c180、安全区d190。加载安全区的进程可以被视为该安全区的“主机进程”。例如,如所示的,主机进程a162托管安全区a160、主机进程b172托管安全区b170、主机进程c182托管安全区c180,并且主机进程d192托管安全区d190。每个安全区也可以由存储安全区的硬件“托管”。例如,计算设备110可以是用于安全区a160和安全区170的主机计算设备,并且计算设备120可以是安全区c180的主机计算设备。如下文相对于示例方法所详细讨论的,两个主机进程可以在彼此之间建立不安全的通信信道,例如以促进这些主机进程内部的安全区之间的证明和认证。

每个安全区可以用于存储数据和指令,同时限制其它应用对此类数据和指令的使用。例如,数据可以包括敏感信息,诸如密码、信用卡数据、社会保险号或用户希望保密的任何其它信息。并且,如下文进一步讨论的,指令可以用于限制对此类数据的访问。尽管计算设备110仅包括两个安全区,计算设备120仅包括1个安全区,计算设备130不包括安全区,并且存储系统140仅包括1个安全区,但可以运用计算设备110、120、存储系统140或系统100的任何其它设备的存储器来定义任何数量的安全区。

为了保护安全区内部的代码和数据,但仍允许安全区与主机交互并且使用主机资源和功能性,安全区可以具有用于代码进入和退出安全区的一个或多个预定义入口点。可以在安全区边界处建立接口,以使得安全区外部的主机侧函数可以调用安全区内部的安全区接口函数,这可以允许来自主机的线程经由特定入口点进入安全区。相反,安全区内部的安全区接口函数可以调用安全区外部的主机侧函数,以便使安全区内部的线程退出安全区。例如,针对在sgx系统上实现的安全区,此类安全区接口函数可以称为“ecall”,而此类主机侧函数可以称为“ocall”。

线程可以在由主机创建以在安全区内部运行应用时具有包含元数据的数据结构,该数据结构可以定义用于使线程进入安全区的具体入口点。例如,针对sgx系统,将这种数据结构称作“线程控制结构(tcs)”。tcs可以定义一个或多个入口点,以便使线程进入安全区中。只能经由这些入口点进入安全区。可以针对分叉操作保留特定tcs,并且可以将特定tcs指派给负责与分叉相关的操作(诸如获取和恢复快照)的线程。例如,sgxsdk系统可以针对非受信任的线程(诸如utility_thread)利用特定tcs,该特定tcs可以用于确保针对分叉操作保留该线程。

ecall可以包括任何数量的不同函数,诸如“enterandinitialize(进入并初始化)”(用于发送代码以获得系统资源来在安全区内部运行应用)、“enterandfinalize(进入并完成)”(用于放弃安全区中不再需要的系统资源)、“enterandrun(进入并运行)”(用于在安全区内部执行应用的函数)、“enteranddonatethread(进入并捐献线程)”(用于使主机向安全区提供线程)、“enterandhandlesignal(进入并处置信号)”(用于处置在安全区之间或在主机与安全区之间发送的信号)、“enteranddestroy(进入并摧毁)”(用于终止安全区)等。

可以特别创建特定ecall来支持分叉。例如,“enterandtakesnapshot”可以允许主机上的线程进入安全区以获取安全区的存储器状态的快照。针对另一示例,“enterandattest”可以允许主机上的线程进入安全区以请求安全区生成断言,而“enterandauthenticate”可以允许主机上的线程进入安全区以请求安全区验证身份断言。针对又一示例,“enterandencrypt”可以允许主机上的线程进入安全区以对数据进行加密。针对再一示例,“enterandrestore”可以允许主机上的线程进入安全区以对快照进行解密并且恢复快照。

针对enterandtakesnapshot的入口,可能需要附加保护措施,以便防止在获取快照时其它线程进入安全区并改变安全区的存储器状态,以及防止未经核准的线程进入安全区并获取安全区内部的存储器状况的快照。因而,可以创建入口屏障和分叉指示以选择性地允许一些线程经由enterandtakesnapshot进入和/或限制所允许的快照的数量,下文将进一步详细地对此进行描述。

可以将这些安全区中的每一者视为安全区系统100的“实体”。作为实体,安全区可以具有或可以用于生成身份和断言,该身份和断言可实现在安全区系统100的身份框架中的证明和认证。作为示例,安全区的身份可以包括“代码身份”,其可以表示安全区的行为的特性,诸如特定类型的安全区技术的特性。因而,代码身份可以包括关于正在安全区内部运行的代码、运行代码的环境以及影响代码执行的任何附加参数的密码性信息。安全区身份的其它示例可以包括密码性凭证,诸如证书、令牌等。断言可以是身份的可密码验证声明。

为了实现在身份框架中实现证明和认证所需的操作,可以在安全区系统100的每个安全区处采用至少两个角色或编程接口,包括生成器和验证器。例如,转向图2,安全区160、170、180、190分别包括一个或多个断言生成器210、212、214、216。由于每种类型的身份可以具有许多不同类型的断言,因此每个安全区可以针对不同类型的断言包括不同类型的断言生成器。断言生成器可以包括用于代表安全区系统中的实体生成断言的指令。由此,每个断言生成器可以提供生成对身份做出声明的断言的操作。由这些操作生成的断言可以是可密码验证的。

此外,验证器可以验证断言以确定对断言的声明是否有效。例如,每个安全区160、170、180、190包括一个或多个断言验证器220、222、224、226。断言验证器可以包括用于验证断言并且从经过验证的断言中提取身份的指令。断言验证器可以提供验证特定类型的身份的断言的操作。由此,安全区可以针对不同类型的身份包括不同断言验证器。在操作中,在给定断言的情况下,断言验证器可以确定对断言中的身份的声明是否有效。作为示例,断言验证器可以返回指示了断言是否能够被验证的boolean响应(即,是/否答复)。如果断言有效且经过验证,则断言验证器还可以从断言中提取身份。如下文关于示例方法详细讨论的,两个安全区可以在建立安全通信信道之前使用断言生成器和断言验证器来生成断言并验证彼此的身份。

安全区中的每一者还可以包括安全区客户端250、252、254、256以及安全区服务器260、262、264、266。安全区客户端可以包括用于生成对安全区系统100内的其它安全区或实体的远程过程调用(rpc)的指令。类似地,安全区服务器可以包括用于接收并响应由安全区系统内的其它安全区或实体生成的请求或来自安全区系统内的其它安全区或实体的请求的指令。作为示例,可以将rpc实现为grpc,其使用http以供消息成帧。如下文相对于示例方法讨论的,两个安全区可以使用安全区客户端和服务器来通过安全通信信道发送和接收作为rpc的数据。

示例方法

除上文所描述的示例系统之外,现在描述了示例方法。可以使用上文所描述的系统、其修改或具有不同配置的各种系统中的任何一者来进行此类方法。应理解,以下方法中所涉及的操作不需要以所描述的精确顺序进行。相反,可以按不同顺序或同时处置各种操作,并且可以添加或省略操作。

图3示出了使在第一安全区中运行的应用分叉以生成在第二安全区中运行的应用的副本实例的示例流程图300。流程图300可以由一个或多个处理器(诸如计算设备110的一个或多个处理器112)进行。例如,计算设备110的一个或多个处理器112可以进行流程图300以针对在安全区a160中运行的应用实现fork(),以便生成在安全区b170中运行的副本应用,以使得两个安全区在计算设备110上运行。

图4至图6分别示出了示例时序图400、500a、500b以及600,这些示例时序图有助于图示用于使安全区中的应用分叉的流程图300的示例实施方式。因而,为了便于说明,结合图3讨论了图4至图6,但应理解,流程图300不限于具有图4至图6的示例操作的实施方式。图4至图6中的框包含下文进一步讨论的示例操作的简要描述,并且箭头表示各种组件之间的数据、代码、消息或信息的流。图4至图6中所示的示例操作可以由一个或多个处理器(诸如计算设备110的一个或多个处理器112)进行。

参看图3,在框310中,接收对复制在第一安全区内部运行的应用的请求。例如,图4示出了由第一托管进程(托管进程a162)托管的第一安全区(安全区a160)。例如,在由框410指示的某点处,主机进程a162加载了安全区a160,例如以便允许应用在安全区a160内部安全地运行。安全区a160内部的应用在运行时可能需要创建其自身(即,该应用)的所复制的实例。应用的所复制的实例将以与原始实例相同的存储器状态开始,但此后,应用的两个实例将分别运行并独立于彼此。因而,在图4的框412中,安全区a160内部的应用例如通过调用安全区a160内部的安全区侧函数fork()来请求分叉。就这一点而言,fork()可以表示前述poxis函数调用。

再次参看图3,为了制作安全区内部的应用的副本,在框320中,生成了第一安全区的、包括应用的快照。如上文所提及,fork()需要主机来实现的功能性。因而,在第一安全区内部运行应用的线程可能需要退出并请求主机侧函数以协助fork()的某些步骤。例如,在图4的框420中,在安全区a160内部运行应用的线程退出安全区a160以调用主机侧函数ocall_fork()。该ocall_fork()可以源自主机进程a162。为了确保安全区a160内部的数据的安全性,ocall_fork()留在安全区a160外部,并且在支持分叉进程时仅对主机的非受信任的存储器进行操作。

然而,由于安全区内部的数据在安全区外部不可见,因此必须在安全区内部生成快照。因而,线程需要进入第一安全区以获取快照。在一些示例中,可以允许新线程进入第一安全区以便获取快照。例如,可以为新线程指派针对分叉保留的新tcs,该新tcs可以包含专门针对分叉定义的一个或多个入口点,诸如用于获取安全区的快照的入口点。如上文所提到,该新tcs可以用于进入安全区的、所有与分叉相关的调用,或更确切而言用于与分叉操作相关的调用。在框430中,可以允许具有针对分叉保留的新tcs的新线程进入安全区a160以获取快照。例如,这可以通过ocall_fork()调用ecall函数enterandtakesnapshot来完成。一旦在内部,则在框440中,该“快照获取”线程获取安全区a160的快照。

在一些示例中,第一安全区可以设置一个或多个标记,以确保快照的安全性和准确性。例如,为了防止其它主机函数进入第一安全区和在获取快照时修改第一安全区内部的存储器——这会导致快照的不准确(即,并非精确地拷贝),第一安全区可以创建入口屏障。由此,如图4的框414中所示的,响应于调用了安全区侧函数fork(),安全区a160内部的fork()函数可以创建入口屏障,该入口屏障阻挡进入安全区a160中的、除了用于响应于分叉请求而获取快照的进入以外的所有进入。另外,入口屏障可以仅允许一个快照线程进入安全区a160。通过防止线程的多次进入,入口屏障降低了非受信任的进程或其它线程可以在分叉进程期间改变安全区a160内的数据的可能性。可以在完成分叉后去除入口屏障,诸如在(图6中所示的)框618中所示。

针对另一实例,为了防止在第一安全区内的敏感数据的泄漏,第一安全区需要确保分叉请求实际上源自第一安全区内部的应用,而非源自非受信任的主机的非受信任的进程。由此,如框416中所示的,响应于在安全区a160内部调用了安全区侧函数fork(),安全区a内部的fork()函数可以创建分叉指示,该分叉指示指示了分叉针对安全区a160正在进行,并且指示了可以获取安全区a160的快照。在一些示例中,可以通过进入安全区a160的第一快照线程去除分叉指示。一旦去除了分叉指示,然后就可以允许第一快照线程获取安全区a160的快照。这样,确保了一个快照线程只能获取一个快照,并且确保了另一快照线程即使以某种方式进入安全区a160中也无法获取安全区a160的第二快照。替选地,可以在完成快照后去除分叉指示,诸如在框442中所示。

再次参看图3,在框330中,在第一安全区内部运用快照密钥对快照进行加密。这是为了确保当在第一安全区外部拷贝快照时,非受信任的主机无法访问快照内部的数据,该数据可以包含敏感信息。例如,如图4中所示的,在框450中,安全区a160生成了snapshot_key(快照_密钥)。在框452中,安全区a160然后运用snapshot_key对快照进行加密,从而产生加密的快照。可以将snapshot_key的生成和快照的加密实现为ecall的一部分,诸如前述enterandtakesnapshot。

再次参看图3,在框340中,将加密的快照拷贝到非受信任的主机的非受信任的存储器。这样,非受信任的主机的功能性可以支持分叉的其它步骤。例如,如图4中所示的,在框460中,前述快照线程退出安全区a160,并且允许ocall_fork()将加密的快照拷贝到分配给主机进程a162的非受信任的存储器。因为快照密钥留在第一安全区内部,所以非受信任的主机不具有快照密钥来对加密的快照进行解密。因此,即使在加密的快照在非受信任的存储器中时,非受信任的主机中的进程也无法访问加密的快照内部的数据。

再次参看图3,在框350中,生成了第二安全区。如上文所提及,这确保了所复制的应用在与原始应用相同的安全环境中运行。例如,如图4中所示的,在框480中,ocall_fork()可以调用主机侧函数fork()来创建第二主机进程,诸如主机进程b172。对此,可以为ocall_fork()提供对关于安全区a160的限制信息(诸如安全区a160的身份、安全区a160的地址等)的访问。可以由在如关于图1所提及的安全区a160的边界处建立的接口诸如通过调用安全区接口函数来对ocall_fork()提供这样的访问。在框486中,主机进程b172加载安全区b170。主机进程b172可以基于由ocall_fork()获得的信息(诸如安全区a160的身份、安全区a160的地址等)来加载安全区b170。例如,可以运用与安全区a160相同的身份和虚拟存储器地址来生成安全区b170。

在一些示例中,在框480中调用的主机侧函数fork()可以附加地用于影响其它操作。例如,可以使用主机侧函数fork()在主机进程a162与主机进程b172之间建立通信信道。例如,在调用主机侧函数fork()之前,在框470中,主机进程a162可以在主机进程a162内部创建通信套接字对中的一个套接字。一旦调用了主机侧函数fork()来生成主机进程b172,就将套接字拷贝到主机进程b172中,从而在主机进程b172内部生成通信对的第二套接字。因而,主机进程a162中的套接字和主机进程b172中的套接字可以在主机进程a162与主机进程b172之间建立通信信道。由于通信信道是在非受信任的主机的两个进程之间形成的,因此该通信信道可以是不安全的通信信道。

针对另一实例,由于调用了主机侧函数fork(),因此在框482中,可以将存储在分配给主机进程a162的非受信任的存储器中的加密的快照拷贝到分配给主机进程b172的非受信任的存储器中。可选地,如框484中所示的,一旦将加密的快照拷贝到分配给主机进程b172的存储器中,主机进程a162就可以经由ocall_fork删除加密的快照。

针对又一实例,如下文相对于图5a和5b更详细地描述的,由于调用了主机侧函数fork(),主机进程a162和主机进程b172可以分别运行证明和认证代码的相同集合,以允许两个安全区在建立安全通信信道之前验证彼此的身份。

此时,即使将加密的快照从非受信任的存储器拷贝到第二安全区中,第二安全区也将无法对加密的快照进行解密,且因此将无法访问快照内部的数据,以使其自身作为第一安全区的副本。这是因为第二安全区不具有访问快照密钥的权限,该快照密钥仍然仅仅存在于第一安全区内部。然而,在第一安全区与第二安全区之间发送快照将必然涉及主机,其无法被受信任的而具有快照密钥。为解决此问题,分叉支持进一步提供了用于在两个安全区之间发送快照密钥的安全性保护措施。因而,再次参看图3,在框360中,经由安全通信信道将快照密钥从第一安全区发送到第二安全区。

图5a和图5b示出了在两个安全区之间建立安全通信信道之前的证明和相互认证的示例实施方式。参看图5a,在框510中,可以允许线程经由所保留的tcs进入安全区a160,以协助安全区a160生成其身份的证明。例如,这可以通过ocall_fork()调用ecall函数enterandattest来完成。在一些示例中,该“证明”线程可以是前述快照线程,其先前在图4的框440中获取快照之后已经退出了安全区a160。因而,所保留的tcs可以是与图4的框430中所描述的相同的所保留的tcs。通过使用相同线程且因此使用具有多个入口点的相同的所保留的tcs,分叉支持可以防止原始线程的对存储器的意外修改,该意外修改可能会导致所分叉的安全区与原始安全区之间(例如安全区a160与安全区b170之间)的差异。因此,这可以确保原始安全区与分叉安全区之间的一致性。这还可以解决以下情况:针对其它函数用完了数量有限的所有tcs。

一旦在内部,则在框512中,证明线程请求安全区a160来生成第一断言。响应于该请求,在框514中,安全区a160生成例如第一密钥对<ka,ka>,该第一密钥对包括与第一私钥配对的第一公钥。虽然第一公钥ka可以离开安全区a160,但第一私钥ka留在安全区a160内部。在框516中,安全区a160例如使用断言生成器210来生成其身份的第一断言,可以生成身份的可密码验证声明。例如,对于断言生成器210的输入数据可以包括关于安全区a160的身份、第一公钥ka、新鲜值(nonce)、附加经认证数据等的信息。

接下来,在框520中,证明线程退出安全区a160并且将安全区a160的第一断言和第一公钥ka输出到主机进程a162。在框522中,主机进程a162然后将第一断言和第一公钥ka发送到主机进程b172。例如,可以将框520和522中的第一断言的输出和发送实现为ocall的一部分,诸如前述ocall_fork()。

接下来,在框530中,可以允许线程经由所保留的tcs进入安全区b170,以协助安全区b170通过验证安全区a160的身份的第一断言来认证安全区a。例如,这可以通过ocall_fork()调用ecall函数enterandauthenticate来完成。在一些示例中,该“认证”线程可以是前述证明线程,该“认证”线程也可以是前述快照线程。因而,所保留的tcs可以是与图4的框430中所描述的相同的所保留的tcs。通过使用相同线程且因此使用相同的所保留的tcs,分叉支持使得能够比使用多个线程和tcs更高效地使用系统资源。

一旦在内部,则在框532中,认证线程请求安全区b170验证第一断言是否与公钥ka绑定,安全区b170可以例如使用断言验证器222来验证其为真还是为假。另外,在框534中,认证线程请求安全区b170验证第一断言是否与安全区a160的身份绑定,安全区b170可以例如使用断言验证器222来验证其为真还是为假。如上文在图4的框486中所提及,如果运用与安全区a160相同的身份创建了安全区b170,那么安全区b170将能够验证第一断言何时为安全区a160的有效断言,这是由于该第一断言也将是安全区b170知道的、安全区b170自己身份的有效断言。如果是如此,那么在框536中,安全区b170存储第一公钥ka。这样,图5a中的系列步骤有效地使得安全区b170能够认证安全区a。换句话说,安全区b170能够验证其确实正在与安全区a160通信,这是因为安全区b170不应该随便与任何一个其它安全区设立安全信道。安全区b能够验证第一公钥ka是与安全区a160绑定,并且保存第一公钥ka以便参与同安全区a160的安全通信。

图5b示出了与图5a对应的一系列步骤,其使得安全区b170能够将第二公钥kb发送到安全区a160。在框540中,可以允许线程经由所保留的tcs进入安全区b170,以协助安全区b170生成其身份证明。例如,这可以通过ocall_fork()调用ecall函数enterandattest来完成。在一些示例中,该证明线程可以是前述快照/证明/认证线程。因而,所保留的tcs可以是与图4的框430中所描述的相同的所保留的tcs。通过使用相同线程且因此使用相同的所保留的tcs,分叉支持使得能够比使用多个线程和tcs更高效地使用系统资源。

一旦在内部,则在框542中,证明线程请求安全区b170来生成第二断言。响应于该请求,在框544中,安全区b170生成例如第二密钥对<kb,kb>,该第二密钥对包括与第二私钥配对的第二公钥。虽然第二公钥kb可以离开安全区b170,但第二私钥kb留在安全区b170内部。在框546中,安全区b170例如使用断言生成器220来生成其身份的第二断言,可以生成身份的可密码验证声明。例如,对于断言生成器210的输入数据可以包括关于安全区b170的身份、第二公钥kb、新鲜值、附加经认证数据等的信息。

接下来,在框550中,证明线程退出安全区b170并且将安全区b170的第二断言和第二公钥kb输出到主机进程b172。在框550中,主机进程b172然后将第二断言和第二公钥kb发送到主机进程a162。例如,可以将框550和552中的第一断言的输出和发送实现为ocall的一部分,诸如前述ocall_fork()。

接下来,在框560中,可以允许线程经由所保留的tcs进入安全区a160,以协助安全区a160通过验证安全区b170的身份的第二断言来认证安全区b。例如,这可以通过ocall_fork()调用ecall函数enterandauthenticate来完成。在一些示例中,该认证线程可以是前述快照、证明和/或认证线程。因而,所保留的tcs可以是与图4的框430中所描述的相同的所保留的tcs。通过使用相同线程且因此使用相同的所保留的tcs,分叉支持使得能够比使用多个线程和tcs更高效地使用系统资源。

一旦在内部,则在框562中,认证线程请求安全区a160验证第二断言是否与公钥kb绑定,安全区a160可以例如使用断言验证器220来验证其为真还是为假。另外,在框564中,认证线程请求安全区a160验证第二断言是否与安全区b170的身份绑定,安全区a160可以例如使用断言验证器220来验证其为真还是为假。如上文在图4的框486中所提及,如果运用与安全区a160相同的身份创建了安全区b170,那么安全区a160将能够验证第二断言何时为安全区b170的有效断言,这是由于该第二断言也将是对安全区a160已知的安全区a160自己身份的有效断言。如果是如此,那么在框566中,安全区a160存储第二公钥kb。这样,图5b中的系列步骤有效地使得安全区a160能够认证安全区b。换句话说,安全区a160能够验证其确实正在与安全区b170通信,这是因为安全区a160不应该随便与任何一个其它安全区设立安全信道。安全区a160也能够验证第二公钥kb与安全区b170的身份绑定,并且保存第二公钥kb以便参与同安全区b170的安全通信。

因此,经由图5a和5b中所描述的这些证明和认证步骤(其可以类似于握手的方式发挥作用),安全区a160配备有安全区b170的第一密钥对<ka,ka>和第二公钥kb。同样,安全区b170配备有安全区a160的第二密钥对<kb,kb>和第一公钥ka。因而,两个安全区可以使用这些密钥来推导可以用于对在这两个安全区之间发送的数据进行加密和解密的共享密钥,从而建立安全通信信道。

在一些示例中,第一密钥对和第二密钥对可以是diffie-hellman密钥对,这意味着安全区a170与安全区b170之间的共享秘密可以由安全区b170使用ka和kb来生成并且可以由安全区a160使用kb和ka独立地生成。例如,共享秘密可以使用椭圆曲线密码来生成。可以将该共享秘密用作诸如hkdf的密钥推导函数(“kdf”)的输入,以推导对称秘密密钥。也就是说,安全区a160可以使用kb和ka来推导与安全区b170使用ka和kb会推出的相同的对称秘密密钥。kdf还可以从图5a和5b的握手中获得附加上下文信息——诸如握手转录的散列,该附加上下文信息包含在两个安全区之间交换的断言——作为秘密密钥推导进程的输入。这将提供以下特性:推导出的秘密密钥以密码方式绑定至安全区a160和安全区b170的所交换的身份,并且在图5a和5b的握手期间进行了验证,以及先前在握手中交换以建立会话唯一性的任何随机值。

再次参看图3,一旦在两个安全区之间建立了安全通信信道,则在框360中,经由安全通信信道将snapshot_key从第一安全区传递到第二安全区。例如,如图6中所示的,在框610中,在安全区a160内部使用kb和ka来生成secret_key,该kb和该ka可以是来自安全区b170所生成的diffie-hellman密钥对的公钥和来自安全区a160所生成的diffie-hellman对的私钥。例如,框610可以由在框560中进入安全区a160中的线程进行。替选地,框610可以由被允许经由所保留的tcs(例如经由诸如enterandencrypt的ecall函数)进入的线程进行。如上文所描述,这种线程可以是经由新tcs进入的新线程,或经由与框430中相同的tcs进入的相同快照/证明/认证线程。在框612中,安全区a160运用secret_key对snapshot_key进行加密。

一旦进行了加密,则在框620中,将加密的snapshot_key输出到主机进程a162。在框622中,经由在框460和470中建立的通信信道将加密的snapshot_key从主机进程a162发送到主机进程b172。由于主机不具有访问secret_key的权限,因此在框620和622中发送加密的snapshot_key可以由主机侧函数ocall_fork()进行。

接下来,在框630中,允许线程经由所保留的tcs连同加密的snapshot_key进入安全区b170。例如,ocall_fork()可以调用ecall函数enterandrestore以允许线程进入安全区b170。如上文所描述,线程可以是经由新tcs进入的新线程,或经由框430的所保留的tcs进入的前述快照、证明、认证和/或加密线程。在框640中,安全区b170例如使用ka和kb来生成共享secret_key,如上文所描述,该ka和该kb可以是来自安全区a160所生成的diffie-hellman密钥对的公钥和来自安全区b170所生成的diffie-hellman对的私钥。在框642中,安全区b170使用secret_key来对加密的snapshot_key进行解密,以恢复snapshot_key。

此时,快照的恢复需要在第二安全区内部进行,以使得第二安全区可以复制在第一安全区内部运行的原始应用的实例。因而,再次参看图3,在框370中,将加密的快照拷贝到第二安全区中。然后,在框380中,运用snapshot_key在第二安全区内部对加密的快照进行解密,以在第二安全区内部恢复快照。

例如,参看图6,在框644中,将存储在分配给主机进程b172的非受信任的存储器中的加密的快照拷贝到安全区b170中。在框646中,安全区b170使用snapshot_key来对加密的快照进行解密,以恢复快照。在框648中,安全区b170恢复发往安全区b170的快照中的数据,从而创建在安全区a160内部运行的、请求了分叉的应用的所复制的实例。例如,框644、646以及648可以分别实现为ecallenterandrestore的一部分。此外,在将加密的快照拷贝到安全区b170后,主机进程b172也可以在框650中删除加密的快照。

此外,本文中所描述的特征提供了框架以针对在安全区内部运行的应用实现fork(),从而在主机实际上将不具有访问安全区内的信息的权限时提供安全区分叉支持。换句话说,在不具有该框架的情况下,因为主机不会具有访问安全区内的信息的权限,所以主机将根本无法针对安全区内的进程实现fork()。此外,包括各种保护措施是为了允许非受信任的主机协助进行分叉进程,而从不允许主机访问安全区内部的数据。通过复制安全区,该框架使得所复制的应用能够在相同安全环境内部与原始应用分开运行。

除非另有说明,否则前述替选示例不是互相排斥的,而是可以以各种组合实现以达成独特优点。由于可以在不脱离权利要求书所限定的主题的情况下利用上文所论述的特征的这些和其它变化以及组合,因此对实施例的前述描述应该理解为对权利要求书所限定的主题的说明而非经由对其的限制。另外,对本文中所描述的示例以及措辞为“诸如”、“包括”等子句的提供不应该被解释为将权利要求书的主题限制为具体示例;相反,示例仅旨在说明许多可能的实施例中的一者。另外,不同附图中的相同附图标记可以标识相同或相似元件。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1