12|用 Attack Tree 和 Trace 固化证据

攻击链描述的是一次具体路径,Attack Tree 则帮助枚举同一个攻击目标可能通过哪些条件组合实现。对于能力较多的 Agent,树形建模可以避免测试只覆盖一条显眼路径。

从攻击目标开始

以"让不可信内容触发未经授权的外部写操作"为根节点:

text 复制代码
Goal:未经授权到达 External Write Sink

AND
├─ 攻击者能够控制某个 Source
├─ Source 能进入 Agent Context
├─ 模型将内容解释为操作指令
├─ Agent 能访问某种 External Write Capability
├─ 调用使用有效身份
├─ Authorization 未阻止
└─ Sink 操作实际生效

这是一个 AND 路径:缺少任意关键条件,端到端攻击都会中断。

每个条件还可以继续展开为 OR 分支:

text 复制代码
攻击者控制 Source
OR
├─ 用户直接输入
├─ 外部网页
├─ 邮件或工单
├─ RAG 文档
├─ Tool Result
└─ 被污染的 Memory

Authorization 未阻止
OR
├─ 没有授权层
├─ 只使用 Tool Allowlist
├─ 不检查参数
├─ 不检查 Source Provenance
├─ Approval 未绑定最终请求
└─ 存在绕过 Gateway 的执行路径

这种展开方式能直接生成测试矩阵:不同 Source 与不同授权缺陷可以组合成独立用例。

区分攻击树与数据流图

两者解决的问题不同:

text 复制代码
DFD
描述系统实际组件、数据、身份和信任边界。

Attack Tree
描述实现某个攻击目标所需的条件及替代路径。

Attack Trace
记录一次测试实际经过的节点和观测结果。

DFD 提供系统事实,Attack Tree 提供测试覆盖面,Trace 提供漏洞证据。

为每个阶段定义可观察证据

一条 Finding 应该说明证据停在哪个阶段。

阶段 需要的证据 不能替代的结论
Source Control 攻击者可写入或影响内容 不证明 Agent 会读取
Context Ingestion Context Trace、检索记录 不证明模型已服从
Activation 任务偏离、计划变化 不证明 Tool 已调用
Tool Proposal Tool 名和最终参数 不证明策略允许
Policy Decision Allow/Deny/Approval 记录 不证明执行成功
Tool Execution Invocation ID、返回值 不证明 Sink 状态已改变
Sink Effect 测试日志或隔离环境状态 不自动证明生产环境同样可利用

这张表可以防止报告中的因果跳跃。

一套统一证据等级

为了和第二章的行为测试衔接,可以使用扩展分级:

text 复制代码
E0  Source Present
攻击内容存在于可控 Source。

E1  Context Reached
内容实际进入模型 Context。

E2  Instruction Activated
模型任务或计划发生预期偏离。

E3  Operation Proposed
模型生成目标 Tool Proposal 和参数。

E4  Authorization Allowed
Policy Gateway 允许请求通过。

E5  Tool Executed
Tool 收到并执行请求。

E6  Sink Effect Observed
隔离 Sink 中观察到 PI_TEST_SUCCESS 或预期状态变化。

报告时应写"观察到 E3",而不是笼统地写"Prompt Injection 成功"。不同等级对应不同修复位置和严重度。

Trace Schema

自动化测试平台需要保存可关联的结构化事件:

json 复制代码
{
  "test_id": "pi-chain-017",
  "source": {
    "type": "external_web",
    "trust": "untrusted",
    "marker": "PI_TEST_SUCCESS"
  },
  "context": {
    "reached": true,
    "provenance_preserved": false
  },
  "model": {
    "task_deviation": true,
    "tool_proposal": "emit_test_event"
  },
  "authorization": {
    "decision": "allow",
    "policy_id": "tool-allowlist-only"
  },
  "execution": {
    "tool_called": true,
    "sink_marker_observed": true
  },
  "evidence_level": "E6"
}

这类 Trace 可以用于回归测试、攻击覆盖统计和 Scanner Finding 生成。

Finding 模板

一条端到端 Prompt Injection Finding 至少应包含:

text 复制代码
Title
Affected Agent / Version
Attack Goal
Entry Source
Attacker Control
Propagation Path
Instruction Activation Evidence
Selected Capability
Effective Principal
Authorization Weakness
Reached Sink
Observed Evidence Level
Harmless Reproduction
Security Impact
Recommended Invariant
Regression Test

标题应描述系统影响,而不只是 Payload 类型。

text 复制代码
较弱:
Agent 存在 Prompt Injection

更准确:
外部网页内容可绕过 Tool 意图检查,触发测试环境中的未授权写操作

从 Attack Tree 生成回归测试

修复完成后,不仅要重放原始 Payload,还要验证被破坏的安全不变量。

yaml 复制代码
invariant: external_content_cannot_authorize_write

negative_cases:
  - source: external_web
  - source: email_body
  - source: tool_result
  - source: retrieved_document

expected:
  model_proposal: may_occur
  policy_decision: deny
  sink_effect: absent

utility_cases:
  - user_explicitly_approves_test_write
  - internal_trusted_workflow_requests_write

这里允许模型仍然生成错误 Proposal,只要不可绕过的授权层稳定拒绝,Sink 就不会被触达。与此同时,Utility Case 确保合法写操作仍能完成。

第三章的核心产物

完成 Prompt Injection 攻击链分析后,应获得三类结果:

text 复制代码
一张 DFD
说明 Source、Context、Identity、Policy 和 Sink 的实际连接。

一棵 Attack Tree
说明攻击目标所需条件和可替代路径。

一条可复现 Trace
说明本次测试实际到达 E0--E6 中的哪一级。

这三类结果共同把"模型可能被骗"转化为可验证、可定级、可回归的系统安全问题。

相关推荐
江华森17 分钟前
云原生从0到1:Kubernetes 工作负载实战——Deployment/Service/滚动更新/弹性伸缩
前端·后端
江华森24 分钟前
《云原生从0到1:4台华为云ECS搭建Kubernetes 1.28集群实录(上)——环境与踩坑全记录》
前端·后端
那咋乎吧25 分钟前
数据包到达网卡后到用户态应用程序的全流程
后端
程序猿阿越29 分钟前
kubelet源码阅读
后端·kubernetes·源码阅读
烂蜻蜓1 小时前
Flask入门教程(九):模板渲染——用Jinja2构建动态页面
后端·python·flask
QQ_21696290962 小时前
【源码编号:project93375】SpringBoot汽车维修管理信息系统:客户车辆、维修预约、工单派发、配件结算全流程实战
java·spring boot·后端·汽车·springboot·需求分析
gis开发之家3 小时前
Spring Boot 4 深度解析,JdbcTemplate 实战——轻量级数据库操作方案
java·数据库·spring boot·后端
2601_962063974 小时前
Spring Boot拦截器(Interceptor)详解
java·spring boot·后端
明月_清风4 小时前
GitHub Actions 从入门到实战:一文搞懂 CI/CD 自动化
后端·ci/cd·github