3. 安全威胁建模

安全基线与验收不是“把能关的端口都关掉”,而是先回答三个问题:我们要保护什么、对手会怎么打、打成功后会造成什么后果。威胁建模就是把这三个问题结构化,让后续的基线项、测试用例和验收判据都有出处。本节围绕 STRIDE 分类、攻击树分析、嵌入式典型威胁场景与资产识别展开,形成可落地的建模流程。

一、核心原理:从资产到威胁的结构化推导

威胁建模的起点是资产识别。嵌入式设备的资产不只是固件二进制,还包括:启动链(BootROM、SPL、U-Boot)、密钥与证书、调试接口(JTAG/SWD/UART)、通信通道(BLE、Zigbee、MQTT、CAN)、设备身份(Device ID、证书私钥)、用户数据与配置、以及设备被攻陷后可作为跳板进入的云端或内网资源。资产识别要标注“价值”和“暴露面”:价值决定保护强度,暴露面决定攻击可达性。

在资产清单之上,用 STRIDE 对每一条数据流和交互点做分类检查。STRIDE 是六类威胁的缩写:Spoofing(仿冒)、Tampering(篡改)、Repudiation(抵赖)、Information Disclosure(信息泄露)、Denial of Service(拒绝服务)、Elevation of Privilege(权限提升)。它的价值在于“不遗漏”:对每个接口、每条消息、每个存储点逐项过一遍,比凭经验拍脑袋更可靠。

威胁建模的输出不是一份报告,而是一组可验证的假设:每条威胁都应能对应到具体的基线项、测试方法或验收判据,否则它只是“担忧”,不是“威胁”。

二、方法流程:STRIDE 与攻击树的配合使用

推荐流程为:资产识别 → 画数据流图(DFD)→ 标注信任边界 → STRIDE 逐项分析 → 对高危路径建攻击树 → 映射到基线与验收项。数据流图不必复杂,标出外部实体、进程、数据存储、数据流和信任边界即可。信任边界是重点:跨边界处就是攻击者最可能下手的位置。

STRIDE 分析时,对每个元素问对应的问题:外部实体是否可被仿冒?数据流是否可被篡改或窃听?进程是否可被提权?数据存储是否可被非授权读取?设备是否可被拒绝服务?操作是否可被抵赖?把答案记录为“威胁—影响—可能性—缓解措施”。

攻击树用于对高价值目标做纵深推演。根节点是攻击者目标(如“获取固件中的私钥”),子节点是达成目标的子目标或手段,叶子节点是具体攻击动作。攻击树能暴露“多条路径中只要一条成立即可成功”的现实,帮助确定优先级。

攻击树示例:获取设备私钥
根:读取设备私钥
├─ 物理接触
│  ├─ 读取未加密 Flash
│  ├─ 通过 UART 进入 U-Boot 并 dump
│  └─ 利用 JTAG 调试口读取内存
├─ 网络攻击
│  ├─ 利用固件升级接口上传恶意固件
│  ├─ 利用调试服务命令执行
│  └─ 利用弱口令登录管理页面
└─ 供应链
   ├─ 从固件包中提取硬编码密钥
   └─ 从日志或配置文件中获取凭据

攻击树建好后,对叶子节点标注“可行性”和“所需条件”,再与 STRIDE 结果合并,形成威胁清单。清单中的每一项都要有明确的缓解措施和验收方法,例如“关闭 JTAG”对应“物理接口测试:尝试连接 JTAG 应无法读取内存”。

三、嵌入式设备典型威胁场景

嵌入式设备的威胁场景与通用 IT 有明显差异,常见的有:

  • 固件提取与逆向:Flash 未加密、调试口未关闭,攻击者可直接读取固件并提取密钥、算法和硬编码凭据。
  • 固件篡改与降级:升级包未签名或未校验版本,攻击者刷入恶意固件或降级到有漏洞的旧版本。
  • 调试接口滥用:UART 暴露 shell、JTAG 可读写内存,攻击者获得设备控制权。
  • 通信窃听与重放:BLE/Zigbee/无线通信未加密或未做防重放,攻击者可窃取数据或重放控制指令。
  • 拒绝服务:资源受限设备易被大量连接、畸形报文或耗尽内存的攻击打瘫。
  • 供应链与云侧风险:设备证书共用、云端接口鉴权不足,单台设备被攻陷后可横向影响其他设备。

这些场景的共同点是:攻击面往往来自“为了方便而保留的接口”和“为了省成本而省略的校验”。威胁建模的作用就是把这些“默认存在”的风险显式化。

四、资产识别清单与 STRIDE 映射表

下表给出一个可复用的资产—威胁映射模板,实际项目中可按设备类型增删。表中“验收关注点”直接对应后续基线测试项。

资产STRIDE 主要威胁典型场景验收关注点
启动链(BootROM/SPL/U-Boot)篡改、提权刷入未签名引导程序安全启动是否强制校验签名
固件与升级包篡改、信息泄露提取固件、降级攻击签名校验、防回滚、加密存储
调试接口(JTAG/UART/SWD)提权、信息泄露通过调试口读内存量产是否关闭或鉴权
密钥与证书信息泄露、仿冒硬编码密钥被提取密钥是否安全存储、是否可导出
无线通信通道窃听、重放、仿冒重放开锁指令加密、防重放、双向认证
设备身份仿冒、抵赖伪造设备接入云端一机一密、证书唯一性
云端接口提权、DoS越权访问其他设备数据鉴权、限流、输入校验

五、误区与复盘

常见误区一:把威胁建模做成“一次性文档”。设备固件、云接口、攻击手法都在变,威胁模型必须随版本迭代更新。误区二:只做 STRIDE 不做攻击树,导致“分类齐全但优先级不清”。误区三:资产识别只列硬件,忽略密钥、证书、日志和云端凭据。误区四:威胁没有对应验收项,导致建模与测试脱节。

复盘时建议检查三件事:第一,每条高危威胁是否都有明确的缓解措施和验收方法;第二,攻击树中“低成本高收益”的叶子节点是否已被基线覆盖;第三,信任边界是否随架构变化重新标注。只有把威胁建模的结论落到基线项和验收判据上,安全基线才不是一张静态清单,而是可验证、可迭代的工程约束。

嵌入式设备威胁建模:资产 → STRIDE → 攻击树 → 验收项 ① 资产识别 启动链 / 固件 / 密钥 调试口 / 通信 / 身份 云端接口 / 用户数据 标注价值与暴露面 ② 数据流图 DFD 外部实体 / 进程 数据存储 / 数据流 信任边界标注 跨边界即高风险点 ③ STRIDE 分析 仿冒 / 篡改 / 抵赖 信息泄露 / 拒绝服务 权限提升 逐元素逐项检查 ④ 攻击树 根:攻击目标 子目标 / 手段 叶子:具体动作 标注可行性与条件 ⑤ 威胁清单:威胁 — 影响 — 可能性 — 缓解措施 — 验收方法 每条威胁必须能映射到具体基线项与测试用例,否则只是“担忧” ⑥ 映射到安全基线与验收判据 基线项 关闭 JTAG / 签名校验 测试方法 物理接口测试 / 固件提取 验收判据 无法读取 / 校验失败即拒绝 版本迭代 / 架构变更后重新建模