欢迎光临
我们一直在努力

007 - stride-pasta-guide

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 # 除非显式沙箱化


快速参考:严重程度矩阵

低影响中影响高影响
高概率 中 高 严重
中概率 低 中 高
低概率 低 低 中
赞(0)
未经允许不得转载:171主机测评 » 007 - stride-pasta-guide
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址