一、安全启动概述:汽车电子电气架构演进、功能安全与信息安全、安全启动的定义与价值

大家好,我是你们的嵌入式安全讲师。今天咱们聊聊安全启动。说实话,这个主题我讲了不下几十次,但每次都有新感悟。汽车行业这几年变化太快,安全启动已经从「可选配置」变成了「刚需功能」。

你想想看,十年前的车,一个MCU跑跑CAN总线就完事了。现在呢?一个域控制器里可能集成了十几个核,跑着Linux、QNX、甚至多个RTOS。这种复杂度下,没有安全启动,你敢让车上路吗?

1.1 汽车电子电气架构的演进

先说说架构变化。我入行那会儿,汽车电子还是典型的分布式架构。每个功能一个ECU,车窗一个、雨刷一个、ABS一个。整车可能有七八十个ECU,各自为政。

这种架构有什么问题?

  • 线束太重:一辆车线束能到几十公斤
  • 升级困难:每个ECU都得单独刷写
  • 安全薄弱:ECU之间缺乏信任机制

后来行业开始往域集中架构走。把功能相近的ECU合并到一个域控制器里。比如车身域、动力域、智能座舱域。再到现在的中央计算平台 + 区域控制器架构,说白了就是「软件定义汽车」。

关键变化:从「硬件定义功能」变成了「软件定义功能」。这意味着软件的安全直接决定了车辆的安全。

我记得2018年做一个Tier1的项目,客户要求我们在一款S32K上实现安全启动。当时觉得「有必要吗?一个车身控制器而已」。结果客户说:「你不做,我们就不采购。」嗯,从那以后我就明白了,安全启动不是技术选择,是市场准入条件。

1.2 功能安全与信息安全

这两个概念经常被混为一谈,但其实是两码事。

维度 功能安全 (Functional Safety) 信息安全 (Cybersecurity)
关注点 系统故障时是否安全 系统是否被恶意攻击
标准 ISO 26262 ISO 21434
典型问题 内存越界、看门狗超时 固件篡改、CAN报文注入
目标 避免随机硬件故障导致危害 避免蓄意攻击导致危害

我个人的理解是:功能安全保证「车不会自己坏」,信息安全保证「车不会被别人搞坏」。两者缺一不可。

举个例子。你实现了ASIL-D级别的看门狗,确保程序跑飞了能复位。但如果攻击者直接篡改了Flash里的固件,看门狗再厉害也没用——它复位后加载的还是恶意代码。这就是安全启动要解决的问题。

注意:安全启动不是功能安全的替代品,而是信息安全的基石。没有安全启动,其他安全措施都建立在沙滩上。

1.3 安全启动的定义

安全启动,说白了就是「确保芯片上电后,执行的每一行代码都是可信的」。

具体流程是这样的:

  1. 芯片复位后,从ROM里执行一段不可修改的BootROM代码
  2. BootROM验证第一级Bootloader的签名
  3. 第一级Bootloader验证第二级Bootloader或OS的签名
  4. 依次类推,形成一条信任链

每一级在加载下一级之前,都要做两件事:

  • 身份验证:代码是谁签发的?
  • 完整性校验:代码有没有被改过?

我曾经遇到过一个坑:某客户在量产阶段发现,芯片上电后偶尔启动失败。排查了三天,最后发现是签名验证时,公钥存储的地址被Linker脚本覆盖了。嗯,从那以后我每次做安全启动项目,第一件事就是检查公钥是不是放在了OTP(一次性可编程)区域。

避坑指南:公钥存储位置一定要用硬件保护。NXP的芯片通常提供eFuse或OTP区域,写入后不可修改。千万别图省事放Flash里,否则攻击者换个公钥就能绕过你的安全启动。

1.4 安全启动的价值

安全启动到底值不值?我直接说结论:值,而且非常值。

从三个角度看:

  • 防篡改:防止恶意固件被刷入ECU。2022年某车企的OTA被中间人攻击,就是吃了这个亏。
  • 防回滚:防止攻击者刷回有漏洞的旧版本固件。安全启动通常会检查版本号,只允许升级不允许降级。
  • 建立信任根:为后续的Secure Boot、Secure Update、Secure Diagnostics提供基础。

你想想看,一辆L3级自动驾驶的车,如果ECU被刷入了恶意代码,后果是什么?不是丢数据,是丢命。所以ISO 21434明确要求,所有涉及安全的ECU都必须实现安全启动。

我个人习惯把安全启动比作「芯片的身份证系统」。上电先查身份证,查不过就拒绝执行。虽然每次启动会多花几百毫秒,但这点时间换来的安全性,绝对值。

好了,这一章就到这里。下一章我们深入NXP的BootROM架构,看看具体怎么实现安全启动。到时候我会拿S32K3和i.MX8两个平台做对比,讲讲它们各自的坑和技巧。