DICE 的 SDV 配置文件

设备标识符组合引擎 (DICE) 的 SDV 配置文件是 DICE Android 配置文件的扩展。在 SDV 中,虚拟机使用两条并行的 DICE 链:

  • 安全世界 DICE 链
  • Android SDV DICE 链

Android Profile for DICE 的配置描述符中的以下字段与每个链相关:

名称 类型 说明
组件名称 <0x -70002 tstr 建议在每个 CDI 层上进行。组件名称可明确标识在车辆或车辆平台上运行 Android SDV 虚拟机的硬件的所有 DICE 链中的阶段。
安全版本 -70005 uint 每个 CDI 阶段都需要。可用于定义 DICE 政策,以防止不安全的远程虚拟机版本加入 SDV 安全网格。
组件实例名称 -70007 tstr 在第一个特定于虚拟机的 CDI 层上是必需的。例如,在 Hypervisor 之后,用于 Android SDV DICE 链。SDV 实例的名称。如果多个 CDI 层包含组件实例名称,则每个层必须具有相同的值。

安全世界 DICE 链

安全世界 DICE 链与 Android 的远程密钥配置 (RKP) 服务器从 Android 设备接收的 DICE 链相同。IRemotelyProvisionedComponent HAL 的 generateCertificateRequestV2() 会将此 DICE 链公开给 Android。

下表展示了一个示例安全世界 DICE 链:

启动阶段 DICE CDI 层 颁发者
主引导加载程序 CDI[0] UDS
辅助引导加载程序 CDI[1] 主引导加载程序
TEE 启动 CDI[2] 辅助引导加载程序
KeyMint TA 启动 CDI[3](Leaf) TEE

如需实现 KeyMint 受信任的应用 (TA),请使用以下任一选项:

  • 所有 SDV 虚拟机共用一个 KeyMint 实例:您必须为所有虚拟机指定一个 CDI。

  • 每个 SDV 虚拟机对应一个 KeyMint 实例:您必须为每个虚拟机指定不同的 CDI 值。各个 CDI 值必须包含与虚拟机的组件实例名称相匹配的组件实例名称。

Android SDV DICE 链

Android SDV DICE 链可对在引导路径上运行的软件进行认证,该引导路径通过 Hypervisor 到达在 SDV 虚拟机上运行的 Android 高级操作系统 (HLOS)。

下表展示了一个示例 Android SDV DICE 链:

启动阶段 DICE CDI 层 颁发者
主引导加载程序 CDI[0] UDS
辅助引导加载程序 CDI[1] 主引导加载程序
Hypervisor CDI[2] 辅助引导加载程序
Android HLOS CDI[3](绿叶) (Hypervisor 中的 Android 加载器)1

1 Hypervisor 将 guest 中的 Android 引导加载程序认证为一层。Android 引导加载程序认证 Android HLOS。

Android HLOS CDI 证书

Android 引导加载程序(或 Hypervisor,如果没有 Android 引导加载程序,但只有一个在 Hypervisor 内加载虚拟机的 Android“加载程序”程序)会对 Android HLOS CDI 证书进行签名,并涵盖 Android HLOS。例如,它涵盖 Android 引导加载程序根据 Android 启动时验证 (AVB) 验证的所有代码。

Android HLOS CDI 证书必须包含 Android 操作系统的 SDV 特有值,以缓解安全漏洞。例如,通过禁止具有已知漏洞的虚拟机加入 SDV 安全网格,防止潜在的密钥泄露。AVB 验证可提供这些值中的大多数。

它们还会移交给 TEE 中的 KeyMint,由 SecureWorld DICE 链的叶 CDI 对证书进行签名,并通过 DeviceInfo 传递给 Android,以在核心 Android 中启用密钥和 ID 认证等功能。

代码输入和 codeHash 证书字段

VBMeta 摘要(Android 引导加载程序为 AVB 验证执行的输出)涵盖 Android HLOS 的软件。因此,它可作为推导 CDI 密钥的 android-dice-input-values,并会进入 CDI 证书的 dice-cert-fields 字段。

建议用于 AVB 的哈希算法是 SHA-256,它会生成一个 32 字节长的 VBMeta 摘要。与 DICE 的开放配置文件不同,DICE 的 Android 配置文件允许使用 32 字节长的 android-dice-hash-algos 作为 DICE 流程的 android-dice-input-values,以及将相同的 32 字节长值作为 DICE 证书中的 codeHash。

配置描述符:Android Profile for DICE 中的字段

除了针对所有 CDI 层描述的内容之外,以下具体信息还适用于 Android Profile for DICE 中的配置描述符字段:

名称 类型 说明
组件版本 -70003 int 来自 AVB version-info-avb 的系统操作系统版本。也与 android.os.Build.VERSION.release 相同。
安全版本 -70005 uint system 分区的安全补丁级别,格式为 YYYYMMDD
RKP 虚拟机标记 -70006 null RKP 虚拟机标记可防止远程密钥配置为 Android SDV DICE 链颁发证书。 :

RKP 虚拟机标记必须显示在 Android SDV DICE 链的第一个 CDI 证书中,该证书与安全世界 DICE 链不通用。它也不得出现在任何后续 CDI 证书中,以防止 RKP 服务器 rkp-avf-support 将 DICE 链视为来自 RKP 虚拟机。

配置描述符:新字段

Android HLOS CDI 证书的配置描述符必须包含除 Android Profile for DICE 描述的值之外的 SDV 特定值。DICE 的 SDV 配置文件为此目的预留了键值范围 [-71000, -71999]。您可以使用保留范围之外的键值添加特定于实现的字段。SDV 特有的值包括:

名称 类型 说明
已验证启动状态 -71000 tstr greenyelloworange
build 指纹 -71001 tstr 能让人看懂的字符串,用于唯一标识相应 build,与 ro.build.fingerprint 相同。Android CDD 的 3.2.2 build 参数部分 cdd-3-2-2 定义了此内容。VBMeta 将此存储为名为 com.android.build.system.fingerprint 的属性
system_ext 安全补丁级别 -71002 uint YYYYMMDDsystem_ext 分区的安全补丁级别,格式为 YYYYMMDD
product 安全补丁级别 -71003 uint YYYYMMDDproduct 分区的安全补丁级别,格式为 YYYYMMDD
vendor 安全补丁级别 -71004 uint YYYYMMDDvendor 分区的安全补丁级别,格式为 YYYYMMDD
boot 安全补丁级别 -71005 uint boot 分区(包含 Linux 内核)的安全补丁级别,采用 YYYYMMDD 格式。
SDV 启动模式 -71006 tstr lockedunlocked。如需了解详情,请参阅 Mesh 状态和配置

Android HLOS CDI 的模式输入值选择

Android HLOS CDI 证书的 android-dice-mode 使用以下定义:

AVB UNLOCKED AVB LOCKED
SDV 启动模式 UNLOCKED 调试 调试
SDV 启动模式 LOCKED 未配置(无效) 正常

密钥推导函数

从 Android HLOS CDI 的 CDI_Attest 密钥派生出公钥/私钥对的 android-dice-kdf 必须是 HKDF,且以 SHA512 作为其哈希函数。