【问题标题】:What does it implies to disable syscall in Intel SGX在英特尔 SGX 中禁用系统调用意味着什么
【发布时间】:2015-03-22 18:40:12
【问题描述】:

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

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

【问题讨论】:

    标签: kernel intel system-calls


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢您的回答!是的,你说的很有道理,应该禁止系统调用。但我有一些后续问题。 1)在您指出的论文中,经常提到我们在飞地和远程服务器之间有一个可信通道。但是如果socket 的东西是不允许的,那么飞地如何与远程服务器通信? 2)飞地如何与本地飞地通信?手册上说需要将REPORT传递给另一个才能证明,但是没有系统的帮助如何做到这一点?
    • 或者一般来说,如何在没有系统帮助的情况下飞地IPC?提前致谢。
    • 现在我好像很清楚了。所谓的trusted path 是建立在OS 提供的untrusted path 之上(应用程序之间的传统IPC) ,具有加密保护(密钥仅对飞地已知)。
    【解决方案2】:

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

    【讨论】:

    • 我仍然不明白 enclave1 如何将报告传输到 enclave2。该报告位于 enclave1 中。从那里您可以使用 EEXIT 并将指针返回到不受信任空间中的应用程序。指针无法访问,因为它指向 Enclave。直接从 enclave1 发送到 enclave2 也是不可能的。你能详细解释一下那部分吗?
    • 驻留在 enclave1 中的报告首先由 enclave 本身复制到 enclave1s 进程的不受信任的内存中。请记住,飞地可以访问所有被映射的进程内存。这没关系,因为报告没有任何秘密。然后,不受信任的代码可以使用所有操作系统提供的 ipc 将报告传输到 enclave2s 进程,该进程也是不受信任的内存。然后进程 2 中不受信任的代码可以调用 enclave 2,然后可以将报告从 enclave2 进程的不受信任内存复制到 enclave 2s 内存中。
    猜你喜欢
    • 2018-11-28
    • 2018-10-10
    • 1970-01-01
    • 2018-07-05
    • 2018-09-17
    • 2018-01-02
    • 2021-12-11
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多