目录
《再回顾SGX初始化(二)——uRTS端构建Enclave》
《再回顾SGX初始化(三)——uRTS维护Enclave、tRTS完成Enclave构建收尾确认工作》简介
目录
《再回顾SGX初始化(二)——uRTS端构建Enclave》
《再回顾SGX初始化(三)——uRTS维护Enclave、tRTS完成Enclave构建收尾确认工作》
《Intel SGX Enclave初始化》简介
下图是《Intel SGX Enclave初始化》中的Enclave初始化时硬件间关系图,Enclave初始化大致经历了(1)申请Enclave内存,(2)创建SECS数据结构,(3)加载Enclave代码进Enclave内存,(4)度量Enclave代码,(5)完成初始化。
这张图代表了SGX初始化中最重要的环节。所经历的过程是位于《再回顾SGX初始化(二)——uRTS端构建Enclave》,其他环节主要是针对这个环节进行扩展工作。
下面这张图也放在《Intel SGX Enclave初始化》中,是对SGX初始化所有流程的关键内容的简化提取,从这也可以看到《再回顾SGX初始化(二)——uRTS端构建Enclave》占据了各个环节中最重要的地位。
《再回顾SGX初始化(一)——环境检查》简介
SGX初始化过程中部分扩展特性的声明、验证和配置(Switchless特性、PCL特性、KSS特性)。
ex_features_p数组项 | 说明 |
0 | pointer to an Intel® SGX PCL sealed key |
1 | pointer to the sgx_uswitchless_config_t structure |
2 | pointer to the sgx_kss_config_t structure |
3:31 | reserved, must be NULL |
将Enclave文件映射到进程的虚拟地址空间。这个映射的位置就是下图Enclave虚拟内存视图的虚框部分。
将Enclave文件这个ELF文件进行全面的ELF格式解析,验证Enclave文件格式的正确性,以及对Enclave文件中关键信息(关键符号、动态Section、元数据【其中包括重要的Enclave布局信息等】)进行记录,后续在构建Enclave时经常会用到这些信息。比如布局直接填充到ELRANGE,起ELRANGE结构性(堆、栈、TCS等)格局作用,比如动态Section中的REL、PLT用于重定位过程,比如关键符号用于进出Enclave时提供出入口。
对当前软件栈平台进行验证,尤其是版本情况进行匹配验证。
对当前CPU的X扩展特性进行验证、分析和记录,后续构建Enclave过程中,需要依据X特性对细节进行指定,比如根据X特性支持情况,在进出Enclave时候针对X特性,额外保存X特性相关的上下文环境(比如SSE、AVX、MPX等CPU扩展特性的上下文内容,并且值得提醒的是Enclave内外是两套不同的上下文环境)。一切的目的是为了让SGX和CPU扩展特性有更好地兼容,并且不会引入任何安全问题。
《再回顾SGX初始化(二)——uRTS端构建Enclave》
包括部分扩展特性的声明、验证和配置(Switchless特性、PCL特性、KSS特性)。
SGX元数据的验证,后面会用到。
将SGX驱动绑定的设备作为Enclave或者说ELRANGE的基址,构建SECS(管理并代表一个Enclave的数据结构),并加载到EPC中。
对Enclave文件映射打补丁,将一些全局变量等信息更新到Enclave文件映射,后续会使用Enclave文件映射构建ELRANGE。
将PT_LOAD、PT_TLS等类型的Segment加载到ELRANGE和对应的EPC中。
将元数据中堆、线程上下文等布局信息加载到ELRANGE和对应的EPC中。
布局情况可以参考下图
上面提到SECS的构建会涉及到ECREATE硬件指令,并且任何页加载到EPC的过程都会涉及到EADD、EEXTEND硬件指令。并且ECREATE、EADD、EEXTEND都是Ring0权限的ENCLS硬件指令,需要SGX驱动来完成。
之后EINIT硬件指令判断Enclave加载过程是否可信,是否是一个可信启动过程。
《再回顾SGX初始化(三)——uRTS维护Enclave、tRTS完成Enclave构建收尾确认工作》简介
uRTS维护一个CEnclave类用来管理使用Enclave。
如果开启了调试模式,那么就对调试模式的相关功能进行初始化,比如VTune。
uRTS请求裁剪敏感的或者动态的EPC页。
进入tRTS完成Enclave初始化相关的配套工作,比如ELRANGE的符号、地址重定位过程,比如字符串库、加密库的优选过程,比如保留内存、线程栈保护机制的初始化,比如初始化或调整线程栈、TCS等线程相关信息。此外还有就是对之前敏感或动态页的裁剪申请进行批准接受(调用EACCEPT硬件指令,Ring3权限的ENCLU硬件指令)。
这里进出Enclave都是通过上下文切换的方式。
《再回顾SGX初始化(四)》简介
将通过裁剪申请的裁剪页重新放入到可用EPC页中。
mprotect设置ELRANGE中各个Section的访问属性以及各个Segment对应的访问属性
如果元数据版本较新,并且当前环境支持EDMM,那么对PT_GNU_RELRO、PT_LOAD的Segment,用Ring0权限的EMODPR硬件指令来设置这些页的访问权限为RX,Ring0权限的EMODPR硬件指令会对管理EPC属性的EPCM进行调整设置。rsrv内存用EMODPR改为RW。不支持EDMM等情况,就不进行改动。
针对上下文相关的内存,内存访问控制属性用mprotect设置为RW。rsrv内存在不支持EDMM情况下,不要用mprotect改变它的属性。
针对EREMOVE掉的页,需要用mprotect设置为PROT_NONE,不然这个页一旦被访问,会发生总线异常(sigbus exception),因为这个EPC页已经被EREMOVE硬件指令给从当前Enclave中去除,EPCM也没有再维护EREMOVE掉的页的信息。
上面所涉及到的ELRANGE的页本身在ECREATE、EADD、EREMOVE时就设置或更改了基本的EPCM项,这里主要是进行调整,以及在进程虚拟地址空间用mprotect进行访问控制设置。
填充TCS最小池,使得TCS最小池现有的TCS数量达到最低要求。
Switchless模式的初始化。