目录
硬件指令
硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是ENCLS。用户权限硬件指令指的是指令用户态下便能访问,缩写是ENCLU。每一个具体的功能指令被称为叶功能,如EADD叶功能,因为叶功能之间的区分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在输入时都是用作叶功能号。
内核权限硬件指令-ENCLS
如图2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文将介绍的Enclave初始化,ECREATE指令创建Enclave,主要是创建SECS,然后EADD添加EP(Enclave Page)并把Enclave文件内容拷贝到EP中,EEXTEND度量EP,最后EINIT确定这个Enclave建立是否合法可信。
如图3所示,SGX 2代指令在1代基础上添加了动态增加EP、修改EP权限类型的功能,在1代中,在Enclave初始化以后,不能动态增加EP或者修改EP权限属性。
图2:SGX 1代内核权限硬件指令
图3:SGX 2代新增内核权限硬件指令
- EADD
这个叶功能将源页面从非Enclave内存复制到EPC中,将EPC页面与EPC中驻留的SECS页面相关联,并将线性地址和安全属性存储在EPCM中。Enclave偏移量和安全属性作为关联内容的一部分被度量并扩展到SECS.MRENCLAVE。此指令只能在当前特权级别为0时执行。
RBX包含PAGEINFO结构的有效地址,而RCX包含EPC页面的有效地址。
- EBLOCK
这个叶功能导致EPC页面被标记为阻塞。此指令只能在当前特权级别为0时执行。
RCX的内容是EPC页面的有效地址。DS段用于创建线性地址。不支持段重写。在RAX中返回一个错误代码。
- ECREATE
ENCLS[ECREATE]是Enclave构建过程中执行的第一条指令。ECREATE将EPC外部的SECS结构复制到EPC内部的SECS页面。SECS的内部结构是软件无法访问的。
ECREATE将在受保护的SECS中设置字段,并在EPC中将页面标记为有效。ECREATE初始化或检查未使用的字段。
软件在源结构中设置以下字段:SECS:BASEADDR, SECS:SIZE(以字节为单位)和属性。SECS:BASEADDR必须按照SECS.SIZE范围自然对齐。SECS.SIZE最小是2页(8192字节)。
源操作数RBX包含一个PAGEINFO结构的有效地址。PAGEINFO包含源SECS的有效地址和SECEINFO的有效地址。PAGEINFO中的SECS字段未被使用。RCX寄存器是目标SECS的有效地址。它是EPC中的一个空槽的地址。SECS结构必须是页面对齐的。SECINFO标记必须将页面指定为SECS页面。
- EDBGRD
这个叶功能将一个四字/双字从属于调试Enclave的EPC页面复制到RBX寄存器中。在64位模式下读取8个字节,在非64位模式下读取4个字节。无法重写读取的数据的大小。
EPC内部源位置的有效地址在寄存器RCX中提供。
- EDBGWR
这个叶功能将EBX/RBX中的内容复制到属于调试Enclave的EPC页面。8个字节以64位模式写入,4个字节以非64位模式写入。无法重写数据的大小。EPC内部源位置的有效地址在寄存器RCX中提供
- EEXTEND
这个叶功能通过测量一个扩展字符串来更新一个SECS的MRENCLAVE测量寄存器。此指令只能在当前特权级别为0且未初始化enclave时执行。
RCX包含要测量的EPC页面的256字节区域的有效地址。DS段用于创建线性地址。不支持段重写。
- EINIT
这个叶功能是在Enclave构建过程中执行的最后一条指令。EINIT之后,MRENCLAVE度量完成,Enclave准备使用EENTER指令开始执行用户代码。
EINIT接收SIGSTRUCT和EINITTOKEN的有效地址。SIGSTRUCT描述了包含MRENCLAVE、ATTRIBUTES、ISVSVN、一个3072位RSA密钥和使用所包含密钥的签名的Enclave。SIGSTRUCT必须填充两个值,q1和q2:
q1 = floor(Signature2 / Modulus);
q2 = floor((Signature3 - q1 * Signature * Modulus) / Modulus);
EINITTOKEN包含MRENCLAVE、MRSIGNER和属性。这些值必须与SECS中的对应值匹配。如果使用调试启动键创建EINITTOKEN,则Enclave也必须处于调试模式。
具体过程可以参考下文“EINIT指令过程”章节。
- ELDB/ELDU
这个叶功能将页面从常规主存复制到EPC。作为复制过程的一部分,对页面进行密码学验证和解密。此指令只能在当前特权级别为0时执行。
ELDB叶功能在复制后在EPC中的目标页面的EPCM条目中设置BLOCK位。复制后,ELDU叶功能清除EPC中的目标页的EPCM条目中的BLOCK位。
RBX包含一个PAGEINFO结构的有效地址;RCX包含目的地EPC页面的有效地址;RDX包含保存页面版本的版本数组槽的有效地址。
- EPA
这个叶功能在EPC页面中创建一个空版本数组,其逻辑地址由DS:RCX提供,并为该页面设置EPCM属性。在执行这条指令时,寄存器RBX必须设置为PT_VA。
- EREMOVE
这个叶功能使EPC页面与其SECE解除关联,并被标记为未使用。此指令叶仅在当前特权级别为0时才能执行。
RCX的内容是EPC页面的有效地址。DS段用于创建线性地址。不支持段重写。
如果操作数没有正确对齐、或没有引用该EPC页面、或页面被另一个线程使用、或其他线程在页面所属的Enclave中运行,则该指令将失败。此外,如果操作数指向所关联的SECS,则指令失败。
- ETRACK
这个叶功能提供了一种机制,让硬件跟踪软件是否成功地完成了所需的TLB地址清除。该指令只能在当前特权级别为0时执行。
RCX的内容是EPC页面的有效地址。
- EWB
这个叶功能将一个页面从EPC复制到常规主存。作为复制过程的一部分,页面受到加密保护。此指令只能在当前特权级别为0时执行。
- EAUG
这个叶功能为已存在的Enclave新分配EPC页,将使EPC页面清零,将EPC页面与EPC中驻留的SECS页面相关联,并将线性地址和安全属性存储在EPCM中。作为关联内容的一部分,将安全属性配置为阻止访问EPC页面,直到EACCEPT叶或EACCEPTCOPY叶的相应调用确认将新页面添加到Enclave为止。此指令只能在当前特权级别为0时执行。
RBX包含PAGEINFO结构的有效地址,而RCX包含EPC页面的有效地址。
- EMODPR
此叶功能限定已初始化的Enclave中的EPC页面的访问权限。SECINFO参数的RWX位被视为一个权限掩码;没指定页面权限的值将无效。此指令只能在当前特权级别为0时执行。
RBX包含SECINFO结构的有效地址,而RCX包含EPC页面的有效地址。
- EMODT
这个叶功能修改EPC页面的类型。将安全属性配置为:在调用EACCEPT确认修改之前,阻止作为新类型访问EPC页面。此指令只能在当前特权级别为0时执行。
RBX包含SECINFO结构的有效地址,而RCX包含EPC页面的有效地址。
用户权限硬件指令-ENCLU
如图4所示,SGX 1代指令中,ENCLU主要用于进出Enclave、创建用于Enclave验证的报告等。
如图5所示,SGX 2代指令在1代基础上让用户决定是否接受的ENCLS对EP权限类型的修改、扩展EP权限、EP拷贝到EAUG新创建的EP。
图4:SGX 1代用户权限硬件指令
图5:SGX 2代新增用户权限硬件指令
- EENTER
ENCLU[EENTER]指令将执行转移到Enclave。在指令结束时,逻辑处理器以Enclave模式在EnclaveBase+TCS.OENTRY的RIP上执行。
如果目标地址不在CS段(32位)内,或者不在标准的地址范围(64位),则会得到一个#GP(0)结果。
- EEXIT
ENCLU[EEXIT]指令从当前执行的Enclave和分支退出到RBX中指定的位置。
RCX接收当前的AEP(异步退出指针)。如果RBX不在CS(32位模式)或不在标准的地址范围(64位模式),则会产生#GP(0)结果。
- EGETKEY
ENCLU[EGETKEY]指令从处理器特定的密钥层次结构中返回一个128位的密钥。寄存器RBX包含KEYREQUEST结构的有效地址,指令据此决定被请求的密钥。RCX寄存器包含将返回密钥的有效地址。RBX和RCX中的地址都应该是Enclave中的位置。EGETKEY使用处理器唯一的值根据许多可能的输入创建特定的键来派生键。这个指令叶只能在一个Enclave内执行。
EGETKEY使用处理器唯一的值根据多种可能的输入创建特定密钥来派生密钥。这个指令叶只能在一个Enclave内执行。
- EREPORT
这个叶功能创建一个描述Enclave内容的加密报告。这个指令叶只能在Enclave内部执行。其他Enclave可以使用密码报告来确定Enclave是否在相同的平台上运行。
RBX包含Enclave的MRENCLAVE值的有效地址,MRENCLAVE使用REPORT密钥验证输出的REPORT。RCX包含一个64字节的REPORTDATA结构的有效地址,该结构允许指令的调用者将数据与目标Enclave相关联。RDX包含指令输出的REPORT的地址。
- ERESUME
ENCLU[ERESUME]指令使用之前存储在SSA中的机器状态,继续执行由于异常或中断而中断的ENCLU指令。
- EACCEPT
通过验证SECINFO中指定的安全属性与EPCM中页面的安全属性匹配,这个叶函数接受对运行中的Enclave中的页面的更改。这个指令叶只能在Enclave内部执行。
RBX包含SECINFO结构的有效地址,而RCX包含EPC页面的有效地址。
- EACCEPTCOPY
这个叶功能将现有EPC页面的内容复制到未初始化的EPC页面(由EAUG创建)。初始化之后,该指令还可以修改与目标EPC页面关联的访问权限。这个指令叶只能在Enclave内部执行。
RBX包含SECINFO结构的有效地址,而RCX和RDX分别包含EPC页面的有效地址。
- EMODPE
这个叶功能扩展了运行中的Enclave现有EPC页面的访问权限。SECINFO参数的RWX位被视为一个权限掩码;若值表示不扩展页面权限,那么指令将不起作用。这个指令叶只能在Enclave内部执行。
RBX包含SECINFO结构的有效地址,而RCX包含EPC页面的有效地址。
SGX初始化过程
这里将以SGX初始化为例,使读者能够对SGX指令有更直观的感受。SGX初始化过程如图6所示。
- 应用程序会请求将其Enclave加载到内存中。
- ECREATE指令负责创建并填充SECS结构,SECS具体保存在一个EP中。
- 使用EADD指令将每个页面加载到受保护的内存中,添加过程会记录到SECS的日志中。
- 使用EEXTEND指令将度量每个添加的EP,度量过程会记录到SECS的日志中。
- EINIT指令最终完成对Enclave的创建,如图4-3-2-12所示。
图6:SGX初始化流程
EINIT指令过程
EINIT指令的执行过程体现了Enclave实例是如何被可信的启动起来,因此这里将对EINIT指令过程展开描述。
如图7讲述了EINIT指令的执行过程,既EINIT如何最终完成Enclave创建,用到了三个结构:SIGSTRUCT、EINITTOKEN和SECS。
- EINIT先检查Enclave文件的SIGSTRUCT中的公钥是否能够成功验证之前硬件平台对这个Enclave文件的SIGSTRUCT的签名,如果成功说明,这个公钥和这个签名是匹配的。
- 之后,当加载起Enclave实例时,需要向Architectural Enclave(完成特定功能由SGX平台提供的特殊的Enclave)根据Enclave文件的各项加载特性和最后运行起来的Enclave的各项特性申请一个EINITTOKEN。SIGSTRUCT中的公钥HASH以后将成为签名者的标识MRSIGNER,然后与EINITTOKEN中的MRSIGNER比对,如果配对,说明,这个公钥的确是这个SGX平台所认证的开发者的,这个Enclave文件确实是这个SGX平台所认证的开发者签名的。
- MRENCLAVE代表着Enclave可信启动的度量结果,或者说Enclave启动日志。EINIT指令将SIGSTRUCT中的MRENCLAVE与SECS中的、EINITTOKEN中的比对,如果匹配,说明这个Enclave启动过程时可信的。