Trusted Memory Zone 介绍
参考:通过可信内存区域(Trusted Memory Zone)支持安全缓冲区
背景
- 内存加密是一项重要功能,可保护内容不被未经授权的应用程序访问。
- AMD GPU 开发了 TMZ(可信内存区域)来支持视频内存和系统内存加密。
- Linux® 内核、Mesa 和用户空间应用程序正在利用 TMZ 的功能来实现安全缓冲区支持,该支持可用于 Linux® 上的许多其他场景。
介绍
- 可信内存区域 (TMZ) 是一种保护正在写入和从内存读取的内容的方法。
- AMD GPU 平台支持全内存带宽 AES 密码。
- 所有 TMZ 读取和 TMZ 写入在到达内存之前都会经过 AES 密码。
- 页表中的 TMZ 位和可信事务提供多重保护。
- 即使 TMZ 位配置错误,内容仍然是安全的,不会暴露。
硬件平台支持
- 支持的硬件平台:
- 独立 GPU 平台(可加密显存)。
- APU(CPU + GPU)平台(可加密显存和系统内存)。
- 注意:我们目前仅在 Linux® 上启用了 APU 支持。
Secure BO(Buffer Object)
内核和 Mesa 安全缓冲区定义和握手
- 在内核驱动程序中初始化 BO 级保护,以便为 gem create ioctl 和 libdrm 提供新标志 AMDGPU_GEM_CREATE_ENCRYPTED,以进行安全缓冲区分配。
- Mesa 使用分配缓冲区来决定是否安全。
- 如果 Mesa 设置了 AMDGPU_GEM_CREATE_ENCRYPTED,则必须设置此缓冲区的整个页表条目的 TMZ 位。
- 提供 AMDGPU_IB_FLAGS_SECURE 来指示 IB(存储 GPU 命令的间接缓冲区)是否受信任。
- Mesa 在命令提交上下文的 IB 句柄中使用此标志来通知内核图形引擎是否需要转换为受信任状态。
- 提供 AMDGPU_IDS_FLAGS_TMZ 来指示 TMZ 功能是否集成。
- Mesa 使用此信息标志来了解当前 gpu 是否支持 TMZ。
安全策略
- CPU 作为不受信任的域,无法使用 TMZ 解密安全缓冲区。
- 即使经过 k 映射,用户也无法从 CPU 地址获取原始数据。
- 只有受信任的硬件块才有能力解密安全缓冲区。
- 所有加密内存只能通过映射 GPUVM 进行解密。
- 受信任的硬件块
- GFX
- SDMA
- Video Codec Next (VCN) / (JEPG)
- 显示引擎
写操作调制表
Transaction Trust State (0:Not trusted, 1:Trusted) | TMZ bit in GPU table | Modulation Result | Encryption State in TMZ |
---|---|---|---|
0 | 0 | Not Encrypted | OFF |
0 | 1 | Encrypted | ON |
1 | 0 | Encrypted | ON |
1 | 1 | Encrypted | ON |
读操作调制表
Transaction Trust State (0:Not trusted, 1:Trusted) | TMZ bit in GPU table | Modulation Result | Decryption State in TMZ |
---|---|---|---|
0 | 0 | Not Decrypted | OFF |
1 | 1 | Not Decrypted | OFF |
1 | 0 | Not Decrypted | OFF |
1 | 1 | Decrypted | ON |
Per-IB 保护机制
- Per-IB 保护提交
- IB(间接缓冲区)是存储 GFX 队列执行的数据包的命令缓冲区。
- 内核实现 Per-IB 保护以使用安全缓冲区执行命令提交。
- 当发出具有不安全缓冲区的 IB 时,内核必须将 Transaction Trust State 设置为 Not Trusted。(遗留情况)
- 当发出具有安全缓冲区的 IB 时,内核必须将 Transaction Trust State 设置为 Trusted
使用安全缓冲区提交命令 - GFX/SDMA/VCN
- GFX 使用 FRAME_TMZ 位和 PACKET3_FRAME_CONTROL 数据包来控制 GFX 引擎进入可信状态。
- SDMA 作为另一个可信硬件模块,它使用页表中的 TMZ 标志来决定执行常规读/写还是可信读/写。
- 当内核使用 SDMA 进行安全缓冲区复制时,内核需要在 COPY_LINEAR 数据包的操作码处设置 TMZ 位。
- VCN 引擎不需要内核支持在上下文切换期间切换信任级别,它能够根据页表中的 TMZ 标志自行切换。
Display Secure Frame Buffer
- 根据寄存器设置显示引擎安全状态。(不同于 GFX/SDMA/VCN)
- 显示驱动程序只对寄存器中的一位进行编程,以切换显示引擎的安全状态,而不是使用页表的 TMZ 位。(如果位编程错误,则无法获得有效数据)
- 这允许在不使用页表的情况下安全访问 VRAM 中的显示缓冲区。
安全单元测试套件和相关参数
- 在 libdrm amdgpu_test 中初始化安全测试套件:
- 套件:11:ENABLED:安全测试
- 测试:1:ENABLED:分配安全缓冲区测试
- 测试:2:ENABLED:图形安全命令提交
- 测试:3:ENABLED:sDMA 安全命令提交
- 测试:4:ENABLED:安全反弹
- 套件:11:ENABLED:安全测试
- 启用 TMZ 的内核参数:amdgpu.tmz=1
- 启用 TMZ 的 Mesa 参数:AMD_DEBUG=tmz
未加密与加密数据对比
参考