AlexiaChen / AlexiaChen.github.io

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues
87 stars 11 forks source link

TEE之Intel SGX libOS-Occlum调研杂记 #171

Open AlexiaChen opened 1 year ago

AlexiaChen commented 1 year ago

语句比较零散琐碎。

SGX1 和 SGX2只是SGX的不同指令集,SGX2的指令集只是对enclave中的内存和线程提供了运行时的灵活管理,除此之外都是一样的。SGX1 和 SGX2不是全新的不兼容的SGX架构,也不应该认为 SGX2是你之前概念中的全新的SGX的2.0版本。这是有误解的。所以也不存在SGX1的代码不能运行在SGX2上,也不存在,以后的机器都是SGX2的平台机器这样的说法。

它两是互相配合的,即使没有SGX2,代码也可以良好运行,也不可能只有SGX2的指令,代码就可以运行,因为不是全新的SGX架构,只是提供不了运行时的灵活管理资源管理功能。

Occlum暂时不支持SGX2的EDMM(enclave动态内存管理,enclave dynamic memory management) https://github.com/occlum/occlum/issues/979 因为Intel SGX SDK和Linux kernel没有对SGX2指令集的补丁,可能要等到kernel 6.0

Occlum论文,写论文之初的时候,Occlum是暂时按照SGX1设计的

Enclave dynamic memory management. On SGX 1.0, after an enclave is initialized, enclave pages cannot be added, removed, or modified with their permissions. On SGX 2.0, this restriction has been removed by new SGX instructions. However, Intel has not yet shipped SGX 2.0 CPUs widely. So we implement Occlum on SGX 1.0 to maximize its compatibility.

举个例子,虽然Occlum不支持SGX2指令,但是OCclum可以在支持SGX2的机器上运行,只是不能用SGX2指令提供的功能而已。

enclave中的内存是不支持内存分段和页表的(但是有页面这个概念,只是页面不能动态增删,SGX2可以做到动态增删页面), 但是Occlum要在这个限制条件下做多进程而且是高效安全的,enclave的内存有限制,那么怎么在一个enclave上跑多进程呢?是用到了Intel MPX指令集,也就是内存保护扩展指令集来隔离保护被换出的enclave内存页(通过MPX的bound寄存器),相当于还是做到了安全的页面调度。也包括domains中的一些非安全指令的检查和禁止。

Graphene-SGX的多进程隔离是enclave隔离的,是不同的libOS实例,创建管理代价昂贵,也不方便在不同的OS instance之间通信。不可以往加密文件系统上写文件。所以这个项目被封存了,不再开发。

Graphene-SGX和Haven也不是没有优点,它们是二进制兼容,也就是二进制文件不用修改,直接跑在enclave里面 (个别情况也会要求修改源码)。Occlum,Panoply这些只是源码兼容,就是要重新用Occlum提供的工具编译一下,才可以运行在enclave中。

enclave中的页面

enclave中的页面被存放在enclave page cache中,这个cache被分割成一个一个的页面,一个EPC页面大小为4KB,按照4KB边界对齐。这个cache是所有enclave共用的,所以某些EPC页面,可能有其他enclave的owner。每个enclave实例,都有属于自己的页面,这些页面被一个enclave page cache map的数据结构管理。EPC page中的内容也是CPU加密引擎加密的。而SGX2的指令,就是可以对这些页面进行动态增删。EPC可能的具体实现就是主机内存的某一特殊部分区间。这一部分的页面管理,调度,有点类似于普通操作系统中介绍的页面管理。