网状网络状态和配置

SDV 启动模式定义了 SDV 虚拟机中的 SDV 服务发现代理在尝试连接到其他服务发现代理(在其他 SDV 虚拟机中运行)以建立安全网状网时的行为。这与 Android 启动时验证中现有的 设备 状态 概念类似。SDV 启动模式可以是 LOCKEDUNLOCKED

在预配或更新 车辆虚拟机信任 库时,系统会利用 SDV 启动模式。

SDV 安全网格行为

服务发现网格处于以下状态之一,具体取决于其收到的启动值:NormalWarningFatal

只有当汽车的网格处于 Normal 状态时,汽车才会交付到车主手中。网格需要诊断干预才能从 Normal 状态切换到 Warning 状态。在生产环境中(例如,非开发或调试),Warning 状态仅在预配期间发生。

Fatal 是一种基本故障,类似于 system_ext 映像在 Android 引导加载程序中未能通过签名验证。如果 SDV 网状网仅因无线下载 (OTA) 更新而从 Normal 转换为 Fatal,则该更新被视为不良更新,并且网状网会回退到原始版本 Normal

以下部分将更详细地介绍这些状态。

Normal

  • 从服务发现的角度来看,系统启动是 SECURE 的。
  • 服务发现仅与安全启动的对等方连接。安全启动的对等方意味着 SDV 安全网格也是安全的。

Warning

  • 由于某些验证已停用,系统启动可能已受到影响。
  • 服务发现仅与也停用了相同验证的对等方连接。它是 SDV 安全网格的一部分,具有与自身相同的安全属性。
  • 由于本地故障或停用的功能,无法验证对等方启动是否成功。
  • 在开发环境或情况之外,这具有以下含义:
    • 用户数据不得可用。也就是说,用户数据既不得通过 SDV 安全网格传输,也不得受通过 SDV 安全网格进行的通信的影响。
    • 当网格处于此状态时,只有预配流程所需的服务才应可用。

Fatal

  • 系统启动阶段出现严重错误。
  • 至少存在一个基本故障或错误,导致服务发现代理无法建立网格。本地服务无法与远程服务通信。
  • 从服务发现的角度来看,系统启动是 UNSECURE 的。

SDV 启动模式

SDV 启动模式有两个可能的值:UNLOCKEDLOCKED。对于服务 发现网格建立,LOCKED 表示验证错误是 致命的,而 UNLOCKED 表示验证错误不是致命的。

条件 SDV 启动模式
UNLOCKED LOCKED
本地 VVM 信任库为空 Warning Fatal
缺少本地 DICE 链 Fatal Fatal
本地 DICE 链验证失败 Warning Fatal
本地 SDV 和 AVB 模式匹配 请参阅本地 SDV 和 AVB 模式匹配中的表格
远程设备模式值比较 请参阅远程设备模式值比较中的表格
远程 uds_pubs 匹配失败 Warning Fatal
远程 DICE 链验证失败(使用 DICE 政策 Warning Fatal
远程身份验证握手失败 Fatal Fatal

本地 SDV 和 AVB 模式匹配

下表显示了 AVB 模式和 SDV 启动模式如何影响 SDV 安全网状网行为。颜色定义与 AVB 文档的 Android 特定 集成 部分中的定义相同。

AVB 模式 x SDV 启动模式 SDV 启动模式
UNLOCKED LOCKED
AVB LOCKED 绿色 Warning Normal
黄色 Fatal Fatal
AVB UNLOCKED 橙色 Warning Fatal

设备模式值

在 DICE 链中,每个 CDI 证书都有一个 模式值。此值根据其配置输入描述该层的安全状态。为了表达设备上所有软件的安全立场,系统定义了一个设备模式值 ,该值派生自与给定 SDV 虚拟机(即 Android HLOS 和安全世界)相关的所有 DICE 链的所有 CDI 阶段的模式值,并定义如下:

enum DeviceMode {
  NotConfigured = 0,
  Recovery = 1,
  Debug = 2,
  Normal = 3,
}

算法

用于计算设备模式值的算法如下:

  1. deviceMode 指定为 DeviceMode::Normal
  2. diceChainList 指定为与 SDV 虚拟机相关的 DICE 链的列表。
  3. 对于 diceChainList 中的每个 diceChain
    1. cdiList 指定为 diceChain 中的 CDI 证书的列表:
    2. 对于 cdiList 中的每个 cdiCert
      1. cdiDeviceMode 指定为与 cdiCert.mode 对应的 DeviceMode
      2. deviceMode 设置为 min(deviceMode, cdiDeviceMode)
  4. 返回 deviceMode

远程设备模式值比较

服务发现代理仅与其他具有相同 设备模式值的代理连接。

设备模式值可确保网格不能有具有不同安全属性的成员。生成的网格在其所有成员之间具有统一的安全立场。

设备模式值 遥控器
未配置 调试 恢复 正常
本地 未配置 Fatal Fatal Fatal Fatal
调试 Fatal Warning Fatal Fatal
恢复 Fatal Fatal Warning Fatal
正常 Fatal Fatal Fatal Normal

出厂预配流程

这是车辆装配线上的预配流程,假设公钥基础架构不可用。

此流程依赖于存储在一次性可编程 (OTP) 内存(称为 VVMFactoryTrust)中的 32 字节值。设置后,此值将作为名为 androidboot.sdv.vvmfactorytrust 的参数传递给内核。

ECU 中的所有虚拟机都必须具有相同的 SDV 启动模式和 VVMFactoryTrust。

初始状态

所有 ECU 最初都处于 UNLOCKED 模式下的 SDV 启动模式,其中空白 VVMFactoryTrust 和 车辆虚拟机信任库,但 VVMTrustStore 上存在的任何 uds_certs 除外。

图 1 描绘了一个示例,其中有三个 SDV 虚拟机(VM-A、VM-B 和 VM-C)分布在两个单独的 ECU(ECU-0 和 ECU-1)中:

工厂配置示例 - 初始状态

图 1. 出厂预配,初始状态。

第 1 步:运行 sdv_provisioning_tool

启动所有 ECU 中的所有虚拟机。

在每个虚拟机上,运行 sdv_provisioning_tool

  1. 该工具与本地服务发现代理通信,并等待该代理发出 SDV 安全网状网已完成的信号,并且该代理已将 UDS 公钥列表写入 /vvmtruststore/uds_pubs
  2. 发生这种情况时,该工具会获取刚刚写入的 /vvmtruststore/uds_pubs 的哈希并输出它。

出厂配置,第 1 步

图 2. 出厂预配,第 1 步。

第 2 步:写入 VVMFactoryTrust

在每个 ECU 的一个虚拟机上:

  1. 将上一步中 sdv_provisioning_tool 输出的 /vvmtruststore/uds_pubs 的哈希写入 VVMFactoryTrust。此写入的执行方式特定于 OEM 或供应商,不在本规范的讨论范围内。

出厂配置,第 2 步

图 3. 出厂预配,第 2 步。

第 3 步:在 SDV 启动模式锁定状态下重启

LOCKED 模式下的 SDV 启动模式下重启所有 ECU 中的所有虚拟机。

服务发现代理信任 ECU 中具有 uds_pubs 中列出的 UDS 公钥的虚拟机,因为此文件的哈希与 VVMFactoryTrust 匹配。

由于 ECU 是同时预配的,因此它们永久绑定在一起,从 DICE 链验证的角度来看,可以有效地将其视为单个硬件。

出厂配置,第 3 步

图 4. 出厂预配,第 3 步。

部件更换流程

这是在授权汽车修理厂或车库的预配流程,其中必须将有故障的 ECU 替换为新的、未预配的 ECU。

此流程依赖于直接由根 授权机构颁发的 UDS 证书,或通过某些 中间授权机构链间接颁发的 UDS 证书,这些授权机构在 vvmconfig 中声明。

初始状态

所有虚拟机都已出厂预配,并且在 LOCKED 模式下的 SDV 启动模式下运行。

图 5 描绘了一个示例,其中 ECU-0 出现故障,需要更换:

零件替换,初始状态

图 5. 部件更换,初始状态。

第 1 步:安装新 ECU

安装处于空白、未预配状态的新 ECU。

在图 6 中,当 ECU-2(替换 ECU)启动时,存在两个不相交的 SDV 安全网格:一个处于 Warning 状态,另一个处于 Normal 状态。这两个 SDV 安全网格都不完整。

更换零件,第 1 步

图 6. 部件更换,第 1 步。

第 2 步:在 SDV 启动模式解锁状态下重启

UNLOCKED 模式下的 SDV 启动模式下重启所有 ECU 的所有虚拟机。

在图 7 中,VM-B 和 VM-C 加入了 Warning SDV 安全网格,该网格已完成。

更换零件,第 2 步

图 7. 部件更换,第 2 步。

第 3 步:运行 sdv_provisioning_tool

在每个虚拟机上,运行 sdv_provisioning_tool

该工具与本地服务发现代理通信,并等待该代理发出 SDV 安全网状网已完成的信号,并且该代理已将 UDS 公钥列表写入 /vvmtruststore/uds_pubs

发生这种情况时,该工具会获取刚刚写入的 /vvmtruststore/uds_pubs 的哈希并输出它,但此哈希不会在此流程中使用。

更换部件,第 3 步

图 8. 部件更换,第 3 步。

第 4 步:安装 UDS 证书

  • 从任意 SDV 虚拟机中提取 /vvmtruststore/uds_pubs。提取哪个虚拟机并不重要,因为对于同一 SDV 安全网格中的所有虚拟机,该文件都是相同的。
  • 检索该 /vvmtruststore/uds_pubs 中列出的所有 UDS 公钥的预配证书。
    • 这通常意味着将此文件发送到远程服务器,该服务器要么已存储证书,要么通过将收到的公钥与已知 UDS 公钥的数据库进行比较来生成证书。此数据库是根据 ECU 制造期间提取的 UDS 公钥构建的。
  • 写入每个 SDV 虚拟机的 /vvmtruststore/uds_certs

更换部件,第 4 步

图 9. 部件更换,第 4 步。

第 5 步:在 SDV 启动模式锁定状态下重启

LOCKED 模式下的 SDV 启动模式下重启所有虚拟机。

如果 SDV 安全网格不完整,请返回到 第 2 步

更换零件,第 5 步

图 10. 部件更换,第 5 步。