【机密计算-大厂有话说】微软 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,一经查实,立即删除!

相关文章

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

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

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

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

【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…

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

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

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

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

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

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

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

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

数据结构-1

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

短视频账号矩阵系统/技术开发搭建私有部署

本系统是基于短视频领域的新一代系统,旨在提供一个高效、全面的短视频管理与分发平台。系统采用先进的开发算法和技术,实现了智能化视频分类、推荐和用户互动功能。 目录 一、抖音SEO账号矩阵系统的开发和部署遵循以下原则: 二、账号矩阵绑…

谷歌全栈多平台应用开发神器Project IDX来了!PaLM 2加持,代码效率翻倍

一直以来,从0开始构建应用,都是一项复杂的工作。尤其是跨越手机、Web和桌面平台的程序。 这是一片无尽的复杂海洋,需要把技术堆栈融合在一起,来引导、编译、测试、部署、监控应用程序。 多年来,谷歌一直致力于让多平…

EFLFK——ELK日志分析系统+kafka+filebeat架构

环境准备 node1节点192.168.40.16elasticsearch2c/4Gnode2节点192.168.40.17elasticsearch2c/4GApache节点192.168.40.170logstash/Apache/kibana2c/4Gfilebeat节点192.168.40.20filebeat2c/4G https://blog.csdn.net/m0_57554344/article/details/132059066?spm1001.2014.30…

HTTP代理授权方式介绍

在网络爬虫过程中,我们经常需要使用HTTP代理来实现IP隐藏、突破限制或提高抓取效率。而为了确保代理的正常使用,并避免被滥用,代理服务商通常会采用授权方式。在本文中,我们将介绍几种常见的HTTP代理授权方式,以帮助你…

matplotlib 设置legend的位置在轴最上方,长度与图的长度相同

import matplotlib.pyplot as plt import numpy as npx1 np.linspace(0, 10, 50) x2 [6,4,3]ax plt.subplot() ax.plot(x1, label"test1") ax.plot(x2, label"test2") # 设置图例的位置 # 将左下角放置在【0, 1.02】位置处,横为1&#xff0c…

9.2.1Socket(UDP)

一.传输层: 1.UDP:无连接,不可靠,面向数据报,全双工. 2.TCP:有连接,可靠,面向字节流,全双工. 注意:这里的可不可靠是相对的,并且和安不安全无关. 二.UDP数据报套接字编程: 1.socket文件:表示网卡的这类文件. 2.DatagramPacket:表示一个UDP数据报. 三.代码实现: 1.回显服务…

原型和原型链理解

这个图大概能概括原型和原型链的关系 1.对象都是通过 _proto_ 访问原型 2.原型都是通过constructor 访问构造函数 3.原型是构造函数的 prototype 4.原型也是对象实例 也是通过 _proto_ 访问原型(Object.prototype) 5.Object.prototype的原型通过 _proto_ 访问 为null 那么…

【ChatGPT】自我救赎

ChatGPT辅助学习C之【在C中如果大数据类型转小数据类型会发生什么呢?】&#xff0c;今天问ChatGPT一个问题&#xff0c;让它解析下面这个C程序&#xff1a; #include <iostream> #include <cstdio> using namespace std; int main() {int a;long long b532165478…