4. 安全需求分解:从TSR到SSR与HSR的落地

好,咱们进入第四讲。前面我们聊了安全目标和ASIL等级,那都是顶层设计。现在要干的事,说白了就是——把那些抽象的安全目标,拆成工程师能直接动手的活儿。

我个人习惯把这一步叫做“从目标到需求的翻译”。你想想看,安全目标说“升级包不能被篡改”,但软件工程师要怎么写代码?硬件工程师要选什么芯片?这中间差着一层呢。

这一层,就是技术安全需求(TSR)、软件安全需求(SSR)和硬件安全需求(HSR)。

4.1 技术安全需求(TSR)的编写

TSR是连接安全目标和具体实现的桥梁。它不关心你用软件还是硬件实现,只描述“系统应该具备什么技术能力来满足安全目标”。

举个例子,安全目标是:“在OTA升级过程中,避免因升级包损坏导致ECU变砖(ASIL B)”。

那么对应的TSR可能是:

  • TSR-01:系统必须在升级前对升级包进行完整性校验,校验算法支持SHA-256及以上。
  • TSR-02:系统必须在升级过程中检测通信中断,并在中断后30秒内进入安全状态。
  • TSR-03:系统必须保留至少一个可回滚的备份版本,备份版本必须通过完整性校验。

写TSR时,我有个经验:每个TSR必须可验证。什么叫可验证?就是测试工程师看到这条需求,知道怎么测。比如“校验算法支持SHA-256”,测试可以写用例验证是否真的用了SHA-256。但如果你写“系统要足够安全”,那测试就懵了。

我的小技巧:写TSR时,我会在每条后面加一个“验证方法”的备注。比如“通过静态代码分析确认SHA-256算法被调用”、“通过故障注入测试验证30秒超时机制”。这样后面做验证时,不会漏项。

4.2 软件安全需求(SSR)的分解

TSR写好了,接下来要分给软件和硬件。SSR就是软件部分的安全需求。

我记得在做一个OTA项目时,TSR要求“升级包完整性校验”。软件团队一开始说:“简单,我们在下载完成后算个哈希就行。”但后来发现,如果哈希算法本身被篡改了呢?如果校验代码在升级过程中被覆盖了呢?

所以SSR的分解,不能只是简单地把TSR抄一遍。你得考虑软件架构、模块划分、运行时环境。

从TSR-01分解出来的SSR可能包括:

  • SSR-01.1:Bootloader必须在应用启动前,对应用镜像进行SHA-256完整性校验。
  • SSR-01.2:校验代码必须存储在受保护的只读存储区,运行时不得被修改。
  • SSR-01.3:如果校验失败,Bootloader必须禁止启动新应用,并尝试回滚到备份版本。

你看,一个TSR拆成了三个SSR,每个都对应具体的软件模块和具体行为。这就是分解的意义。

关键原则:SSR必须分配到具体的软件组件(SW-C)。每个SW-C的安全需求要明确输入、输出、行为、时序和故障响应。别写“系统应该……”,要写“当……时,模块X必须……”。

4.3 硬件安全需求(HSR)的分配

硬件这边,HSR的分配往往更依赖芯片选型和硬件架构。我见过不少项目,软件安全需求写得天花乱坠,结果硬件不支持——比如要求硬件安全模块(HSM)做签名验证,结果选的MCU根本没有HSM。

从TSR分解到HSR,常见的方向包括:

  • 存储安全:Flash需要支持ECC,防止位翻转导致升级包损坏。
  • 通信安全:CAN/CAN FD控制器需要支持硬件时间戳,用于检测消息延迟或重放攻击。
  • 安全启动:硬件必须提供安全存储区存放公钥,且该区域在调试模式下不可读。
  • 故障响应:硬件看门狗必须在主核挂起时触发系统复位。

举个例子,TSR-02要求“30秒内进入安全状态”。硬件这边可能需要:

  • HSR-02.1:硬件看门狗超时时间设置为25秒(留5秒余量给软件处理)。
  • HSR-02.2:电源管理芯片(PMIC)必须支持在收到看门狗触发信号后,5ms内切断非安全相关模块电源。
我曾经踩过的坑:有一次,HSR要求“Flash ECC必须覆盖整个应用区”,结果硬件团队说“我们的Flash控制器只支持ECC在特定区域”。最后不得不改软件架构,把关键数据放在ECC区域,非关键数据放别处。所以,HSR一定要和硬件datasheet逐条核对,别想当然。

4.4 需求分解的完整流程

说了这么多,咱们用一张图把整个流程串起来。下面这张SVG图,展示了一个典型的OTA升级安全需求分解路径。

OTA升级安全需求分解流程 OTA升级安全需求分解流程 安全目标(SG) 技术安全需求(TSR) 软件安全需求(SSR) SSR 硬件安全需求(HSR) SSR-01.1: Bootloader校验 SSR-01.2: 校验代码保护 SSR-01.3: 失败回滚 SSR-02.1 SSR-02.2 SSR-02.3 HSR-02.1: 看门狗25s超时 HSR-02.2: PMIC快速断电 HSR-03.1: Flash ECC覆盖 说明:每个TSR至少分解为1个SSR和/或1个HSR,且所有需求必须可追溯回安全目标 分解过程中需考虑ASIL等级继承、独立性要求和故障覆盖

4.5 需求追溯矩阵

需求分解完了,怎么保证没漏?我建议你建一个需求追溯矩阵。这玩意儿看着麻烦,但真能救命。

下面是一个简化的例子,针对OTA升级包完整性校验这个场景:

安全目标 TSR编号 SSR编号 HSR编号 验证方法
SG-01: 防止升级包篡改 TSR-01 SSR-01.1, SSR-01.2, SSR-01.3 HSR-03.1 代码审查 + 故障注入
SG-02: 防止通信中断导致变砖 TSR-02 SSR-02.1, SSR-02.2 HSR-02.1, HSR-02.2 时序测试 + 硬件在环
SG-03: 保证回滚能力 TSR-03 SSR-03.1, SSR-03.2 HSR-03.2 集成测试

这个矩阵,每个项目阶段都要更新。我习惯在需求评审会上,直接拿这个矩阵过一遍——看哪个安全目标没有对应的TSR,哪个TSR没有分解到SSR/HSR。嗯,这招帮我抓出过不少遗漏。

一句话总结:安全需求分解不是一次性工作。随着设计深入,你会发现新的风险,需要补充新的TSR。保持追溯矩阵的更新,比写一百页文档都管用。

4.6 常见误区与避坑

最后,聊几个我亲眼见过的坑:

  • 误区一:TSR写得太具体。比如直接写“使用HSM模块的AES-128引擎”。这就把实现方案定死了,万一后面换芯片呢?TSR应该写“提供加密运算能力”,具体用HSM还是软件库,那是SSR/HSR的事。
  • 误区二:SSR和HSR重复。比如SSR写了“Flash数据完整性保护”,HSR也写了同样的内容。这会导致测试时两边都测,或者两边都以为对方在测。明确分工:硬件负责ECC检测,软件负责重读校验。
  • 误区三:忽略ASIL分解。如果一个TSR是ASIL D,但分解后的SSR只覆盖了ASIL B,那剩下的ASIL D谁来覆盖?要么硬件承担,要么加冗余。别让ASIL等级在分解过程中“缩水”。
我的习惯:每次分解完,我会做一次“ASIL等级审计”。拿个表格,把每个TSR的ASIL等级和它分解出的所有SSR/HSR的ASIL等级列在一起,确保没有降级。如果降级了,必须有充分的独立性证据。

好了,这一讲的内容就是这些。记住,安全需求分解是功能安全落地的第一步,也是最重要的一步。分解得好,后面的设计、实现、测试都会顺畅很多。分解得不好……嗯,后面全是坑。