背景知识
SGX(TEE)相比纯软件加密方案的优势
相比纯软件的隐私保护解决方案(比如之前介绍的同态加密、混淆电路等软件加密方案),SGX的优势主要体现在以下3个方面。
- 计算性能高
- 可扩展性强
- 应用程序可验证
SGX(TEE)的不足
- 可能受到侧信道攻击
- 用户必须相信硬件厂商和平台服务商
- 漏洞曝光后可能难以及时修复
- 密钥管理面临可用性问题
SGX签名/鉴证流程



SGX密钥层级结构
SGX CPU中烧录了两个设备根密钥:
- RPK(Root ProvisioningKey)和RSK(RootSealing Key)。RPK在一个被称为Intel密钥生成设备(iKGF)的特殊用途设施内的专用硬件安全模块(HSM)上随机生成。
- RSK是在CPU内随机生成的。Intel宣称会清除生成该密钥时所产生的所有残留物,因此,每个平台都可以认为其RSK是唯 一的且只有该平台自己知道

本地鉴证
本地鉴证是指运行在同一个平台上的两个Enclave在相互通信前通过SGX报告机制进行相互认证

远程鉴证
远程鉴证用于本地软件证明自己运行在Enclave中,以获取远端的认证者(亦称为依赖方,Relying Party)的信任
- EPID: 依赖Intel提供的鉴证服务

- ECDSA: 第三方通过Inter SGX DCAP提供远程鉴证服务

开源项目
CPU-TEE
安全执行环境TEE(SGX(Intel) / SEV(AMD),TrustZone(Arm)等),相关开源项目(Graphene/Occlum/OpenEnclave/Asylo等)
- LibOS
- Occlum / Gramine 可以帮助开发人员将现有应用程序打包为基于 Intel SGX 构建的"机密库"包。
- Arm平台的OP-TEE
- SDK
- Intel SGX SDK
- Enarx 可以帮助开发人员编译一个可以透明地跨多个部署类别部署。相同的程序可以在"机密库"(如 SGX)或"机密虚拟机"(如 SEV‑SNP)中运行,Enarx 提供抽象层以确保相同的运行时环境管理。
- OpenEnclave 可以让开发人员设计一个能够同时在 SGX(打包为"机密库")和 TrustZone(打包为"机密流程")上运行的库。
原生SDK
[C++]Inter SGX SDK在SGX硬件中执行
-
编译生成
.sig签名文件- 使用 SGX 提供的签名工具(
sgx_sign)。 - 读取开发者提供的
config.*.xml文件,定义 Enclave 的安全属性。 - 对 Enclave 文件进行签名,生成
.sig文件。
- 使用 SGX 提供的签名工具(
-
运行
-
运行时,加载
.sig文件和.signed.so文件 -
技能 模拟/硬件 运行
文件名 作用 *.so 编译后的 Enclave 文件 *.sig Enclave 的签名文件 Enclave.config.xml 配置文件,定义 Enclave 属性(用于签名)。 *.signed.so 签名后的 Enclave 可执行文件 -
基于原生SDK
基于原生SDK的开发存在较高的学习门槛,而很多实际业务应用依赖特定的库文件(如PyTorch),此时基于SDK的开发会非常烦琐
[C++]微软openenclave实现SGX虚拟机
我的笔记本能跑通的环境, 需要 sgx-sdk 和 dcap (DCAP需要CPU支持 sgx launch control 和 sgx2)
[Python+Rust]开发框架Teaclave (Python调用Rust实现)
基于 Rust SGX SDK: https://github.com/apache/incubator-teaclave-sgx-sdk
Bash
git clone https://github.com/apache/incubator-teaclave.git
cd incubator-teaclave
docker run --rm -v $(pwd):/teaclave -w /teaclave \
-it teaclave/teaclave-build-ubuntu-1804-sgx-2.14:latest \
bash -c ". /root/.cargo/env && \
rustup component add rust-src --toolchain nightly-2022-10-22-x86_64-unknown-linux-gnu && \
. /opt/sgxsdk/environment && \
mkdir -p build && cd build && \
export http_proxy=http://172.17.0.1:12333 && \
export https_proxy=http://172.17.0.1:12333 && \
cmake -DTEST_MODE=ON -DSGX_SIM_MODE=ON .. && \
make"
export AS_SPID="00000000000000000000000000000000"
export AS_KEY="00000000000000000000000000000000"
export AS_ALGO="sgx_epid"
export AS_URL="https://api.trustedservices.intel.com:443"
cd docker
docker-compose -f docker-compose-ubuntu-1804.yml up --build
[WASM]红帽开放Enarx
Bash
sudo dpkg -i enarx_0.7.1-1_amd64.deb
/opt/wasi-sdk/bin/clang++ fibonacci.cpp --sysroot /opt/wasi-sdk/share/wasi-sysroot/ -o fibonacci.wasm
enarx run fibonacci.wasm
库操作系统LibOS
LibOS相当于是在操作系统内核上提供了一份精简版的内核和软件运行库。LibOS可以作为TEE,为应用程序提供单独的安全环境。应用程序之间只能通过LibOS进行通信。这种方式的优点是可以较为快捷地将原有程序迁移到TEE环境,无须重新开发
基于LibOS
业务代码可直接通过LibOS在Enclave内部运行,无须重构,这大大方便了业务应用的接入。
[C++]用gramine(原来叫Graphene)在SGX硬件中执行
Gramine 是一个允许在 Intel SGX(Software Guard Extensions)上运行未修改的 Linux 应用程序的开源库操作系统(Library OS)。它并不是一个 SGX 的软件模拟器,而是专门为直接在 SGX 硬件上运行而设计的。
论文: https://www.usenix.org/system/files/conference/atc17/atc17-tsai.pdf
-
安装
-
编译安装
- https://gramine.readthedocs.io/en/latest/devel/building.html
- 依赖
- linux-sgx
- linux-sgx-driver
- linux-sgx-sdk
- Intel SGX DCAP
-
编译生成
.sig签名文件-
使用签名工具(
gramine-sgx-sign)。 -
读取开发者提供的
.manifest文件,定义 Enclave 的安全属性。 -
对 Enclave 文件进行签名,生成
.sig文件。
特性 gramine-direct gramine-sgx 依赖 SGX 硬件 否 是 执行环境 普通用户态环境 SGX enclave 安全性 标准用户态安全,依赖 Linux 环境 硬件级别保护,防止数据泄露和篡改 性能 无额外开销,性能接近原生应用 因为 enclave 和加密操作,有性能开销 适用场景 开发、测试或对安全性要求不高的场景 生产环境,对安全性有高要求的场景 -
-
运行
-
运行时,加载
.sig文件 -
我的笔记本能编译,运行时报找不到device, 需要 sgx-sdk 和 dcap
-
error: Cannot open SGX driver device. Please make sure you're using an up-to-date kernel or the standalone Intel SGX kernel module is loaded. -
error: load_enclave() failed with error: No such file or directory (ENOENT)
-
[C++, Go, Rust]用Occlum实现SGX虚拟机
用户可以使用命令cpuid来检测HW是否满足Occlum要求。
- SGX2,
cpuid | grep SGX2 - FLC,
cpuid | grep SGX_LC
且我的环境缺少 /dev/sgx_enclave
用docker
Bash
docker pull occlum/occlum:0.31.0-rc-ubuntu22.04
docker run -it --privileged -v /dev/sgx:/dev/sgx occlum/occlum:0.31.0-rc-ubuntu22.04
#如果报错: docker: Error response from daemon: privileged mode is incompatible with user namespaces. You must run the container in the host namespace when running privileged mode.
#则运行
docker run -it --privileged --userns=host -v /dev/sgx:/dev/sgx occlum/occlum:0.31.0-rc-ubuntu22.04
#(可选)容器内尝试 Intel SGX SDK 的示例代码,以确保 SGX 正常运行
cd /opt/intel/sgxsdk/SampleCode/SampleEnclave && make && ./app
#容器内预装的Occlum演示代码 /root/demos