威胁建模入门:STRIDE模型详解、数据流图(DFD)绘制、威胁识别与分级

威胁建模这件事,说白了就是在攻击者动手之前,你先替他把路走一遍。我见过太多团队上来就写代码、调板子,等到渗透测试时才发现——嗯,这里有个后门,那里能直接读内存。那时候再改,成本就高了去了。

我个人习惯,每个新项目启动的第一周,必须做一次威胁建模。不是走过场,是真的坐下来,把系统拆开看。今天我们就聊聊怎么干这件事。

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

STRIDE 是微软提出来的威胁分类法。六个字母,对应六类威胁。你想想看,任何一个安全漏洞,基本都能归到其中一类里。

字母 威胁类型 通俗理解 典型例子
S Spoofing(假冒) 你是谁?我凭什么信你? 伪造身份、重放攻击
T Tampering(篡改) 数据在路上被人动了手脚 固件注入、参数篡改
R Repudiation(抵赖) 做了不认账 缺少审计日志、日志被删
I Information Disclosure(信息泄露) 不该看的人看到了 侧信道、内存dump
D Denial of Service(拒绝服务) 系统瘫了,谁也甭用 电压毛刺、时钟故障
E Elevation of Privilege(权限提升) 普通用户干管理员的事 缓冲区溢出、越权调用
我的经验: 做故障注入测试时,最常碰到的就是 T 和 D。篡改固件、打乱时钟,这两招在硬件层面特别好使。但别忘了 I——侧信道泄露密钥,我就在一个看似安全的加密芯片上栽过跟头。

数据流图(DFD):把系统画出来,威胁才看得见

光背 STRIDE 没用,你得把它用到自己的系统上。怎么用?先画 DFD。

DFD 有四个基本元素,记住就行:

  • 外部实体(矩形):人、其他系统、云端服务
  • 过程(圆形/椭圆):处理数据的模块,比如加密引擎、认证服务
  • 数据存储(双横线):数据库、文件、寄存器
  • 数据流(箭头):数据怎么走,走什么协议

画 DFD 有个关键原则:只画数据,不画控制流。我刚开始画的时候总想把 if-else 也画进去,结果图乱成一锅粥。记住,DFD 关心的是数据从哪里来、到哪里去、存哪里、谁处理它。

避坑指南: 我曾经在一个车联网项目里,团队画了 DFD 但漏掉了 OTA 升级通道的数据流。结果威胁建模时完全没覆盖远程固件篡改的风险。后来……嗯,后来我们补了三个安全补丁才堵上。

下面这张图,是我做安全评估时常用的 DFD 模板。它展示了一个典型的嵌入式系统数据流:

嵌入式系统数据流图(DFD)示例 用户 云端服务 认证 模块 加密 引擎 固件更新 服务 安全存储 (密钥/证书) 登录请求 会话密钥 固件包 写入固件 存储密钥 读取密钥 信任边界 说明:每个数据流箭头都代表一个潜在的威胁面。比如“固件包”这条流,如果没有签名验证,就是典型的 Tampering 风险。

威胁识别:对着STRIDE,逐个问问题

DFD 画好了,接下来就是拿着 STRIDE 这六把刀,对着每个元素挨个砍一遍。我习惯用表格来记录,这样一目了然。

举个例子,针对上面 DFD 中的「固件更新服务」这个过程:

STRIDE类别 威胁描述 影响
Spoofing 攻击者伪装成云端下发假固件 设备被植入恶意代码
Tampering 固件包在传输过程中被篡改 固件校验失败或执行恶意逻辑
Repudiation 固件更新没有日志,出了问题找不到原因 无法追溯攻击来源
Information Disclosure 固件包未加密,泄露内部算法或密钥 知识产权被盗
Denial of Service 攻击者发送大量无效更新请求,耗尽资源 设备无法正常更新
Elevation of Privilege 利用更新服务漏洞获取系统最高权限 完全控制设备
注意: 别想着一次把所有威胁都找全。我个人的做法是:第一轮先找最明显的,比如未加密的通信、硬编码的密钥。第二轮再深入,比如侧信道、故障注入这类硬件层面的威胁。贪多嚼不烂。

威胁分级:不是所有威胁都值得修

找到威胁之后,你得排个优先级。资源有限,不可能每个漏洞都修。我常用的方法是 DREAD 模型,给每个威胁打分:

  • D - Damage Potential(潜在损害):如果被利用,损失多大?
  • R - Reproducibility(可复现性):攻击者能稳定复现吗?
  • E - Exploitability(可利用性):攻击难度高不高?
  • A - Affected Users(受影响用户):多少人会遭殃?
  • D - Discoverability(可发现性):攻击者发现这个漏洞的难度?

每个维度打 1-3 分,总分越高,越要优先处理。我一般把 12-15 分的定为「高危」,8-11 分「中危」,5-7 分「低危」。低于 5 分的,先放一放。

举个例子: 上面提到的「固件包传输中被篡改」——损害 3 分(设备变砖),可复现 3 分(每次更新都能搞),可利用 2 分(需要中间人攻击),受影响用户 3 分(所有设备),可发现 2 分(抓包就能看到)。总分 13,高危。必须加签名验证。

小结一下

威胁建模不是一次性的工作。系统变了、攻击手法变了,你的模型也得跟着变。我每半年至少 revisite 一次已有的威胁模型,看看有没有新的攻击面冒出来。

STRIDE 帮你分类,DFD 帮你可视化,DREAD 帮你排优先级。这三样东西配合好,安全设计就有了底。下次我们聊具体怎么用故障注入去验证这些威胁——嗯,那才是真正动手的时候。