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