# 第四章:威胁建模与风险评估 > "如果你不知道你在防御什么,你就无法有效地防御。" ```{mermaid} mindmap root((威胁建模)) 方法论 STRIDE DREAD PASTA Attack Tree 数据流图 信任边界 数据流 处理过程 数据存储 OWASP Top 10 注入 认证失败 访问控制 风险评估 可能性 影响 优先级 ``` ## 4.1 为什么需要威胁建模 威胁建模是一种**结构化的方法**,用于识别、量化和解决与应用程序安全相关的威胁。它回答四个核心问题: 1. **我们在构建什么?**(系统架构) 2. **什么可能出错?**(威胁识别) 3. **我们该怎么办?**(缓解措施) 4. **我们做得够好吗?**(验证) ``` 威胁建模的时机: ┌─────────────────────────────────────────────┐ │ 需求阶段 │ 识别安全需求和合规要求 │ │ 设计阶段 │ ★ 威胁建模的最佳时机 ★ │ │ 开发阶段 │ 增量威胁建模(新功能) │ │ 测试阶段 │ 验证威胁缓解措施 │ │ 运维阶段 │ 更新威胁模型(新威胁) │ └─────────────────────────────────────────────┘ ``` ## 4.2 STRIDE 威胁模型 STRIDE 是微软提出的威胁分类方法,每个字母代表一种威胁类型: | 威胁 | 全称 | 描述 | 违反的安全属性 | 示例 | |------|------|------|--------------|------| | **S** | Spoofing | 身份伪造 | 认证 | 伪造 JWT Token | | **T** | Tampering | 数据篡改 | 完整性 | 修改 API 请求参数 | | **R** | Repudiation | 否认 | 不可否认性 | 否认执行过删除操作 | | **I** | Information Disclosure | 信息泄露 | 机密性 | API 返回敏感数据 | | **D** | Denial of Service | 拒绝服务 | 可用性 | DDoS 攻击 | | **E** | Elevation of Privilege | 权限提升 | 授权 | 普通用户获取管理员权限 | ### STRIDE 与系统组件的映射 | 组件类型 | 常见威胁 | |---------|---------| | 外部实体(用户/外部系统) | S(身份伪造) | | 数据流(网络通信) | T(篡改)、I(信息泄露) | | 处理过程(服务/API) | S、T、R、I、D、E(全部) | | 数据存储(数据库/文件) | T(篡改)、I(信息泄露)、D(拒绝服务) | ## 4.3 数据流图(DFD)与信任边界 数据流图是威胁建模的基础工具,用于可视化系统的数据流动。 ### DFD 元素 ``` ┌─────────┐ │ 外部实体 │ 矩形:用户、外部系统 └─────────┘ ( 处理过程 ) 圆形:服务、API、函数 ═══════════ 双线:数据存储(数据库、文件) ──────────▶ 箭头:数据流 ┄┄┄┄┄┄┄┄┄┄ 虚线:信任边界 ``` ### 示例:Web 应用的 DFD ``` 信任边界 ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄ ┄ ┌──────────┐ ┄ ┌──────────┐ ┌──────────┐ ┄ │ │ HTTPS ┄ │ │ │ │ ┄ │ 浏览器 │──────▶┄──▶│ API 网关 │───▶│ 认证服务 │ ┄ │ (用户) │◀──────┄──◀│ │◀───│ │ ┄ │ │ ┄ └────┬─────┘ └──────────┘ ┄ └──────────┘ ┄ │ ┄ ┄ ▼ ┄ ┄ ┌──────────┐ ┌──────────┐ ┄ ┄ │ │ │ │ ┄ ┄ │ 业务服务 │───▶│ 数据库 │ ┄ ┄ │ │◀───│ │ ┄ ┄ └──────────┘ └──────────┘ ┄ ┄ ┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ``` ### 对每个数据流应用 STRIDE | 数据流 | S | T | R | I | D | E | |--------|---|---|---|---|---|---| | 浏览器 → API 网关 | ✅ 伪造身份 | ✅ 篡改请求 | ✅ 否认操作 | ✅ 窃听 | ✅ 洪水攻击 | — | | API 网关 → 认证服务 | ✅ 伪造请求 | ✅ 篡改 Token | — | ✅ Token 泄露 | ✅ 服务不可用 | — | | 业务服务 → 数据库 | — | ✅ SQL 注入 | — | ✅ 数据泄露 | ✅ 资源耗尽 | ✅ 权限提升 | ## 4.4 DREAD 风险评分 DREAD 用于量化每个威胁的风险等级: | 维度 | 含义 | 评分(1-10) | |------|------|-------------| | **D**amage | 造成的损害程度 | 10 = 完全系统被攻破 | | **R**eproducibility | 攻击的可重复性 | 10 = 每次都能成功 | | **E**xploitability | 利用的难易程度 | 10 = 无需技术知识 | | **A**ffected Users | 受影响的用户范围 | 10 = 所有用户 | | **D**iscoverability | 漏洞的可发现性 | 10 = 公开已知 | **风险分数 = (D + R + E + A + D) / 5** | 分数范围 | 风险等级 | 处理优先级 | |---------|---------|-----------| | 1-3 | 低 | 可接受,记录并监控 | | 4-6 | 中 | 计划修复 | | 7-9 | 高 | 尽快修复 | | 10 | 极高 | 立即修复 | ### 示例评估 ``` 威胁:SQL 注入攻击 ┌──────────────────┬───────┬──────────────────────┐ │ 维度 │ 评分 │ 理由 │ ├──────────────────┼───────┼──────────────────────┤ │ Damage │ 9 │ 可获取全部数据 │ │ Reproducibility │ 8 │ 一旦发现,容易重复 │ │ Exploitability │ 7 │ 有现成工具(sqlmap) │ │ Affected Users │ 10 │ 所有用户数据受影响 │ │ Discoverability │ 8 │ 自动化扫描可发现 │ ├──────────────────┼───────┼──────────────────────┤ │ 平均分 │ 8.4 │ 高风险 → 尽快修复 │ └──────────────────┴───────┴──────────────────────┘ ``` ## 4.5 PASTA 威胁建模 PASTA(Process for Attack Simulation and Threat Analysis)是一个以风险为中心的七步威胁建模方法: ``` ┌─────────────────────────────────────────────┐ │ 第1步:定义业务目标 │ │ → 识别关键业务流程和合规要求 │ ├─────────────────────────────────────────────┤ │ 第2步:定义技术范围 │ │ → 绘制架构图、识别技术组件 │ ├─────────────────────────────────────────────┤ │ 第3步:应用分解 │ │ → 绘制 DFD、识别信任边界 │ ├─────────────────────────────────────────────┤ │ 第4步:威胁分析 │ │ → 收集威胁情报、识别攻击者画像 │ ├─────────────────────────────────────────────┤ │ 第5步:漏洞分析 │ │ → 识别已知漏洞、弱点 │ ├─────────────────────────────────────────────┤ │ 第6步:攻击建模 │ │ → 构建攻击树、模拟攻击路径 │ ├─────────────────────────────────────────────┤ │ 第7步:风险与影响分析 │ │ → 量化风险、确定缓解优先级 │ └─────────────────────────────────────────────┘ ``` ## 4.6 攻击树(Attack Tree) 攻击树是一种自顶向下的威胁分析方法,根节点是攻击目标,叶节点是具体的攻击手段: ``` 窃取用户数据 [攻击目标] / | \ / | \ SQL注入 API漏洞 社会工程 / \ | / \ / \ | / \ 搜索框 登录表单 未授权 钓鱼邮件 电话诈骗 注入 注入 API端点 ($100) ($100) ($500) ($50) ($200) [AND] [AND] [OR] [OR] [OR] | | 无输入 无参数 验证 化查询 ``` ## 4.7 OWASP Top 10(2021) OWASP Top 10 是最权威的 Web 应用安全风险列表: | 排名 | 风险 | 描述 | 防御 | |------|------|------|------| | A01 | 访问控制失效 | 未正确实施访问控制 | RBAC/ABAC、默认拒绝 | | A02 | 加密失败 | 敏感数据未加密或加密不当 | TLS、AES-GCM、密钥管理 | | A03 | 注入 | SQL/NoSQL/OS/LDAP 注入 | 参数化查询、输入验证 | | A04 | 不安全设计 | 架构级安全缺陷 | 威胁建模、安全设计模式 | | A05 | 安全配置错误 | 默认配置、不必要的功能 | 安全基线、自动化检查 | | A06 | 脆弱和过时组件 | 使用有漏洞的依赖 | SCA、依赖更新 | | A07 | 认证和识别失败 | 弱密码、Session 管理不当 | MFA、安全 Session | | A08 | 软件和数据完整性失败 | 不安全的 CI/CD、反序列化 | 签名验证、SBOM | | A09 | 安全日志和监控失败 | 缺乏审计日志和告警 | 集中日志、SIEM | | A10 | SSRF | 服务端请求伪造 | URL 白名单、网络隔离 | ## 4.8 威胁建模实战 以一个典型的微服务电商系统为例: ### 系统架构 ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 移动端 │ │ Web 端 │ │ 第三方 │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ ┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄ 信任边界 │ │ │ ▼ ▼ ▼ ┌─────────────────────────────────────────┐ │ API Gateway │ │ (认证、限流、路由) │ └────┬──────────┬──────────┬──────────────┘ │ │ │ ▼ ▼ ▼ ┌────────┐ ┌────────┐ ┌────────┐ │用户服务 │ │订单服务 │ │支付服务 │ └───┬────┘ └───┬────┘ └───┬────┘ │ │ │ ▼ ▼ ▼ ┌────────┐ ┌────────┐ ┌────────┐ │用户 DB │ │订单 DB │ │支付网关 │ └────────┘ └────────┘ └────────┘ ``` ### STRIDE 分析结果 | 组件 | 威胁 | 风险 | 缓解措施 | |------|------|------|---------| | API Gateway | S: 伪造 Token | 高 | JWT 验证 + Token 黑名单 | | API Gateway | D: DDoS | 高 | 速率限制 + WAF + CDN | | 用户服务 | I: 用户数据泄露 | 高 | 数据加密 + 最小权限 | | 用户服务 | E: 权限提升 | 高 | RBAC + 输入验证 | | 订单服务 | T: 订单篡改 | 高 | 数字签名 + 审计日志 | | 支付服务 | S: 支付伪造 | 极高 | mTLS + 双重验证 | | 支付服务 | R: 否认交易 | 高 | 审计日志 + 数字签名 | | 数据库 | T: SQL 注入 | 高 | 参数化查询 + ORM | | 数据库 | I: 数据泄露 | 高 | 加密存储 + 访问控制 | | 服务间通信 | I: 窃听 | 中 | mTLS(SPIFFE/SPIRE) | ### 缓解措施优先级 ```python # 威胁建模结果的代码化管理 from dataclasses import dataclass from enum import Enum class Severity(Enum): LOW = 1 MEDIUM = 2 HIGH = 3 CRITICAL = 4 class Status(Enum): OPEN = "open" IN_PROGRESS = "in_progress" MITIGATED = "mitigated" ACCEPTED = "accepted" @dataclass class Threat: id: str category: str # STRIDE component: str description: str severity: Severity mitigation: str status: Status # 威胁清单 threats = [ Threat("T001", "Spoofing", "API Gateway", "伪造 JWT Token 访问受保护资源", Severity.HIGH, "使用 RS256 签名 + Token 黑名单 + 短过期时间", Status.IN_PROGRESS), Threat("T002", "Injection", "用户服务", "SQL 注入获取用户数据", Severity.CRITICAL, "使用 ORM + 参数化查询 + 输入验证", Status.MITIGATED), Threat("T003", "Information Disclosure", "服务间通信", "明文通信被窃听", Severity.MEDIUM, "部署 SPIRE 实现自动 mTLS", Status.OPEN), ] # 按严重程度排序 for t in sorted(threats, key=lambda x: x.severity.value, reverse=True): print(f"[{t.severity.name}] {t.id}: {t.description} - {t.status.value}") ``` ## 4.9 风险评估矩阵 ``` 影响程度 │ 高│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ 中风险 │ │ 高风险 │ │ 极高风险 │ │ │ │ │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ 中│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ 低风险 │ │ 中风险 │ │ 高风险 │ │ │ │ │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ 低│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ 极低风险 │ │ 低风险 │ │ 中风险 │ │ │ │ │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └──────────────────────────────────────── 可能性 低 中 高 ``` ## 4.10 小结 本章介绍了威胁建模的核心方法和实践: - **STRIDE** 提供了系统化的威胁分类框架 - **数据流图(DFD)** 帮助可视化系统架构和信任边界 - **DREAD** 和风险矩阵用于量化和优先排序威胁 - **PASTA** 提供了完整的七步威胁建模流程 - **OWASP Top 10** 是 Web 应用安全的权威参考 - 威胁建模应该在**设计阶段**进行,并在整个生命周期中持续更新 在下一章中,我们将学习身份与访问管理(IAM)的概论,为后续深入探讨认证和授权技术打下基础。