第四章:威胁建模与风险评估

“如果你不知道你在防御什么,你就无法有效地防御。”

        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)

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)的概论,为后续深入探讨认证和授权技术打下基础。