导语:SGX是Intel开发的新的处理器技术,可以在计算平台上提供一个可信的空间,保障用户关键代码和数据的机密性和完整性。SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系(IA)的一个扩展,用于增强软件的安全性。
SGX介绍
SGX是Intel开发的新的处理器技术,可以在计算平台上提供一个可信的空间,保障用户关键代码和数据的机密性和完整性。SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系(IA)的一个扩展,用于增强软件的安全性。
SGX是在2015年推出的第六代英特尔酷睿处理器,基于Skylake微架构。可以通过执行带有结构化扩展功能叶(Structured Extended Feature Leaf)标志的CPUID指令来检查SGX支持,并检查EBX寄存器的第二位是否已设置。为了能够使用SGX,它必须由BIOS启动,并且目前,只有少数BIOS支持该技术,这是它没有被广泛使用的原因之一。
SGX的保护方式并不是识别和隔离平台上的所有恶意软件,而是将合法软件的安全操作封装在一个enclave中,保护其不受恶意软件的攻击。而且执行SGX的权限非常高,特权或者非特权的软件都无法访问enclave,也就是说,一旦软件和数据位于enclave中,即便操作系统管理员和VMM(Hypervisor)也无法影响enclave里面的代码和数据。Enclave的安全边界只包含CPU和它自身。SGX创建的enclave也可以理解为一个可信执行环境TEE(Trusted Execution Environment)。不过其与ARM TrustZone(TZ)还是有一点小区别的,TZ中通过CPU划分为两个隔离环境(安全的环境和正常的环境),两者之间通过SMC指令通信;而SGX中一个CPU可以运行多个安全enclaves,并发执行亦可。当然,在TZ的安全的环境内部实现多个相互隔离的安全服务亦可达到同样的效果。另外,SGX是针对桌面和服务器平台的。
总结来说,Intel SGX的安全性能有以下3点:
1.把应用程序分为两部分:安全应用程序和非安全应用程序;
2.将合法软件的安全操作封装在一个enclave中;
3.当调用enclave函数时,只有enclave内部的代码才能查看其数据,并始终拒绝外部访问;当调用结束时,enclave的数据会留在受保护的内存中。
安全执行环境是主机进程的一部分,这意味着:
1.应用程序包含自己的代码,数据和enclave;
2.enclave也包含自己的代码和自己的数据;
3.SGX保护enclave代码和数据的机密性和完整性;
4. Enclave接入点是在编译期间预先定义的;
5.支持多线程(但不能轻易实现);
6.enclave可以访问其应用程序的内存,但应用程序的内存则无法访问enclave。
指令介绍
· Intel SGX定义了18条新指令,其中13条由管理者使用,5条由用户使用。所有这些指令都以微代码实现,以便可以修改指令的具体行为。以下是18条新指令的完整说明:
· EADD:添加页面;
· EENTER:进入enclave;
· EBLOCK:阻止EPC页面;
· EEXIT:退出enclave;
· ECREATE:创建安全区;
· EGETKEY:创建加密密钥;
· EDBGRD:通过调试器读取数据;
· EREPORT:创建加密报告;
· EBDGWR:通过调试器写入数据;
· ERESUME:重新进入安全区;
· EINIT:初始化enclave;
· ELDB:加载EPC页面为已阻止;
· ELDU:加载EPC页面为未阻止;
· EPA:添加版本数组(version array);
· EREMOVE:从EPC中删除页面;
· ETRACE:激活EBLOCK检查;
· EWB:回写或是让EPC页面无效;
其中EENTER, EEXIT, EGETKEY, EREPORT,ERESUME为用户使用的指令。
数据结构
另外,Intel SGX还定义了13种新的数据结构,其中8种用于enclave管理,3种用于内存页面管理,2种用于资源管理。以下是13种新的数据结构的完整说明:
· SGX Enclave控制结构(SECS);
· 线程控制结构(TCS);
· 存储状态区(SSA);
· 页面信息(PAGEINFO);
· 安全信息(SECINFO);
· 分页加密元数据(PCMD);
· 版本数组(VA);
· Enclave页面缓存映射(EPCM);
· Enclave签名结构(SIGSTRUCT);
· EINIT令牌结构(EINITTOKEN);
· 报告(REPORT);
· 报告目标信息(TARGETINFO)
· 密钥请求(KEYREQUEST)
我会在以下详细介绍相关的这写指令和数据结构,然后对它们如何实现哪种安全功能进行详细解释。
内存保护过程
enclave页面缓存(EPC)
Enclave代码和数据放置在被称为Enclave Page Cache(EPC)的特殊内存区域中,该内存区域使用内存加密引擎(MEE)进行加密,该内存区域只存在于一种专用的芯片上。内存总线上的外部读取只能观察到加密数据。而页面只会在处理器内核中才能被解密,这个密钥只会在enclave页面缓存启动时生成并存储在CPU中。
此时传统页面检查已被扩展,以防止外部访问EPC页面。
Enclave页面缓存映射(EPCM)
Enclave页面缓存映射(EPCM)结构用于存储页面状态,它位于受保护的内存中,其大小限制了EPC的大小(由BIOS设置,最大128MB)。EPCM包含了每个页面的配置、权限和类型。
内存管理
数据结构
页面信息(PAGEINFO):
EPC管理指令会用以PAGEINFO结构的参数来引用页面。这些参数包含页面的线性和虚拟地址,以及指向SECINFO和SECS结构的指针。
安全信息(SECINFO):
SECINFO结构用于存储页面元数据,包括访问权限(读/写/执行)和类型(SECS,TCS,REG或VA)。
分页加密元数据(PCMD):
PCMD结构用于跟踪那些从EPC中被清除的页面的相关联的元数据,它包含页面所属的enclave标识,指向SECINFO结构和MAC的指针。
版本数组(VA):
VA结构用于存储从EPC中被清除的页面的版本号,它是一种特殊的页面类型,包含512个8字节的插槽来存储版本号。
相关指令
EPA:该指令分配一个4KB的内存页面,其中包含页面版本号数组(VA)以防止重播。每个元素长64位。
EBLOCK:该指令会阻止被那些正准备从EPC中清除的页面的所有访问,将来对这些页面的所有访问都将导致页面错误。
ETRACK:该指令负责从EPC中删除页面,不过前提是页面必须被阻止访问,并且不能被TLB引用。在将其写入外部内存之前,要先对页面进行加密,生成版本号和元数据,并执行最终的MAC。
ELDB/ELDU:该指令会将先前被清除的页面加载到内存中,以检测是它们否处于禁止访问状态。它会检查元数据的MAC、版本号(来自相应的VA条目)和页面加密内容。如果先前被清除的页面处于禁止访问状态,则页面内容被解密并放置在所选的EPC页面内,并且相应的VA条目被删除。
安全功能如何实现的过程
EPC内存由BIOS定义,大小有限。 不过SGX有一种方法可以从EPC中删除页面,将其放在不受保护的内存中,并稍后恢复它。由于EPC页面管理指令允许加密页面并生成其他元数据,因此页面保持相同的安全属性。在引用此页面的所有缓存条目都已从所有处理器逻辑内核中删除之前,不能删除该页面,且以页面的粒度大小(4KB)导出或导入内容。
存储内容
SGX Enclave控制结构(SECS):
每个enclave都与SECS结构相关联,该结构将包含其元数据(例如其哈希值和大小)。任何安全或非安全代码都无法访问它,只能由处理器本身可以访问。
线程控制结构(TCS):
每个enclave至少与一个TCS结构相关联,该结构是进入enclave的执行点。由于SGX支持多线程,因此enclave可以使用与TCS一样多的活动线程。与SECS结构一样,它只能由处理器访问。
存储状态区(SSA):
每个TCS至少与一个SSA结构相关联,该结构可以在异常和中断处理期间保存处理器的状态。它在退出时写入,在恢复时读取。
栈和堆:
每个enclave都可以使用它的栈和堆,当进入和退出时,RBP和RSP寄存器会被保存,但它们的值不会被改变。堆不在内存内部进行处理,enclave有自己的分配器。
处理器保护过程
Enclave的创建和检查过程
Enclave检查(Enclave Measure):
每个enclave都由其属性以及页面的位置、内容和保护的哈希值表示。具有相同哈希的两个enclave是相同的,该方法被称为MRENCLAVE,用于检查enclave的完整性。
签名检查(Signer Measure):
每个enclave也由其管理者进行签名, MRSIGNER包含管理者公钥的哈希值,MRENCLAVE和MRSIGNER使用SHA-256哈希函数生成。
数据结构
EINIT令牌结构(EINITTOKEN):
EINIT指令使用EINITTOKEN结构来检查是否允许执行enclave。它包含enclave的属性,哈希和签名者身份,它使用启动密钥执行的HMAC进行身份验证。
enclave签名结构(SIGSTRUCT):
每个enclave都与一个SIGSTRUCT结构相关联,该结构由管理者签名并包含enclave方法,签名者公钥,版本号(ISV,反映安全级别)和产品标识符(ISVPRODID,以区分同一管理者的enclave) 。它负责确保enclave未被修改,然后使用其他密钥重新签名。
指令说明
ECREATE:该指令负责实例化一个新的enclave,定义其地址空间和信任root ,这些信息存储在新分配的SECS中。
EADD:该指令允许向enclave添加新页面,此时操作系统只负责选择页面及其内容。 EPCM的初始条目表示页面类型及其保护。
EEXTEND:该指令允许通过256字节的代码块将页面内容添加到enclave检查中,必须调用16次才能将完整页面添加到enclave检查中。
EINIT:该指令在初始化之前会检查enclave是否与其EINITTOKEN(相同的检查属性)相对应,它还会检查令牌是否已使用启动密钥签名。
EREMOVE:该指令负责彻底从enclave中删除页面。
保护过程
1.应用程序会请求将其enclave加载到内存中;
2.ECREATE指令负责创建并填充SECS结构;
3.使用EADD指令将每个页面加载到受保护的内存中;
4.使用EEXTEND指令将每个页面添加到enclave检查中;
5.EINIT指令最终完成对enclave的创建;