SGX软硬件栈(二)——硬件指令

目录

硬件指令

内核权限硬件指令-ENCLS

用户权限硬件指令-ENCLU

SGX初始化过程

EINIT指令过程


硬件指令

硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是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所示。

  1. 应用程序会请求将其Enclave加载到内存中。
  2. ECREATE指令负责创建并填充SECS结构,SECS具体保存在一个EP中。
  3. 使用EADD指令将每个页面加载到受保护的内存中,添加过程会记录到SECS的日志中。
  4. 使用EEXTEND指令将度量每个添加的EP,度量过程会记录到SECS的日志中。
  5. EINIT指令最终完成对Enclave的创建,如图4-3-2-12所示。

图6:SGX初始化流程

EINIT指令过程

EINIT指令的执行过程体现了Enclave实例是如何被可信的启动起来,因此这里将对EINIT指令过程展开描述。

如图7讲述了EINIT指令的执行过程,既EINIT如何最终完成Enclave创建,用到了三个结构:SIGSTRUCT、EINITTOKEN和SECS。

  1. EINIT先检查Enclave文件的SIGSTRUCT中的公钥是否能够成功验证之前硬件平台对这个Enclave文件的SIGSTRUCT的签名,如果成功说明,这个公钥和这个签名是匹配的。
  2. 之后,当加载起Enclave实例时,需要向Architectural Enclave(完成特定功能由SGX平台提供的特殊的Enclave)根据Enclave文件的各项加载特性和最后运行起来的Enclave的各项特性申请一个EINITTOKEN。SIGSTRUCT中的公钥HASH以后将成为签名者的标识MRSIGNER,然后与EINITTOKEN中的MRSIGNER比对,如果配对,说明,这个公钥的确是这个SGX平台所认证的开发者的,这个Enclave文件确实是这个SGX平台所认证的开发者签名的。
  3. MRENCLAVE代表着Enclave可信启动的度量结果,或者说Enclave启动日志。EINIT指令将SIGSTRUCT中的MRENCLAVE与SECS中的、EINITTOKEN中的比对,如果匹配,说明这个Enclave启动过程时可信的。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值