gpt4 book ai didi

英特尔 SGX 线程与 TCS

转载 作者:行者123 更新时间:2023-12-04 14:56:41 26 4
gpt4 key购买 nike

我试图了解 TCS 启用的 SGX 线程与 SDK 提供的不受信任线程之间的区别.

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

然后,另一方面,SGX SDK 提供了一组 线程同步原语 ,主要是互斥量和条件变量。这些原语不受信任,因为它们最终由操作系统提供服务。

我的问题是,这些是 线程同步原语 打算由 TCS 线程使用?如果是这样,这不会降低安全性吗?操作系统可以按照自己的意愿进行调度。

最佳答案

第一 ,让我们来处理你有些不清楚的术语

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



在飞地内,只有“受信任的”线程可以执行。飞地内没有“不受信任的”线程。可能是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 页面,线程的完整性(TCS 定义了允许的入口点)可以通过 enclave 证明进行验证。因此,只有已知良好的执行路径才能在飞地内执行。

第二 ,让我们看看同步原语。

SDK 确实提供了同步原语,您说这些原语不可信,因为它们最终由操作系统提供服务。让我们看看 [1] 中对这些原语的描述:
  • sgx_spin_lock() 和解锁仅在飞地内操作(使用原子操作),无需操作系统交互(无 OCALL)。使用自旋锁,您可以自己实现更高级别的原语。
  • sgx_thread_mutex_init() 也不做 OCALL。互斥体数据结构在飞地内初始化。
  • sgx_thread_mutex_lock() 并解锁可能执行 OCALLS。然而,由于互斥锁数据在飞地内,它们总是可以在安全飞地内强制执行锁定的正确性。

  • 查看互斥函数的描述,我的猜测是 OCALL 用于实现 enclave 外的非忙等待。这确实由操作系统处理,并且容易受到攻击。操作系统可以选择不唤醒在飞地外等待的线程。但它也可以选择中断在飞地内运行的线程。 SGX 无法抵御 DoS 攻击 (拒绝服务)来自(可能受到损害的)操作系统。

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

    [1] SGX SDK Guide

    [2] SGX Explained

    关于英特尔 SGX 线程与 TCS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36213547/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com