【机密计算-大厂有话说】微软 Open Enclave SDK

前言

        机密计算是基于硬件支持的可信执行环境的,比如 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++ 语言构建安全区应用程序。 一个飞地应用程序将自身划分为两个部分(组件):

  1. 不受信任的部分(组件)(称为 host)
  2. 受信任的部分(组件)(称为 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 数据流

  1. Host 程序将签名的二进制 enclave 程序通过创建命令加载到 enclave 空间里
  2. Host 程序通过 ECALL(x86 和 risc-v 都这么称呼,arm 上叫 smc)调用 enclave 安全程序
  3. enclave 程序也可以通过 OCALL 调用一个 host 的函数功能
  4. host 端返回到 enclave 端
  5. enclave 程序返回结果给 host 程序
  6. 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 用来相互访问的代码:

- 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 工具签名:

$ oesign sign -e enclave -c enclave.conf -k key.pem

         enclave 由 host 应用程序加载、运行:

$ ./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 来实现远程证明服务:

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 进行抽象,为机密计算提供一套通用的接口,简化机密计算应用开发过程,实现一次开发,多平台部署的效果。

皮格马利翁效应心理学指出,赞美、赞同能够产生奇迹,越具体,效果越好~
“收藏夹吃灰”是学“器”练“术”非常聪明的方法,帮助我们避免日常低效的勤奋~

猜你喜欢

转载自blog.csdn.net/BillyThe/article/details/132223757
SDK