NVIDIA Confidential Computing
Resources for NVIDIA Confidential Computing
一些会议视频介绍:
- Confidential Computing: New Features and NVIDIA Hardware Attestation | GTC 24 2024 | NVIDIA On-Demand
- Decentralized Collaborative AI With Federated Learning in Trustworthy Environments | GTC 24 2024 | NVIDIA On-Demand
其他视频:利用机密计算确保 AI 安全性 | NVIDIA,在这里查看资源 ->
加深理解 ->
视频。
为什么 GPU 机密计算一定要依赖 CPU TEE 实现?
我们可以只加密显存内容,不加密虚拟机的内存,然后 GPU 之间通过 NVLink 传输吗?
无论如何 GPU 都是需要和 CPU 做 DMA 通信的,如果 CPU 内存做不到加密,那么 GPU 显存的保护就没有意义。
即使做到了,很多 CUDA 的 API 可能因此需要修改,工作量也会比较大吧。
NVIDIA Confidential Computing / GPU TEE
为了保护视频的版权,保证播放过程中的视频数据安全,英伟达在显卡中应用了 VPR(VIdeo Protected Region)技术,该技术通过独特的硬件和固件保护 GPU 内存区域。当 GPU 内存被 VPR 保护时,有且仅有一个安全显示引擎可以从该区域读取数据并写入 HDMI 或 DP 通道,其他任何引擎在尝试读出数据时都会出错。
受 VPR 启发,英伟达在 Ampere 架构 GPU 中实现了机密计算的部分基础能力。Ampere 架构的固件允许在 GPU 内存里创建一个保护计算的飞地,保证仅有 SEC2 安全微控制器可以从飞地读取数据,并且加密后写入外部。这项能力被称作 APM (Ampere Protected Memory)。机密计算要求同时保护数据和代码的机密性和完整性,APM 仅提供了数据的机密性,无法提供代码的机密性,也不能保护数据和代码的完整性。
GPU TEE 是从 Hopper 架构才开始支持的:
NVIDIA was the first GPU to deliver Confidential Computing on the NVIDIA Hopper™ architecture with the unprecedented acceleration of NVIDIA Tensor Core GPUs. NVIDIA Blackwell architecture has taken Confidential Computing to the next level with nearly identical performance compared to unencrypted modes for large language models (LLMs)
引用自 Confidential Computing | NVIDIA
普通情况下,GPU 显存,虚拟机 guest 可以读,VMM / Host 也可以读,都是明文。
GPU TEE 之后,VMM / Host 无法读取里面内容。这种保护是通过对显存进行访问控制来实现的(显存并未加密)。NVIDIA 驱动运行在 TDX 中。
开启后,GPU 显存分成两部分:
- Compute Protected Region(CPR)
- GPU Unprotected Memory
# CC Mode: Off
nvidia-smi conf-compute -mgm
# Protected PCIe
nvidia-smi conf-compute -grs
nvidia-smi conf-compute -f
CC mode and Protected PCIe (PPCIe) mode
PPCIe 的 announce 博客:[Announcing NVIDIA Secure AI General Availability | NVIDIA Technical Blog](https://developer.nvidia.com/blog/announcing-nvidia-secure-ai-general-availability/) |
只有买了 HGX 8 卡平台才支持 PPCIe mode:
- [[cc-deployment-guide-tdx.pdf]] 上可以看到对于 HGX FW Bundle 有要求。
- Confidential Computing: New Features and NVIDIA Hardware Attestation | GTC 24 2024 | NVIDIA On-Demand 这个 talk 对于 multi-GPU 的部分也是通过 HGX 来举例的。同时里面有一页写道 HGX 8GPU System Only。
PPCIe 相当于是把整个包含 8 个 GPU 和 4 个 Switch 的 HGX 机尾整体当作了一个可信环境(switch 自己也会被 evaluated)。
不管是 CC mode 还是 PPCIe mode,CPU 到 GPU 之间的传输都是加密的。
Protected PCIe 是一个单机多卡的机密计算模式。In this mode, GPU-GPU communications over the NVLink/NVSwitch are not encrypted。PPCIe was designed with an explicit tradeoff between performance and security.
-
Normal Operation 普通模式:
--set-cc-mode=off
和--set-ppcie-mode=off
的情况下,就是普通模式。 -
CC Mode:
--set-cc-mode=on
和--set-ppcie-mode=off
。也就是单卡模式。这种模式下,CPU 和 GPU 之间通信是加密的。GPU 和其他也同时打开了 CC Mode 的 GPU:- 通过 PCIe P2P 来通信,可以通信,但是是 plain text。
- 通过 NVLink/NVSwitch 来通信,可以通信,但是是 plain text。
-
Protected PCIe Mode:
--set-cc-mode=off
和--set-ppcie-mode=on
,仅仅 GPU 显存里的数据是被保护的,CPU 到 GPU 的通信也是加密的。GPU 之间走 PCIe DMA P2P 之间是加密的(正如名字)?NVLink/NVSwitch 不加密。- 通过 PCIe P2P 来通信,加密吗?应该完全就没有办法通过 PCIe P2P 来通信,因为 GPU 上压根没有这个接口。那么 CPU 到 GPU 之间的通信应该还是 PCIe 的,是怎么实现的呢?
- 通过 NVLink/NVSwitch 来通信,是不加密的,这是出于性能考虑的折衷设计。
也就是说,CC 和 PPCIe 是互斥的,没有办法同时打开的。打开了 PPCIe 之后,我们能看到输出是下面这样(CC mode 是 off 的):
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -q
==============NVSMI CONF-COMPUTE LOG==============
CC State : OFF
Multi-GPU Mode : Protected PCIe
CPU CC Capabilities : INTEL TDX
GPU CC Capabilities : CC Capable
CC GPUs Ready State : Not Ready
同理,关闭 PPCIe,打开 CC 的显示输出就不赘述了。
GPU TEE 和 TDXIO / TDX Connect 之间的关系
GPU TEE 保护显存数据,TDX Connect 把设备纳入 TCB,能让设备做 DMA,不再需要 bounce buffer,是正交的关系。
- Legacy VM & Legacy GPU:也就是最传统的情况,直接通信。
- 功能上:无 GPU 机密计算;
- 性能上:无拷贝无软件加解密。
- CVM (TDX 1.x) & Legacy GPU:设备无法被纳入 CVM TCB,通过 bounce buffer 通信。
- 功能上:无 GPU 机密计算;
- 性能上:有拷贝无软件加解密,bounce buffer 数据是明文。
- CVM (TDX 2.x) & Legacy GPU:设备无法被纳入 CVM TCB,通过 bounce buffer 通信。
- 功能上:无 GPU 机密计算;
- 性能上:有拷贝无软件加解密,bounce buffer 数据是明文。
- Legacy VM & Hopper:也就是最传统的情况,直接通信。
- 功能上:无 GPU 机密计算;
- 性能上:无拷贝无软件加解密。
- CVM (TDX 1.x) & Hopper:设备无法被纳入 CVM TCB,通过 bounce buffer 通信(两端都不支持 TDISP)。
- 功能上:有 GPU 机密计算;
- 性能上:有拷贝有 CPU 端软件加解密(GPU 端是硬件的加解密)。
- CVM (TDX 2.x) & Hopper:设备无法被纳入 CVM TCB,通过 bounce buffer 通信(Device 不支持 TDISP)。
- 功能上:有 GPU 机密计算;
- 性能上:有拷贝有 CPU 端软件加解密(GPU 端是硬件的加解密)。
- Legacy VM & Blackwell:也就是最传统的情况,直接通信。
- 功能上:无 GPU 机密计算;
- 性能上:无拷贝无软件加解密。
- CVM (TDX 1.x) & Blackwell:设备无法被纳入 CVM TCB,通过 bounce buffer 通信(Host 不支持 TDISP)。
- 功能上:有 GPU 机密计算;
- 性能上:有拷贝有 CPU 端的软件加解密(GPU 端是硬件的加解密)。
- CVM (TDX 2.x) & Blackwell:设备可以被纳入 CVM TCB。
- 功能上:有 GPU 机密计算;
- 性能上:无拷贝无软件加解密。
其实不管是 TDX 2.x 还是 Blackwell CC,他们之所以相比于上一代在机密计算设备直通上有进步,是因为它们都满足了 TDISP 协议,一个协议需要双方都遵守,Host 上需要满足 TDISP 协议,Device 也需要满足 TDISP 协议。
TDX 2.x 相比于 TDX 1.x 增加了什么功能?
同样都是 Hopper 的 GPU,TDX 2.x 和 1.x 没有任何区别,还是得用 bounce buffer,那么 TDX Connect 到底增加了什么内容?
CPUs that support TDISP provide hardware encryption for PCIe communication, removing the need for software encryption
TDX Connect 扩展了 TCB。
Blackwell CC 相比于 Hopper CC 增加了什么功能?
同样都是 TDX 1.x,Blackwell CC 和 Hopper CC 一样,还得用 bounce buffer,那么 Blackwell 到底增加了什么内容?
Hopper 不支持 TDISP 协议,机密计算是通过 ad-hoc 的方式设计的(驱动加密设备解密),但是 Blackwell 支持 TDISP 协议,更加规范,也更加能和 TDX 2.x 配合。
NVIDIA HCC
应该指的就是 Hopper CC。
Hopper 机密计算
两种方式共同作用保护机密性和完整性:
- CPR 内存保护区域:防止 host 直接攻击 GPU 显存,窥探显存信息;
- DMA Engine 加解密:防止传输过程中在 PCIe 链路上的攻击。
CPR 不仅仅防止 Host 和 Hypervisor 访问,即使是 CVM 里面的 code 也没有办法直接访问。CVM 需要借助 driver 先 DMA 到 GPU 里的共享显存区域,然后由 GPU 做解密之后再放到 CPR 当中。
Host & Hypervisor 能不能通过同样的动作 DMA 到 shared 区域,然后让 GPU 硬件做解密,虽然解密出来的内容是 non-sense,但是也可能对 GPU 造成攻击。答案是:数据是 encrypted 跟 authenticated 的,authentication 不通过我理解是不会拷贝到 CPR 的。
Hopper 机密计算必须要基于 CPU 端的基于虚拟机的机密计算解决方案,如果 CPU 端不支持 VM-based 机密计算,那么 Hopper 的机密计算也就没有办法使能。
Hopper 也是基于 SPDM 协议吗来沟通的。
不同类型 GPU(on, off)是可以共存的:
![[Hopper CC.pdf#page=9&rect=436,88,984,407&color=annotate | Hopper CC, p.9]] |
CPU - GPU 侧通信是加密的,但是仅仅 GPU 这一端是基于硬件(GPU DMA Engine)做的加解密,CPU 那一端还是基于软件(NVIDIA Driver in Guest)做的加解密。 GPU Driver 和 GPU DMA Engine 也是基于 SPDM 做密钥协商的。
在机密计算模式下,必须要使用 NVLink,PCIe P2P 是不被允许的。NVLink 是有加密的:
- DMA Engine in the source GPU encrypts data, transfers over untrusted NVLINK to unprotected memory of the destination GPU.
- DMA Engine in the destination GPU decrypts data into protected GPU memory.
支持 GDR 吗?
也就是说 PCIe 传输和 NVLink 的 DMA 传输都是加密的,防止基于 PCIe 和 NVLink 的物理攻击。目前除了 CPU 端以外,加解密都是硬件(e.g., DMA Engine)直接实现。
注意 GPU - GPU 通过 NVLink 传输也是基于 bounce buffer 的(GPU 2 上),如下图所示:
![[Hopper CC.pdf#page=18&rect=565,75,979,462&color=annotate | Hopper CC, p.18]] |
With CC=On
, all GPU performance counters are disabled, to protect against side channel attacks. 也就是说没有办法做性能统计了。
Note: 但是在这个视频 Confidential Computing: New Features and NVIDIA Hardware Attestation | GTC 24 2024 | NVIDIA On-Demand 的 8 分 29 秒里说,GPU ↔ GPU transfers are in plaintext, Non-Encrypted NVLINK data。Anyway,还是以加密的为准。
机密计算同时支持 MIG GPU 虚拟化:
![[Hopper CC.pdf#page=19&rect=502,120,963,472&color=annotate | Hopper CC, p.19]] |
Blackwell 机密计算
引入了 NVLink encryption,也就是 GPU-GPU 之间的通信也是加密的了。
也是支持 Bounce buffer mode 的,如果 host 上的芯片不支持 TDX Connect 技术的话。
如果支持 TDX Connect,那么就不再需要 bounce buffer 了。
多卡下是通过 HGX Protected PCIe 来实现的。
NVIDIA GPU Attestation
NVIDIA 的 GPU Attestation 架构设计其实也是 follow 了 IETF 的 RATS 规范。
GPU 机密计算和 CPU 一样,也分为静态数据(boot 时的数据)和动态数据(boot 后的数据)。用户可以在任何时候请求一个 attestation report。
Attestation 流程:
- 通过 GPU driver,拿到 GPU 设备的数字证书;
- 通过 OSCP 服务,验证证书链,从而能够证明这个证书里的内容(公钥)是可信的;
- 从 GPU 拿到 attestation report,并用证书来验证可信度,表示内容是可信的;
- 通过将 report 和基线 RIM 对比,来确定通过还是不通过。
GPU attestation 都 measure 哪些组件?
![[Hopper CC.pdf#page=17&rect=2,56,1007,608&color=annotate | Hopper CC, p.17]] |
OCSP (Online Certificate Status Protocol) Service
这是一个公开的网络协议标准,并不是 NVIDIA 自己发明的,也不是专门为远程证明设计的协议(就像 CRL 一样)。是在 HTTP 之上封装的一个更高层的应用层协议。
Used for obtaining the revocation status of an X.509 digital certificate.
是 CRL (Certificate Revocation Lists)^ 的升级版。相比于 CRL 的优势:
- 传输数据量更少,对网络带宽要求更小;
- 数据量少所以处理需要的算力也更少;
- OSCP 并不强制加密。
NVIDIA RIM (Reference Integrity Manifest) Service
RIM 并不是 NVIDIA 发明的特有概念,而是一个通用的概念,是 Trusted Computing Group RIM specification 发布的。
简而言之就是参考答案,标准答案。
RIM Provider Service 持有英伟达所有显卡驱动和 VBIOS 发布版本所对应的 RIM 文件。
NVIDIA GPU CC How-To
NVIDIA Trusted Computing Solutions - NVIDIA Docs
怎么打开 NVIDIA GPU 的机密计算模式?/ nvtrust
首先 CC Mode 的打开和关闭是在 host 上控制的。可以 clone 下 nvtrust 这个 repo,里面有脚本可以设置。
参考这里的文档:
- NVIDIA Trusted Computing Solutions - NVIDIA Docs
- [[cc-deployment-guide-tdx.pdf]]
![[cc-deployment-guide-tdx.pdf#page=15&rect=69,130,539,635&color=annotate | cc-deployment-guide-tdx, p.15]] |
NVIDIA Persistence Mode
nvidia-smi conf-compute
这个命令应该是在 guest 中执行而不是 host 中执行。
root@iv-ydw8g79m9sv1ew99um4h:~# nvidia-smi conf-compute -h
conf-compute -- Display Confidential Compute information.
Usage: nvidia-smi conf-compute [options]
Options include:
[-h | --help]: Display help information
[-i | --id]: Enumeration index, PCI bus ID or UUID.
Provide comma separated values for more than one device.
[-gc | --get-cpu-caps]: Display Confidential Compute CPU Capability
[-gg | --get-gpus-caps]: Display Confidential Compute GPUs Capability
[-d | --get-devtools-mode]: Display Confidential Compute DevTools Mode
[-e | --get-environment]: Display Confidential Compute Environment
[-f | --get-cc-feature]: Display Confidential Compute CC feature status
[-gm | --get-mem-size-info]: Display Confidential Compute GPU Protected/Unprotected Memory Sizes
[-sm | --set-unprotected-mem-size]: Set Confidential Compute GPU Unprotected Memory Size in KiB
[-srs | --set-gpus-ready-state]: Set Confidential Compute GPUs Ready State
[-grs | --get-gpus-ready-state]: Display Confidential Compute GPUs Ready State
[-skr | --set-key-rotation-max-attacker-advantage]: Set Confidential Compute Key Rotation Max Attacker Advantage
[-gkr | --get-key-rotation-threshold-info]: Display Confidential Compute Key Rotation Threshold Info
[-mgm | --get-multigpu-mode]: Display Confidential Compute Multi-GPU Mode
[-q | --query-conf-compute]: Display Confidential Compute Detailed Info
# CPU 侧支持哪些机密计算能力?
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -gc
CPU CC capabilities: INTEL TDX
# GPU 侧支持哪些机密计算的能力?
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -gg
GPU CC capabilities: CC Capable
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -d
DevTools Mode: OFF
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -e
CC Environment: PRODUCTION
# The H100 GPU supports these operational modes:
# - CC enabled (CC = on)
# - CC disabled (CC = off)
# - CC devtools (CC = devtools)
#
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -f
CC status: OFF
# CC status 是 off,为什么 proteced memory size 还是这么多呢?
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -gm
GPU 0: NVIDIA H20 (UUID: GPU-9eec5fae-f11c-ad39-47e7-9c2e020ac9e6)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
GPU 1: NVIDIA H20 (UUID: GPU-116971fb-682f-226f-8621-c79a9b61f81e)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
GPU 2: NVIDIA H20 (UUID: GPU-a22c6a00-991f-54c1-8b4b-2f436721d217)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
GPU 3: NVIDIA H20 (UUID: GPU-e25f5dec-3652-1ff7-1522-b1f4c4f5e304)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
GPU 4: NVIDIA H20 (UUID: GPU-8de31433-33e4-6900-37d5-4956fbdc811e)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
GPU 5: NVIDIA H20 (UUID: GPU-78abcff1-6ff8-5ff0-a6ba-6feb037cd6fe)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
GPU 6: NVIDIA H20 (UUID: GPU-7958643a-0426-62d0-9c10-23a8ee3cb0c5)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
GPU 7: NVIDIA H20 (UUID: GPU-38b963b0-8823-0d84-3187-8d9c9a090588)
Protected memory size: 99220864 KiB
Unprotected memory size: 0 KiB
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -grs
Confidential Compute GPUs Ready state: not-ready
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -mgm
Multi-GPU Mode: Protected PCIe
root@iv-ydvapkwcn4xjd1tl6a3k:~# nvidia-smi conf-compute -q
==============NVSMI CONF-COMPUTE LOG==============
CC State : OFF
Multi-GPU Mode : Protected PCIe
CPU CC Capabilities : INTEL TDX
GPU CC Capabilities : CC Capable
CC GPUs Ready State : Not Ready