# SGX安全开发笔记 **Repository Path**: a054545641/sgx-security-development-notes ## Basic Information - **Project Name**: SGX安全开发笔记 - **Description**: 学习SGX开发的记录,以及范例代码 - **Primary Language**: C++ - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-30 - **Last Updated**: 2022-10-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SGX安全开发笔记 ## 介绍 学习SGX开发的记录,以及范例代码 :joy: 主要是因为网上的资料太多太复杂,而且不是很新,有一些新的变化并没有被考虑到。 而Intel的SGX各个部分比较碎,针对不同的需求的操作有不同的文档步骤组合,配置略显复杂,容易劝退新人。 因此就有了这个项目,旨在降低SGX开发者,尤其是SGX-SSL使用者的入门门槛。 ## 实验环境 1. OS: Ubuntu 18.04 LTS 2. Lib: Intel-SGX(out-of-tree driver 2.14), Intel-SGX-SSL( Linux 2.14 SGX SDK, OpenSSL 1.1.1k) ## 看懂本文档需要的技能 - 对可信执行环境概念有一定了解 - 对Intel SGX技术及相关特性的概念有所了解(Enclave、Flexible Launch Control等) - 对C/C++有一定了解 - 用过Github和git工具(会git clone) - 会使用终端执行命令,了解命令打错可能引起的后果 ## 你将学会 - make文件的简单结构和写法 - EDL文件的暴力理解 :laughing: - 密码学的一些零碎知识和代码实践经验 ## 文档结构 待定 ## 安装教程 #### 预准备 1. 要使用Intel软件保护扩展,设备必须满足要求测试是否支持以及开启SGX的方法可以参见ayeks的[SGX-hardware](https://github.com/ayeks/SGX-hardware)。 2. 若主板BIOS中的SGX选项只有Software Controlled选项,可以使用[Intel提供的工具](https://github.com/intel/sgx-software-enable)来启用软件控制的SGX。 由于我使用的机器尚不支持SGX2,也不支持FLC,因此使用了[out-of-tree驱动](https://github.com/intel/linux-sgx-driver)来进行开发。 3. 安装前保持系统软件包最新,即 ``` sudo apt update sudo apt upgrade ``` #### 安装linux-sgx-driver 1. 从[out-of-tree驱动](https://github.com/intel/linux-sgx-driver)处下载最新版的out-of-tree driver,我这里使用的版本是2.14; 2. 解压下载后的驱动源代码,在源代码文件夹中打开终端,按照[out-of-tree驱动的Build指引](https://github.com/intel/linux-sgx-driver#build-and-install-the-intelr-sgx-driver)进行安装操作。这里把要指引中要求执行的操作简单概述一下,即 打开一个终端 ``` dpkg-query -s linux-headers-$(uname -r) sudo apt-get install linux-headers-$(uname -r) ``` 再在解压后的驱动源代码目录里打开一个终端 ``` make sudo mkdir -p "/lib/modules/"`uname -r`"/kernel/drivers/intel/sgx" sudo cp isgx.ko "/lib/modules/"`uname -r`"/kernel/drivers/intel/sgx" sudo sh -c "cat /etc/modules | grep -Fxq isgx || echo isgx >> /etc/modules" sudo /sbin/depmod sudo /sbin/modprobe isgx ``` 至此,linux-sgx-driver安装完成。 #### 下载安装SDK,添加PSW源,安装PSW 这些步骤比较固定,具体可以参考[2.11版的官方指导](https://download.01.org/intel-sgx/sgx-linux/2.11/docs/Intel_SGX_Installation_Guide_Linux_2.11_Open_Source.pdf)。(当然有时间我会补上) 最后记得启动一下aesmd服务,即 ``` sudo service aesmd start ``` #### 下载安装专用linking工具 由于CVE-2020-0551影响,需要使用Intel的专用链接器。 1. 到[这里](https://download.01.org/intel-sgx/sgx-linux/2.14/)下载as.ld.objdump.gold.r3.tar.gz。 我这里是2.14的,所以直接给出了2.14的链接工具下载链接,其他SDK对应版本应该只需要修改地址栏结尾的版本号即可。 2. 解压下载的包,并在解压后的目录中打开终端,执行以下命令 ``` sudo cp external/toolset/ubuntu18.04/{as,ld,ld.gold,objdump} /usr/local/bin which as ld ld.gold objdump ``` #### 下载解压SGX-SSL包 这里我是从[SGX-SSL的Release页面](https://github.com/intel/intel-sgx-ssl/releases)下载的最新版的tar.gz(此时是 intel-sgx-ssl-lin_2.14_1.1.1k, OpenSSL 1.1.1k)。 但是这个项目的Readme一般都是按当前开发到的commit的进度来的,有可能比最新的Release超前,所以也可以直接clone这个项目到本地。 #### 编译测试TestApp 在SGX-SSL的源码包中,有一个test_app项目,可以在里面source一下再make一下,然后执行./TestApp,无报错说明一切正常。 #### 安装SGX-SSL 之后的安装,按照[Readme的Linux部分](https://github.com/intel/intel-sgx-ssl#linux)来就行。 ``` make all test sudo make install ``` ## 使用说明 #### Hello World 这里直接照搬[qiu_pengfei的教程](https://blog.csdn.net/qiu_pengfei/article/details/78798644) 简要概括一下操作和概念: 1. 将SGX SDK安装目录中SampleCode目录下的SampleEnclave目录复制到自己想要建立项目的位置,重命名为SGX_HelloWorld(可选,以下将该文件夹称为“项目”) 2. 删除项目中的README.txt(或者改成你想要的描述) 3. 概念介绍:App目录用来放不可信代码; Enclave目录用来存放可信代码; App/Edger8rSyntax和Enclave/Edger8rSyntax是用来生成可信函数与不可信函数桥的工具,一般不用管; App/App.cpp是不可信函数的起点,相当于我们的main函数代码文件; Enclave/Enclave.cpp是包含可信函数的代码,如果你想让某段逻辑在SGX机制内运行,就需要在这里写, Enclave/Enclave.h包含了函数声明,记得在这里声明下可以被外部调用的可信函数; Enclave/Enclave.edl是Enclave的接口定义文件,定义了不可信函数调用和可信函数调用的接口; Makefile文件是项目的编译文件,供make工具编译使用。 其他的文件可以先不用了解,以后的教程中用到了会一一介绍。 4. 修改Enclave.edl,这里介绍下文件里几个用得到的结构,trusted{}就是可信函数列表, 你在Enclave.cpp中写的函数如果想被App.cpp中的函数调用的话,就要将函数在这里声明一下。 这里在trusted{}当中加入public void printf_helloworld();这段声明。 未完待续 #### 引进加密函数 待定 ## 参与贡献 请联系作者 ## 作者 a054545641