可易

OWASP 代理控制标准 ACS 全文翻译:守护代理实时管控 AI 代理

可易团队阅读约 13 分钟

OWASP Agent Control Standard(ACS)v0.1.0 主文档全文中译:守护代理经16个生命周期钩子对代理每步动作实时裁决(allow/deny/modify/ask/defer),SHA-256链式审计、动态AgBOM、后量子签名,附企业代理网关落地步骤。

目录

结论

这是 OWASP GenAI 安全项目《代理控制标准》(Agent Control Standard,ACS)v0.1.0 主文档的全文中文翻译。ACS 由 OWASP GenAI Security Project 于 2026 年 9 月 1 日发布(资源页日期),文档部分采用 CC BY-SA 4.0 许可(代码部分 Apache 2.0),贡献者包括 Almog Langleben、Ariel Fogel、Bar Kaduri、Eva Benn、Fred Wilmot、Stefano Amorelli 等。

ACS 回答的是企业代理治理中最硬核的一个问题:如何在运行时、实时地允许/拒绝/修改一个 AI 代理的每一步动作,并留下可观测、可重建的审计链。它的答案是一个「线格式规范」(wire-format specification):由一个独立的守护代理(Guardian Agent)通过经认证的通道,对被观测代理(Observed Agent)的 16 个原生生命周期钩子(会话起止、用户消息、工具调用、知识检索、记忆读写、子代理启停等)做实时裁决,裁决结果只有五种处置:allow(允许)、deny(拒绝)、modify(修改)、ask(询问)、defer(延迟)。审计链用滚动 SHA-256 链式哈希保证可重建,Crypto 档案提供抗抵赖签名(含后量子算法 ML-DSA-65/SLH-DSA-128s 与混合过渡方案)。

原文有一个必须向企业管理者传达的清醒判断:「ACS-Core 认证通道并把代理绑定到守护者的决定;它本身并不能让部署变安全、也不能让策略变严格」——标准提供的是管道与钩子,策略质量仍取决于人。另一处关键划界:对被攻破的守护者本身的防篡改证据,是 Crypto 与 Audit 档案的职责,不是 Core。

ACS 的设计哲学是「扩展既有标准而非重新发明」:线格式用 JSON-RPC 2.0,可观测性用 OpenTelemetry 与 OCSF,代理物料清单 AgBOM 用 CycloneDX/SPDX/SWID,工具与对等通信保持 MCP 与 A2A 原样。

对企业启示:ACS 给出了「代理运行时管控」的参考架构与统一词汇。企业建代理网关/管控平面时,可直接对照它的 16 钩子清单核查覆盖面,用五处置模型设计审批策略,用 AgBOM 动态盘点代理的模型/工具/MCP 服务器/记忆存储构成,用链式哈希审计满足合规取证需求。

以下为忠实全文翻译(代码示例保留英文原文,注释与说明文字翻译;这符合技术文档翻译惯例)。


原文全文翻译

代理控制标准(Agent Control Standard)

代理控制标准(ACS)是一个线格式规范(wire-format specification),它让一个独立的守护代理(Guardian Agent)能够实时允许、拒绝或修改一个 AI 代理的行为——通过经认证的通道,并带有可观测、可重建的审计轨迹。

实现 ACS-Core 的代理,把每一步都通过经认证的通道交给守护者裁决,并实时遵守其决定。借助 Trace、Inspect 与 Crypto 档案,它们还会发出 OpenTelemetry 跨度(spans)与 OCSF 事件,暴露一份动态的代理物料清单(Agent Bill of Materials,AgBOM——涵盖模型、MCP 服务器、A2A 对等方、工具、知识来源、记忆存储),并获得审计链的密码学抗抵赖性。ACS-Core 认证通道并把代理绑定到守护者的决定;它本身并不能使一个部署变得安全、也不能使其策略变得严格;而针对「守护者本身被攻破」的防篡改证据,是 Crypto 与 Audit 档案的职责,不是 Core。

ACS 扩展既有标准而非重新发明它们:线格式用 JSON-RPC 2.0,可观测性用 OpenTelemetry 与 OCSF,AgBOM 用 CycloneDX / SPDX / SWID,工具与对等通信保持 MCP 与 A2A 原样。

下图展示了一个钩子(hook)的往返:被观测代理把它发给守护者,确定性层先行评估,然后五种处置之一返回。

(原文 mermaid 流程图:被观测代理 →「钩子,JSON-RPC 2.0」→ 守护代理【确定性策略引擎先行评估 ⇄ LLM 层(可选委托)】→「allow / deny / modify / ask / defer」→ 被观测代理。)

v0.1.0 交付内容

  • ACS-Core(强制基线)——能力协商握手、JSON-RPC 信封、16 个原生生命周期钩子(sessionStart/sessionEnd、agentTrigger、userMessage、agentResponse、turnStart/turnEnd、toolCallRequest/toolCallResult、knowledgeRetrieval、memoryContextRetrieval、memoryStore、preCompact/postCompact、subagentStart/subagentStop)、包装的 MCP、五种处置(allow、deny、modify、ask、defer)、带滚动 SHA-256 链式哈希的会话上下文(SessionContext)、带不可变性规则的可选意图(Intent)、重放保护,以及 system/ping 存活探测。
  • ACS-Trace 档案——OpenTelemetry 语义约定映射 + OCSF 事件类映射,裁决作为跨度事件发出在父步骤跨度上。
  • ACS-Inspect / ACS-Inspect-Dynamic 档案——规范化 AgBOM,带 agbom/snapshot 与 agbom/changed,确定性的 CycloneDX / SPDX / SWID 派生。
  • ACS-Provenance 档案——字段级 Provenance 对象,带 origin、source_id、derived_from,以及一个可选的线格式 trust 枚举,遵守单调性规则。
  • ACS-Crypto 档案——加密敏捷(crypto-agile)的签名注册表:HMAC-SHA256 基线,ML-DSA-65 / SLH-DSA-128s 用于后量子密码(PQC),混合复合签名用于过渡期部署。
  • ACS-Audit 档案——每个 ContextEntry 上的 request_hash,使审计链承诺到请求内容本身,而不只是步骤元数据。

各档案的具体要求见《合规档案》(Conformance Profiles)文档。

可信的代理是……(Trustworthy agents are)

可插桩的(Instrumentable)

运行时钩子(Runtime Hooks)

  • 价值:钩入代理运行时与生命周期事件。
  • 描述:规定允许在代理生命周期与运行时执行中进行干预的钩子。
  • 标准:ACS Instrument。

示例:用 ACS 初始化代理(LangChain / Python)

from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
from acs import ACSInstrument

# 初始化 LLM 与工具
llm = OpenAI(temperature=0)
tools = [
    Tool(name="Search", func=search_api,
         description="Search the web for information"),
    Tool(name="Calculator", func=calculate,
         description="Perform mathematical calculations")
]

# 创建带 ACS 插桩的代理
agent = initialize_agent(
    tools, llm,
    agent="zero-shot-react-description",
    verbose=True
)

# 用 ACS 包装以获得可观测性
acs_agent = ACSInstrument(agent)

示例:Vercel AI SDK(TypeScript)

import { createAgent } from '@vercel/ai'
import { ACSInstrument } from '@acs/sdk'

const tools = {
  search: {
    description: 'Search the web for information',
    parameters: z.object({ query: z.string() }),
    execute: async ({ query }) => searchAPI(query)
  },
  calculate: {
    description: 'Perform mathematical calculations',
    parameters: z.object({ expression: z.string() }),
    execute: async ({ expression }) => evaluate(expression)
  }
}

const agent = createAgent({
  model: 'gpt-4', tools,
  system: 'You are a helpful assistant'
})

const acsAgent = new ACSInstrument(agent)

示例:MCP(JSON-RPC 创建带 ACS 能力的代理)

{
  "jsonrpc": "2.0",
  "method": "agent/create",
  "params": {
    "name": "research-assistant",
    "capabilities": {
      "tools": ["search", "calculate"],
      "models": ["claude-3-opus"],
      "protocols": ["mcp", "acs"]
    },
    "acs": {
      "instrumentation": {
        "enabled": true,
        "hooks": ["agentTrigger", "toolCallRequest", "message"]
      },
      "trace": {
        "format": "opentelemetry",
        "endpoint": "https://observability.example.com/v1/traces"
      }
    }
  }
}

示例:A2A(带 ACS 能力的代理清单 YAML)

apiVersion: a2a.io/v1
kind: Agent
metadata:
  name: research-assistant
  namespace: production
spec:
  model:
    provider: anthropic
    name: claude-3-opus
  capabilities:
    - search
    - calculate
  observability:
    acs:
      version: "1.0"
      instrumentation:
        hooks: [agentTrigger, toolCallRequest, message]
      trace:
        provider: opentelemetry
        endpoint: https://telemetry.example.com
      inspect:
        format: cyclonedx
        dynamic: true

示例:守护代理钩子——运行时控制(LangChain / Python)

from acs import GuardianAgent, PolicyResponse

# 创建守护代理来执行策略
guardian = GuardianAgent(
    endpoint="https://guardian.example.com",
    policies=["data-protection", "cost-control"]
)

# 钩入代理运行时
@acs_agent.hook("toolCallRequest")
async def on_tool_call(context):
    # 守护代理评估该工具调用
    response = await guardian.evaluate({
        "hook": "toolCallRequest",
        "tool": context.tool_name,
        "parameters": context.parameters,
        "session": context.session_id
    })
    if response.action == "DENY":
        raise PermissionError(f"Tool call denied: {response.reason}")
    elif response.action == "MODIFY":
        context.parameters = response.modifications  # 应用守护者的修改
    return response

# 示例:守护代理拒绝敏感数据访问
result = await acs_agent.run("Search for employee SSN records")
    # > PermissionError: Tool call denied: Accessing PII data violates policy

示例:TypeScript 版钩子(Vercel AI)——与 Python 版等价:注册 toolCallRequest 钩子,DENY 时抛错、MODIFY 时替换参数。成本控制策略示例:await acsAgent.run('Generate 1000 images using DALL-E') → Error: Denied: Request exceeds cost threshold ($50 limit)(拒绝:请求超出成本阈值——50 美元上限)。

示例:MCP 版钩子注册与评估

// 注册钩子
{"jsonrpc":"2.0","method":"acs/registerHook",
 "params":{"hook":"toolCallRequest",
           "guardianEndpoint":"https://guardian.example.com/evaluate",
           "policies":["data-protection","cost-control"]}}

// 守护者收到的评估请求
{"jsonrpc":"2.0","method":"guardian/evaluate",
 "params":{"hook":"toolCallRequest",
   "context":{"tool":"database_query",
     "parameters":{"query":"SELECT * FROM customers"},
     "session":"sess_123"}}}

// 守护者响应(MODIFY:收窄查询范围)
{"jsonrpc":"2.0","result":{"action":"MODIFY",
  "modifications":{"query":"SELECT id, name FROM customers LIMIT 100"},
  "reason":"Limited query to prevent full data exposure"}}

示例:A2A 版可用钩子声明(YAML)——原文列出五个代表性钩子及其能力:agentTrigger(代理开始处理时触发,可修改、可拒绝)、message(对话中每条消息触发,可修改、可拒绝)、toolCallRequest(工具执行前触发,可修改、可拒绝)、knowledgeRetrieval(访问知识库时触发,不可修改、可拒绝)、memoryStore(写入记忆时触发,可修改、可拒绝)。

可追踪的(Traceable)

全面审计日志(Comprehensive Audit Logs)

  • 价值:全面的审计日志。
  • 描述:规定捕捉 AI 代理生命周期与运行时执行的事件。以如下属性扩展 OpenTelemetry 与 OCSF 规范。
  • 标准:ACS Trace;扩展 OpenTelemetry 与 OCSF。

示例:Python 端 OpenTelemetry 集成——用 ACSTraceProvider 配置 tracer,代理执行自动产生跨度;输出包含完整推理链、带参数的工具调用、模型交互与决策点。原文 JSON 跨度示例(节选):traceId、spanId、operationName: agent_session,attributes 含 acs.session.id、acs.agent.name、acs.reasoning.steps: 3、acs.tools.called: ["web-search","summarize"];events 含 acs.step.reasoning(thought:「需要搜索近期 AI 安全论文」,action: tool_call,tool: web-search)。

示例:TypeScript 端——OpenTelemetryTracer 以 serviceName 与 endpoint 配置,tracer.instrument(acsAgent) 包装代理,执行时自动产生与 Python 示例相同的完整追踪数据。

示例:MCP 端——acs/trace/emit 方法发出追踪事件(type: agent.execution,含 session.id、agent.name、reasoning.steps、tools.called 等属性)。

示例:A2A 端——kind: TraceEvent 的 YAML 事件,spec 含 eventType、agent(name/session)、execution(reasoningSteps/toolsCalled)、observability(format: opentelemetry, endpoint)。

示例:OCSF 安全事件日志(Python)——用 OCSFLogger(endpoint 指向 SIEM)挂到代理上,执行时自动记录安全事件。原文 OCSF JSON 示例(要点):activity_name: Agent Execution、category_name: Application Activity、class_name: AI Agent Activity,actor 含 session uid 与 idp(agent 身份);acs_extensions 扩展字段含 reasoning_chain(推理链步骤)、tools_invoked: ["database_query"]、data_accessed: ["customers.personal_info"]、risk_score: 8.5。

示例:实时流式追踪(TypeScript)——ACSTraceStream 订阅事件流,按 severity 分级联动(event.severity === 'high' 时告警安全团队)。原文示例输出:session.start {id:'sess_789', user:'alice'} → reasoning.step → tool.call {name:'database_query', risk:'high'} → security.alert {reason:'Sensitive data access'}。

可检视的(Inspectable)

代理物料清单(Agent Bill of Materials,AgBOM)

  • 价值:动态的、代理感知的物料清单。
  • 描述:规定捕捉 AI 代理的工具、模型与能力的属性。以这些属性扩展 SBOM 标准规范——即 AgBOM。更进一步,为 AgBOM 增加动态更新,以应对代理的动态能力发现。
  • 标准:ACS Inspect;扩展 CycloneDX、SPDX、SWID。

示例:生成 CycloneDX 格式 AgBOM(Python)——generate_agbom(acs_agent, format="cyclonedx")。原文 JSON 示例(要点):bomFormat: CycloneDX、specVersion: 1.5,metadata.component 类型为 ai-agent(name: research-assistant, version: 1.0.0);components 含 type: ai-model(gpt-4,supplier: OpenAI,properties 含 parameters: 175B、context_window: 128000)与 type: tool(web-search 2.1.0)。

示例:TypeScript 版——generateAgBOM(acsAgent, {format:'cyclonedx'}),输出结构与 Python 示例一致。

示例:MCP 版——acs/agbom/generate 方法(params 含 format 与 agent_id),响应为 CycloneDX JSON(示例组件为 claude-3-opus,supplier: Anthropic)。

示例:A2A 版——kind: AgBOMRequest(spec 含 agent、format: cyclonedx、includeRuntime: true)与 kind: AgBOM 响应(components 含 ai-agent 及其 models、tools 清单)。

示例:SPDX 格式(Python)——generate_agbom(acs_agent, format="spdx")。原文 SPDX 文本示例(要点):SPDXVersion: SPDX-2.3、DataLicense: CC0-1.0、DocumentName: research-assistant-agbom;Package 段分别为 AI Agent(research-assistant 1.0.0)、AI Model(gpt-4,ModelParameters: 175B,ContextWindow: 128000)、Tool(web-search 2.1.0)。

示例:动态发现(Python)——DynamicAgBOM(acs_agent) 订阅能力变更:@dynamic_agbom.on_update 回调在代理运行时发现新工具时触发(示例:代理运行「我需要分析这份 PDF 文档」后,自动检测到 COMPONENT_ADDED——{"type":"tool","name":"pdf-analyzer","version":"1.2.0"}),自动再生成 AgBOM 并通知安全团队。

示例:实时更新与策略校验(TypeScript)——dynamicAgBOM.on('update') 监听能力变化,取当前 AgBOM 后 validateAgainstPolicy 校验;未通过审批的能力被自动禁用(acsAgent.disableComponent(event.component.id))。原文示例输出:「Capability ADDED: claude-3-opus → Validating against policy... → Component approved and active」。

  • 核心概念(Core concepts)
  • Instrument 规范
  • Trace 规范
  • Inspect 规范

(原文末尾链接指向仓库内 topics/core_concepts.md 与 spec/instrument、spec/trace、spec/inspect 各子规范。)


中文解读与企业落地方法

ACS 给企业代理治理的四个可直接采用的构件

第一,「守护代理+16 钩子+五处置」是代理运行时管控的完整参考架构。企业在建代理网关时最常见问题是「钩子覆盖不全」——只在工具调用前拦一道。ACS 的 16 个钩子给出了完整清单:会话起止、代理触发、用户消息、代理响应、轮次起止、工具调用请求/结果、知识检索、记忆上下文检索、记忆写入、压缩前/后、子代理启/停。特别注意三个容易被遗漏的钩子:memoryStore(记忆写入是持久化投毒的入口)、knowledgeRetrieval(知识检索是 RAG 投毒的出口)、subagentStart(子代理是权限逃逸的常见路径)。五种处置中「modify」最被低估——原文示例把 SELECT * FROM customers 自动改写为 SELECT id, name FROM customers LIMIT 100,比一刀切拒绝更能兼顾安全与可用性。

第二,「确定性层先行评估、LLM 层可选委托」的裁决顺序是安全设计的关键细节。守护者内部先走确定性策略引擎,LLM 只做可选委托——这与 OWASP LLM Top 10「授权必须实现在确定性逻辑中、不能委托给 LLM」的原则一致。企业自建管控层时必须遵守同样的顺序,绝不能让 LLM 做最终授权判断。

第三,AgBOM(代理物料清单)是代理资产管理的缺失环节。SBOM 管软件组件,AgBOM 管代理构成:模型、MCP 服务器、A2A 对等方、工具、知识来源、记忆存储——而且是动态的:代理运行时发现新工具(如 pdf-analyzer)会触发 agbom/changed 事件与策略重校验,未批能力自动禁用。企业代理平台应内置这一「动态能力发现→策略校验→自动禁用」回路。

第四,审计链的密码学设计满足合规取证。滚动 SHA-256 链式哈希让审计轨迹可重建、不可悄悄篡改;Audit 档案把 request_hash 加到每个 ContextEntry(链承诺到请求内容而不只是元数据);Crypto 档案提供 HMAC-SHA256 基线+后量子签名(ML-DSA-65/SLH-DSA-128s)+混合过渡方案。金融、医疗等强合规行业可直接引用这套设计满足审计要求。

落地步骤

  1. 钩子覆盖自查:对照 ACS 16 钩子清单盘点现有代理管控层的覆盖面,缺失的钩子(尤其 memoryStore、knowledgeRetrieval、subagentStart/Stop)列入改造计划。
  2. 部署守护代理:独立于业务代理部署 Guardian(避免同体失效),通道走认证(mTLS 或等价机制),裁决顺序为确定性策略引擎先行、LLM 委托可选。
  3. 五处置策略分级:allow(低危只读)、modify(可自动收窄的操作,如 SQL 加 LIMIT、参数脱敏)、ask(人在回路审批)、deny(策略硬禁)、defer(异步复核)——按工具风险级与操作可逆性配置。
  4. AgBOM 动态盘点:为每个代理生成 CycloneDX 格式 AgBOM 并接入变更订阅,新能力上线先过策略校验,未批自动禁用。
  5. 审计链落地:会话上下文启用滚动 SHA-256 链哈希;强合规场景叠加 Audit(request_hash)与 Crypto(签名)档案;OCSF 事件接入 SIEM,含 acs_extensions 的推理链、工具清单、数据访问与风险分。
  6. 重放与存活防护:启用 ACS 的重放保护与 system/ping 存活探测,防止审计记录重放攻击与守护者失联。

人工复核点与失败条件

  • 失败条件:以为实现 ACS-Core 就等于安全——原文明确「Core 本身不能让部署变安全或策略变严格」,策略质量与钩子覆盖面才是决定因素。
  • 失败条件:让 LLM 层做最终授权裁决(必须确定性层先行)。
  • 失败条件:守护者与被观测代理同进程/同信任域部署(守护者被攻破即全线失守;原文指出对被攻破守护者的防篡改是 Crypto/Audit 档案的职责)。
  • 失败条件:AgBOM 只做静态一次性盘点(代理动态发现新工具后清单失真)。
  • 人工复核点:ask 处置触发的人工审批;modify 改写规则的定期复核(防止过度收窄伤及业务);AgBOM 变更事件的未批能力处置;审计链完整性告警的响应。

试点与验收

  • 试点场景:选一个带工具调用与记忆能力的生产/准生产代理,接入守护代理做运行时管控试点。
  • 试点周期:8 周。第 1—2 周:钩子覆盖盘点与守护者部署(认证通道);第 3—4 周:五处置策略配置与 AgBOM 接入;第 5—6 周:审计链(链式哈希+OCSF 接 SIEM)与重放保护;第 7—8 周:对抗演练(模拟记忆投毒、子代理逃逸、越权工具调用)验证裁决有效性。
  • 基线:接入前记录该代理的工具调用审计覆盖率、高危操作拦截能力(有/无)、资产清单更新方式(静态/动态)。
  • 验收指标:
  • 覆盖:16 钩子中业务相关钩子 100% 接入(至少含 toolCallRequest、memoryStore、knowledgeRetrieval、subagentStart);所有裁决实时生效(非事后告警)。
  • 审计:100% 会话可按链式哈希重建;OCSF 事件含推理链、工具、数据访问、风险分四要素;重放攻击测试 0 通过。
  • 资产:AgBOM 动态更新时延 ≤ 约定阈值;未批能力自动禁用验证通过。
  • 业务:modify/ask 处置的误伤率在业务可接受范围(误拒率与人工审批量有量化跟踪)。
  • 扩大条件:守护者部署模板、五处置策略库、AgBOM 订阅回路推广到其余代理;审计链接入企业统一取证流程。
  • 停止条件:守护者成为单点故障且无降级方案(如守护者失联时代理行为未定义)——必须先补 fail-closed/fail-open 策略再扩面;或裁决延迟使交互场景不可用且无法优化。

出处

  • 机构:OWASP 基金会 · OWASP GenAI 安全项目(Agent Control Standard 工作组)
  • 作者:Almog Langleben、Ariel Fogel、Bar Kaduri、Eva Benn、Fred Wilmot、Stefano Amorelli 等(GitHub 仓库贡献者)
  • 日期:2026 年 9 月 1 日(OWASP 资源页发布日;v0.1.0,活跃开发中,最近推送 2026-09-28)
  • 原文标题:Agent Control Standard(ACS)
  • URL:https://genai.owasp.org/resource/agent-control-standard-acs
  • 文档源:GitHub 仓库 github.com/GenAI-Security-Project/agent-control-standard(docs/acs.md 主文档)
  • 许可:文档 CC BY-SA 4.0,代码 Apache 2.0;允许全文翻译与再发布,本译文以相同许可分发
  • 版本说明:v0.1.0 为活跃开发中的规范,引用时应注明版本并跟踪更新

PRIMARY_SOURCE: https://genai.owasp.org/resource/agent-control-standard-acs

  • #ACS
  • #守护代理
  • #代理网关
  • #审计链
  • #AgBOM