Intel SGX(4)——特性
密封
指令集
EGETKEY:enclave 使用此指令来访问平台提供的各种不同密钥。每个密钥启用不同的操作(密封、证明)。
说明
当一个 enclave 被实例化时,它的代码和数据被保护免被外部访问。但是当它停止时,它的所有数据都将丢失。密封是一种将数据安全地保存在 enclave 之外的方法,例如在硬盘驱动器上。enclave 必须使用 EGETKEY 指令检索其密封密钥,它使用此密钥来加密并确保其数据完整性,使用的算法由 enclave 作者选择。
- 使用 Enclave 标识符
密封可以使用 enclave 标识来完成。此时基于 MRENCLAVE 的值进行密钥派生,两个不同的 enclave 具有不同的密钥,同一个 enclave 的两个版本也将有不同的密钥,这会阻止数据的本地迁移。
- 使用签名者标识符
也可以使用签名者身份标识符进行密封。这个密钥派生是基于 MRSIGNER 的值,两个不同的 enclave 仍然具有不同的密钥,但是一个 enclave 的两个版本共享同一个密钥并且可以读取密封数据。如果多个 enclave 使用相同的密钥进行签名,则它们都可以读取彼此的数据。
- 安全版本号 (SVN)
不允许旧版本的 enclave 读取新版本的 enclave 密封的数据。为了防止它,使用了安全版本号 (SVN)。这是一个计数器,在每次更新影响 enclave 安全性后递增。使用 SVN 派生密钥的方式是,enclave 可以检索与当前或较旧的安全级别相对应的密钥,但不能检索较新的密钥。
证明
数据结构
- Key Request (KEYREQUEST):KEYREQUEST 结构用作 EGETKEY 指令的输入。它选择要获取哪一个密钥,以及派生密钥可能需要的其他参数。
- Report Target Info (TARGETINFO):TARGETINFO 结构用作 EREPORT 指令的输入。它用来标识哪一个 enclave(散列和属性)能够验证 CPU 生成的 REPORT。
- Report (REPORT):REPORT 结构是 EREPORT 指令的输出。它包含 enclave 的属性、度量、签名者身份和一些在源和目标 enclave 之间共享的用户数据。处理器使用 Report Key 对该结构执行 MAC 操作。
指令集
EREPORT:enclave 使用此指令生成包含与它有关的多个信息的 REPORT 结构,并使用目标 enclave 的 Report Key 进行身份验证。
说明
enclave 代码和数据在初始化之前是纯文本的。虽然在技术上 ELF 文件中的 sections 是可以加密的,但不能预先安装解密密钥(或者它不会提供任何额外的安全性)。秘密必须来自外部,可能是密钥和敏感数据。enclave 必须能够向第三方证明它是可信的(未被篡改)并在合法平台上执行。
存在两种类型的Attestation:
local attestation:同一平台的两个 enclave 之间的证明过程
- enclave A 和 enclave B 之间必须已经建立了通信通道,enclave A 使用它来获取 enclave B 的 MRENCLAVE
- enclave A 使用 B 的 MRENCLAVE 调用 EREPORT 为后者生成已签名的 report 信息
- enclave B 调用 EGETKEY 来检索其 Report Key 并验证 EREPORT 结构的 MAC。如果有效,则 enclave 是预期内的,并运行在合法的平台上
remote attestation:enclave 和不在平台上的第三方之间的证明过程
remote attestation 需要一个称为 Quoting Enclave (QE) 的架构 enclave,该 enclave 对 REPORT(本地可验证)进行验证,并使用一个特殊密钥 Provisioning Key 对其签名将其转换为 QUOTE(远程可验证)。
- 一开始,enclave 通知应用程序它需要位于平台外部的秘密。该应用程序与服务器建立安全通信。服务器以挑战作为响应,用来证明执行的 enclave 未被篡改,并且它执行的平台是合法的。
- 应用程序给出 Quoting Enclave 标识符,和服务器发出的对其 enclave 的挑战
- enclave 生成一个清单,其中包括挑战应答和一个临时公钥,稍后将使用该公钥来保护服务器和 enclave 之间的通信。它生成包含在 EREPORT 指令的用户数据部分中的清单的散列。EREPORT 指令为 Quoting Enclave 生成 REPORT 结构,将清单与 enclave 联系起来。 enclave 将 REPORT 传递给应用程序。
- 应用程序将 REPORT 传输到 Quoting Enclave 进行验证和签名
- Quoting Enclave 使用 EGETKEY 指令检索其 Report Key 并验证 REPORT,它创建 QUOTE 结构并在将其返回给应用程序之前使用其 Provisioning Key 对其进行签名
- 应用程序将 QUOTE 和关联的清单发送到服务器进行验证
- 服务器使用英特尔提供的 attestation 服务来验证 QUOTE 签名。然后它使用来自 QUOTE 用户数据的散列检查清单完整性;最后,它确保清单包含对挑战的预期答案。