一 、环境要求
1.1 实验环境不低于一下要求
- 64 位 Microsoft Windows 操作系统
- Microsoft Visual Studio 2015
- 英特尔软件防护扩展 SDK
注意:Visual Studio一定是专业版
1.2 BIOS中开启SGX配置
不同bios的设置可能会有区别,即使bios不支持sgx,也不会影响入门学习。我们可以通过SGX
SDK里面内置的模拟器来运行调试enclave程序。
手动 BIOS 配置
- 系统在启动过程中,键入要进入 BIOS 击键 (通常功能键)。
- 通过下面的菜单导航:
英特尔高级菜单-> CPU 配置软件 Guard 扩展指令集 (SGX)->
- BIOS 都会显示下面的选项。(并非所有系统 Oem 都支持所有的三个选项。)
已启用
软件控制
已禁用
这些选项定义,如下所示:
已启用
如果设置此选项,英特尔软件防护扩展是已启用且可供使用的应用程序。
注:如果设置已启用,英特尔高级菜单-> CPU Configuration-> PRMRR必须还配置。(一些 Oem 可能会自动分配 PRMRR 值时启用了英特尔 SGX。)如果 OEM 支持 PRMRR 所选内容,将值设为 32 MB,64 MB 或 128 MB。英特尔参考 BIOS 的默认选项为 128 MB。
软件控制
如果设置软件控制,您的应用程序必须支持在英特尔软件防护扩展功能检测过程(以前提供的链接) 中提及英特尔 SGX 使用 API.
注:支持通过软件参加英特尔软件防护扩展,则可能需要重新启动系统。
已禁用
如果设置被禁用,英特尔 SGX 已明确禁用,并通过软件应用程序无法启用它。您应更改此设置为启用。如果已禁用,则可以只构建/运行英特尔 SGX 启用模拟模式中的应用程序。此外,英特尔 SGX 平台软件 (PSW) 将无法安装。
4.后启用英特尔 SGX,输入键击保存并退出BIOS。
二 、软件安装
2.1 Intel ME下载及安装
https://downloadcenter.intel.com/download/28680/Intel-Management-Engine-Driver-for-Windows-7- E:\devsoft\sgx\ME_SW_1909.12.0.1237\Corp\ME_SW_MSI\SetupME.exe
SGX有些相关的安全功能需要Intel Management Engine(ME)提供(单向计数器monotonic counter和实时时钟RTC)以及互联网连接,所以建议安装SGX SDK及PSW时保持互联网连接, 并且安装完全版的Intel ME软件包
2.2 安装Visual studio 2017
通过微软官方下载Visual Studio IDE,不是code。
https://visualstudio.microsoft.com/
这一步一定要在安装SGX SDK之前。否则,你启动VS2017时,无法看到SGX的插件。
2.3 安装SGX SDK
2.3.1 下载
https://registrationcenter.intel.com/en/products/postregistration/?sn=CCXS-ZSSJ7GG5&EmailID=908947250%40qq.com&Sequence=2444010&ret=n 下载PSW(平台环境)和SDK(必须的),下载后的exe文件解压后,有说明文档和安装的exe
2.3.2 新建项目可以看到 Intel SGX Enclave Project时,说明你的环境是ok的。
Hello World
原生C++的helloworld (高手可以跳过)
// main_app.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include"pch.h"
#include <stdio.h>
#include <string.h>
#define MAX_BUF_LEN 100
void foo(char *buf, size_t len)
{
const char *secret = "Hello App!";
if (len > strlen(secret))
{
memcpy(buf, secret, strlen(secret) + 1);
}
}
int main()
{
char buffer[MAX_BUF_LEN] = "Hello World!";
foo(buffer, MAX_BUF_LEN);
printf("buffer:\"%s\"\n", buffer);
return 0;
}
ctrl+f5 运行。
定义了一个buffer和长度。将Hello World传入后打印。
Windows版Hello World的所有代码都是运行在Windows内存空间的。因此运行在这个Windows运行环境下的其他程序可以很容易的通过一些漏洞攻击Hello World的内存空间,例如通过修改foo()函数代码段的数据,把buffer[]数组内的“Hello App”替换成其他的字符串。
Enclave版本Hello World
修改edl文件,在ECALLs添加 foo函数调用
enclave {
from "sgx_tstdc.edl" import *;
trusted {
/* define ECALLs here. */
public void foo([out,size=len] char* buf,size_t len);
};
untrusted {
/* define OCALLs here. */
};
};
打开原生版本的helloworld项目,文件-》添加-》现有项目
目的:把enclave项目add到原生项目
把enclave项目添加到原生C++的项目中去。资源里表里可以看到存在两个项目
在原生(main_app)右键 import Enclave
选中之前修改的edl文件,OK
文件结构
停顿一下,先看看现在的文件目录。(实验命名不是很规范,看起来有点累)
main_app.cpp是原生的helloworld。
Enclave1.cpp是Enclave项目创建的文件。
编辑 Enclave1.cpp
#include "Enclave1_t.h"
#include "sgx_trts.h"
#include <string.h>
void foo(char *buf, size_t len)
{
const char *secret = "Hello App!";
if (len > strlen(secret))
{
memcpy(buf, secret, strlen(secret) + 1);
}
}
编辑main_app.cpp
#include "pch.h"
#include <stdio.h>
#include <tchar.h>
#include "sgx_urts.h"
#include <string.h>
#include "Enclave1_u.h"
#define ENCLAVE_FILE _T("Enclave1.signed.dll")
#define MAX_BUF_LEN 100
int main()
{
sgx_enclave_id_t eid;
sgx_status_t ret = SGX_SUCCESS;
sgx_launch_token_t token = { 0 };
int updated = 0;
char buffer[MAX_BUF_LEN] = "Hello World!";
//创建包含token的enclave容器
ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, &eid, NULL);
if (ret != SGX_SUCCESS)
{
printf("APP:error %#x ,failed to create enclave .\n", ret);
return -1;
}
//Enclave CALL(ECALL) 启动enclave容器
foo(eid,buffer,MAX_BUF_LEN);
printf("%s\n",buffer);
getchar();
//销毁enclave容器
if (SGX_SUCCESS != sgx_destroy_enclave(eid))
return -1;
system("pause");
getchar();
return 0;
}
编译结果
1>------ 已启动全部重新生成: 项目: main_app, 配置: Debug Win32 ------
2>------ 已启动全部重新生成: 项目: Enclave1, 配置: Debug Win32 ------
2>Creating proxy/bridge routines
1>Creating untrusted proxy/bridge routines
1>pch.cpp
2>Enclave1.cpp
1>Enclave1_u.c
2>Enclave1_t.c
2> 正在创建库 E:\sgx\main_app\Debug\Enclave1.lib 和对象 E:\sgx\main_app\Debug\Enclave1.exp
2>Enclave1.vcxproj -> E:\sgx\main_app\Debug\Enclave1.dll
2>sign the enclave
2>The required memory is 0x15f000.
2>Succeed.
2><EnclaveConfiguration>
2> <ProdID>0</ProdID>
2> <ISVSVN>0</ISVSVN>
2> <StackMaxSize>0x40000</StackMaxSize>
2> <HeapMaxSize>0x100000</HeapMaxSize>
2> <TCSNum>1</TCSNum>
2> <TCSPolicy>1</TCSPolicy>
2> <DisableDebug>0</DisableDebug>
2> <MiscSelect>0</MiscSelect>
2> <MiscMask>0xFFFFFFFF</MiscMask>
2></EnclaveConfiguration>
1>main_app.cpp
1>main_app.vcxproj -> E:\sgx\main_app\Debug\main_app.exe
========== 全部重新生成: 成功 2 个,失败 0 个,跳过 0 个 ==========
运行结果
结语
运行的过程并不顺利,我本身不懂C++,也没用过VS2017。报了很多lib找不到或者无法打开的错误。经过大量尝试一后才跑通了helloworld。遇到问题慢慢分析,可以参考其他文章。关于如何打卡intel sgx的支持,还有检查手段。