Intel SGX 通过基于硬件的内存加密,保护隔离的应用程序逻辑和飞地内的敏感数据。要使用这种基于硬件的安全机制,需要对内存使用采用严格的编程模型,并使用穿越飞地边界的复杂 API。飞地开发人员必须小心谨慎地编程以确保飞地安全,尤其是在处理跨越飞地可信边界的数据时。可信边界违规可能进一步导致内存损坏,并可能被攻击者利用以检索和操纵受保护的数据。目前,没有公开可用的工具能够有效检测真实飞地中的此类问题。
SGXRay 是一个基于 SMACK 验证器的自动化推理工具,能够自动检测源于可信边界违规的 SGX 飞地错误。它重新编译给定的飞地代码,并从用户指定的飞地函数入口开始分析。分析完成后,它要么发现 SGX 软件栈中的无效指针处理(例如在飞地内解引用未检查的指针、无效内存释放和 TOCTOU 错误),要么证明在用户指定的循环和递归边界内不存在此类错误。
目前,SGXRay 支持基于两个 SGX SDK 构建的 SGX 应用程序:Intel SGX SDK 和 openenclave SDK。用户可以选择包含 SDK 代码以进行更彻底的分析。
如需快速入门,请按照逐步教程使用 SGXRay 运行其中一个演示示例,详见此处。
下图展示了 SGXRay 的工作流程。
运行 SGXRay 分为两步。第一步是获取应用程序的 LLVM IR 文件。第二步是调用 SGXRay CLI 进行验证。
对于第一步,我们分别为每个 SDK 提供了两个 Docker 镜像。
docker pull baiduxlab/sgx-ray-frontend-intel
docker pull baiduxlab/sgx-ray-frontend-oe
运行第一步的详细说明见此处。
对于第二步,我们也提供了一个 Docker 镜像。
docker pull baiduxlab/sgx-ray-distro:latest
运行第二步的详细说明见此处。
我们提供了一个 Dockerfile 来构建用于验证步骤的镜像。
git clone https://github.com/baiduxlab/sgxray.git && cd sgxray
docker build . -t sgx-ray-distro-local --build-arg hostuid=$UID -f Dockerfiles/Dockerfile-CLI
构建成功后,应生成一个名为 sgx-ray-distro-local 的镜像,其中包含一个用户 ID 与主机账户相同的 user 用户。
SGXRay 的详细文档如下所示。