增强SGX飞地的可信度 - 使用Nix实现可复现构建

本文探讨了如何利用Nix包管理器为SGX飞地创建可复现的构建环境,解决隐私导向部署中的信任问题。通过分析Signal和MobileCoin案例,作者展示了Nix如何比传统方法更有效地确保从源代码到产物的可信验证。

增强SGX飞地的可信度

在隐私导向部署中为SGX飞地创建可复现构建是一项缺乏便捷稳健解决方案的难题。我们描述了如何使用Nix实现可复现且透明的飞地构建,使任何人都能审计飞地是否运行其声明的源代码,从而提升SGX系统的安全性。

背景

Intel SGX是2015年推出的机密计算实现,属于可信执行环境(TEE),允许用户在不受信任方维护的远程计算机上运行机密计算。用户信任硬件制造商(此处为Intel)能保护执行环境免受篡改,即使面对最高权限代码(如内核恶意软件)。SGX代码和数据驻留在称为飞地的特殊加密认证内存区域中。

飞地如何证明身份?

除TEE保护外,SGX还能远程证明飞地身份,包括其代码哈希、签名和运行时配置。此功能称为远程认证(remote attestation)。飞地加载时,CPU会将其初始状态(含代码)哈希为测量值(MRENCLAVE)。该哈希值仅随飞地代码变化而改变。

安全通信信道

SGX能证明飞地身份及其生成的报告数据,但建立可信安全通信信道取决于飞地和验证方。SGX本身不强制规定具体协议,只要信道加密、认证并终止于飞体内部即可。

为何可复现构建困难?

我们关注的是比特级可复现性。SGX飞地使用SDK构建为.dll或.so文件,必须用作者RSA密钥签名。由于计算产物哈希,即使一位差异也会产生不同哈希值。

Nix的优越性

Nix是跨平台源码包管理器,具有以下优势:

  • 通过/nix/store目录和符号链接管理包
  • 每个包前缀哈希捕获所有构建输入
  • 强制声明所有构建依赖
  • 固定网络获取的输入
  • 包含常见软件的复现性修复补丁

Intel使用Nix的问题

虽然Intel准备了基于Nix的可复现构建,但存在以下问题:

  • 未固定Docker镜像或SDK源码哈希
  • 架构飞地构建下载预编译SDK安装程序且不校验哈希
  • Nix部分构建不正确,手工选择预构建缓存依赖

将SGX SDK引入Nixpkgs

作者参与将SGX SDK移植到Nixpkgs的工作,现在任何SGX飞地都可使用sgx-sdk包轻松构建。还创建了reproducible-sgx仓库展示如何使用Nix构建Intel示例飞地。

资源

  • Intel SGX开发者指南
  • Intel SGX详解
  • SGX 101入门
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计