有没有办法将现有应用程序Intel SGX
直接加载到 enclave 中?
3 回答
Intel SGX
旨在保护数据而不是加载整个应用程序。SGX
您可以通过将临时缓冲区从用户空间程序 ( app.cpp
) 发送到SGX
enclave ( ) 在 enclave内对数据执行安全计算Enclave.cpp
。但为什么?
- 飞地大小很小,您不能同时在其中加载所有数据。
- 在 enclave 内部,您仅限于一组编程原语,如 if-then-else、for-loop 等。此外,您不能使用系统调用
open
来打开文件。
因此,如果您的应用程序很大或包含一些系统调用,甚至是一些禁止的标准 C 库函数SGX
,则不可能将其完全导入到 enclave 中。但是,如果您的应用程序正在执行一些原始操作而不需要任何特殊的系统调用或函数调用,您可以将其自由地移植到 enclave 内。不过,您不能直接将其加载到 enclave 中,您必须更改您的实现以使其成为Enclave.cpp
.
例如,我在一个 enclave 内实现了一组加密操作,例如 SHA-2、HMAC SHA-2、AES 等。我向/从 enclave 发送/接收 pliantext/ciphertext 数据的临时缓冲区,执行 enclave 内的加密/解密操作,并将计算结果(如哈希摘要或用户空间中的密文)存储。通过这种方式,我确保没有人可以篡改操作结果,因为它们运行在由 CPU 指令保护的 enclave 内。
正如之前的答案所指出的,英特尔 SGX 默认设计通常不允许运行未经修改的应用程序,因为后者包含(很可能)英特尔 SGX SDK 提供的受信任的 libc 不支持(所有系统调用)的例程。Scone、Graphene SGX、Haven或SGX-LKL等工具允许在英特尔 SGX 飞地中运行未经修改的应用程序。
大多数上述工具在 enclave 内运行 mini-OS 来处理(通过仿真)不受支持的系统调用。这会导致较大的 enclave 大小,这对于需要大量内存资源的应用程序是非常不利的;enclave 内存限制为 128MB(或在最近的 SGX 版本中为 256MB)。
您选择使用的解决方案很大程度上取决于您尝试运行的应用程序。如果后者不是那么大,您可以尝试将其移植到英特尔 SGX。移植涉及将您的应用程序分成受信任和不受信任的部分。只有受信任的部分将在 enclave 中运行,并且可以与 enclave 运行时之外的不受信任的部分(助手)安全地通信。在移植期间,您可能仍然拥有受信任的代码,这些代码依赖于不受支持的例程,例如系统调用。您可以通过在 enclave 中实现/扩展您自己的受信任的 libc(只是您需要的系统调用)来解决这个问题,它将系统调用重新定义为 ocall 的包装器,然后从 enclave 中调用真正的例程(安全地);这里的好例子. 然而,这种方法并不适合新手。这样,您将最大化 enclave 内存并防止膨胀,它将成为一个成熟的库操作系统。
另一方面,如果您正在处理一个非常复杂且无法移植的应用程序,那么我会建议您使用 Graphene-SGX 之类的解决方案,该解决方案是开源且有据可查的。