威胁建模基础:STRIDE模型介绍、数据流图绘制、识别资产与信任边界

大家好,我是你们的嵌入式安全讲师。今天我们来聊聊威胁建模。

说实话,很多工程师一听到「威胁建模」就觉得头大。觉得这是安全专家才该干的事。我自己刚入行时也这么想。直到有一次,我负责的一个物联网网关产品在渗透测试中被攻破——攻击者通过一个不起眼的调试接口拿到了root权限。嗯,从那以后,我再也不敢跳过威胁建模了。

威胁建模说白了就是:在攻击者动手之前,你先替他们想一遍怎么搞破坏。今天我会重点讲三个东西:STRIDE模型、数据流图绘制、以及如何识别资产与信任边界。

1. STRIDE模型:六类威胁,一个框架

STRIDE是微软提出来的威胁分类方法。每个字母代表一类威胁。我习惯把它贴在工位上,每次做新项目都过一遍。

字母 威胁类型 通俗解释 嵌入式场景举例
S Spoofing(假冒) 假装自己是别人 伪造传感器ID,发送虚假数据
T Tampering(篡改) 数据被动了手脚 固件升级包被篡改,植入后门
R Repudiation(抵赖) 做了事不认账 设备日志被删除,无法追溯操作
I Information Disclosure(信息泄露) 不该看的被看到了 调试串口打印了密钥
D Denial of Service(拒绝服务) 让系统瘫掉 大量无效请求耗尽MCU资源
E Elevation of Privilege(权限提升) 小兵当上了将军 从用户态漏洞拿到内核权限

我的经验:STRIDE不是让你一次性全做完。我通常先过一遍S、T、D这三个,因为它们对嵌入式系统威胁最大。剩下的后面再补。

2. 数据流图绘制:画清楚,才能想明白

数据流图(DFD)是威胁建模的「地图」。没有地图,你连敌人在哪都不知道。

绘制DFD时,我建议用四个基本元素:

  • 外部实体(矩形):人、其他系统、云平台
  • 过程(圆形):MCU上的任务、算法模块
  • 数据存储(双横线):Flash、RAM、SD卡
  • 数据流(箭头):通信方向

举个例子。一个智能门锁的简化DFD:

用户APP → [蓝牙通信] → 门锁MCU → [验证逻辑] → 电机驱动
                            ↓
                         [密钥存储区]

你想想看,这个图里有多少攻击面?蓝牙通信可能被嗅探,密钥存储区可能被读取,电机驱动可能被直接触发。每个箭头和每个存储点,都是潜在的威胁入口。

小技巧:画DFD时,别画得太细。我见过有人把每个函数调用都画出来,结果图比代码还复杂。控制在10-15个元素以内,够用就行。

3. 识别资产与信任边界

资产就是攻击者想要的东西。信任边界就是「谁可以信任谁」的分界线。

嵌入式系统里,常见的资产有:

  • 固件本身——攻击者想逆向或篡改
  • 密钥和证书——拿到它们就能冒充设备
  • 用户数据——隐私信息,比如指纹、密码
  • 设备控制权——让设备做不该做的事

信任边界怎么画?我有个简单粗暴的方法:每次数据跨越一个物理或逻辑边界,就是一条信任边界

比如:

  • MCU内部Flash → 外部SPI Flash:信任边界
  • 安全区 → 非安全区(TrustZone场景):信任边界
  • 设备 → 云端:信任边界

我曾经踩过的坑:有个项目,我把MCU内部的所有模块都画在同一个信任域里。结果攻击者通过一个温度传感器的I2C总线,直接读到了存放密钥的Flash区域。教训是:不同外设之间也要画信任边界,哪怕它们挂在同一个MCU上。

4. 把STRIDE套到DFD上

有了DFD和资产清单,接下来就是把STRIDE的六顶帽子挨个戴一遍。

我习惯用表格来梳理:

DFD元素 STRIDE威胁 具体描述 风险等级
蓝牙数据流 Spoofing 攻击者伪造合法APP连接
固件升级过程 Tampering 升级包被篡改
日志存储区 Repudiation 攻击者删除操作记录
调试串口 Information Disclosure 调试信息泄露密钥
网络接口 Denial of Service 大量连接请求导致MCU死机
用户态任务 Elevation of Privilege 漏洞导致内核代码执行

做完这个表,你就知道该优先修哪里了。我个人习惯先处理「高」风险的项,剩下的放到下一轮迭代。

5. 一个完整的实战流程

最后,我总结一下做威胁建模的完整步骤。你照着做就行:

  1. 画DFD——把系统拆成外部实体、过程、存储、数据流
  2. 标资产——圈出攻击者最想要的东西
  3. 画信任边界——用虚线标出每个边界
  4. 套STRIDE——对每个DFD元素,问自己六类威胁是否可能
  5. 排优先级——按风险等级排序,先修最要命的
  6. 记录归档——把威胁模型文档化,方便后续回归

记住:威胁建模不是一次性的。每次迭代、每次加新功能,都要重新过一遍。我见过太多团队做完一次就扔一边,结果新加的OTA功能成了最大的漏洞。

好了,这一章的内容就到这里。下一章我们会深入讲如何把STRIDE模型落地到具体的嵌入式架构中,包括怎么给每个威胁设计缓解措施。到时候见。


公众号:蓝海资料掘金营,微信deep3321