8个发布版本
0.6.3 | 2022年8月8日 |
---|---|
0.6.2 | 2022年7月28日 |
0.5.1 | 2022年5月24日 |
0.4.0 | 2022年4月12日 |
#6 in #enarx
每月下载量 34次
210KB
4.5K SLoC
安全加密虚拟化 (SEV) - SNP
- SEV - 安全加密虚拟化
- SEV-ES - 安全加密虚拟化 - 加密状态
- SEV-SNP - 安全加密虚拟化 - 安全嵌套分页
- PSP - 平台安全处理器
启动
- 创建一个普通虚拟机,预留内存
- 使用 /dev/sev 的特殊 ioctls 与 PSP 固件通信
- 使用 shim 和可执行文件 (exec-wasmtime) elf 部分填充内存
- 将内存标记为加密
- 在 elf 部分标记了 2 个特殊页面
- CPUID
- 秘密
- 创建 CPU
- 使用 IP == 重置向量启动 CPU
- 16 位模式
- 带段的 GDT 的 32 位模式
- 初始页表的 64 位模式
- 最终页表的 64 位模式
- 跳转到 rust 🎉
CPUID 页面
- 包含所有
cpuid
请求返回值 - 由固件预先验证
- 例如 xsave 区域的大小
- 例如 C 位的位置
秘密页面
- 与 PSP SNP 固件通信的私钥
- OS 自由使用
- 消息编号
- AP 跳转表
内存布局
地址 | 用途 | 大小 |
---|---|---|
Sallyport | ||
GHCB | 页面 | |
秘密 | 页面 | |
CPUID | 页面 | |
PML3 | 页面 | |
PML4 | 页面 | |
0xFFFFF000 | ResetVector | 页面 |
Shim | ||
可执行文件 |
Shim 将所有内存映射到以 0xFFFF_FF80_0000_0000
开始的内核地址空间。
每个加密页面都必须在页表中设置加密位(C 位)。
Shim 在运行时从主机接受的新的内存必须通过 pvalidate
操作码标记为加密或未加密(共享)。
系统调用
sequenceDiagram
participant H as Host Enarx Backend
participant S as Guest Shim
participant E as Executable (wasmldr)
E->>S: Syscall
S->>+H: Sallyport Syscall
Note left of H: Real syscall
H->>-S: Sallyport Syscall
S->>E: Syscall return
虚拟机管理程序通信异常 (#VC
)
通常,KVM 虚拟机可以在许多情况下被主机拦截,例如写入寄存器、MSRs、发出 cpuid
等(linux/arch/x86/kvm/svm/svm.c#L991)。
在使用SEV-ES和SEV-SNP时,当发生#VMEXIT时,寄存器内容会以加密形式保存在VMCB中。此外,对于某些类型的#VMEXIT
,虚拟机内部会抛出一个新的异常,称为VMM通信异常(#VC
)。
虚拟机的#VC
处理程序负责确定需要向虚拟机管理程序暴露哪些寄存器状态以模拟此操作。此外,#VC
处理程序还会检查虚拟机管理程序返回的值,并在输出被认为可接受时更新虚拟机状态。
目前,模拟层仅处理cpuid
指令在#VC
中的处理,但未来可能拦截其他#VMEXIT
。
对于cpuid
指令,模拟层使用启动时获取的CPUID页面作为查找表以返回验证后的结果。
与SNP固件的通信
通过GHCB MSR执行简单的命令,例如宣布GHCB页面或将单个页面转换为共享页面。
更高级的通信通过GHCB进行。
使用256位密钥和96位nonce的AES-GCM作为与固件通信的加密算法。
sequenceDiagram
participant K as Guest Shim
participant H as Host Linux Kernel
participant F as PSP Firmware
note right of K: Guest Launch
F-->>K: Secrets Page with Keys
Note over K,F: GHCB message to PSP
activate K
Note left of K: Encrypt Request
deactivate K
K->>H: Request over GHCB
H->>+F: Request over /dev/sev
Note right of F: Decrypt Request
Note right of F: Process
Note right of F: Encrypt Response
F->>-H: Response over /dev/sev
H->>K: Response over GHCB
activate K
Note left of K: Decrypt Response
deactivate K
认证报告
可以通过GHCB扩展请求请求认证报告。扩展请求引用额外的共享(未加密)内存进行数据交换。与固件的通信仅交换加密和签名数据,因此即使有额外的未加密内存,主机内核也无法进行中间人攻击。可以将64字节的用户数据添加到报告中。
可以使用从https://kdsintf.amd.com/vcek/v1/Milan/cert_chain提供的证书链验证签名的报告,该证书链用于根密钥以及从具有一些平台参数构造的URL的平台密钥。
您可以在SEV-SNP机器上调用enarx sev vcek
,这将执行所有魔术并以可消费的格式返回整个链。因为密钥服务器有速率限制,所以您只需要在启动时执行一次,并使用缓存的 结果。
依赖关系
~7MB
~138K SLoC