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)

Secure 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

Per-IB

使用安全缓冲区提交命令 - 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:安全反弹
  • 启用 TMZ 的内核参数:amdgpu.tmz=1
  • 启用 TMZ 的 Mesa 参数:AMD_DEBUG=tmz

未加密与加密数据对比

data
参考