SGX学习笔记01

Intel SGX之enclave生命周期以及认证

Posted by ZBX on February 18, 2020

Intel SGX

​ Intel SGX是Intel架构新的扩展, 在原有架构上增加了一组新的指令集和内存访问机制。这些扩展允许应用程序实现一个被称为enclave的容器, 在应用程序的地址空间中划分出一块被保护的区域, 为容器内的代码和数据提供机密性和完整性的保护, 免受拥有特殊权限的恶意软件的破坏。

enclave 生命周期

enclave创建

一个enclave需要经过创建、资源分配、可信度量三步完成创建:

  1. 应用程序将 enclave 相关的内容通过运行库提供的 enclave 创建 API 提交到运 行在ring0的SGX服务(Linux中表现为设备驱动);
  2. enclave 创建服务执行 ECREATE 指令, 为此 enclave 分配内存 (EPC, 大小为 ELRANGE, 占用原应用的一部分内存);ECREATE 指令同时也为 SECS 分配 EPC 页面;另外,ECREATE 指令初始化 MRENCLAVE的内容, 作为可信度量 凭据;
  3. EADD指令将为此enclave分配更多的EPC页面。处理器将新的页面信息(物理地址、页面类型等)更新到EPCM条目中,将页面和enclaveSECS关联起来, 并将不可信内存中的 4K 数据复制到页面中, 同时记录 SECS 中的安全记录。 开发者将选择是否使用 EEXTEND 来度量此 EPC 页面是否可信;EEXTEND 命令将每次度量 256 字节页面数据, 度量整个页面需要执行 16 次 EEXTEND 指令;度量的结果将被存储在SECS中的MRENCLAVE安全记录中;该度量 信息将被作为载入enclave数据完整性的凭据。

enclave初始化

  当enclave数据和代码被加载并度量后,使用EINIT指令初始化enclave,EADD 和 EEXTEND 指令将被禁用 (尝试执行将会出现错误)。EINIT 指令将会封装可信 度量结果, 同时确定 enclave 的 enclave id 和 sealing id, 分别被用于指令 EGETKEY 和 EREPORT。enclave id 是可信度量结果的 hash, 完整被加载的 enclave 可以正确 匹配开发者提供的SIGSTRUCT.ENCLAVEHASH;另一方面,由EREPORT处理过 得enclaveid可以用于远程认证。
  EINIT指令会检查启动器提供的EINIT令牌确定此enclave是否可以在此系统 中运行。包括enclave没有正确加载、ENINT令牌不匹配、签名不正确等任何的不 匹配都将导致enclave加载失败。 EINIT指令执行如下操作生成sealingid:

  1. 验证SIGSTRUCT结构被SIGSTRUCT中的密钥正确签名;
  2. 验证对enclave的度量结果和SIGSTRUCT中的结果相同;
  3. 验证enclave的加载和属性是正确的;
  4. 使用enclaveid、产品id和产品版本号生成sealingid;
  5. 为当前enclave设置ATTRIBUTES.INIT标志为,结束enclave初始化。

进入和退出enclave

  使得 CPU 进入 enclave 执行的方法是执行 EENTER 指令。EENTER 指令需 要一个 enclave 中 TCS 的地址, TCS 中记录了 enclave 内部可执行代码的地址和 一个可以记录寄存器状态的 SSA 帧 (用于存储 AEX 发生时的寄存器状态)。正在 enclave 中运行的 CPU 使用的 TCS 会被标记为占用, 试图调用一个被占用的 TCS 会触发错误。为了正常退出 enclave, 软件也必须指定一个 enclave 中的异步退出 地址 (AEP: Asynchronous Exit Pointer), 这个地址通常会执行 ERESUME 指令以从 enclave中返回到enclave外部。
  enclave 中的代码可以执行 EEXIT 指令退出 enclave, 递交控制权限给外部应用。这一操作需要一个外部可执行代码的地址, 并应由 enclave 的代码清除寄存器 中的遗留信息以保证代码的机密性。EEXIT会返回用于重新进行EENTER的AEP 地址。

访问

  • Intel SGX架构对于每个enclave,它提供两个度量寄存器MREnclave和MRSIGNER;MREnclave提供了构建的Enclave代码和数据的身份,MRSIGNER提供了Enclave上的权限的身份。在构建Enclave时记录这些值,并在Enclave执行开始之前完成这些值。只有TCB可访问这些寄存器。Intel SGX的SDK工具包里专口提供了一个名为sgx_sign的工具,用于给Enclave签名。一般来说,给Enclave签名是一个包含生成包含Enclave属性(如Enclave的度量)的签名结构的过程。一旦一个Enclave被签名生成了这样一个结构,就可检测到Enclave文件的修改(如代码、数据、签名等)。签名工具还会评估Enclave程序是否存在潜在的错误,并向用户发出潜在的安全隐患警告。sgx_sign通常由Intel SGX的SDK 中包含的其中一个配置工具设置,并在编译过程结束时自动运行。在加载过程中,检查签名确认Enclave未被篡改并己正确加载。

  • Enclave包括来自一个自签名证书,也称为Enclave签名(SIGSTRUCT)。Enclave签名用来检测Enclave文件的任何部分是否已被篡改的信息。这允许一个Enclave证明它己被正确加载到EPC中,并且它可被信任。但是硬件仅在加载Enclave时验证Enclave度量值。这意味着任何人都可修改Enclave,并用自己的私钥签名。为了防止这种类型的攻击,Enclave签名还标识Enclave的作者。Enclave签名包含几个重要的域,这对 于验证外部实体的Enclave至关重要:

  • Enclave度量的结果是一个256位的hash值,用于标识要放置在Enclave内的代码和初始数据,要放置的预期顺序和位置及这些页面的安全属性。任何这些变量的变化将导致不同的度量结果。当Enclave代码或数据页面放置在EPC内部时,CPU会计算Enclave的度量值,并将该值存储在MREnclave寄存器中。然后,CPU将MREnclave的内容与SIGSTRUCT中的Enclave度量值进行比较。只有当它们相互匹配时,CPU才允许初始化Enclave。

  • Enclave作者公钥,成功初始化Enclave后,CPU会将Enclave作者公开的哈希值记录在MRSIGNER寄存器中。MRSIGNER的内容将作为Enclave作者的身份。结果是己经通过相同密钥认证的那些Enclave的MRSIGNER寄存器中的值必须相同。

  • Enclave安全版本号(ISVSVN),Enclave作者给Enclave每个版本分配一个安全版本号(SVN)。SVN反映了Enclave的安全财产水平,并应随着安全财产的改善而单调增加。在成功初始化Enclave后,CPU记录SVN,可在认证期间使用。具有相同安全属性的不同版本的Enclave应分配相同的SVN。例如,具有非安全相关错误修复的新版本的飞地应具有与旧版本相同的SVN。

  • Enclave产品ID(ISVPRODID),Enclave作者还会将产品ID分配给每个Enclave。产品ID允许Enclave作者将具有相同Enclave作者身份的Enclave区域分裂。成功初始化Enclave后,产品ID由CPU记录,可在认证期间使用。

认证

​ Intel SGX 提出了两种类型的身份认证方式:一种是平台内部 enclave 间的认证,用来认证进行报告的 enclave 和 自己是否运行在同一个平台上;另一种是平台间的远程认证,用于远程的认证者认证 enclave 的身份信息。

  • 当 enclave 向平台上其他 enclave 报告身份时,先获取当前的 enclave 的身份信息和属性、平台硬件 TCB 信息,附加上用户希望交互的数据,生成报告结构;然后获取目标enclave的报告密钥,对报告结构生成一个MAC标签,形成最终的报告结构,传递给目标enclave,由目标enclave验证请求报告身份的enclave跟自己是否运行于同 一平台。

  • 为了实现远程认证,需要引入一个特殊的引用(quoting)enclave.同一平台 enclave 之间的验证使用的是对称 密钥,不适用于远程认证,因此,平台间的认证采用非对称密钥机制.由引用 enclave 创建平台认证的签名密钥 EPID(enhanced privacy identification),这个密钥不仅代表平台,还代表着底层硬件的可信度,并且绑定处理器固件的版本,当 enclave 系统运行时,只有引用enclave才能访问到 EPID 密钥。

  • 远程认证的过程中,假设远程认证方 B 要认证enclave A,A 先执行 EREPORT 指令,将 A 的身份和附加信息组合生成REPORT结构,利用引用enclave(称其为Q)的报告密钥生成一个MAC,连同报告结构一起发给Q,Q 通 过该结构验证 A 是否运行于同一平台,然后将它封装为一个引用结构体 QUOTE,并使用 EPID 进行签名,将 QUOTE 和签名一同发给远程认证者.报告结构还需提供额外的用户数据域,可用来传递用户自定义的信息,以 支持更复杂的交互方式。

​ 当 enclave 被加载时, 用于度量该 enclave 的 MRENCLAVEMRSIGNER 被 保存在 256 位的度量寄存器 (MR, Measurement Registers) 中。其中 MRENCLAVE 如2.3.2所述,被EEXTEND迭代更新;对enclave的任何更改都将得出不同的MRENCLAVE值。MRSIGNER是enclave签名者公钥的SHA-256hash值,该签名存储于 SIGSTRUCT 中。结合 enclave 安全版本号, MRSIGNER 使得开发者可以开发迭代 的产品,新版本的enclave可以使用更早版本的签名数据,反之则不行。
EGETKEY 指令可以根据开发者选择使用可信度量、签名信息、硬件信息等 参数获得只对当前 enclave 负责 (或可以对之后版本负责) 的密钥, 用于数据封存、 REPORT、EINITTOKEN、远程enclave认证等操作。