SGX概述:第一部分(内部机制) 翻译

淺唱寂寞╮ 提交于 2019-12-02 02:41:49

目录

Overview of Intel SGX - Part 1, SGX Internals

翻译自原文:https://blog.quarkslab.com/overview-of-intel-sgx-part-1-sgx-internals.html,为避免翻译不准确,会在括号内备注英文

这篇博文为读者提供了英特尔SGX技术的概述。在第一部分中,我们将探讨为支持SGX而对英特尔平台所做的补充,重点放在处理器和内存上。然后我们解释Enclave的管理和生命周期。最后,我们详细介绍了Enclaves的两个特征:密封和认证。

1. Introduction 介绍

英特尔SGX是为满足可信计算行业的需求而开发的技术,其方式与ARM TrustZone类似,但这次是用于台式机(desktop)和服务器平台。它允许用户域代码创建称为Enclaves的私有内存区域(private memory regions),这些私有内存区域与运行在相同或更高权限级别的其他进程隔离开来。在Enclave内部运行的代码与其他应用程序、操作系统、Hypervisor等有效隔离。

2015年推出的第六代英特尔酷睿处理器基于Skylake微体系结构。通过执行设置了结构化扩展特征叶标志的CPUID指令,并检查是否设置了EBX寄存器的第二位,可以检查SGX支持。为了能够使用SGX,它必须由BIOS启用,可只有几个BIOS真正支持此技术。这也是它没有被广泛使用的原因之一。

2. Overview 概述

  • 英特尔SGX的实现可以概括为几点:
    • 应用程序分为两部分:安全应用程序和非安全应用程序;
    • 应用程序启动Enclave,该Enclave放在受保护的内存中;
    • 当Enclave函数被调用时,只有Enclave内的代码可以看到它的数据,外部访问总是被拒绝;
    • 当它返回时,Enclave数据保留在受保护的内存中。

uploading-image-777816.png

  • 安全执行环境是主机进程的一部分,这意味着:
    • 应用程序包含自己的代码、数据和Enclave
    • Enclave也包含自己的代码和自己的数据;
    • SGX保护Enclave代码和数据的机密性和完整性;
    • Enclave入口点在编译时预先定义;支持多线程(其实现并不简单);
    • Enclave可以访问其应用程序的内存,但不能反过来访问

uploading-image-126559.png

Instructions 指令

英特尔SGX定义了18条新指令:13条供管理员(supervisor)使用,5条由用户使用。所有这些指令都是用微代码(micro-code) 实现的(以便可以修改它们的行为)。有关完整的说明列表,请参阅以下内容。

Super. Description User Description
EADD Add a page EENTER Enter an enclave
EBLOCK Block an EPC page EEXIT Exit an enclave
ECREATE Create an enclave EGETKEY Create a cryptographic key
EDBGRD Read data by debugger EREPORT Create a cryptographic report
EBDGWR Write data by debugger ERESUME Re-enter an enclave
EINIT Initialize en enclave
ELDB Load an EPC page as blocked
ELDU Load an EPC page as unblocked
EPA Add a version array
EREMOVE Remove a page from EPC
ETRACE Activate EBLOCK checks
EWB Write back/invalidate an EPC page

Structures 结构

英特尔SGX还定义了13种新的数据结构:8种用于Enclave管理,3种用于内存页面管理,2种用于资源管理。参见下面的完整结构列表。

  • SGX Enclave Control Structure (SECS)
  • Thread Control Structure (TCS) 线程控制结构
  • State State Area (SSA)
  • Page Information (PAGEINFO)
  • Security Information (SECINFO)
  • Paging Crypto MetaData (PCMD) 页面加密元数据
  • Version Array (VA)
  • Enclave Page Cache Map (EPCM)
  • Enclave Signature Structure (SIGSTRUCT)
  • EINIT Token Structure (EINITTOKEN)
  • Report (REPORT)
  • Report Target Info (TARGETINFO)
  • Key Request (KEYREQUEST)

在下面的部分中,我们将详细介绍相关的指令和结构,然后对如何使用它们来实现某些功能进行详细解释。

3. Memory 内存

Enclave Page Cache (EPC)

Enclave代码和数据被放置在一个称为Enclave页面缓存 (EPC)的特殊内存区域中。该内存区域使用memory Encryption Engine (MEE)进行加密,这是一种新的专用芯片。内存总线上的外部读取只能观察加密的数据。只有在物理处理器内核内部才能解密页面。密钥在启动时生成,并存储在CPU中。

扩展了传统的页面检查,以防止对EPC页面的外部访问。
uploading-image-446827.png

Enclave Page Cache Map (EPCM)

Enclave Page Cache Map(EPCM)结构用于存储页面状态。它位于受保护的内存中,其大小限制了EPC的大小(由BIOS设置,最大128MB)。它包含每个页面的配置、权限和类型。

Memory Management

Structures

Page Information (PAGEINFO)

PAGEINFO结构用作EPC管理指令的参数,以引用页面。它包含其线性和虚拟地址,以及指向SECINFOSECS结构的指针。

Security Information (SECINFO)

SECINFO结构用于存储页元数据:访问权限(读/写/执行)和类型(SECSTCSREG,或VA).

Paging Crypto MetaData (PCMD)

The PCMD structure is used to track the meta-data associated to an evicted page. It contains the identity of the enclave the page belongs to, a pointer to a SECINFO structure and a MAC.

PCMD结构用于跟踪一个驱逐页面相关联的元数据(is used to track the meta-data associated to an evicted page)。它包含页面所属Enclave的标识,一个指向SECINFO结构的指针和一个MAC。

Version Array (VA)

VA结构用于存储从EPC中逐出的页面的版本号。它是一种特殊的页面类型,包含512个8字节的插槽(slots)来存储版本号。

Instructions

EPA-此指令分配一个4KB的内存页,其中将包含页版本号数组(VA)以防止重放(replay)。每个元素的长度为64位。

EBLOCK-此指令阻止对准备进行驱逐的页面的所有访问。以后对此页面的所有访问都将导致页面错误(“页面被阻止”)。

ETRACK -此指令从EPC中逐出页面。该页必须已正确准备:它必须被阻塞,并且不能被TLB引用。在将其写入外部存储器之前,对页面进行加密,生成版本号和元数据,并执行最终MAC。

ELDB/ELDU-此指令将先前收回的页面加载到内存中,无论是否处于阻塞状态。它检查元数据的MAC、版本号(来自相应的VA条目)和页面加密内容。如果验证成功,则解密页面内容并将其放置在所选EPC页面内,并删除相应的VA条目。

Explanations 解释

EPC内存由BIOS定义,大小有限。SGX有一种方法可以从EPC中删除页面,将其放入不受保护的内存中,并在以后恢复它。由于EPC页面管理指令允许对页面进行加密并生成其他元数据,页面保持了相同的安全属性。只有从所有处理器逻辑核心中删除了引用该页的所有缓存条目后,才能删除该页。内容以页面粒度(granularity )(4KB)导出或导入。

uploading-image-529036.png

Memory Content

SGX Enclave Control Structure (SECS)

每个Enclave都与一个SECS结构相关联,该结构将包含它的元数据(例如,它的hash和size)。它不能被任何安全或不安全的代码访问,只能由处理器本身访问。一旦实例化,它也是不可变的。

Thread Control Structure (TCS)

每个Enclave至少与一个TCS结构相关联,该结构指示进入Enclave的执行点。由于SGX支持多线程,Enclave可以有TCS一样多的活动线程。与SECS`结构一样,它只能由处理器访问,并且也是不可变的。

Save State Area (SSA)

每个TCS至少与一个SSA结构相关联,该结构用于在异常和中断处理期间保存处理器的状态。退出时写入,恢复时读取。

Stack and Heap

每个Enclave都可以使用其stack 和 heap。进入和退出时保存RBPRSP寄存器,但它们的值不变。heap(堆)不是在内部处理的,Enclaves需要自己的分配器。

uploading-image-41062.png

4. Processor 处理器

Enclave Creation

Measures 措施

Enclave Measure

每个Enclave都由其属性及其页面的位置、内容和保护的hash表示。具有相同hash的两个Enclave是相同的。此措施称为MRENCLAVE,用于检查Enclaves的完整性

Signer Measure

每个enclave都有author的签名。MRSIGNER包含author公钥的哈希。MRENCLAVEMRSIGNER是使用SHA-256散列函数产生的。

Structures

EINIT Token Structure (EINITTOKEN)

EINIT指令使用EINITTOKEN结构来检查是否允许Enclave执行。它包含Enclave的属性、hash和签名者身份。使用使用启动密钥执行的HMAC对其进行身份验证。

Enclave Signature Structure (SIGSTRUCT)

每个Enclave都与SIGSTRUCT结构相关联,该结构由其作者签名,并包含Enclave度量值、签名者公钥、版本号(ISV,反映安全级别)和产品标识符(ISVPRODID,用于区分来自同一作者的Enclave)。它允许确保Enclave没有被修改,然后使用不同的key重新签名。

Instructions

ECREATE-此指令实例化一个新的Enclave,定义其地址空间和信任根。这些信息存储在新分配的SECS.

EADD-此指令允许向Enclave添加新页面。操作系统只负责选择页面及其内容。EPCM的初始条目表示页面类型及其保护。

EEXTEND-此指令允许通过256字节的块将页面内容添加到Enclave度量值。必须调用16次才能将完整的页面添加到度量值中

EINIT-此指令在初始化Enclave之前检查Enclave是否对应于其EINITTOKEN(相同的度量和属性)。它还检查令牌是否用启动密钥签名。

EREMOVE-此指令从Enclave中永久删除页面。

1571661732111

Explanations

1.应用程序请求将其Enclave加载到内存中;

2.ECREATE指令创建并填充SECS结构;

3.使用EADD指令将每个页面加载到受保护的内存中;

4.使用EEXTEND指令将每一页添加到Enclave的度量值中;

5.EINIT指令完成Enclave创建;

1571661813782

Enclave Entry/Exit

Instructions

EENTER-此指令将控制从应用程序转移到Enclave中的预定位置。检查TCS是否空闲并清除TLB条目。然后将处理器置于Enclave模式,并保存RSP/RBPXCR0寄存器。最后,禁用Precise Event Based Sampling(PEBS),使Enclave执行显示为一个giant instruction。

EEXIT-此指令将进程置于其原始模式,并清除Enclave中地址的TLB条目。将控制权转移到位于应用程序内并在RBX寄存器中指定的地址,并释放TCS结构。Enclave需要在退出之前清除其寄存器以防止数据泄漏。

Explanations

Enclave Entry

1.执行EENTRY指令;

2.保存应用上下文;

3.将处理器置于Enclave模式。

Enclave Exit

4.执行EEXIT指令;

5.处理器处于正常模式

1571661873838

Interrupt Handling 中断处理

Instructions 指令

ERESUME - 这条指令从当前的“SSA”中恢复上下文并继续执行。

Explanations

中断和异常导致异步Enclave出口(AEX)。异步退出指针(AEP)指向位于应用程序内部的处理程序,该处理程序将在中断服务例程(ISR)处理异常后恢复执行。处理程序可以通过执行ERESUME指令来决定是否继续执行Enclave。

当发生AEX时,Enclave的上下文保存在当前的SSA中,并恢复应用上下文。执行ERESUME指令时恢复Enclave上下文。TCS包含表示当前SSA的计数器,形成上下文堆栈.

Handling an Interruption

1.中断或异常到达处理器;

2.保存Enclave上下文,恢复应用上下文;

3.在操作系统的处理程序中继续执行;

4.处理程序返回(IRET)到AEP,一个蹦床(trampoline )函数;

5.AEP如果决定恢复Enclave执行,则执行ERESUME

6.恢复之前保存的Enclave上下文;

7.在Enclave内停止的地方继续执行.

1571661894736

5. Features

Sealing

Instructions

EGETKEY - 这个指令被一个enclave用来访问平台提供的不同密钥。每个密钥可以进行不同的操作(密封、验证)。

Explanations

实例化enclave时,它的代码和数据受到保护,不受外部访问。但是当它停止时,所有的数据都丢失了。密封是一种安全保存数据的方法,例如保存在硬盘上。enclave必须使用EGETKEY指令检索它的 Seal Key 。它使用此密钥加密并确保其数据完整性。使用的算法由enclave author选择。

Using the Enclave Identity

可以使用enclave身份进行密封。然后根据“MRENCLAVE”的值进行关键推导。两个不同的enclave有不同的keys,但也有同一个enclave的两个版本,这阻止了数据的本地迁移。

Using the Signer Identity

也可以使用签名者身份进行密封。然后,根据“MRSIGNER”的值进行密钥推导。两个不同的enclave仍然有不同的密钥,但是同一个enclave的两个版本共享相同的密钥,并且可以读取密封的数据。如果多个enclave使用相同的键进行签名,那么它们都可以读取彼此的数据。

Security Version Number (SVN)

不应该允许enclave的旧版本读取由enclave的新版本封装的数据。为了防止这个问题发生,使用安全版本号 (' SVN ')。它是在每次影响enclave安全性的更新之后递增的计数器。密钥是使用‘SVN’派生出来的,在某种程度上,enclave可以检索与当前或更早的安全级别对应的密钥,但不能检索更新的密钥。

Attestation

Structures

Key Request (KEYREQUEST)

KEYREQUEST 结构用作' EGETKEY '指令的输入。它允许选择要获取哪个key,以及可能需要用于派生的其他参数。

Report Target Info (TARGETINFO)

TARGETINFO结构用作“EREPORT”指令的输入。它用于识别哪些enclave(hash and attributes)能够验证由CPU生成的“REPORT”。

Report (REPORT)

REPORT 结构是EREPORT指令的输出。它包含enclave的属性、度量、签名者身份和一些要在源和目标enclave之间共享的用户数据。处理器使用Report键在这个结构上执行MAC。

Instructions

EREPORT——enclave使用这条指令生成一个“REPORT”结构,其中包含关于它的多个信息,并使用目标enclave的Report Key进行身份验证。

Explanations

enclave代码和数据在初始化之前是纯文本形式的。虽然在技术上可以对节(sections)进行加密,但是不能预先安装解密密钥(或者它不会提供任何额外的安全性)。Secrets必须来自外部,可能是密钥和敏感数据。enclave必须能够向第三方证明它是可信的(没有被篡改),并且是在合法的平台上执行的。

存在两种类型的证明:

-本地认证:同一平台两块enclaves 之间的认证过程;
-远程认证:enclave与不在平台上的第三方之间的认证过程。

Local Attestation

  1. 在enclave A和enclave B之间必须已经建立了一个通道。enclave A使用它来检索B的“MRENCLAVE”。
  2. Enclave A使用B的' MRENCLAVE '调用' EREPORT ',为后者生成一个已签名的报告。
  3. Enclave B调用' EGETKEY '来检索它的Report Key并验证' EREPORT '结构的MAC。如果有效,enclave就是预期的并在合法平台上运行的enclave。

1571661937859

Remote Attestation

远程认证需要一个architectural enclave,称为“引用Enclave”(“QE”)。这个enclave通过使用另一个特殊密钥(即“供应密钥”)来验证并将“REPORT”(本地可验证)转换为“QUOTE ”(远程可验证)。

  1. 最初,enclave通知应用程序它需要一个位于平台外部的secret 。应用程序与服务器建立安全通信。服务器响应一个challenge ,以证明执行的enclave没有被篡改,并且它所执行的平台是合法的;
  2. 应用程序给出了Quoting Enclave的标识,并对Enclave提出了challenge ;
  3. Enclave生成一个清单(manifest ),其中包括challenge answer和一个临时公钥,稍后将使用它来保护服务器和enclave之间的通信。它生成清单的hash,清单包含在“EREPORT”指令的用户数据部分(data section)中。指令为Quoting Enclave生成一个“REPORT”,该报告将清单与Enclave绑定在一起。enclave将“REPORT”传递给应用程序。
  4. 应用程序将“REPORT”传输到“Quoting Enclave”进行验证和签名。
  5. QE”使用“EGETKEY”指令检索它的“Report Key”,并验证“REPORT”。它创建“QUOTE”结构,并在将其返回应用程序之前使用其“Provisioning Key”对其进行签名。
  6. 应用程序将' QUOTE '和相关的清单发送到服务器进行验证。
  7. 服务器使用Intel提供的认证服务来验证“QUOTE”签名。然后,它使用来自“QUOTE”用户数据的hash检查清单完整性。最后,它确保清单包含对challenge的预期答案。

1571661954162

6. Conclusion

This blog-post gives an overview of the SGX internals. We've seen how memory is managed, how to load and call an enclave, and we detailed sealing, local and remote attestation.

In the next blog-post, we will present the SGX externals (everything that is not embedded in the CPU). We will talk about the development process of an SGX enclave, the SDK and PSW (Architectural Enclaves).

这篇博客文章概述了SGX的内部机制。我们已经了解了如何管理内存,如何加载和调用一个enclave,我们还详细介绍了密封、本地和远程认证。

在下一篇博文中,我们将介绍SGX外部机制(没有嵌入到CPU中的所有东西)。我们将讨论SGX enclave、SDK和PSW(Architectural Enclaves)的开发过程。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!