英特尔 SGX 线程与 TCS 对比

Intel SGX Threading and vs TCS

我正在尝试了解 TCS 启用的 SGX 线程与 SDK 提供的不受信任线程之间的区别。

如果我没理解错的话,TCS 允许多个逻辑处理器进入同一个飞地。每个逻辑处理器都有自己的 TCS,因此也有自己的入口点(TCS 中的 OENTRY 字段)。每个线程运行直到 AEX 发生或到达线程末尾。但是,这些由 TCS 启用的线程还无法相互同步。至少,同步没有SGX指令。

然后,另一方面,SGX SDK提供了一套线程同步原语,主要是mutex和condition variable。这些原语不受信任,因为它们最终由 OS 提供服务。

我的问题是,这些线程同步原语 是要由 TCS 线程使用吗?如果是这样,这不会降低安全性吗? OS 可以随心所欲地进行调度。

首先,让我们来处理一下您对

的有点不清楚的术语

SGX threads enabled by TCS and untrusted threading provided by SDK.

在飞地内,只有 "trusted" 个线程可以执行。飞地内没有 "untrusted" 线程。可能是SDK指南[1]中的下面一句话误导了你:

Creating threads inside the enclave is not supported. Threads that run inside the enclave are created within the (untrusted) application.

不受信任的应用程序必须设置 TCS 页面(有关 TCS 的更多背景信息,请参阅 [2])。那么,不受信任的应用程序设置的 TCS 如何成为 enclave 内受信任线程的基础呢? [2]给出答案:

EENTER is only guaranteed to perform controlled jumps inside an enclave’s code if the contents of all the TCS pages are measured.

通过测量 TCS 页面,可以通过 enclave 证明来验证线程的完整性(TCS 定义了允许的入口点)。因此只有已知良好的执行路径才能在飞地内执行。

其次,让我们看看同步原语

SDK 确实提供同步原语,您说这些原语不可信,因为它们最终由 OS 服务。让我们看看[1]中对这些原语的描述:

  • sgx_spin_lock() 和解锁仅在 enclave 内操作(使用原子操作),不需要 OS 交互(无 OCALL)。使用自旋锁,您可以自己实现更高级别的原语。
  • sgx_thread_mutex_init() 也不进行 OCALL。互斥锁数据结构在飞地内初始化。
  • sgx_thread_mutex_lock() 并解锁可能执行 OCALLS。但是,由于互斥锁数据位于飞地内,因此它们始终可以在安全飞地内强制锁定的正确性。

查看互斥函数的描述,我的猜测是 OCALL 用于实现 enclave 外的非忙等待。这确实由 OS 处理,并且容易受到攻击。 OS 可以选择不唤醒在 enclave 外等待的线程。但它也可以选择中断 enclave 内的线程 运行ning。 SGX 无法抵御来自(可能受到威胁的)OS.

的 DoS 攻击(拒绝服务)

总而言之,可以在 enclave 内安全地实现自旋锁(以及任何更高级别的同步)。但是,SGX 不能防止 DoS 攻击,因此您不能假设线程会 运行。这也适用于锁定原语:当互斥量被释放时,等待互斥量的线程可能不会被唤醒。意识到这种固有的局限性,SDK 设计者选择使用(不受信任的)OCALL 来有效地实现一些同步原语(即非忙等待)。

[1] SGX SDK Guide

[2] SGX Explained

qweruiop,关于你在评论中的问题(我的回答太长了无法评论):

我仍将其视为 DoS 攻击:管理 enclave 资源的 OS 拒绝 T 访问资源 CPU 处理时间. 但我同意,你必须在意识到 T 可能永远不会 运行 的情况下设计该飞地中的其他线程 运行ning。语义不同于您控制的平台上的 运行ning 线程。如果您想绝对确定检查了条件变量,则必须在您控制的平台上进行检查。

sgx_status_t return 由每个代理函数编辑(例如,当将 ECALL 变成飞地时)可以 return SGX_ERROR_OUT_OF_TCS。因此,SDK 应该为您处理所有线程——只需从飞地外的两个不同 ("untrusted") 线程 A 和 B 进行 ECALL,并且执行流程应该在飞地内的两个 ("trusted") 线程中继续,每个都绑定到一个单独的 TCS(假设有 2 个未使用的 TCS 可用)。