【机密计算-大厂有话说】微软 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.signedHello world from the enclaveHello 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 进行抽象,为机密计算提供一套通用的接口,简化机密计算应用开发过程,实现一次开发,多平台部署的效果。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 中替换所有匹配项的自定义函数非正则表达式

引言 在 JavaScript 中,字符串替换是常见的操作之一。虽然 JavaScript 提供了一些内置的字符串方法来实现替换,比如 replace() 方法,但它只会替换第一个匹配到的项。如果我们想要替换所有匹配到的项,就需要自己编写一个函数。本文…

生成测试报告,在Unittest框架中就是简单

测试套件(Test Suite)是测试用例、测试套件或两者的集合,用于组装一组要运行的测试(多个测试用例集合在一起)。 (1)创建一个测试套件: import unittest suite unittest.TestSuite…

面向开发人员的 Spring Boot 最佳实践

Spring Boot是一种广泛使用且非常流行的企业级高性能框架。以下是一些最佳实践和一些技巧,您可以使用它们来改进 Spring Boot 应用程序并使其更加高效。这篇文章会有点长,完整读完文章需要一些时间。 正确的包装风格 正确的打包将有助于轻松理解代码和…

STL模板——vector详解

一、vector对象的定义和初始化方式 vector 中的数据类型 T 可以代表任何数据类型,如 int、string、class、vector(构建多维数组) 等,就像一个可以放下任何东西的容器,因此 vector 也常被称作容器。字符串类型 string …

ElasticSearch索引生命周期管理--DELETE

概要 ElasticSearch中的索引生命周期管理,也就是ilm(Manage the index lifecycle),是指定了索引在不同周期下的处理策略。ilm 的对象是索引而不是索引中的数据。ilm 包括四个阶段:hot 、warm、cold和delete。hot、warm和cold表示…

【VUE】项目本地开启https访问模式(vite4)

在实际开发中,有时候需要项目以https形式进行页面访问/调试,下面介绍下非vue-cli创建的vue项目如何开启https 环境 vue: ^3.2.47vite: ^4.1.4 根据官方文档:开发服务器选项 | Vite 官方中文文档 ps:首次操作,不要被类…

Pyspark

2、DataFrame 2.1 介绍 在Spark语义中,DataFrame是一个分布式的行集合,可以想象为一个关系型数据库的表,或者一个带有列名的Excel表格。它和RDD一样,有这样一些特点: Immuatable:一旦RDD、DataFrame被创…

ssm+vue基于java的少儿编程网上报名系统源码和论文PPT

ssmvue基于java的少儿编程网上报名系统源码和论文PPT006 开发工具:idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具:navcat,小海豚等 开发技术:java ssm tomcat8.5 摘 要 在国家重视教育影响下,教育部门的密确配合下&#…

沐渥六门氮气柜技术参数详解

氮气柜是用来存储电子元器件、芯片、半导体器件、金属材料、电路板、精密仪器等物品的设备,通过充入氮气降低柜内湿度,达到防潮、防氧化、防静电、防锈和防霉效果。 六门氮气柜参数 1、容积:约1380L;外尺寸:W1200*D700…

一零六八、回顾MySQL关键字排序

一、 关键字书写顺序 select distinct from join on where group by having union (all) order by limit二、 关键字实际执行顺序 from on join where group by having select distinct union (all) order by limit个人理解&…

100G光模块的应用案例分析:电信、云计算和大数据领域

100G光模块是一种高速光模块,由于其高速率和低延迟的特性,在电信、云计算和大数据领域得到了广泛的应用。在本文中,我们将深入探讨100G光模块在这三个领域的应用案例。 一、电信领域 在电信领域,100G光模块被广泛用于构建高速通…

QT- QLineEdite设置自动补全功能,并修改自动补全的样式

#include <QApplication> #include <QLineEdit> #include <QCompleter> #include <QStringListModel> #include <QMainWindow>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建一个字符串列表模型QStringListModel mode…

python流程控制语句学习笔记

if语句的使用 一、if判断语句介绍 if语句是用来进行判断的&#xff0c;其使用格式如下&#xff1a; if 要判断的条件: 条件成立时&#xff0c;要做的事情 demo1: age 30 print("------if判断开始------") if age > 18: print("我已经成年了") print…

HTML 元素中的name 属性

name 属性是 HTML 元素中常用的属性之一。它用于指定表单元素的名称&#xff0c;以便在提交表单时将其值与对应的键关联起来。 每个表单元素&#xff08;例如 <input>、<select> 和 <textarea>&#xff09;都可以具有一个 name 属性&#xff0c;该属性为元素…

Nginx使用proxy_cache指令设置反向代理缓存静态资源

场景 CentOS7中解压tar包的方式安装Nginx&#xff1a; CentOS7中解压tar包的方式安装Nginx_centos7 tar文件 怎么load_霸道流氓气质的博客-CSDN博客 参考上面流程实现搭建Nginx的基础上&#xff0c;实现静态资源的缓存设置。 注意上面安装时的目录是在/opt/nginx目录下&…

ELK中grok插件、mutate插件、multiline插件、date插件的相关配置

目录 一、grok 正则捕获插件 自定义表达式调用 二、mutate 数据修改插件 示例&#xff1a; ●将字段old_field重命名为new_field ●添加字段 ●将字段删除 ●将filedName1字段数据类型转换成string类型&#xff0c;filedName2字段数据类型转换成float类型 ●将filedNam…

如何使用Flask-CORS实现跨域资源共享

如何使用Flask-CORS实现跨域资源共享 引言&#xff1a; 在网络应用开发中&#xff0c;跨域资源共享&#xff08;Cross Origin Resource Sharing&#xff0c;简称CORS&#xff09;是一种机制&#xff0c;允许服务器与指定的来源或域名之间共享资源。使用CORS&#xff0c;我们可…

Leetcode每日一题:1289. 下降路径最小和 II(2023.8.10 C++)

目录 1289. 下降路径最小和 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 动态规划 原理思路&#xff1a; 1289. 下降路径最小和 II 题目描述&#xff1a; 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路…

数据结构-1

1.2 线性结构树状结构网状结构&#xff08;表 数 图&#xff09; 数据&#xff1a;数值型 非数值型 1.2.3数据类型和抽象数据类型 1.3抽象数据类型 概念小结&#xff1a; 线性表: 如果在独立函数实现的 .c 文件中需要包含 stdlib.h 头文件&#xff0c;而主函数也需要包含 st…