1 个不稳定版本
0.0.0 | 2019年12月19日 |
---|
#29 在 #sgx-sdk
145KB
3K 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_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 .
进行构建。
代码示例
我们提供了十八个代码示例,帮助开发者了解如何在Rust中编写Enclave代码。这些示例位于samplecode
目录中。
查看代码示例
-
helloworld
是一个非常简单的应用程序。它展示了参数传递、Rust字符串和ECALL/OCALL的基本用法。 -
crypto
展示了Intel SGX库提供的加密API的用法。它在Enclave内部执行一些加密计算,这在大多数情况下是推荐的。 -
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 和 protobuf-codegen:apt-get install protobuf-compiler
和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
。我们还添加了sgx_tstd中的Backtrace::capture
。借助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。将所有内容提升到版。由于我们已使用合并机器人分叉并维护了所有这些依赖项,因此已删除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-2019-05-14)。已添加到sgx_cov中的代码覆盖率支持。修复了内存分配器和恐慌例程中的错误。添加了支持kvdb-memorydb的新第三方库。有关详细信息,请参阅release_notes。
版本1.0.7
v1.0.7版本发布
支持英特尔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的分支。通过Pull机器人的帮助,同步原crate,并手动将几乎所有的测试从原crate移植到SGX以测试移植的crate是否正常工作。请参阅发布说明获取更多详细信息。
我们更改了内置的EDL文件。请仔细升级你的EDL文件中的import
语句。如果在编译过程中遇到任何问题,请创建问题并告诉我。谢谢!
注意:(Ubuntu通道)从英特尔SGX SDK 2.8开始,aesmd
需要环境变量才能启动。如果你使用的是docker,请按以下方式启动aesmd
LD_LIBRARY_PATH=/opt/intel/sgx-aesm-service/aesm /opt/intel/sgx-aesm-service/aesm/aesm_service
从英特尔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,英特尔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版本发布
此版本在主分支支持Rust夜间构建(nightly-2019-01-28,v1.34.0),在rust-stable分支支持最新的稳定构建(stable-2019-01-16,v1.32.0)。它支持最新的英特尔SGX SDK v2.4.0和Ubuntu Linux 16.04+18.04。我们提供对英特尔受保护代码加载器的支持。我们提供sgx_ucrypto和sgx_crypto_helper,以在不受信任的应用程序中使用SGX风格的加密原语,并在受信任和不信任的程序中提供RSA密钥对序列化和反序列化。我们重新组织了ocall相关接口,并在新的crate sgx_libc中提供了一组新的ocall函数。此外,我们还把net2移植到SGX。请参阅发布说明获取更多详细信息。
版本1.0.4
v1.0.4版本发布
此版本在主分支支持Rust夜间构建(nightly-2018-10-01),在rust-stable分支支持最新的稳定构建(stable-2018-09-25)。它支持最新的英特尔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。由于支持no_std
并且可以直接从crates.io使用,一些第三方库,如untrusted、parity-wasm和lazy-static已被移除。我们强烈建议开发者升级到v1.0.4并使用最新的Rust发布版来构建它,因为标准库安全警告。请参阅发布说明获取更多详细信息。
版本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。新代码示例'秘密共享'和'rust-threshold-secret-sharing'由@davidp94提供。请参阅发布说明获取更多详细信息。
版本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稳定-2018-05-07),而master分支仅支持nightly-2018-04-11的Rust夜间工具链。请参阅发布说明获取更多详细信息。
版本0.9.8
v0.9.8发布
本版本提供了针对Intel SGX中最近Spectre攻击的安全更新,并支持命名为'rust-stable'的分支中的Rust稳定版(2018-03-01)。它包含对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
,提供了对在未受信任命名空间中进行ocall操作的支持。无论是否设置了untrusted_*
,未受信任命名空间始终启用。我们强烈建议开发者使用sgx_tstd::untrusted
命名空间来迁移他们的crate,而不是使用untrusted_
系列功能。我们还把untrusted_net
功能重命名为net
以统一功能名称。请参阅发布说明获取更多详细信息。
贡献
Teaclave采用Apache之道开源,我们旨在创建一个由社区维护和拥有的项目。所有类型的贡献都受欢迎。阅读此文档以了解如何贡献。感谢我们的贡献者。
社区
- 加入我们的邮件列表。
- 在@ApacheTeaclave上关注我们。
- 了解更多信息。
lib.rs
:
通过堆栈回溯实现恐慌
这个crate是Rust中实现恐慌(panics)的库,它使用了编译平台“最原生”的栈回溯机制。这本质上可以分为三类
- MSVC目标在
seh.rs
文件中使用了SEH(结构化异常处理)。 - 64位MinGW目标在
seh64_gnu.rs
模块中部分使用SEH,部分使用gcc-like信息。 - 所有其他目标在
gcc/mod.rs
模块中使用libunwind/libgcc。
有关每种实现的更多文档可以在相应的模块中找到。