增强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入门