前言
机密计算是基于硬件支持的可信执行环境的,比如 Intel SGX 硬件技术上面的 enclave 以及 Arm Trustzone 上的 OT-TEE,不过这些异构的 TEE 之间差异还是蛮大的,所以亟需一种能够屏蔽 TEE 差异软件中间件或者 SDK,这就是本文将要提到的微软 Open Enclave SDK。
Open Enclave 提供了异构 TEE (SGX 和 OP-TEE)的兼容,为上层机密应用提供了同一的接口,同时为机密计算提供了远程证明、多高级语言支持等功能。
机密计算是一项持续的工作,旨在保护静态、传输中和正在使用中的数据的整个生命周期安全。通过使用信任执行环境,客户可以构建应用程序,以保护数据在使用时免受外部访问。Open Enclave SDK 是一个开源 SDK,旨在为开发人员创建单个统一的安全区抽象,以构建基于可信执行环境 (TEE) 的应用程序。随着 TEE 技术的成熟和不同实现的出现,Open Enclave SDK 致力于支持一个 API 集,允许开发人员一次构建并部署在多个技术平台,从云到混合云再到边缘的不同环境,同时兼容 Linux 和 Windows 操作系统。
一、介绍
Open Enclave SDK 是一个与硬件无关的开源库,用于开发基于硬件的可信执行环境的应用程序,即飞地(Enclave)。
Open Enclave (OE) 是一个 SDK,基于 C 和 C++ 语言构建安全区应用程序。 一个飞地应用程序将自身划分为两个部分(组件):
- 不受信任的部分(组件)(称为 host)
- 受信任的部分(组件)(称为 enclave)
enclave 是受保护的内存区域,可为数据和代码提供机密访问运行的环境。它是可信执行环境 (TEE) 的一种实例,通常由硬件保护,例如英特尔软件防护扩展 (SGX)。
该 SDK 旨在使 enclave 程序的开发更简单通用,屏蔽掉不同硬件供应商 TEE 方案的差异性。目前,OE 实现提供了对英特尔 SGX 的支持,同时对 ARM TrustZone 上的 OP-TEE OS 提供了一个预览版本。作为一个 开源项目,该 SDK 也力求提供透明的解决方案, 与特定供应商、服务提供商、操作系统无关。
二、架构
OE 采用封层的隔离架构,下层是 TEE 组件层,包括 Intel SGX 库和 ARM OP-TEE,上层是不受信的主机程序和受信的 enclave 程序,中间是 OE 软件栈。
OE 软件栈包括:
- OE host 库
- OE 运行时库
- musl libc 库
- musl libc 是一个轻量级的 C 标准库,它的设计目标是尽可能小而快,同时提供最高的代码质量和安全性。musl libc 的源代码通常较短,编译速度较快,没有额外的依赖,因此非常适用于嵌入式系统和轻量级应用程序。
- 兼容性较 glibc 差一些
- 静态编译
- 严格遵循 POSIX 标准
- 采用更宽松的 BSD 协议许可
- OpenSSL & MbedTLS
- LLVM libc++:符合 apache 协议许可的开源 c++ 库
- OE Attestation 插件
三、编程模型
3.1 数据流
- Host 程序将签名的二进制 enclave 程序通过创建命令加载到 enclave 空间里
- Host 程序通过 ECALL(x86 和 risc-v 都这么称呼,arm 上叫 smc)调用 enclave 安全程序
- enclave 程序也可以通过 OCALL 调用一个 host 的函数功能
- host 端返回到 enclave 端
- enclave 程序返回结果给 host 程序
- host 程序销毁 enclave 应用程序
3.2 hello world
OE SDK 最小工程当属 hello world 工程,整个工程由以下部分构成
- 全局 Makefile
- 用于生成 OCALLs/ECALLs 的 edl 配置文件
- host 端的 Makefile文件、C 源文件、自动生成的边缘调用过程文件
- enclave 端的 C 源文件、配置文件、Makefile 文件以及边缘调用过程文件
3.2.1 edl 文件
edl 文件用于生成 ECALLs/OCALLs,这里包含了另外两个 edl 文件,同时定义了 ECALL 和 OCALL 的入口函数,通过 oeedger8r 工具可以生成 host 和 enclave 用来相互访问的代码:
cpp
- Host
$oeedger8r --untrusted helloworld.edl --search-path /opt/openenclave/include
- Enclave
$oeedger8r --trusted helloworld.edl --search-path /opt/openenclave/include
3.2.2 C 文件
此例子中演示了 host 调用 enclave 的 enclave_helloworld 函数,在 enclave 环境下打印消息,并反向调用 host_hellowold 来在非信任区打印消息,最后一层一层返回。整个中间调用过程由 ECALL/OCALL 机制保证。
enclave 通过 oesing 工具签名:
bash
$ oesign sign -e enclave -c enclave.conf -k key.pem
enclave 由 host 应用程序加载、运行:
bash
$ ./host enclave.signed
Hello world from the enclave
Hello world from the host
3.2.3 ECALL/OCALL
上图中虽然 host 端和 enclave 端的 enclave_helloworld 同名,但是并不是一个函数直接调用,仅仅是同名而已(这个在 ARMv8-M trustzone 架构下基于安全门 sg 指令实现的跳板函数类似)。host 端的 enclave_helloworld 是自动生成的子程序,它会将参数序列化然后通过特定的通道传输给 enclave,这里会涉及到内存复制;进入 enclave 后,重新对参数进行反序列化传递给真正的 enclave_helloworld,ECALL 过程结束。
而 OCALL 可以认为是 ECALL 的反过程,涉及的具体细节也类似。
四、证明 Attestation
OE 实现了两个 API 来实现远程证明服务:
cpp
oe_get_evidence:证明方从 TEE 获取远程证明用到的证据;
oe_verify_evidence:验证方验证证明方的证据;
设备端 enclave 证明环境使用 oe_get_evidence API,而微软证明服务 MAS 使用 oe_verify_evidence API。
OE 的证明架构兼容 TEE 特定的证明,比如 SGX 插件;
五、其他
5.1 功能特性
- 日志回调 APIs
- 数据封装 APIs
- ECALLs/OCALLs 深拷贝
- 可插拔的内存分配器
- 调试 Malloc
- 模拟模式
5.2 工具
- 调试器
- GDB
- WinDbg
- IDE 扩展
- Visual Studio
- VS Code
- 包管理器
- apkman(实验中)
5.3 计划中
- FIPS 模块加载
- 提高 syscall/libc 的支持
- 高级语言支持(比如 rust)
总结
从上面我们可以对 Open Enclave SDK 有个大概的了解,看起来还是非常简单易用的,对于 SGX Lib 以及 OP-TEE OS 的具体封装情况,我们可以后面再继续分析。
总之,Open Enclave SDK 致力于通过对异构 TEE API 进行抽象,为机密计算提供一套通用的接口,简化机密计算应用开发过程,实现一次开发,多平台部署的效果。
皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~
"收藏夹吃灰"是学"器"练"术"非常聪明的方法,帮助我们避免日常低效的勤奋~