第四章:威胁建模与风险评估
“如果你不知道你在防御什么,你就无法有效地防御。”
mindmap
root((威胁建模))
方法论
STRIDE
DREAD
PASTA
Attack Tree
数据流图
信任边界
数据流
处理过程
数据存储
OWASP Top 10
注入
认证失败
访问控制
风险评估
可能性
影响
优先级
4.1 为什么需要威胁建模
威胁建模是一种结构化的方法,用于识别、量化和解决与应用程序安全相关的威胁。它回答四个核心问题:
我们在构建什么?(系统架构)
什么可能出错?(威胁识别)
我们该怎么办?(缓解措施)
我们做得够好吗?(验证)
威胁建模的时机:
┌─────────────────────────────────────────────┐
│ 需求阶段 │ 识别安全需求和合规要求 │
│ 设计阶段 │ ★ 威胁建模的最佳时机 ★ │
│ 开发阶段 │ 增量威胁建模(新功能) │
│ 测试阶段 │ 验证威胁缓解措施 │
│ 运维阶段 │ 更新威胁模型(新威胁) │
└─────────────────────────────────────────────┘
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) |
|---|---|---|
Damage |
造成的损害程度 |
10 = 完全系统被攻破 |
Reproducibility |
攻击的可重复性 |
10 = 每次都能成功 |
Exploitability |
利用的难易程度 |
10 = 无需技术知识 |
Affected Users |
受影响的用户范围 |
10 = 所有用户 |
Discoverability |
漏洞的可发现性 |
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) |
缓解措施优先级
# 威胁建模结果的代码化管理
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)的概论,为后续深入探讨认证和授权技术打下基础。