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 之间的证明过程

  1. enclave A 和 enclave B 之间必须已经建立了通信通道,enclave A 使用它来获取 enclave B 的 MRENCLAVE
  2. enclave A 使用 B 的 MRENCLAVE 调用 EREPORT 为后者生成已签名的 report 信息
  3. enclave B 调用 EGETKEY 来检索其 Report Key 并验证 EREPORT 结构的 MAC。如果有效,则 enclave 是预期内的,并运行在合法的平台上

remote attestation:enclave 和不在平台上的第三方之间的证明过程

remote attestation 需要一个称为 Quoting Enclave (QE) 的架构 enclave,该 enclave 对 REPORT(本地可验证)进行验证,并使用一个特殊密钥 Provisioning Key 对其签名将其转换为 QUOTE(远程可验证)。

  1. 一开始,enclave 通知应用程序它需要位于平台外部的秘密。该应用程序与服务器建立安全通信。服务器以挑战作为响应,用来证明执行的 enclave 未被篡改,并且它执行的平台是合法的。
  2. 应用程序给出 Quoting Enclave 标识符,和服务器发出的对其 enclave 的挑战
  3. enclave 生成一个清单,其中包括挑战应答和一个临时公钥,稍后将使用该公钥来保护服务器和 enclave 之间的通信。它生成包含在 EREPORT 指令的用户数据部分中的清单的散列。EREPORT 指令为 Quoting Enclave 生成 REPORT 结构,将清单与 enclave 联系起来。 enclave 将 REPORT 传递给应用程序。
  4. 应用程序将 REPORT 传输到 Quoting Enclave 进行验证和签名
  5. Quoting Enclave 使用 EGETKEY 指令检索其 Report Key 并验证 REPORT,它创建 QUOTE 结构并在将其返回给应用程序之前使用其 Provisioning Key 对其进行签名
  6. 应用程序将 QUOTE 和关联的清单发送到服务器进行验证
  7. 服务器使用英特尔提供的 attestation 服务来验证 QUOTE 签名。然后它使用来自 QUOTE 用户数据的散列检查清单完整性;最后,它确保清单包含对挑战的预期答案。

 

 

原文地址:https://www.cnblogs.com/caidi/p/15476710.html