SDV 启动模式定义了 SDV 虚拟机中的 SDV 服务发现代理在尝试连接到其他服务发现代理(在其他 SDV 虚拟机中运行)以建立安全网状网时的行为。这与 Android 启动时验证中现有的 设备
状态 概念类似。SDV 启动模式可以是 LOCKED 或
UNLOCKED。
在预配或更新 车辆虚拟机信任 库时,系统会利用 SDV 启动模式。
SDV 安全网格行为
服务发现网格处于以下状态之一,具体取决于其收到的启动值:Normal、Warning 或 Fatal。
只有当汽车的网格处于 Normal 状态时,汽车才会交付到车主手中。网格需要诊断干预才能从 Normal 状态切换到 Warning 状态。在生产环境中(例如,非开发或调试),Warning 状态仅在预配期间发生。
Fatal 是一种基本故障,类似于 system_ext 映像在 Android 引导加载程序中未能通过签名验证。如果 SDV 网状网仅因无线下载 (OTA) 更新而从 Normal 转换为 Fatal,则该更新被视为不良更新,并且网状网会回退到原始版本 Normal。
以下部分将更详细地介绍这些状态。
Normal
- 从服务发现的角度来看,系统启动是
SECURE的。 - 服务发现仅与安全启动的对等方连接。安全启动的对等方意味着 SDV 安全网格也是安全的。
Warning
- 由于某些验证已停用,系统启动可能已受到影响。
- 服务发现仅与也停用了相同验证的对等方连接。它是 SDV 安全网格的一部分,具有与自身相同的安全属性。
- 由于本地故障或停用的功能,无法验证对等方启动是否成功。
- 在开发环境或情况之外,这具有以下含义:
- 用户数据不得可用。也就是说,用户数据既不得通过 SDV 安全网格传输,也不得受通过 SDV 安全网格进行的通信的影响。
- 当网格处于此状态时,只有预配流程所需的服务才应可用。
Fatal
- 系统启动阶段出现严重错误。
- 至少存在一个基本故障或错误,导致服务发现代理无法建立网格。本地服务无法与远程服务通信。
- 从服务发现的角度来看,系统启动是 UNSECURE 的。
SDV 启动模式
SDV 启动模式有两个可能的值:UNLOCKED 和 LOCKED。对于服务
发现网格建立,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,
}
算法
用于计算设备模式值的算法如下:
- 将
deviceMode指定为DeviceMode::Normal。 - 将
diceChainList指定为与 SDV 虚拟机相关的 DICE 链的列表。 - 对于
diceChainList中的每个diceChain:- 将
cdiList指定为diceChain中的 CDI 证书的列表: - 对于
cdiList中的每个cdiCert:- 将
cdiDeviceMode指定为与cdiCert.mode对应的DeviceMode。 - 将
deviceMode设置为min(deviceMode, cdiDeviceMode)。
- 将
- 将
- 返回
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。
- 该工具与本地服务发现代理通信,并等待该代理发出 SDV 安全网状网已完成的信号,并且该代理已将 UDS 公钥列表写入
/vvmtruststore/uds_pubs。 - 发生这种情况时,该工具会获取刚刚写入的
/vvmtruststore/uds_pubs的哈希并输出它。
图 2. 出厂预配,第 1 步。
第 2 步:写入 VVMFactoryTrust
在每个 ECU 的一个虚拟机上:
- 将上一步中
sdv_provisioning_tool输出的/vvmtruststore/uds_pubs的哈希写入 VVMFactoryTrust。此写入的执行方式特定于 OEM 或供应商,不在本规范的讨论范围内。
图 3. 出厂预配,第 2 步。
第 3 步:在 SDV 启动模式锁定状态下重启
在 LOCKED 模式下的 SDV 启动模式下重启所有 ECU 中的所有虚拟机。
服务发现代理信任 ECU 中具有 uds_pubs 中列出的 UDS 公钥的虚拟机,因为此文件的哈希与 VVMFactoryTrust 匹配。
由于 ECU 是同时预配的,因此它们永久绑定在一起,从 DICE 链验证的角度来看,可以有效地将其视为单个硬件。
图 4. 出厂预配,第 3 步。
部件更换流程
这是在授权汽车修理厂或车库的预配流程,其中必须将有故障的 ECU 替换为新的、未预配的 ECU。
此流程依赖于直接由根
授权机构颁发的 UDS 证书,或通过某些
中间授权机构链间接颁发的 UDS 证书,这些授权机构在 vvmconfig 中声明。
初始状态
所有虚拟机都已出厂预配,并且在 LOCKED 模式下的 SDV 启动模式下运行。
图 5 描绘了一个示例,其中 ECU-0 出现故障,需要更换:
图 5. 部件更换,初始状态。
第 1 步:安装新 ECU
安装处于空白、未预配状态的新 ECU。
在图 6 中,当 ECU-2(替换 ECU)启动时,存在两个不相交的 SDV 安全网格:一个处于 Warning 状态,另一个处于 Normal 状态。这两个 SDV 安全网格都不完整。
图 6. 部件更换,第 1 步。
第 2 步:在 SDV 启动模式解锁状态下重启
在 UNLOCKED 模式下的 SDV 启动模式下重启所有 ECU 的所有虚拟机。
在图 7 中,VM-B 和 VM-C 加入了 Warning SDV 安全网格,该网格已完成。
图 7. 部件更换,第 2 步。
第 3 步:运行 sdv_provisioning_tool
在每个虚拟机上,运行 sdv_provisioning_tool。
该工具与本地服务发现代理通信,并等待该代理发出 SDV 安全网状网已完成的信号,并且该代理已将 UDS 公钥列表写入 /vvmtruststore/uds_pubs。
发生这种情况时,该工具会获取刚刚写入的 /vvmtruststore/uds_pubs 的哈希并输出它,但此哈希不会在此流程中使用。
图 8. 部件更换,第 3 步。
第 4 步:安装 UDS 证书
- 从任意 SDV 虚拟机中提取
/vvmtruststore/uds_pubs。提取哪个虚拟机并不重要,因为对于同一 SDV 安全网格中的所有虚拟机,该文件都是相同的。 - 检索该
/vvmtruststore/uds_pubs中列出的所有 UDS 公钥的预配证书。- 这通常意味着将此文件发送到远程服务器,该服务器要么已存储证书,要么通过将收到的公钥与已知 UDS 公钥的数据库进行比较来生成证书。此数据库是根据 ECU 制造期间提取的 UDS 公钥构建的。
- 写入每个 SDV 虚拟机的
/vvmtruststore/uds_certs。
图 9. 部件更换,第 4 步。
第 5 步:在 SDV 启动模式锁定状态下重启
在 LOCKED 模式下的 SDV 启动模式下重启所有虚拟机。
如果 SDV 安全网格不完整,请返回到 第 2 步。
图 10. 部件更换,第 5 步。