威胁建模基础: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. 一个完整的实战流程
最后,我总结一下做威胁建模的完整步骤。你照着做就行:
- 画DFD——把系统拆成外部实体、过程、存储、数据流
- 标资产——圈出攻击者最想要的东西
- 画信任边界——用虚线标出每个边界
- 套STRIDE——对每个DFD元素,问自己六类威胁是否可能
- 排优先级——按风险等级排序,先修最要命的
- 记录归档——把威胁模型文档化,方便后续回归
记住:威胁建模不是一次性的。每次迭代、每次加新功能,都要重新过一遍。我见过太多团队做完一次就扔一边,结果新加的OTA功能成了最大的漏洞。
好了,这一章的内容就到这里。下一章我们会深入讲如何把STRIDE模型落地到具体的嵌入式架构中,包括怎么给每个威胁设计缓解措施。到时候见。
公众号:蓝海资料掘金营,微信deep3321