OWASP Top 10 for Agentic Applications 是风险分类,不是让 Agent 自动安全的检查清单。正确用法是把每条可信攻击路径连接到可执行控制、责任人、测试、可观测信号与恢复流程。

核心要点

  • Agent 安全是系统属性,模型、工具、身份、数据、运行时、操作人员和恢复机制都要纳入。
  • OWASP 清单是风险分类和排序辅助,不是权限系统或安全认证。
  • 授权、租户隔离、确认、预算和回滚必须放在可强制执行的服务边界。
  • 外部内容、记忆、工具结果和 Agent 间消息都应视为不可信。
  • 在合成数据和可回退副作用的隔离环境中测试,不要把攻击载荷带入生产。

官方风险主题

2026 版围绕以下主题组织 Agentic 风险:

编号与官方风险主题 工程问题
ASI01 Agent Goal Hijack 不可信内容能否把 Agent 从获准任务引向其他目标?
ASI02 Tool Misuse and Exploitation 有效 Tool 能否被不安全的目标、参数或调用顺序滥用?
ASI03 Identity and Privilege Abuse Caller、Agent、Tool 和对象是否由服务端明确鉴权?
ASI04 Agentic Supply Chain Vulnerabilities 模型、Skill、插件、Tool、依赖或 Workflow 能否未经审查发生变化?
ASI05 Unexpected Code Execution 生成或检索到的代码能否触达解释器、Shell 或动态加载器?
ASI06 Memory and Context Poisoning 不可信状态能否持久化并影响后续任务?
ASI07 Insecure Inter-Agent Communication 消息是否鉴权、授权、有界且能防重放?
ASI08 Cascading Failures 单个 Agent、Tool 或依赖能否放大为全链路故障?
ASI09 Human-Agent Trust Exploitation 人是否会过度相信自信但不清楚的 Agent 输出?
ASI10 Rogue Agents Agent 能否脱离生命周期、逃避监督或持续越权行动?

应以当前 OWASP 版本核对名称和描述。风险严重程度依赖场景:只读研究助手与可转账 Agent 的影响面不能套用同一等级。

按控制边界进行威胁建模

1. 身份与授权

先认证人或服务,再针对当前主体、租户、用途和状态,为每次工具调用和对象访问做授权。不能让模型生成的身份、工具名、确认字符串或 Agent Card 授予权限。只传播最小委派能力,并明确过期、撤销和审计。

2. 工具与副作用

为工具设置狭窄 Schema、有限资源选择器、超时、限流、幂等键和副作用等级。区分读取、提议和提交操作;删除、转账、发送等不可逆或高影响动作需要新的确认或人工复核。工具服务必须再次校验,Prompt 限制不是强制控制。

3. 不可信内容与记忆

检索文档、网页、邮件、文件、工具结果和记忆都可能包含指令或虚假状态。为每项数据保留来源、修订、租户、新鲜度和信任状态,并执行写入准入、过期、替代、删除传播和回放测试。净化器或分隔符可以降低风险,但不能构成信任边界。

4. 代码执行与供应链

不要在应用进程中执行模型输出或第三方工作流代码。确有需要时,使用独立沙箱,限制文件系统、网络、CPU/内存/时间,禁止秘密凭据,并设置制品审查。锁定依赖和工具清单,验证来源,扫描更新,保留可回滚版本。“官方”“已验证”或“流行”标签都不是安全证明。

5. Agent 通信与故障

把每条 Agent 间消息当作 API 请求:认证发送方,授权能力,限制载荷和递归,防止重放,并附带关联、取消和截止时间状态。使用断路器、预算、截止时间传播、幂等和明确的 outcome_unknown 状态,避免超时被误当成可以安全重试。

分层防御架构

text
人/服务身份
  -> 任务与租户策略
  -> 有界规划器
  -> 带服务端授权的工具网关
  -> 隔离执行与数据边界
  -> 结果验证与人工审批
  -> 脱敏审计事件
  -> 回滚、删除与事件响应

每一层有不同负责人:输入分类由应用执行,对象授权由资源服务执行,隔离由运行时执行,保留和事件响应由运营组织负责。单一“AI 防火墙”不能替代这些控制。

把风险分类转化为运行时控制

风险台账只有进入 Action Path 才产生价值。OWASP Agent Control Standard(ACS)v0.1.0 定义了一套早期 Wire Contract:Observed Agent 在 Lifecycle Hook 调用独立 Guardian,并接收 allow、deny、modify、ask 或 defer。其 Instrument、Trace 与 Inspect Profile 可以帮助统一证据,但采用与 Conformance 仍是部署方声明,不能当成安全证明。

ACS 是一种可选控制面,不替代应用授权。其 Reference Implementation 明确披露当前 Wire 未认证且默认 Fail-open。生产设计必须认证决策通道,把请求绑定到不可变 Agent 与 Policy Identity,按后果选择失败策略,在副作用发生前执行 Decision,并验证不存在绕过 Hook 的替代路径。

控制层 可信决定 需要保留的证据
Identity Principal、Tenant、Workload、Delegated Subject Issuer、Audience、Credential Class、Expiry、Policy Revision
Capability 允许的 Tool Revision、Resource Selector、Destination Registry Digest、Schema Digest、Requested Effect
Intervention 执行前 allow、deny、modify、ask 或 defer Decision ID、Reason Code、规范化 Argument Digest
Effect 权威 Resource 与业务 Invariant Idempotency Key、Transaction 或 Provider Result
Recovery Revoke、Quarantine、Compensate、Restore 或 Notify 受影响 Run ID、Artifact Hash、最终 Effect Status

下面的无第三方依赖 Go 门禁展示 Model Proposal 与 Authorized Effect 的最小区别:

go
package main

import (
	"errors"
	"fmt"
)

type Principal struct {
	Subject string
	Tenant  string
	Roles   map[string]bool
}

type ToolRequest struct {
	Tool, Tenant, Effect string
	Approved             bool
}

func authorize(principal Principal, request ToolRequest) error {
	if principal.Subject == "" || principal.Tenant != request.Tenant {
		return errors.New("identity_or_tenant_denied")
	}
	if request.Tool != "invoice.refund" || request.Effect != "external_write" {
		return errors.New("capability_denied")
	}
	if !principal.Roles["refund_operator"] || !request.Approved {
		return errors.New("role_or_approval_denied")
	}
	return nil
}

func main() {
	principal := Principal{
		Subject: "user-42",
		Tenant:  "tenant-a",
		Roles:   map[string]bool{"refund_operator": true},
	}
	request := ToolRequest{
		Tool:     "invoice.refund",
		Tenant:   "tenant-a",
		Effect:   "external_write",
		Approved: true,
	}
	fmt.Println(authorize(principal, request))
}

// Output: <nil>

真实资源服务还必须解析 Invoice、校验 Ownership 与 Refundable State,把 Approval 绑定到精确参数和 Expiry,执行 Idempotency,并记录已提交结果。上游 allow 是一次决策的证据,不是未来调用都能复用的 Bearer Capability。

防御性测试协议

使用包含以下内容的 Manifest:

  • 合成身份、租户、文档、秘密和交易;
  • 允许动作与禁止副作用;
  • 模型、工具、策略、依赖和 Prompt 修订;
  • 预期授权、拒绝、升级和回滚结果;
  • 脱敏遥测以及保留/删除规则。

按风险切片测试:

  1. 通过检索内容和工具结果重定向行为。
  2. 错租户、错对象、过期和撤销能力。
  3. 不安全参数组合、重放、重复提交和超时。
  4. 记忆持久化、旧状态、删除和跨租户泄露。
  5. Agent 冒充、递归、超大载荷和级联故障。
  6. 代码执行尝试、依赖变化和沙箱逃逸信号。
  7. 人工审批清晰度、疲劳、覆盖和事后审计。

测试必须在自有的隔离环境中完成。报告覆盖范围和剩余风险,不要把一次干净运行描述成不存在漏洞的证明。

不过度采集的可观测性

记录足以重建行动的字段,不必永久保留全部原始 Prompt:

text
event_id, request_id, subject_hash, tenant_id_hash
policy_revision, tool_revision, model_revision
action_class, authorization_decision, approval_state
input_provenance, outcome, retry_count, latency

脱敏秘密和个人数据,限制访问,定义保留期,并测试删除与法律留置。日志是调查证据,不是授权替代,也不是永久保存隐藏推理的理由。

法规映射必须单独审查

OWASP 指导和 EU AI Act 回答的是不同问题。法律映射需要记录法域、提供者/部署者角色、预期用途、风险分类、具体条款、日期、过渡规则和证据负责人。不要把 OWASP 标签变成法律截止日期,也不要把法律日期变成 OWASP 严重等级。

发布门禁

  1. 没有服务端身份、对象授权、Scope、Timeout 和 Audit,不上线生产 Tool。
  2. 没有 Provenance、写入准入、Expiry、Deletion 和 Tenant Isolation,不启用持久 Memory。
  3. 没有 Isolation、Resource Limit、无 Secret Credential 和 Review,不执行代码。
  4. 没有 Peer Authentication、Bounded Authority、Replay Protection 与 Artifact Policy,不进行 Agent 间委派。
  5. 没有 Idempotency、Outcome Handling、Action-bound Confirmation 和可行 Rollback,不执行不可逆动作。
  6. 没有代表性 Abuse、Replay、Recovery、Privacy、Dependency-change 与 Control-bypass Test,不发布版本。

常见问题

覆盖 OWASP 十类风险就能证明 Agent 安全吗?

不能。该清单用于发现威胁。安全保证取决于具体部署、身份、Tool、数据、模型、策略、测试、运营和剩余风险决策,组织仍需证明所有相关路径都执行了控制。

Prompt Injection 过滤能阻止 Agent 目标劫持吗?

单一分类器或 Sanitizer 无法建立这个边界。应保留 Provenance、缩小 Capability、在受保护资源处授权、限制 Egress 与 Execution、按需使用 Action-bound Approval,并测试间接和多模态路径。

Sandbox 足以防止意外代码执行吗?

不足。Sandbox 只能按照文件系统、进程、网络、凭证与资源限制缩小影响范围;它不能判断执行是否获得授权,也不能阻止供应链篡改或证明外部副作用安全。

ACS 为 OWASP 风险清单增加了什么?

Agent Control Standard 定义 Observed Agent 与 Guardian 之间的 Lifecycle Intervention 和 Evidence Wire Contract,可以统一策略决定发生的位置;身份、对象授权、副作用核验、失败策略和绕过测试仍由应用负责。

Agent 安全事故应如何止损?

禁用受影响 Capability 或 Artifact,撤销 Credential,停止新 Run,隔离相关 Memory 与 Output,按不可变 Revision 和 Digest 定位执行,核对外部 Effect,恢复干净状态,通知 Owner,并把确认的攻击链转成回归测试。

总结

OWASP Agentic Applications Top 10 最有价值的作用,是提供一套共同语言来发现安全缺口。真正的安全来自可强制的边界、有界权限、可信身份、隔离执行、可测量恢复和负责的运营。把模型视为不可信的决策组件,把副作用交给服务控制,并在工具、数据、模型、租户或工作流变化后重新威胁建模。

一手来源