密码学系列 - 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
相关推荐
其实防守也摸鱼1 天前
软件安全与漏洞--软件安全设计
运维·网络·安全·网络安全·密码学·需求分析·软件安全
其实防守也摸鱼2 天前
ctfshow--Crypto(crypto1-14)解题步骤
java·开发语言·网络·安全·密码学·ctf·ctfshow
安当加密2 天前
数据库密码写配置文件?我用动态凭据管理重构了50个微服务的数据库连接
数据库·密码学·安全架构
MicroTech20253 天前
微算法科技(NASDAQ :MLGO)基于后量子密码学的动态BFT共识机制:QDBFT架构
科技·算法·密码学
Zevalin爱灰灰4 天前
现代密码学 第二章——流密码【下】
算法·密码学
其实防守也摸鱼5 天前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
Zevalin爱灰灰5 天前
现代密码学 第四章——公钥密码【上】
安全·密码学
岁岁的O泡奶5 天前
NSSCTF_crypto_[LitCTF 2023]babyLCG
经验分享·python·算法·密码学·crypto·流密码
Zevalin爱灰灰6 天前
现代密码学 第一章——概述
密码学
Zevalin爱灰灰6 天前
现代密码学 第三章——分组密码【上】
密码学