SGX 的内部组件概述(二)

上一篇,我介绍了 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)。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();