在英特尔 SGX 中禁用系统调用意味着什么

What does it implies to disable syscall in Intel SGX

我最近正在研究使用 Intel Software Guard Extensions (SGX) 工具进行编程。 SGX 的想法是创建一个飞地,在其中加载和执行安全敏感代码。最重要的是,对该飞地的内存访问(以及许多其他限制)是由硬件强制执行的。

在其 manual 中,我发现 syscall 指令在飞地内是非法的(请参阅 Table 3-1),以及许多其他指令可能会更改特权级别。我想知道这意味着什么。由于像 opensocket 这样的内核服务最终引发系统调用,这是否意味着禁止 syscall 指令实际上禁止飞地内的代码使用任何内核服务,例如文件和套接字?这对我来说听起来很不可信,因为这样一来,飞地可以做的事情就会受到严重限制。所以我认为要么我误解了,要么有一些解决方法。

当您说您不能使用内核服务或任何系统调用时,您是对的,因为飞地内禁止使用 Syscall 指令。 OS 不是新交所可信计算库 (TCB) 的一部分。 让我们假设系统调用在 enclave 内部启用,并且您在汇编中编写指令以执行系统调用指令(假设使用开放系统调用的参数 sys_open)。当您执行系统调用时,您会跳转到内核在引导期间设置的预定义位置以开始执行内核代码。这意味着您正在从您编写的代码(受信任的)跳到不是您编写的代码(OS,这是不受信任的并且不是您的 TCB 的一部分)。如果您能够这样做,它将破坏 SGX 提供的安全保证。由于 kernel/OS/any 其他不是您编写的软件不受信任,您可能拥有一个恶意内核,其开放系统调用读取您的 enclave 内的数据并窃取您的秘密。

正如您所说,这是严重的限制,因为您无法直接从 enclave 代码内部使用套接字或任何东西。但是如果你想在 enclave 内使用这些服务,你必须信任不是你编写的代码,这会破坏 SGX 的安全模型。

我认为 SGX 并不像您想象的那样用于用途。以下是英特尔展示的一些预期用例,应该解释如何在不使用系统调用的情况下实现这些应用程序。

https://software.intel.com/en-us/articles/using-innovative-instructions-to-create-trustworthy-software-solutions

没错。请参阅英特尔在 SGX 上发布的三篇论文之一中的本地证明。飞地想要证明它 运行 在英特尔 CPU 上的飞地内,在飞地内创建报告 (EREPORT)。该报告中没有任何秘密,但它是 MAC' 使用报告密钥,该报告密钥可在 enclave 内访问和生成。报告通过不受信任的通道(即 OS 提供的 IPC)发送到另一个 enclave,然后在另一个 enclave 内部验证报告,该报告可以访问 enclave 内部的相同报告密钥(共享密钥)并且可以使用 MAC 和报告密钥(飞地之间的共享秘密)来验证结构完整性。如果报告中的所有信息都匹配,则两个 enclave 可以相信它们 运行 在同一 SGX 平台上。然后他们可以执行密钥交换,如 DH 密钥交换或任何其他方式来建立安全通道,并且他们可以安全地相互通信。