e46955900cd5affc2ce33b092526bc33.png

这篇文章为读者提供了英特尔SGX技术的概述。在第一部分中,我将探讨为支持SGX而在英特尔平台上增加的功能,重点是处理器和内存;然后,我解释Enclave的管理和生命周期;最后,我详细介绍了Enclave的两个特征:秘密和证书。

介绍

英特尔SGX是一项旨在满足可信计算需求的技术,其开发方式类似于ARM TrustZone,但这个是针对台式机和服务器平台。它允许用户域代码创建安全区的私有内存区域,这些区域与以相同或更高特权级别运行的其他进程隔离。Enclave中运行的代码与其他应用程序,操作系统,系统管理程序等有效隔离。

它于2015年与第六代Intel Core处理器一起推出,该处理器基于Skylake微体系结构。可以通过在设置了“ 结构化扩展功能叶”标志的情况下执行CPUID指令,并检查EBX寄存器的第二位是否已设置,来检查SGX支持。为了能够使用SGX,必须通过BIOS启用了SGX,并且实际上只有少数BIOS支持此技术,这是它没有被广泛使用的原因之一。

总览

英特尔SGX可以总结为以下几点:

·应用程序分为两部分:安全部分和非安全部分;

·应用程序启动安全区,该安全区放置在受保护的内存中;

·当一个安全区域函数被调用时,只有安全区域内的代码才能看到其数据,外部访问总是被拒绝;返回时,安全区数据将保留在受保护的内存中。

2812416ac177c17b27cd308eb6e5300a.png

安全执行环境是宿主进程的一部分:

·该应用程序包含其自己的代码,数据和安全区域;

·Enclave也包含自己的代码和数据。

·SGX保护安全区代码和数据的机密性和完整性;

·Enclave进入点是在编译时预定义的;

·支持多线程(但实现起来并不容易);

·一个安全区可以访问其应用程序的内存,但不能反过来。

c2935092486fd5bf958fdb2be4c5547e.png

使用说明

英特尔SGX定义了18条新指令:13条由supervisor使用,5条由用户使用。所有这些指令均以微代码实现(以便可以修改其行为)。

请参阅下面的完整说明列表:

1d0171ec7b4e00e7e0529e574e5c34ca.png

结构体

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

7c967126617640f12af425a41107986b.png

在以下各节中,我将详细介绍相关的指令和结构,然后对它们如何用于实现某些功能的高级解释。

内存

Enclave页面缓存(EPC)

安全区代码和数据放置在安全区页面缓存(EPC)的特殊存储区域中。使用新的专用芯片Memory Encryption Engine(MEE)对此存储区域进行加密,内存总线上的外部读取只能观察加密的数据,仅在物理处理器内核内部时才解密页面,密钥在引导时生成,并存储在CPU中。

扩展了传统的页面检查功能,以防止外部访问EPC页面。

804d21d4806aa423c80d2fae404e6200.png

Enclave页面缓存映射(EPCM)

区页面高速缓存地图(EPCM)结构被用于存储页面的状态,它位于受保护的内存中,其大小限制了EPC的大小(由BIOS设置,最大128MB),它包含每个页面的配置,权限和类型。

内存管理

结构体

页面信息(PAGEINFO)

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

安全信息(SECINFO)

该SECINFO结构用于存储页面的元数据:访问权限(读/写/执行)和类型(SECS,TCS,REG,或VA)。

分页加密元数据(PCMD)

该PCMD结构用于跟踪相关联的一个驱逐页面的元数据。它包含页面所属的安全区的标识,指向SECINFO结构的指针和MAC。

版本阵列(VA)

该VA结构是用来存放从EPC驱逐页的版本号。这是一种特殊的页面类型,包含512个8字节的插槽,用于存储版本号。

使用说明

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

EBLOCK-该指令阻止对准备移出的页面的所有访问,将来对该页面的所有访问都将导致页面错误(“页面被阻止”)。

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

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

说明

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

12b6eb92cdb8db6a050528d99ba85750.png

内存中的内容

SGXEnclave控制结构(SECS)

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

线程控制结构(TCS)

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

保存区域(SSA)

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

堆栈

每个Enclave都可以使用其栈空间和堆空间。该RBP和RSP寄存器保存进入和退出的时候,但他们的值不会改变,堆不是内部处理的,Enclave需要它们自己的分配器。

317457ebda7043b465c2eceeea3faf0f.png

处理器 Enclave

措施

Enclave措施

每个Enclave均由其属性以及其页面的位置,内容和保护组成的哈希表示。具有相同散列的两个Enclave是相同的,此措施称为MRENCLAVE,用于检查Enclave的完整性。

签署者措施

每个Enclave也由其作者签名,MRSIGNER包含作者的公共密钥的哈希。MRENCLAVE和MRSIGNER是使用SHA-256哈希函数生成的。

结构体

EINIT结构(EINITTOKEN)

该EINITTOKEN结构用于由EINIT指令,以检查是否Enclave被允许执行,它包含安全区的属性,哈希和签名者身份。使用通过启动密钥执行的HMAC对其进行身份验证。

Enclave签名结构(SIGSTRUCT)

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

使用说明

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

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

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

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

EREMOVE -此指令从Enclave上永久删除一页。

6194c6cc35eac62325710bc145aec61f.png

说明

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

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

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

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

5. 在EINIT指令定型Enclave。

42875399121ca1960637960cfd6a5279.png

Enclave进入/退出

使用说明

EENTER-此指令将控制权从应用程序转移到安全区域内的预定位置。它检查TCS是否可用,并清除TLB条目,然后将处理器置于隔离模式,并保存RSP / RBP和XCR0寄存器。最后,它禁用了基于精确事件的采样(PEBS),以使Enclave执行看起来像一条很大的指令。

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

说明

Enclave进入

1. EENTRY指令已执行;

2. 应用程序上下文已保存;

3. 处理器处于隔离模式。

Enclave出口

1. 执行EEXIT指令;

2. 处理器进入正常模式。

53a272f60362603628e27d89008329f0.png

中断处理

使用说明

ERESUME-该指令从当前SSA恢复上下文并恢复执行。

说明

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

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

处理中断

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

2. Enclave上下文已保存,应用程序上下文已还原;

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

4. 处理程序将(IRET)返回到AEP;

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

6. 恢复先前保存的安全区上下文;

7. 恢复在Enclave中停止的位置执行。

4bef23eea2eccf800e38257c3518d05c.png

特征 Sealing

使用说明

EGETKEY-安全区使用此指令来访问平台提供的不同密钥,每个键可启用不同的操作(密封,证明)。

说明

实例化一个安全区时,其代码和数据将受到保护,以防止外部访问,但是当它停止时,所有数据都会丢失。密封是一种将数据安全地保存在安全区域外部(例如在硬盘驱动器上)的方法。Enclave必须使用EGETKEY指令检索其密封钥匙,它使用此密钥来加密并确保其数据完整性,Enclave作者选择使用的算法。

使用Enclave身份

可以使用Enclave标识进行密封。然后,密钥派生基于MRENCLAVE的值,两个不同的安全区具有不同的密钥,但是同一安全区还具有两个版本,这会阻止数据的本地迁移。

使用签名者身份

也可以使用签名者身份进行密封。密钥派生然后基于MRSIGNER的值,两个不同的安全区仍具有不同的密钥,但是一个安全区的两个版本共享相同的密钥,并且可以读取密封的数据。如果多个Enclave使用相同的密钥签名,则它们都可以读取彼此的数据。

安全版本号(SVN)

不应允许旧版本的Enclave读取由更高版本的Enclave密封的数据。为防止这种情况,请使用安全版本号(SVN),每次更新都会影响安全区的安全性,它是一个递增的计数器,密钥是使用SVN派生的,Enclave可以检索与当前或更旧的安全级别相对应的密钥,但不能更新。

Attestation

结构体

密钥请求(KEYREQUEST)

该KEYREQUEST结构被用作输入到EGETKEY指令,它允许选择要获取的密钥以及派生可能需要的其他参数。

报告目标信息(TARGETINFO)

该TARGETINFO结构被用作用于输入ereport的指令,它用于标识哪个区域(哈希和属性)将能够验证CPU生成的REPORT。

报告(REPORT)

REPORT结构是输出ereport的指令。它包含安全区的属性,度量,签名者身份以及一些要在源安全区和目标安全区之间共享的用户数据,处理器使用Report Key在此结构上执行MAC 。

使用说明

EREPORT-安全区使用此指令来生成REPORT结构,该结构包含有关它的多个信息,并使用目标安全区的Report Key进行身份验证。

说明

安全区代码和数据在初始化之前为纯文本格式。从技术上讲,可以对部分进行加密,但不能预安装解密密钥(否则它将不提供任何其他安全性),秘密必须来自外部,可能是密钥和敏感数据。该Enclave必须能够向第三方证明它可以被信任(未被篡改)并且可以在合法平台上执行。

存在两种类型的证明:

·本地证明:同一平台的两个Enclave之间的证明过程;

·远程证明:Enclave和不在平台上的第三方之间的证明过程。

本地证明

1. 在安全区A和安全区B之间必须已经建立了一个通道。安全区A使用该通道来检索B 的MRENCLAVE。

2. 安全区A 用B 的MRENCLAVE调用EREPORT为其生成签名的报告。

3. 区域B调用EGETKEY检索其报告密钥并验证EREPORT结构的MAC ,如果有效,则该Enclave应为预期的并在合法平台上运行。

4939e0f8a37417025dba9e47242d652e.png

远程认证

远程认证需要一个称为Quoteing Enclave(QE)的体系结构。此Enclave通过使用另一个特殊密钥Provisioning Key对其进行签名,来验证REPORT(可本地验证)并将其转换为QUOTE(可远程验证)。

1. 最初,安全区告知应用程序它需要位于平台外部的机密。该应用程序与服务器建立安全通信,服务器回应challenge,以证明Enclave的执行未被篡改,并且其执行的平台是合法的。

2. 该应用程序给出了“ Enclave”的身份以及对其Enclave的challenge;

3. 该安全区生成一个清单,其中包含质询答案和短暂的公共密钥,稍后将使用这些清单来保护服务器与安全区之间的通信。它生成清单的哈希,该清单包含在EREPORT指令的用户数据部分中。指令为Enclave生成一个REPORT,将清单与Enclave联系起来,Enclave将REPORT传递给应用程序。

4. 应用程序将报告传输到报价区域进行验证和签名。

5. 该QE检索其报告的主要使用EGETKEY指令并验证报告。它创建QUOTE结构并使用其Provisioning Key对其进行签名,然后再将其返回给应用程序。

6. 应用程序将QUOTE和关联的清单发送到服务器以进行验证。

7. 服务器使用英特尔提供的证明服务来验证QUOTE签名。然后,它使用QUOTE用户数据中的哈希检查清单完整性。最后,它确保清单包含对challenge的预期答案。

dd09f431c986e95c3729aec2aca56346.png

结论

这篇文章概述了SGX内部,我已经了解了如何管理内存,如何加载和调用安全区。

在下一篇博文中,我将介绍SGX外部组件(所有未嵌入CPU的组件),我将讨论SGXEnclave,SDK和PSW的开发过程。

参考及来源:https://blog.quarkslab.com/overview-of-intel-sgx-part-1-sgx-internals.html