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 状态,避免超时被误当成可以安全重试。
分层防御架构
人/服务身份
-> 任务与租户策略
-> 有界规划器
-> 带服务端授权的工具网关
-> 隔离执行与数据边界
-> 结果验证与人工审批
-> 脱敏审计事件
-> 回滚、删除与事件响应
每一层有不同负责人:输入分类由应用执行,对象授权由资源服务执行,隔离由运行时执行,保留和事件响应由运营组织负责。单一“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 的最小区别:
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 修订;
- 预期授权、拒绝、升级和回滚结果;
- 脱敏遥测以及保留/删除规则。
按风险切片测试:
- 通过检索内容和工具结果重定向行为。
- 错租户、错对象、过期和撤销能力。
- 不安全参数组合、重放、重复提交和超时。
- 记忆持久化、旧状态、删除和跨租户泄露。
- Agent 冒充、递归、超大载荷和级联故障。
- 代码执行尝试、依赖变化和沙箱逃逸信号。
- 人工审批清晰度、疲劳、覆盖和事后审计。
测试必须在自有的隔离环境中完成。报告覆盖范围和剩余风险,不要把一次干净运行描述成不存在漏洞的证明。
不过度采集的可观测性
记录足以重建行动的字段,不必永久保留全部原始 Prompt:
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 严重等级。
发布门禁
- 没有服务端身份、对象授权、Scope、Timeout 和 Audit,不上线生产 Tool。
- 没有 Provenance、写入准入、Expiry、Deletion 和 Tenant Isolation,不启用持久 Memory。
- 没有 Isolation、Resource Limit、无 Secret Credential 和 Review,不执行代码。
- 没有 Peer Authentication、Bounded Authority、Replay Protection 与 Artifact Policy,不进行 Agent 间委派。
- 没有 Idempotency、Outcome Handling、Action-bound Confirmation 和可行 Rollback,不执行不可逆动作。
- 没有代表性 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 最有价值的作用,是提供一套共同语言来发现安全缺口。真正的安全来自可强制的边界、有界权限、可信身份、隔离执行、可测量恢复和负责的运营。把模型视为不可信的决策组件,把副作用交给服务控制,并在工具、数据、模型、租户或工作流变化后重新威胁建模。