9 个版本 (稳定)
1.1.1 | 2020年4月2日 |
---|---|
1.1.0 | 2019年12月19日 |
1.0.9 | 2019年9月16日 |
1.0.8 | 2019年6月11日 |
0.0.1 | 2019年1月4日 |
#90 在 硬件支持
88 每月下载次数
在 13 个crate中使用了(直接使用6个)
200KB
4.5K SLoC
Teaclave SGX SDK
Apache Teaclave(孵化)SGX SDK 帮助开发者使用 Rust 编程语言编写 Intel SGX 应用,也称为 Rust SGX SDK。
入门
SDK 容器可以由源代码构建,也可以从 docker hub 拉取并作为 docker 容器运行。
配置
现在的 docker 镜像支持 Intel ME。如果需要,请参考 sgxtime readme 获取说明。
先决条件
-
Docker
-
Intel SGX OOT 2.11.0 驱动程序或 DCAP 1.36.2 驱动程序
-
Intel SGX SDK v2.12
-
Intel SGX PSW
-
Rust nightly-2022-10-22
您可以在 01.org 网站上找到 Intel SGX 软件的 安装指南。
注意:如果您在没有 SGX 支持的机器上运行我们的 SDK,您仍然需要 Intel PSW 和 SDK 的模拟版本。
拉取预构建的 Docker 容器
假设用户已经 正确安装了 docker。我们提供了 5 个容器
baiduxlab/sgx-rust:1604-1.1.3
baiduxlab/sgx-rust:1804-1.1.3
baiduxlab/sgx-rust:2004-1.1.3
baiduxlab/sgx-rust:fedora31-1.1.3
baiduxlab/sgx-rust:centos8-1.1.3
将 latest
锁定为 1604-1.1.3
。
首先,拉取您选择的 docker 容器,此命令将下载 latest
$ docker pull baiduxlab/sgx-rust
要运行容器,我们建议您下载我们的示例代码
使用 Intel SGX 驱动程序运行
我们建议首先使用 github 存储库作为第一个卷来运行容器
$ git clone https://github.com/apache/incubator-teaclave-sgx-sdk.git
要使用 SGX 支持运行容器,请运行
$ docker run -v /path/to/rust-sgx:/root/sgx --device /dev/libsgx -ti baiduxlab/sgx-rust
如果您正在使用 DCAP 驱动程序,您必须运行
$ docker run -v /path/to/rust-sgx:/root/sgx -ti --device /dev/sgx/enclave --device /dev/sgx/provision baiduxlab/sgx-rust
在容器内部,我们必须启动 AESM 守护进程并定义 LD_LIBRARY_PATH
# LD_LIBRARY_PATH=/opt/intel/sgx-aesm-service/aesm/
# /opt/intel/sgx-aesm-service/aesm/aesm_service
如果一切配置正确,现在可以在容器内运行一个简单的 helloworld
程序
# cd sgx/samplecode/helloworld
# make
# cd bin
# ./app
我们建议您查看 samplecode
文件夹中的其他文件,以便熟悉我们的 SDK 编程。
不使用 Intel SGX 驱动程序运行
注意:Intel 提供了一种模拟模式,您可以使用它在不带 SGX 支持的常规机器上进行开发,通过使用 sgx_urts_sim、lsgx_uae_service_sim、sgx_trts_sim、sgx_tservice_sim 库构建 enclave 应用。
我们建议首先使用 github 存储库作为第一个卷来运行容器
$ git clone https://github.com/apache/incubator-teaclave-sgx-sdk.git
要在不支持SGX的情况下运行容器,请执行以下命令:
$ docker run -v /path/to/rust-sgx:/root/sgx -ti baiduxlab/sgx-rust
一旦进入容器,当运行任何 samplecode
时,您可以选择
- 修改Makefile,将
SGX_MODE
设置为SW
- 运行以下命令来设置
export SGX_MODE=SW
- 使用构建标志
SGX_MODE=SW
运行make
现在我们可以运行我们的 helloworld
示例
# cd sgx/samplecode/helloworld
# make SGX_MODE=SW
# cd bin
# ./app
构建Docker镜像
确保Intel SGX SDK已正确安装在主机操作系统上,并且服务已启动。然后进入 cd dockerfile
并运行 docker build -t rust-sgx-docker -f Dockerfile.1604.nightly .
以构建。
代码示例
我们提供了18个代码示例,以帮助开发人员了解如何在Rust中编写Enclave代码。这些示例位于 samplecode
目录中。
查看代码示例
-
helloworld
是一个非常简单的应用程序。它展示了参数传递、Rust字符串和ECALL/OCALLs的基本用法。 -
crypto
展示了Intel SGX库提供的加密API的用法。它在对等区域内进行一些加密计算,这在大多数情况下是推荐的。 -
localattestation
是从原始Intel SGX SDK移植的示例,展示了如何在Rust编程语言中执行本地认证。 -
sealeddata
示例展示了如何在Enclave中密封秘密数据以及如何验证密封数据。 -
thread
示例是从原始Intel SGX SDK移植的,展示了线程API的基本用法。 -
remoteattestation
示例展示了如何使用Rust SGX SDK进行远程认证。该示例是从 linux-sgx-attestation 分叉的,归功于Blackrabbit(《[email protected]》)。在这个示例中包含了Rust的Enclave,并相应地修改了Makefile。 -
hugemem
示例展示了如何在SGX Enclave中使用大内存。在这个示例中,我们分配了31.75GB的堆空间,并分配了31.625GB的缓冲区! -
file
示例展示了如何在SGX Enclave中读取/写入文件。 -
hello-rust
是用纯Rust编写的helloworld示例。 -
backtrace
是一个示例,展示了如何在Enclave内部启用回溯机制。 -
unit-test
展示了编写单元测试和进行单元测试的方式。 -
zlib-lazy-static-sample
展示了如何在Enclave内部使用移植的第三方crate。 -
machine-learning
展示了如何在使用Intel SGX Enclave进行机器学习时使用 rusty-machine。 -
tls
包含了一对TLS客户端/服务器,它们在SGX Enclave中运行得非常好! -
sgxtime
展示了如何通过Intel ME获取可信时间戳。有关详细信息,请参阅此 说明。 -
protobuf
展示了如何使用移植的rust-protobuf
通过 protobuf 将消息传递到安全区域。请在编译此示例之前,通过以下命令安装 protobuf-compiler:apt-get install protobuf-compiler
和 protobuf-codegen:cargo install protobuf-codegen --vers=2.8.1
。 -
wasmi
展示了如何使用移植的 WebAssembly 解释器传递 WebAssembly 测试套件。 -
psi
是 Private-Set-Intersection 问题的原型解决方案。 -
secretsharing
展示了在 Rust-SGX 环境中使用 Shamir 分享的用法(由 @davidp94 提供)。 -
switchless
展示了如何使用英特尔提供的最新 "switchless" 执行模型。请注意 Makefile 和链接标志 "-lsgx_tswitchless" 的位置。 -
mutual-ra
提供了 SGX 安全区域之间的基于远程认证的 TLS 连接。有关详细信息,请参阅 readme。 -
ue-ra
提供了不受信任的第三方与一个 SGX 安全区域之间的基于远程认证的 TLS 连接。有关详细信息,请参阅 readme。 -
sgx-cov
展示了如何使用 lcov 与 Rust SGX 安全区域一起生成代码覆盖率报告。有关详细信息,请参阅 readme。 -
tcmalloc
展示了如何将 Rust-SGX 安全区域与 tcmalloc(由 Intel SGX SDK 提供)链接,并使用不同类型的工作负载测试其性能。
Rust 中编写安全区域的小技巧
查看技巧
编写 EDL
- 在 ECALL/OCALL 定义中,对于固定长度的数组,将其声明为数组。对于动态长度的数组,使用关键字
size
让英特尔 SGX 知道应该复制多少字节。
ECALL 函数命名
- 为每个 ECALL 函数添加
#[no_mangle]
。
传递/返回数组
-
对于动态长度的数组,在 Rust 中唯一的方法是使用原始指针。有一些函数可以使用原始指针来获取/设置数据,例如
offset
方法。也可以使用slice::from_raw_parts
将数组转换为切片。 -
对于固定长度的数组,上述方法是可行的。根据在 问题 30382 和 问题 31227 中的讨论,瘦指针(例如固定长度数组)目前是 FFI 安全的,但未记录。在示例代码中,我们使用固定长度的数组来传递和返回一些固定长度的数据。
Apache 之前的版本
最新版本:v1.1.3
支持 Intel SGX SDK v2.12 和 Rust nightly-2020-10-25。增加了对 Ubuntu 20.04 的支持。强烈建议用户升级到 Intel SGX SDK v2.12 和驱动程序到 DCAP 1.36.2 和 OOT 2.11.0。release_notes。
版本 1.1.2
v1.1.2
支持Intel SGX SDK v2.9.1,以及Rust nightly-2020-04-07版本。v1.1.2版本提供了一个方便的crate sgx_signal
,它能够实现信号捕获。可以轻松找到异常发生的位置,并最终触发ud2
。我们还添加了Backtrace::capture
到sgx_tstd中。在Intel SGX SDK v2.9.1补丁的帮助下,线程局部存储的析构函数最终在常规SGX线程和pthread线程上工作。由于Rust在no_std
环境中支持async
/await
,因此已移除sgx_core_futures。请参阅release_notes获取更多详细信息。
版本1.1.1
v1.1.1
支持Intel SGX SDK v2.9,以及Rust nightly-2020-03-12版本。v1.1.1包含了许多错误修复和新进程宏sgx_align
,有助于对给定的结构进行对齐。对于LVI缓解,它仅在C/C++部分(EDL头文件/Intel库)上工作,并支持两种模式:MITIGATION-CVE-2020-0551=LOAD
或MITIGATION-CVE-2020-0551=CF
。要启用它,需要设置环境变量env "MITIGATION-CVE-2020-0551=LOAD"
。有关详细信息,请参阅release_notes。
版本1.1.0
v1.1.0
支持Intel SGX SDK v2.7.1,以及Rust nightly-2019-11-25版本。v1.1.0通过thread::spawn
引入了动态静态支持,以及几乎所有的std::sync
功能。此外,v1.1.0利用Intel SGX SDK的内存分配原语缓解了INTEL-SA-00219。此外,我们通过解析Intel SGX urts/trts初始化的隐藏全局CPU功能指示器,启用了is_x86_feature_detected!
。我们还提供了Fedora 27的Dockerfile。有关详细信息,请参阅release_notes。
版本1.0.9
v1.0.9 发布
支持Intel SGX SDK v2.6,以及Rust nightly-2019-08-01版本。将所有内容提升到版。由于我们已经使用merge bot分叉和维护了所有这些依赖项,因此已移除third_party目录。由于Intel SGX SDK v2.6在全局线程元数据中引入了一些破坏性变更,因此v1.0.9的线程局部功能在Intel SGX SDK v2.5上不起作用。EDL和公共头文件分别进行了更改。有关详细信息,请参阅release_notes。
版本1.0.8
v1.0.8 发布
支持最新的Rust nightly(nightly-2019-05-22)和Rust stable(stable-2019-05-14)。添加了对sgx_cov的代码覆盖率支持。修复了内存分配器和恐慌例程中的错误。为支持kvdb-memorydb添加了新的第三方库。有关详细信息,请参阅release_notes。
版本1.0.7
v1.0.7 发布
支持Intel SGX SDK v2.5。主分支支持Rust夜间构建(nightly-2019-04-26),稳定分支支持Rust稳定构建(stable-2019-04-25)。重构了sgx_tstd
以支持mio
。增加了更多示例代码,包括ue-ra的Java/Go客户端(感谢@bradyjoestar)!我们还在Github组织mesalock-linux上维护流行crate的分叉。移植的crate与原始crate通过Pull机器人同步,我们手动将几乎所有的测试从原始crate移植到SGX以测试移植的crate是否正常工作。请参考release_notes获取更多详细信息。
我们更改了内置的EDL文件。请在import
语句上仔细升级您的EDL文件。如果在编译过程中遇到任何问题,请创建问题并告诉我。谢谢!
注意:(Ubuntu通道)从Intel SGX SDK 2.8开始,aesmd
需要环境变量才能启动。如果您使用docker,请以以下方式启动aesmd
LD_LIBRARY_PATH=/opt/intel/sgx-aesm-service/aesm /opt/intel/sgx-aesm-service/aesm/aesm_service
从Intel SGX SDK 2.5开始,aesmd
需要环境变量才能启动。如果您使用docker,请以以下方式启动aesmd
LD_LIBRARY_PATH=/opt/intel/libsgx-enclave-common/aesm /opt/intel/libsgx-enclave-common/aesm/aesm_service
(CentOS通道)截至2.6,Intel SGX SDK的CentOS分支仍以bin可执行文件格式存在。请像过去一样启动aesmd
LD_LIBRARY_PATH=/opt/intel/sgxpsw/aesm /opt/intel/sgxpsw/aesm/aesm_service
版本1.0.6
v1.0.6发布
修复了sgx_alloc、sgx_types、ucd-generate中的错误,并改进了sgx_tunittest。添加了rust-base58。感谢@elichai、@cbeck88、@brenzi和@nhynes。
版本1.0.5
v1.0.5发布
此版本在master分支中支持Rust夜间构建(nightly-2019-01-28,v1.34.0),在rust-stable分支中支持最新的稳定构建(stable-2019-01-16,v1.32.0)。它支持最新的Intel SGX SDK v2.4.0和Ubuntu Linux 16.04+18.04。我们提供对Intel受保护代码加载器的支持。我们提供sgx_ucrypto和sgx_crypto_helper,用于在非可信应用程序中使用SGX样式的加密原语,并在可信和非可信程序中提供RSA密钥对序列化和反序列化。我们重新组织了ocall相关接口,并在新的crate sgx_libc中提供了一组新的ocall函数。此外,我们还移植了net2到SGX。请参考release_notes获取更多详细信息。
版本1.0.4
v1.0.4发布
此版本在master分支中支持Rust夜间构建(nightly-2018-10-01),在rust-stable分支中支持最新的稳定构建(stable-2018-09-25)。它支持最新的Intel SGX SDK v2.3.1和Ubuntu Linux 18.04。它现在包含更多的第三方库,包括:bit-vec、chrono、erased-serde、fxhash、nan-preserving-float、num-bigint、quick-error、raft-rs、time、webpki-roots和yasna。一些第三方库,如untrusted、parity-wasm和lazy-static被移除,因为它们支持no_std
并可以直接从crates.io使用。由于标准库的安全警告,我们强烈建议开发者升级到v1.0.4并使用最新的Rust版本来构建它。请参考release_notes获取更多详细信息。
版本1.0.1
v1.0.1发布
此版本在master分支中支持Rust夜间构建(nightly-2018-07-16)和最新的Rust稳定构建(stable-2018-07-10)。它支持最新的Intel SGX SDK v2.2。新第三方库包括:bytes、http、iovec、rust-crypto、rust-fnv和rust-threshold-secret-sharing。新的代码示例“secretsharing”和“rust-threshold-secret-sharing”由@davidp94提供。请参考release_notes获取更多详细信息。
版本 1.0.0
v1.0.0 发布
我们自豪地宣布 rust-sgx-sdk v1.0.0 的发布!我们将 Parity 的Webassembly 解释器移植到 Intel SGX,并提供了一个完整的在安全区域内运行的wasmi 示例,以及一个抵抗侧信道攻击的解决方案!从本版本开始,我们开始支持最新的 Rust 稳定分支,而不是每晚构建版本,以获得更好的稳定性和未来的生产使用。因此,v1.0.0 的稳定分支支持最新的 Rust 稳定工具链(1.26.0 stable-2018-05-07),而 master 只支持 Rust 每晚构建版本的 nightly-2018-04-11。有关详细信息,请参阅发布说明。
版本 0.9.8
v0.9.8 发布
本版本提供了针对 Intel SGX 中最近 Spectre 攻击的安全更新,并支持 Rust 稳定 (2018-03-01)(在名为 'rust-stable' 的分支上)。它包含对 Intel SGX SDK 2.1.2 的支持以及一系列按需停止推测执行的 API 函数。此外,我们还提供了一个 rust-protobuf v1.4.4 的移植版本。有关详细信息,请参阅发布说明。
版本 0.9.7
v0.9.7 发布
本版本提供了一个新的命名空间:sgx_tstd::untrusted
,包括 sgx_tstd::untrusted::fs
、sgx_tstd::untrusted::time
和 sgx_tstd::untrusted::path
,为 不受信任 命名空间中的操作提供了支持。无论是否设置 untrusted_*
,不受信任 命名空间始终启用。我们强烈建议开发人员使用 sgx_tstd::untrusted
命名空间来移植他们的软件包,而不是使用 untrusted_
系列特性。同时,我们将 untrusted_net
特性重命名为 net
以实现特性名称统一。有关详细信息,请参阅发布说明。
贡献
Teaclave 按照开源方式The Apache Way 进行开源,我们旨在创建一个由社区维护和拥有的项目。我们欢迎各种贡献。阅读这份文档来了解更多关于如何贡献的信息。感谢我们的贡献者。
社区
- 加入我们的邮件列表。
- 关注我们@ApacheTeaclave。
- 了解更多信息。