enclave 创建
度量
- enclave 度量:每个 enclave 都由其属性及其页面的位置、内容和保护信息的散列表示。具有相同散列的两个 enclave 是相同的。该度量称为 MRENCLAVE,用于检查 enclave 的完整性。
- 签名度量:每个 enclave 由其作者进行签名。 MRSIGNER 包含作者公钥的哈希值。 MRENCLAVE 和 MRSIGNER 是使用 SHA-256 哈希函数生成的。
数据结构
- EINIT Token Structure (EINITTOKEN):EINIT 指令使用 EINITTOKEN 数据结构来确认是否允许运行 enclave。它包含 enclave 的属性、哈希值和签名者身份,使用通过 Launch Key 执行的 HMAC 进行身份验证。
- Enclave Signature Structure (SIGSTRUCT):每个 enclave 都关联一个 SIGSTRUCT 结构,该结构由其作者签名并包含 enclave 度量、签名者公钥、版本号(ISV,反映安全级别)和产品标识符(ISVPRODID,以区分来自同一作者的 enclave)。它允许确保 enclave 未被修改,然后使用不同的密钥重新签名。
指令集
- ECREATE:该指令实例化一个新的 enclave,定义其地址空间和信任根,这些信息存储在新分配的SECS 中。
- EADD:该指令允许向 enclave 添加一个新的页面。操作系统全权负责选择页面及其内容,EPCM 条目的初始化信息表示页面类型及其保护。
- EEXTEND:该指令允许以 256 字节的块将页面内容添加到 enclave 度量中,必须调用 16 次才能将完整的页面添加到度量中。
- EINIT:该指令在初始化 enclave 之前检查其是否对应于它的 EINITTOKEN(相同的度量和属性)。它还检查 token 是否使用 launch key 签名。
- EREMOVE:该指令从 enclave 中永久删除一个页面。
说明
- 应用程序请求将其 enclave 加载到内存中
- ECREATE 指令创建并填充 SECS 结构
- 使用 EADD 指令将每个页面加载到受保护的内存中
- 使用 EEXTEND 指令将每个页面添加到 enclave 度量中
- EINIT 指令完成 enclave 创建
enclave 进入和退出
指令集
- EENTER:该指令将控制权从应用程序转移到 enclave 内的预定位置。它检查 TCS 是否空闲并清除 TLB 条目,然后将处理器置于 enclave 模式并保存 RSP/RBP 和 XCR0 寄存器。最后,它禁用 Precise Event Based Sampling (PEBS) 以使 enclave 执行看起来像一个巨大的指令。
- EEXIT:该指令将进程放回其原始模式并清除位于 enclave 内的地址的 TLB 条目。处理器控制权被转移到位于应用程序内 RBX 寄存器指定的地址,并且释放 TCS 结构。enclave 需要在退出之前清除其寄存器以防止数据泄漏。
说明
- EENTRY 指令被执行
- 保存应用程序上下文
- 将处理器切换到 enclave 模式
- EEXIT 指令被执行
- 将处理器切换到 normal 模式