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 的主观性较强,企业落地时更推荐把它作为“排序工具”而非“精确评分”,并固定评分口径,避免不同团队各打各的分。

企业威胁建模闭环:STRIDE 找全 → 攻击树走深 → DREAD 排序 → 验证回归 ① STRIDE 分类排查 输入:DFD + 信任边界 S 仿冒 · T 篡改 · R 抵赖 I 泄露 · D 拒绝服务 E 权限提升 输出:威胁清单(带元素归属) 按数据流/进程/存储逐项过 ② 攻击树路径分解 输入:高价值目标 根:获取管理员权限 OR 窃取凭据 / 利用漏洞 AND 撞库 = 口令泄露 + 无锁定 输出:可执行攻击路径 AND 节点即防御杠杆 ③ DREAD 风险排序 输入:威胁清单 D 损害 · R 可复现 E 可利用 · A 影响用户 D 可发现(1~10 分) 输出:修复优先级 固定口径,避免各打各分 ④ 验证回归 输入:修复方案 复测攻击路径 确认路径被切断 更新威胁模型 输出:闭环记录 未验证=未修复 企业场景示例:财务系统“管理员权限获取”威胁建模片段 攻击路径(攻击树叶子节点) P1 钓鱼页窃取口令 + 诱导 MFA 疲劳 P2 代码仓库泄露 AK/SK 直连数据库 P3 管理后台公网暴露 + 弱口令 P4 越权接口未校验角色读取全量数据 红色路径 = 需优先切断的高危链路 DREAD 评分与处置(示例值) P3:9+9+8+7+8 → 8.2 立即修复(关闭公网、强口令+MFA) P1:8+7+6+6+7 → 6.8 短期修复(FIDO2 替代疲劳确认) P2:9+6+5+5+6 → 6.2 短期修复(密钥轮换+最小权限) P4:7+8+7+6+5 → 6.6 迭代修复(统一鉴权中间件) 评分口径固定:1~10 分,取算术平均,≥7 立即处置

四、企业场景下的建模实战流程

把三种方法串起来,可以形成一条可复用的工作流。以下流程适合在架构评审或迭代规划阶段执行,通常 2~4 小时可完成一个中等规模系统的首轮建模。

  1. 确定范围与资产:明确本次建模覆盖哪个系统、哪些数据、哪些角色。例如“财务结算系统,涉及订单金额、银行账号、管理员权限”。
  2. 画数据流图并标信任边界:至少标出互联网、DMZ、内网办公区、生产核心区四层边界,以及跨边界的每一条数据流。
  3. 用 STRIDE 逐元素排查:对每条数据流、每个进程、每个存储问六类威胁,记录“元素 + 威胁类型 + 简要描述”。
  4. 对高价值目标建攻击树:只对根目标建树,分解到可执行动作,标出 AND/OR 关系,识别 AND 节点上的防御杠杆。
  5. 用 DREAD 打分排序:固定评分口径,输出优先级列表,明确“立即修复 / 短期修复 / 迭代修复 / 接受”。
  6. 验证与回归:修复后复测对应攻击路径是否被切断,更新威胁模型,形成闭环记录。
建模时最容易犯的错误是“只列威胁不排优先级”。企业资源有限,必须把 DREAD 评分与业务影响结合,优先处理“高损害 + 高可复现 + 低利用门槛”的路径,例如公网暴露的管理后台、未鉴权的内部接口、长期未轮换的密钥。

五、可直接使用的威胁建模记录表

为了让建模结果可追踪、可复测,建议每个威胁条目至少记录以下字段。下表给出一个填写示例,字段可根据企业实际裁剪。

编号元素/位置STRIDE 类型攻击路径摘要DREAD 均分处置验证方式
T-001管理后台入口Spoofing公网暴露 + 弱口令登录8.2立即:关闭公网、强口令+MFA外网扫描无管理端口;弱口令登录失败
T-002代码仓库Info DisclosureAK/SK 硬编码泄露6.2短期:密钥轮换、最小权限仓库扫描无密钥;旧密钥失效
T-003订单查询接口Elevation越权读取他人订单6.6迭代:统一鉴权中间件用普通账号请求他人订单返回 403
T-004登录接口DoS撞库打满连接池5.8短期:限流+失败锁定压测触发限流,正常用户不受影响

最后需要强调:威胁建模的产出不是一张漂亮的图,而是一组可验证的修复动作和明确的优先级。STRIDE 保证覆盖度,攻击树保证深度,DREAD 保证排序,三者结合才能在企业资源约束下把风险真正降下来。建模完成后,应把威胁清单纳入需求或缺陷跟踪系统,并在每次架构变更时增量更新,而不是等到下一次大评审才重新开始。