密码学系列 - TEE

背景知识

SGX(TEE)相比纯软件加密方案的优势

相比纯软件的隐私保护解决方案(比如之前介绍的同态加密、混淆电路等软件加密方案)​,SGX的优势主要体现在以下3个方面。

  1. 计算性能高
  2. 可扩展性强
  3. 应用程序可验证

SGX(TEE)的不足

  1. 可能受到侧信道攻击
  2. 用户必须相信硬件厂商和平台服务商
  3. 漏洞曝光后可能难以及时修复
  4. 密钥管理面临可用性问题

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 文件。
  • 运行

    • 运行时,加载 .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

  • 安装

  • 编译安装

  • 编译生成.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
相关推荐
岁岁的O泡奶5 天前
ctfshow_crypto_萌新赛
经验分享·python·密码学·crypto
H0ne6 天前
密码学(Crypto)梳理(一)
密码学
橘子编程7 天前
密码学完全指南:从基础到实战
java·python·密码学
lcreek7 天前
公钥密码学与数字签名:原理详解
密码学
proware8 天前
海思3403与3559安全启动
linux·安全·tee
洒家肉山大魔王11 天前
PKI/CA X.509证书的基础应用与解读
服务器·https·密码学·数字证书
酿情师12 天前
2026软件系统安全赛初赛RSA(赛后复盘)
android·网络·安全·密码学·rsa
Liudef0613 天前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
YIN_尹15 天前
关于论文《使用 FLUSH+RELOAD 缓存侧信道攻击恢复 OpenSSL ECDSA 的随机数》的理解
缓存·系统安全·密码学