STRIDE & PASTA 威胁建模指南
对系统、API 和 AI 代理进行威胁建模的实用指南。
在执行 007 threat-model 或任何需要结构化威胁识别的安全分析时使用。
何时使用什么方法
| STRIDE | 组件级分析、快速威胁识别 | 低-中 | 每个组件的威胁列表 |
| PASTA | 完整系统风险分析、业务对齐 | 中-高 | 按优先级排序的攻击场景 |
| 两者结合 | 关键系统、合规要求 | 高 | 完整的威胁全景 |
经验法则:
- 快速代码审查或 PR?-> 对变更组件使用 STRIDE
- 新系统设计或架构审查?-> PASTA 完整流程
- 含敏感数据的生产系统?-> 两者结合(PASTA 用于策略,STRIDE 用于每个组件)
STRIDE 演练
STRIDE 将威胁分为六种类型。对每种类型问:“攻击者能对我的系统这样做吗?”
S – 欺骗(身份)
问题: 有人能冒充其他用户、服务或组件吗?
示例:
# 无认证的 API
GET /api/users/123/data # 任何人都可以访问任何用户的数据
# 使用弱密钥伪造的 JWT
jwt.encode({"user_id": "admin", "role": "superuser"}, "password123")
# 无来源验证的 Webhook
POST /webhooks/payment # 无签名验证,任何人都可以发送伪造事件
检测模式: 缺少认证中间件、硬编码/弱密钥、服务间无双向 TLS。
缓解措施: 强认证(OAuth 2.0、mTLS)、HMAC 签名验证、API 密钥轮换。
T – 篡改(数据完整性)
问题: 有人能篡改传输中、静态或处理中的数据吗?
示例:
# 修改数据的 SQL 注入
POST /api/transfer {"amount": "100; UPDATE accounts SET balance=999999 WHERE id=1"}
# HTTP(非 HTTPS)上的中间人攻击
# 攻击者拦截并修改 API 响应
# 未签名的配置文件
config.yaml 加载时无完整性检查 -> 攻击者将 log_level 修改为 DEBUG 以暴露密钥
检测模式: 无输入验证、HTTP 端点、文件缺少完整性检查、无校验和。
缓解措施: 输入验证/清理、所有地方使用 HTTPS、已签名的构件、数据库约束。
R – 抵赖(问责制)
问题: 有人能执行操作后否认吗?
示例:
# 金融交易无审计日志
def transfer_money(from_acc, to_acc, amount):
db.execute("UPDATE accounts …") # 无记录谁、何时、为何操作
# 日志存储在同一服务器上(攻击者可删除)
# 用户在未授权访问后删除自己的审计追踪
检测模式: 缺少审计日志、无时间戳/用户 ID 的日志、可变的日志存储、无日志转发。
缓解措施: 不可变的审计日志(仅追加)、集中日志记录(SIEM)、已签名的日志条目、一次写入存储。
I – 信息泄露
问题: 有人能访问他们不应看到的数据吗?
示例:
# 生产环境 API 响应中的堆栈跟踪
{
"error": "NullPointerException at com.app.UserService.getUser(UserService.java:42)",
"database": "postgresql://admin:s3cret@db.internal:5432/users"
}
# 通过 Web 服务器暴露的 .env 文件
GET /.env # 返回 API_KEY=sk-live-xxxxx, DB_PASSWORD=…
# 详细错误消息
"用户 admin@company.com 未找到" vs "无效凭证"(泄露有效邮箱)
检测模式: 生产环境中的详细错误、暴露的配置文件、端点缺少访问控制、调试模式启用。
缓解措施: 通用错误消息、密钥存放在保险库(非环境文件)、所有端点访问控制、生产环境禁用调试。
D – 拒绝服务
问题: 有人能使系统不可用吗?
示例:
# 无分页的无界查询
GET /api/users # 返回 1000 万条记录,服务器崩溃
# ReDoS – 正则表达式拒绝服务
import re
re.match(r"(a+)+$", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!") # 指数级回溯
# 昂贵操作无速率限制
POST /api/reports/generate # 每个请求需要 30 秒和 2GB 内存
检测模式: 缺少速率限制、无界查询、无超时的正则表达式、容器无资源限制。
缓解措施: 速率限制、分页、查询限制、断路器、资源配额、CDN/WAF。
E – 权限提升
问题: 有人能获得他们不应拥有的权限吗?
示例:
# IDOR – 不安全的直接对象引用
GET /api/users/123/admin–panel # 仅检查用户是否登录,而非是否是管理员
# 通过批量赋值的角色操纵
POST /api/register {"name": "John", "email": "john@test.com", "role": "admin"}
# 路径遍历
GET /api/files?path=../../etc/passwd
检测模式: 缺少授权检查(不仅仅是认证)、批量赋值漏洞、路径遍历、不安全的反序列化。
缓解措施: 基于角色的访问控制(RBAC)、可赋值字段的白名单、输入路径验证、最小权限原则。
PASTA 7 阶段演练
Process for Attack Simulation and Threat Analysis(攻击模拟与威胁分析流程)
阶段 1:定义目标
任务: 将安全分析与业务目标对齐。
业务目标:"安全处理支付"
安全目标:"防止未授权交易和数据暴露"
合规:PCI-DSS、LGPD
风险偏好:低(金融数据)
阶段 2:定义技术范围
任务: 映射范围内的所有技术组件。
组件:
– 前端:React SPA(app.example.com)
– API 网关:Kong(api.example.com)
– 后端:FastAPI(内部)
– 数据库:PostgreSQL(内部)
– 队列:RabbitMQ(内部)
– 外部:Stripe API、SendGrid
– 基础设施:AWS ECS、RDS、S3
阶段 3:应用分解
任务: 创建数据流图,识别信任边界。
信任边界:
[互联网] –HTTPS–> [WAF/CDN] –HTTPS–> [API 网关]
[API 网关] –mTLS–> [后端服务]
[后端] –TLS–> [数据库]
[后端] –HTTPS–> [Stripe API]
数据流:
用户凭证 -> API 网关 -> 认证服务 -> 数据库
支付数据 -> API 网关 -> 支付服务 -> Stripe
Webhook 事件 -> Stripe -> API 网关 -> 支付服务
阶段 4:威胁分析
任务: 对阶段 3 中的每个组件使用 STRIDE 识别威胁。
对跨越信任边界的每个数据流应用 STRIDE。
阶段 5:漏洞分析
任务: 将已知漏洞映射到已识别的威胁。
工具:OWASP ZAP、Semgrep、依赖审计(npm audit、pip-audit)
CVE 数据库:NVD、GitHub Advisory
现有发现:渗透测试报告、漏洞赏金报告
阶段 6:攻击建模
任务: 为高优先级威胁构建攻击树。
(参见下面的攻击树部分)
阶段 7:风险与影响分析
任务: 按业务影响和可能性对威胁排序。
使用下面的威胁文档模板为每个威胁评分。
构建攻击树
攻击树将目标分解为子目标,使用与/或关系。
目标:窃取用户支付数据
├── 或:直接攻破数据库
│ ├── 与:找到 SQL 注入点
│ │ ├── 识别未清理的输入字段
│ │ └── 构造注入有效载荷
│ └── 与:获取数据库凭证
│ ├── 找到暴露的 .env 文件
│ └── 或:通过 SSRF 访问
├── 或:拦截传输中的数据
│ ├── 将 HTTPS 降级为 HTTP
│ └── 攻破 TLS 证书
├── 或:利用 API 漏洞
│ ├── 与:支付端点的 BOLA
│ │ ├── 枚举用户 ID
│ │ └── 无授权访问 /users/{id}/payments
│ └── 用户对象的批量赋值
└── 或:社交工程
├── 钓鱼管理员凭证
└── 攻破开发者笔记本电脑
每个叶节点 = 可操作的缓解威胁。
威胁文档模板
对每个识别的威胁使用此模板:
### THREAT-{ID}:{短标题}
**类别:** STRIDE 类别(S/T/R/I/D/E)
**组件:** 受影响的系统组件
**攻击向量:** 攻击者如何利用此漏洞
**前提条件:** 攻击者需要什么(访问级别、知识、工具)
**影响:**
– 机密性:高/中/低
– 完整性:高/中/低
– 可用性:高/中/低
– 业务影响:业务后果描述
**概率:** 高/中/低
**严重程度:** 严重/高/中/低(影响 × 概率)
**证据/检测:**
– 如何检测此漏洞是否被利用
– 日志模式、监控告警
**缓解措施:**
– [ ] 短期修复(热修复)
– [ ] 长期修复(架构性)
– [ ] 需添加的监控/告警
**状态:** 开放 | 已缓解 | 已接受 | 已转移
**负责人:** 负责的团队/人员
**截止日期:** YYYY-MM-DD
示例:对 Webhook 端点进行威胁建模
上下文: POST /webhooks/stripe 接收来自 Stripe 的支付事件。
STRIDE 分析
| 欺骗 | 攻击者发送伪造的 Stripe 事件 | 严重 | 使用 HMAC 验证 Stripe-Signature 头 |
| 篡改 | 事件有效载荷在传输中被篡改 | 高 | HTTPS + 签名验证 |
| 抵赖 | 无法证明事件已收到/处理 | 中 | 记录所有 webhook 事件,使用幂等性密钥 |
| 信息泄露 | 错误响应泄露内部状态 | 中 | 返回通用 200/400,内部记录详情 |
| DoS | 用伪造事件淹没端点 | 高 | 按 IP 速率限制,在处理前验证签名 |
| 权限提升 | Webhook 触发管理员级操作 | 高 | Webhook 处理程序以最小权限运行,验证事件类型 |
关键实现
import hmac
import hashlib
def verify_stripe_webhook(payload: bytes, signature: str, secret: str) –> bool:
"""在处理任何 webhook 逻辑之前始终验证。"""
timestamp, sig = parse_stripe_signature(signature)
# 防止重放攻击(拒绝超过 5 分钟的事件)
if abs(time.time() – int(timestamp)) > 300:
return False
expected = hmac.new(
secret.encode(), f"{timestamp}.{payload.decode()}".encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, sig)
示例:对具有工具访问权限的 AI 代理进行威胁建模
上下文: 可访问文件系统、API 调用和数据库查询的 AI 代理。
STRIDE 分析
| 欺骗 | 提示注入使代理假冒管理员 | 严重 | 输入清理、系统提示加固 |
| 篡改 | 代理修改超预期范围的文件/数据库 | 严重 | 默认只读、可写路径的白名单 |
| 抵赖 | 无法追踪哪个代理操作造成了损害 | 高 | 记录每次工具调用,含完整上下文 |
| 信息泄露 | 代理从上下文/环境泄露密钥到输出 | 严重 | 在上下文注入前剥离密钥,输出过滤 |
| DoS | 代理进入无限循环,消耗 API 额度 | 高 | 迭代限制、令牌预算、每次操作超时 |
| 权限提升 | 代理通过工具链逃离沙箱 | 严重 | 最小权限工具访问、无 shell 访问、沙箱执行 |
AI 代理的关键控制措施
agent_security:
tool_access:
file_system: READ_ONLY # 默认
writable_paths: ["/tmp/agent-workspace/"] # 显式白名单
blocked_paths: ["~/.ssh", "~/.aws", ".env"]
max_file_size: 1MB
execution_limits:
max_iterations: 25
max_tokens_per_request: 4000
max_total_tokens: 100000
timeout_seconds: 120
max_tool_calls: 50
monitoring:
log_all_tool_calls: true
alert_on_file_write: true
alert_on_external_api: true
alert_on_secret_pattern: true # API 密钥、密码的正则表达式
isolation:
network: RESTRICTED # 仅白名单域名
allowed_domains: ["api.openai.com", "api.anthropic.com"]
no_shell_access: true
no_code_execution: true # 除非显式沙箱化
快速参考:严重程度矩阵
| 高概率 | 中 | 高 | 严重 |
| 中概率 | 低 | 中 | 高 |
| 低概率 | 低 | 低 | 中 |




