第三章:威胁建模方法论

威胁建模,说白了就是「先想好敌人怎么打,再设计自己的盾牌」。

我在车载安全这行干了快十年,见过太多「先上车后补票」的项目——功能都开发完了,才想起来做安全分析。结果呢?要么大改架构,要么留一堆漏洞上线。所以,我建议每个项目在需求阶段就把威胁建模做起来。

3.1 STRIDE模型:微软的经典六步法

STRIDE 是微软提出的威胁分类模型。名字来自六种威胁类型的首字母:

字母 威胁类型 通俗解释 车载场景举例
S Spoofing(欺骗) 冒充别人身份 伪造ECU的CAN ID发送虚假报文
T Tampering(篡改) 修改数据或代码 刷写非法的固件到T-Box
R Repudiation(抵赖) 做了事不认账 攻击后删除日志,无法溯源
I Information Disclosure(信息泄露) 不该看的被看到了 通过OBD接口窃取车辆VIN和位置
D Denial of Service(拒绝服务) 让系统没法用 向CAN总线发送大量垃圾帧,导致网关瘫痪
E Elevation of Privilege(权限提升) 从小权限变成大权限 从IVI的普通应用提权到系统级root

我的经验:STRIDE 最适合用在「数据流图」上。你画好系统架构图,然后对着每个数据流、每个存储、每个进程,挨个问「这里能不能S?能不能T?能不能R?」。我习惯用Excel表格列出来,一行一个威胁,效率很高。

小技巧:车载项目里,Spoofing 和 Tampering 是最常见的。尤其是 CAN 总线上的欺骗攻击,几乎每个项目都会遇到。所以,优先关注这两个。

3.2 攻击树分析:把攻击路径画成一棵树

攻击树是 Bruce Schneier 提出的方法。根节点是攻击者的最终目标,子节点是达成目标需要的步骤。

举个例子,攻击者的目标是「远程控制车辆刹车」:

根目标:远程控制刹车
├── 1. 进入车载网络
│   ├── 1.1 通过T-Box远程入侵
│   │   ├── 1.1.1 利用T-Box固件漏洞
│   │   └── 1.1.2 暴力破解T-Box登录密码
│   └── 1.2 通过蓝牙近距离入侵
│       └── 1.2.1 破解蓝牙配对密钥
├── 2. 发送刹车指令
│   ├── 2.1 伪造CAN刹车报文
│   └── 2.2 篡改合法ECU的刹车逻辑
└── 3. 绕过安全监控
    └── 3.1 禁用网关的防火墙规则

为什么要画攻击树?因为你可以直观地看到:哪些路径最容易走通?哪些节点是「必由之路」?

避坑指南:我曾经犯过一个错误——攻击树画得太细,每个叶子节点都列了十几步。结果分析起来累死人,而且很多分支根本不可能实现。后来我学乖了:攻击树只画到「攻击方法」这一层,具体的技术细节留给后面的渗透测试去验证。

3.3 攻击路径图:从攻击者视角看全局

攻击路径图跟攻击树有点像,但更强调「顺序」和「依赖关系」。它像一张地铁线路图,告诉你从起点(攻击入口)到终点(攻击目标)需要经过哪些站。

我常用的画法是这样的:

  • 入口节点:攻击者从哪里进来?比如Wi-Fi、蓝牙、OBD接口、4G/5G网络。
  • 中间节点:攻击者需要攻破哪些组件?比如T-Box、网关、域控制器。
  • 目标节点:攻击者最终想控制什么?比如刹车系统、转向系统、车门锁。
  • :节点之间的攻击方法,比如「利用协议漏洞」、「暴力破解」、「提权」。

举个例子,一个典型的攻击路径:

[攻击者] → [Wi-Fi热点] → [IVI娱乐系统] → [网关] → [CAN总线] → [刹车ECU]

这条路径上,每个箭头都代表一个攻击步骤。你想想看,如果网关能拦住非法CAN报文,那攻击者就卡在网关这一站了。所以,网关就是「高价值防御点」。

我的建议:攻击路径图最好跟系统架构师一起画。因为他们最清楚数据怎么流、组件怎么连。我每次做威胁建模,都会拉上架构师开个1小时的会,在白板上画路径图。画完之后,安全方案也就清晰了。

3.4 威胁建模工具介绍

光靠脑子想和手画,容易漏。所以,我推荐用工具来辅助。下面是我用过的几款:

工具名称 类型 优点 缺点
Microsoft Threat Modeling Tool 桌面软件 免费、自带STRIDE模板、自动生成威胁列表 只支持Windows、模板偏IT,车载场景需要自定义
OWASP Threat Dragon Web/桌面 开源、跨平台、支持多人协作 功能相对简单,没有自动威胁分析
IriusRisk 商业软件 支持完整的安全开发生命周期、集成度高 收费、学习曲线陡
draw.io + 自定义模板 在线/桌面 灵活、免费、可以自己画攻击树和路径图 没有自动分析功能,全靠人工

我的选择:小团队或者项目初期,我推荐用 draw.io 自己画。因为车载系统的组件跟IT系统差别很大——你很难在微软的工具里找到「T-Box」或「网关」的图标。等架构稳定了,再用 IriusRisk 做正式的威胁库管理。

3.5 实战:把方法论用起来

光说不练假把式。我拿一个真实的项目举例:

某款新能源车的T-Box,支持远程OTA升级。我们做威胁建模时,用了STRIDE+攻击树组合:

  1. 画数据流图:T-Box从云端下载固件 → 校验签名 → 写入Flash → 重启生效。
  2. 套STRIDE
    • Spoofing:攻击者能不能伪造云端服务器?能,如果证书验证不严。
    • Tampering:攻击者能不能篡改固件包?能,如果签名算法有漏洞。
    • Denial of Service:攻击者能不能让T-Box一直下载失败?能,如果网络协议有缺陷。
  3. 画攻击树:根目标是「刷入恶意固件」。子节点包括「绕过签名校验」、「利用缓冲区溢出」、「降级攻击」等。
  4. 找防御点:签名校验是必由之路,所以重点加固。我们用了硬件安全模块(HSM)来存储签名公钥,防止被篡改。

结果:这个项目后来通过了第三方安全测试,没有发现高危漏洞。说实话,威胁建模帮了大忙——它让我们在开发阶段就堵住了好几个坑。

3.6 总结:别让方法论变成形式主义

威胁建模不是「做完文档就完事」的。我见过一些团队,花了两周画了精美的攻击树,然后扔到文件夹里吃灰。这完全失去了意义。

我的习惯是:威胁建模的输出要跟开发任务挂钩。比如,每个威胁对应一个JIRA ticket,分配给对应的开发人员去修复。修复完了,还要回归测试,确认漏洞真的堵上了。

嗯,这一章就讲到这里。下一章,我们会聊攻击面识别——说白了,就是「你的车到底哪里能被打」。到时候我会分享一些我在实车测试中发现的「惊喜」。