3. 威胁建模与风险分析
威胁建模不是一次性的文档工作,而是把“系统怎么被攻击”这件事从模糊担忧变成可讨论、可排序、可验证的结构化过程。它的核心价值在于:在代码和配置落地之前,先把资产、信任边界、攻击路径和风险优先级摆到桌面上。本节围绕 STRIDE、攻击树和 DREAD 三种互补方法展开,并给出一套可在企业场景中直接套用的建模流程。
一、STRIDE:按攻击者目标分类威胁
STRIDE 由微软提出,它把威胁按攻击者想达成的效果分成六类,便于在架构评审时逐项排查。理解它的关键是:每一类威胁都对应一个安全属性被破坏。
| 威胁类型 | 破坏的安全属性 | 企业场景示例 |
|---|---|---|
| Spoofing 仿冒 | 认证 | 伪造员工身份登录 VPN,或伪造服务端证书接入内部 API |
| Tampering 篡改 | 完整性 | 修改订单金额、篡改审计日志、替换镜像中的依赖包 |
| Repudiation 抵赖 | 不可否认性 | 管理员否认执行过高危操作,日志缺失或可被删除 |
| Information Disclosure 信息泄露 | 机密性 | 对象存储桶公开、错误信息回显数据库结构、日志打印令牌 |
| Denial of Service 拒绝服务 | 可用性 | 登录接口被撞库打满、消息队列被大量无效消息阻塞 |
| Elevation of Privilege 权限提升 | 授权 | 普通用户通过越权接口读取他人数据,或容器逃逸获得宿主机权限 |
实操时,STRIDE 最有效的用法是“按元素逐项过”。先画数据流图(DFD),标出外部实体、进程、数据存储、数据流和信任边界,然后对每个元素问:这里可能发生哪几类威胁?例如对“Web 前端 → API 网关”这条跨信任边界的数据流,仿冒、篡改、信息泄露和拒绝服务都值得讨论;而对“API 网关 → 用户数据库”的进程与存储交互,权限提升和篡改往往更突出。这样做的结果是威胁清单有明确归属,而不是泛泛而谈。
二、攻击树:从攻击者目标反推路径
STRIDE 擅长“找全”,攻击树擅长“走深”。攻击树以攻击者的最终目标为根节点,向下分解为子目标,直到叶子节点是可执行的具体动作。节点之间用 AND/OR 关系连接:OR 表示任一子节点成功即可达成父目标,AND 表示所有子节点都成功才能达成父目标。
以“获取企业财务系统管理员权限”为根目标,可以构造如下攻击树:
根目标:获取财务系统管理员权限
├── OR 窃取管理员凭据
│ ├── OR 钓鱼获取口令
│ │ ├── 伪造登录页(需域名相似 + 邮件绕过)
│ │ └── 诱导 MFA 疲劳确认
│ ├── OR 从代码仓库泄露中提取密钥
│ └── AND 撞库成功
│ ├── 已泄露口令库命中
│ └── 目标未启用登录失败锁定
├── OR 利用应用漏洞直接提权
│ ├── 越权接口未校验角色
│ └── 反序列化漏洞执行任意代码
└── OR 绕过认证进入管理后台
├── 管理后台暴露在公网且弱口令
└── SSO 配置错误导致断言伪造
攻击树的价值在于暴露“AND 节点”上的防御杠杆。例如“撞库成功”需要同时满足口令泄露和未锁定两个条件,那么启用失败锁定、异常登录检测就能直接切断这条路径。企业实践中,建议只对高价值目标(核心数据库、域控、支付链路、CI/CD 发布权限)建树,避免为每个系统都画一棵树而失去重点。
三、DREAD:给威胁排优先级
找到威胁之后,必须回答“先修哪个”。DREAD 用五个维度打分,通常每项 1~10 分,取平均或加权得到风险值:
- Damage Potential(潜在损害):成功攻击后造成多大损失。
- Reproducibility(可复现性):攻击是否稳定可重复。
- Exploitability(可利用性):需要多少技能、工具和前置条件。
- Affected Users(影响用户数):波及范围。
- Discoverability(可发现性):攻击者多容易找到该弱点。
例如“管理后台公网暴露且使用弱口令”可评为:损害 9、可复现 9、可利用 8、影响用户 7、可发现 8,平均约 8.2,属于必须立即处置。而“某内部测试接口存在低危信息泄露”可能为:损害 3、可复现 5、可利用 4、影响用户 2、可发现 3,平均 3.4,可排入后续迭代。DREAD 的主观性较强,企业落地时更推荐把它作为“排序工具”而非“精确评分”,并固定评分口径,避免不同团队各打各的分。
四、企业场景下的建模实战流程
把三种方法串起来,可以形成一条可复用的工作流。以下流程适合在架构评审或迭代规划阶段执行,通常 2~4 小时可完成一个中等规模系统的首轮建模。
- 确定范围与资产:明确本次建模覆盖哪个系统、哪些数据、哪些角色。例如“财务结算系统,涉及订单金额、银行账号、管理员权限”。
- 画数据流图并标信任边界:至少标出互联网、DMZ、内网办公区、生产核心区四层边界,以及跨边界的每一条数据流。
- 用 STRIDE 逐元素排查:对每条数据流、每个进程、每个存储问六类威胁,记录“元素 + 威胁类型 + 简要描述”。
- 对高价值目标建攻击树:只对根目标建树,分解到可执行动作,标出 AND/OR 关系,识别 AND 节点上的防御杠杆。
- 用 DREAD 打分排序:固定评分口径,输出优先级列表,明确“立即修复 / 短期修复 / 迭代修复 / 接受”。
- 验证与回归:修复后复测对应攻击路径是否被切断,更新威胁模型,形成闭环记录。
五、可直接使用的威胁建模记录表
为了让建模结果可追踪、可复测,建议每个威胁条目至少记录以下字段。下表给出一个填写示例,字段可根据企业实际裁剪。
| 编号 | 元素/位置 | STRIDE 类型 | 攻击路径摘要 | DREAD 均分 | 处置 | 验证方式 |
|---|---|---|---|---|---|---|
| T-001 | 管理后台入口 | Spoofing | 公网暴露 + 弱口令登录 | 8.2 | 立即:关闭公网、强口令+MFA | 外网扫描无管理端口;弱口令登录失败 |
| T-002 | 代码仓库 | Info Disclosure | AK/SK 硬编码泄露 | 6.2 | 短期:密钥轮换、最小权限 | 仓库扫描无密钥;旧密钥失效 |
| T-003 | 订单查询接口 | Elevation | 越权读取他人订单 | 6.6 | 迭代:统一鉴权中间件 | 用普通账号请求他人订单返回 403 |
| T-004 | 登录接口 | DoS | 撞库打满连接池 | 5.8 | 短期:限流+失败锁定 | 压测触发限流,正常用户不受影响 |
最后需要强调:威胁建模的产出不是一张漂亮的图,而是一组可验证的修复动作和明确的优先级。STRIDE 保证覆盖度,攻击树保证深度,DREAD 保证排序,三者结合才能在企业资源约束下把风险真正降下来。建模完成后,应把威胁清单纳入需求或缺陷跟踪系统,并在每次架构变更时增量更新,而不是等到下一次大评审才重新开始。