导语:此文章详细概述了SGX的内部组件,管理内存的详细过程,如何加载和调用enclave,如何密封管理从而进行本地和远程安全认证。
上一篇,我介绍了SGX内部组件的一些基本架构,今天我接着介绍。
Enclave的进入或退出
指令介绍
EENTER:该指令将控制从应用程序转移到Enclave内的预定确定的位置,它会检查TCS是否空闲并清除TLB条目,然后它将处理器置于Enclave模式并保存RSP/RBP和XCR0寄存器。最后,它禁用基于事件的精确抽样(PEBS),使enclave执行看起来像一个复杂的指令。
EEXIT:该指令将进程恢复为原始模式,并清除位于Enclave内的地址的TLB条目。控件被转移到应用程序中的指定地址,该地址会在RBX寄存器中指定,并释放TCS结构。enclave需要在退出之前清除其寄存器,以防止数据泄漏。
Enclave的进入过程
1.执行EENTRY指令;
2.保存应用程序上下文;
3.处理器处于enclave模式;
Enclave的退出过程
1.执行EEXIT指令;
2.处理器处于正常模式;
中断处理
指令介绍
ERESUME:该指令从当前SSA恢复上下文并恢复执行。
指令执行说明
异步Enclave退出( Asynchronous Enclave Exits,AEX)会导致中断和异常,异步退出指针( Asynchronous Exit Pointer,AEP)指向位于应用程序内部的处理程序,该处理程序将在中断服务程序(Interrupt Service Routine,ISR)处理异常后恢复执行。处理程序可以通过执行ERESUME指令决定是否继续执行enclave。
当AEX发生时,Enclave的上下文被保存在当前SSA中并恢复应用程序上下文。执行ERESUME指令时,将恢复Enclave上下文。TCS包含一个表示当前SSA的计数器,组成一个上下文栈。
中断处理过程
1.中断或异常信息被传送到处理器;
2.保存enclave上下文,恢复应用程序上下文;
3.在操作系统的处理程序中继续执行;
4.处理程序返回(IRET)到AEP一个trampoline函数;
5.如果AEP决定恢复enclave执行,则执行ERESUM;
6.先前保存的enclave上下文已恢复;
7.在enclave内中断的地方恢复执行过程;
最大的安全特性——密封性
指令说明
EGETKEY:Enclave使用此指令访问平台提供的不同密钥,每个密钥可以实现不同的操作(密封、安全认证)。
指令执行说明
当实例化enclave时,其代码和数据将受到保护以免被外部访问,但当enclave停止实例化时,它的所有数据都会丢失。所谓密封操作就是一种将数据安全地保存在enclave外部的方法,例如硬盘驱动器上的方法。enclave必须使用EGETKEY指令检索其密封密钥。它使用此密钥加密并确保其数据完整性,而使用的算法则由enclave管理者选择。
使用Enclave标识
可以使用enclave标识进行密封,然后,密钥推导基于MRENCLAVE的值。两个不同的enclave都有着自己的密钥,但也有相同enclave的两个版本,这会阻止数据的本地迁移。
使用签名者标识
也可以使用签名者标识进行密封,然后,密钥推导基于MRSIGNER的值。两个不同的enclave仍然有着不同的钥匙,但两个版本的enclave共享相同的钥匙,可以读取密封的数据。如果使用相同的密钥对多个enclave域进行签名,则它们都可以读取彼此的数据。
安全版本号(SVN)
原则上,旧版本的enclave是不允许读取由较新版本的enclave密封的数据,为防止出现意外,就需要使用安全版本号(SVN)。在每次enclave的安全性被更新后,安全版本号的计数器都会递增。使用SVN产生密钥时,Enclave可以检索与当前版本或更旧版本的安全级别相对应的密钥,但不能找到较新版本对应的密钥。
安全认证
安全认证结构
密钥请求(KEYREQUEST)
KEYREQUEST结构用作EGETKEY指令的进入,它允许选择要获取的密钥,以及生成所需的其他参数。
报告目标信息(TARGETINFO)
TARGETINFO结构用作EREPORT指令的进入,它将用于识别能够验证CPU生成的报告结构的enclave(哈希和属性)。
报告(Report)
REPORT结构是EREPORT指令退出的,它包含enclave的属性、检测标识、签名者标识以及在源和预定的enclave之间共享的一些用户数据,处理器使用报告密钥在此结构上执行MAC。
指令介绍
EREPORT:Enclave使用此指令生成一个REPORT结构,其中包含有关它的许多信息,并使用预定的Enclave的报告密钥进行标识验证。
指令执行说明
enclave代码和数据在初始化之前是明文形式的,虽然其中一部分可以从技术上进行加密,但是解密密钥不能预先安装(或者它不会提供任何额外的安全性)。加密必须来自外部,可能是密钥和敏感数据。enclave必须能够向第三方认证它可以被信任(没有被篡改过),并且是在一个合法的平台上执行的。以下是两类认证方式:
1.本地认证:同一平台的两个enclave之间的认证过程;
2.远程认证:enclave和不在平台上的第三方之间的认证过程;
本地认证
必须在enclaveA和enclaveB之间建立一个通道,enclaveA使用该通道来检索enclaveB的MRENCLAVE。Enclave A使用Enclave B的MRENCLAVE调用EREPORT来为Enclave B生成签名报告。
Enclave B调用EGETKEY来检索其报告密钥并验证EREPORT结构的MAC,如果有效,则enclave是预期的并且在合法平台上运行。
远程认证
远程认证需要一个被称为Quoting Enclave(QE)的enclave,此Enclave通过使用另一个特殊密钥Provisioning Key对REPORT进行签名验证(本地验证),并将其转换为QUOTE(远程验证)。具体步骤如下:
1.最初,enclave会通知应用程序,它需要在位于平台外部的某个位置加密。此时,应用程序与服务器建立安全通信,服务器对此请求进行回应,以认证正在执行的enclave没有被篡改,并且它执行的平台是合法的;
2.该应用程序为其enclave提供了Quoting Enclave标识和认证请求;
3.enclave产生一个包括认证回应和临时公钥的清单,该公钥将在稍后被用于保护服务器和enclave之间的通信。而生成的哈希,则包含在EREPORT指令的用户数据部分中。该指令为Quoting Enclave生成一个报告,将清单与enclave关联起来,此时,enclave将REPORT发送给应用程序;
4.该应用程序将REPORT发送到Quoting Enclave进行验证和签名;
5.QE使用EGETKEY指令检索其报告密钥并验证REPORT,它会创建QUOTE结构,并在将其提供给应用程序之前使用其Provisioning Key对其进行签名;
6.应用程序将QUOTE和关联的清单发送到服务器进行验证;
7.服务器使用Intel提供的认证服务来验证QUOTE签名,然后,它使用QUOTE用户数据中的哈希检查清单完整性。以确保清单包含对认证的预期响应。
总结
此文章详细概述了SGX的内部组件,管理内存的详细过程,如何加载和调用enclave,如何密封管理从而进行本地和远程安全认证。
在下一篇文章中,我将计划介绍SGX外部(未嵌入CPU的所有内容),届时我将讨论SGX enclave的开发过程,SDK和PSW(以构建的 Enclave)。