@Intel SGX 读书笔记…
构建一个Intel SGX项目
VS2017 Professional环境和VS2017 Add-in工具适配。所以我下载了VS2017 Professional版做实验。
创建一个Enclave
- 在VS2017菜单栏中选择文件——>新建——>项目
- 选择Visual C++ ——>Intel SGX Enclave Project,根据自己的需要修改名称、位置和解决方案名称。
- 点击OK。


- 点击Next跳转到Enclave设置页。

- 使用适当的配置设置Enclave
- Project Type:
Enclave —— 创建一个Enclave项目
Enclave library —— 给Enclave项目创建一个静态库 - Additional Libraries:
C++ 11 —— 给Enclave项目连接C++ 11
EDL File —— 在Enclave项目中创建一个EDL文件 - Signing Key:
输入一个现存的签名密钥到Enclave项目中。如果不输入签名密钥,Enclave则会随机产生一个密钥。 - Additional Configurations:
CVE-2020-0551 Load —— 加入CVE-2020-0551缓解负荷水平配置(什么玩意啊,希望早日得到大神指点)
CVE-2020-0551 Control Flow —— 加入CVE-2020-0551减缓控制流级配置

- Project Type:
使用VS Intel SGX插件
该VS插件是提供给Intel SGX开发者更方便有效地配置一个Enclave和输入一个Enclave到一个不可信的组件中。
Enclave Setting帮助保持Enclave的配置设置.Enclave配置文件时Enclave项目的一部分,它描述了Enclave元的信息.
打开包含Enclave的项目,点击右键,先择Intel SGX Configuration->Enclave Settings.

| 名称 | 描述 | 在Enclave配置文件中的Tag |
|---|---|---|
| Product ID | ISV分配项目ID | <ProdID> |
| ISV SVN | ISV分配SVN | <ISVSVN> |
| Thread Stack Size | 每个可信线程的堆栈大小(以字节为单位) | <StackMaxSize> |
| Global Heap Size | Enclave的堆大小(以字节为单位) | <HeapMaxSize> |
| Thread Number | 可信线程的数量 | <TCSNum> |
| Thread Bound Policy | TCS管理策略 | <TCSPolicy> |
点击Advanced按钮可以修改高级特点,下图是Advanced Settings的窗口:
如果你想要Enclave不能在debug模式下运行,就确认Debug Selection选项。这个选项跟Enclave配置文件中的<DisableDebug>标签是相关的。在Debug模式下的Enclave内存区内的代码和数据是能够被调试器或其他Enclave的外部软件访问的。因此,Debug模式下的Enclave就没有非Debug模式下的Enclave相同的内存访问保护,只有在以Debug模式启动时才能调试Debug。如果这个选项被勾选,配置文件中就会设置该Enclave不能被调试。
你还可以设置Misc Select和Misc Mask的位值。这两个设置分别跟配置文件中的<MiscSelect>和<MiscMask>相关联。这俩推荐设置默认值哦。
如果你想要为Enclave使用Key Separation & Sharing(KSS),就要勾选Enable KSS选项,就是配置文件中<EnableKSS>选项。你可以在文本框中为ISV分配的Extended Product ID和ISV分配的Family ID设置值。注意:你需要在设置ISV分配的Extended Product ID和ISV分配的Family ID之前打开KSS。
Enclave首选的加载地址
你可以使用链接器选项选择/BASE和/FIXED去构建一个Enclave。/FIXED告诉uRTS和驱动只在Enclave首选的加载地址加载Enclave,可以使用/BASE选项指定该地址。
当你使用/BASE时,Enclave 的PE的OptionalHeader.ImageBase是用首选的加载地址设置的。当你指定了/FIXED,链接器不会为Enclave生成一个重定位节,且Enclave的PE的Header.Characteristics将有IMAGE_FILE_RELOCS_STRIPPED设置。另外,PE的OptionalHeader.DLLCharacteristic没有IMAGE_DLL_CHARACTERISTICS_SYNAMIC_BASE设置,以说明这个Enclave DLL不能在加载时重分配。(其实我不太懂这个/BASE和/FIXED,然后百度了一下,大概是在写命令行的时候指定的)
1.当你对Enclave签名时,如果sgx_sign.exe发现一个Enclave在PE的Header.Characteristics中有IMAGE_FILE_RELOCS_STRIPPED设置,它会执行以下操作。2.它将验证Enclave没有重定位节,并且IMAGE_DLL_CHARACTERISTIC_DYNAMIC_BASE在PE的OptionalHeader.DLLCharacteristics中没有设置。3.另外,sgx_sign.exe确保所选的BASE与Enclave大小自然对齐。如果以上三点中的任何一个要求没有满足,sgx_sign.exe会报错。加载器sgx_urts.dll只加载满足以上三个条件的Enclave。如果Enclave没有在首选的加载地址被加载,sgx_urts.dll同样会报错。
Enclave签名
Enclave Signing为发布模式执行"两步签名"。
对于Enclave启动控制,用于release mode的Enclave签名密钥必须以安全的方式存储,例如由HSM管理的平台。Enclave Signing提供了一个GUI帮助开发者执行“两步签名”。
步骤一:产生Enclave签名材料
打开包含Enclave的项目,点击右键,选择Intel SGX Configuration -> Enclave Signing。如下图。

输出的签名材料的默认名和地址是指定的。但是你可以改变名字和地址。点击Generate Signing按钮产生Enclave签名材料。
完成步骤一后,你需要用你自己的签名工具,该工具可以访问你的私有签名密钥对输出Enclave签名材料签名,然后将生成的签名文件带回步骤二。(默认情况下,对于release mode,在编译Enclave之后,会自动生成Enclave签名材料)
步骤二:
如果你产生了Enclave签名材料,也已经准备好了结果签名文件,你可以产生签名Enclave文件了.如下图,选中Step2-Generate Signed Enclave File:

签名材料和Enclave文件的默认地址是指定的,但是不要忘记确认一下哦.点击Public Key File旁边的Select按钮,指定相应的公钥.点击Signature File按钮旁边的Select按钮,指定结果签名文件.
指定所有正确的文件后,点击Generate Signed Enclave按钮,然后会在指定的Enclave文件同一目录下产生最后的签名Enclave文件.
输入Enclave
Import Enclave帮助选择Enclaves输入到一个不可信的组件中,以保证不可信的组件可以使用该Enclave.
Import Enclave提供一下的作用:
- 允许从同一个解决方案中中用Intel SGX Wizard创建的一个Enclave。
- 支持从第三方浏览/搜索EDL文件。
- 支持移除任何已经被挑选的Enclave。
- 对于添加到应用程序中的/从应用程序中删除的每个enclave,在不受信任的组件项目中添加/删除enclave的_u.h和_u.c文件。
- 为不可信的组件建立项目设置。
输入Enclaves:
打开包含Enclave项目和将输入Enclave的不可信应用程序。点击右键不可信的应用程序项目。选择Intel SGX Configuration->Import Enclave。如下图:

图中Include EDLs模块中包含该解决方案中所有的Enclave和外部输入的的任何一个Enclave。每个Enclave用一个EDL文件表示。EDL是一个最小的用作描述Enclave结构的IDL。选择Enclave输入到应用程序中。
如果想要输入不是解决方案中的一个Enclave,你可以点击Import EDL去挑选一个新的EDL文件。
你可以从EDL列表中勾选一个你想要输入的EDL文件。
如果所选的EDL文件需要其他的搜索路径给EDL文件,在Search Path Settings中指定搜索路径。
点击OK。然后两个文件会增加到不可信的应用程序项目中:sample_enclave_u.c和sample_enclave_u.h。它们包含用于调用enclave函数的不可信包装函数的声明和定义。另外,当项目重新构建后,不可信应用程序项目的属性就会被修改以重新创建文件。这个文件用户不要修改。为了取消这个行为,可以点Cancel。
想要移除一个已经输入的EDL文件,取消勾选,再点击OK即可 。
Enclave项目配置
Enclave Project Configuration帮助添加CVE-2020-0551 mitigation来激活配置到现存的可信项目中.
增加新的配置:
打开包含可新项目的解决方案。点击右键,选择Intel SGX Configuration->Enclave Project Configuration。如下图所示。

CVE-2020-0551对话框为用户提供了选择两个级别的CVE-2020-0551缓解配置的界面.
Enclave项目文件
Intel SGX Wizard是用来创建Enclave项目的。他创建的几个文件的文件名是来源于项目的名字。假设项目名字是sample_enclave,以下是Wizard会产生的文件列表。
源文件:
sample_enclave.cpp-主要的源文件,由用户的函数和变量组成。用户可以增加其他的源文件。
sample_enclave_t.c-可信的自动产生的包装函数。不要修改这个文件,因为每次构建都会重新创建他。
sample_enclave.edl-EDL文件。声明哪些函数由enclave导出(受信任)和导入(不受信任)。
头文件:
sample_enclave_t.h-为打包函数可信任的自动产生的头文件。同样不要修改这个文件,因为每次构建都会重新创建他。
资源文件:
sample_enclave.config.xml-指定Enclave配置。
sample_encalve.private.pem-用作给Enclave签名的RSA私钥。
注意:这个私钥一定要保管好!落入别人手中,人家就可以拿你这个私钥创建一个合法的Enclave了.你可以用sgx_sign在一个分开的环境中给enclave签名.
如有误,请指正!感激!
本文详细介绍如何在VS2017环境下构建Intel SGX项目,包括创建Enclave、配置项目、签名流程及输入Enclave到不可信组件的全过程。涵盖关键配置如Enclave设置、签名、加载地址等。
2331





