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

Kernel 在“英特尔SGX”中禁用系统调用意味着什么,kernel,intel,system-calls,Kernel,Intel,System Calls,最近,我正在研究使用英特尔软件保护扩展(SGX)设备进行编程。SGX的想法是创建一个enclave,在其中加载和执行安全敏感代码。最重要的是,对该飞地的内存访问(以及许多其他限制)是由硬件强制执行的 在its中,我发现syscall指令在enclave中是非法的(见表3-1),以及许多其他指令可能会改变特权级别。我不知道这意味着什么。由于像open,socket这样的内核服务最终会引发系统调用,这是否意味着禁止syscall指令实际上禁止任何内核服务(如文件和套接字)中的enclave内的代码?

最近,我正在研究使用
英特尔软件保护扩展(SGX)
设备进行编程。SGX的想法是创建一个enclave,在其中加载和执行安全敏感代码。最重要的是,对该飞地的内存访问(以及许多其他限制)是由硬件强制执行的


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

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

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

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


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

非常感谢您的回答!是的,你说的很有道理,应该禁止系统调用。但我有一些后续问题。1) 在你提到的论文中,经常提到我们在enclave和远程服务器之间有一个可信的通道。但是如果不允许使用
socket
东西,enclave如何与远程服务器通信?2) 飞地如何与当地飞地沟通?手册中说,一个人需要向另一个人传递
报告
,以便证明,但是没有系统的帮助,这是如何做到的?或者一般来说,没有系统的帮助,飞地是如何做到的?先谢谢你,我现在看清楚了。。所谓的可信路径是建立在操作系统(应用程序之间的传统IPC)提供的不可信路径之上的,具有加密保护(密钥只有enclaves知道)。我仍然不知道enclave1如何将报告传输到enclave2。报告位于enclave1中。从那里,您可以使用EEXIT并在不受信任的空间中返回指向应用程序的指针。无法访问指针,因为它指向Enclave。从enclave1直接发送到enclave2也是不可能的。您能详细解释一下这一部分吗?enclave1中的报告首先由enclave1本身复制到enclave1进程的不受信任内存中。请记住,enclave可以访问映射的所有进程和内存。这没关系,因为报告没有任何秘密。然后,不受信任的代码可以使用所有操作系统提供的ipc将报告传输到enclave2s进程,该进程也是不受信任的内存。然后进程2中不受信任的代码可以调用enclave2,enclave2可以将报告从enclave2进程的不受信任内存复制到enclave2内存中。