多Agent系统中,接收方无法验证发送方身份和授权是常见但被低估的安全隐患,比Prompt注入更隐蔽也更根本。
我在各种 agent 演示中看到同一个 bug。
有人把 GPT-5 或 Claude 接上几个工具,加上一个审查 agent,再塞一些护栏,就宣称这是安全方案。
然后一个 agent 给另一个 agent 发送指令,而所有人只是寄希望于接收方会"自行判断"。
那不是安全。那是玄学。
一旦你的 agent 开始接受来自其他 agent 的请求,你首先面对的不是提示词问题。
你面对的是身份问题。
而如果你把这个问题搞错了,整个审批工作流就是用湿纸板搭的。
失败模式远比人们想象的原始
人们以为多 agent 系统会以奇特的方式失败。
提示词注入。突发性欺骗。递归自我提升。一些带有酷炫标签的戏剧性科幻式故障。
但很多真实的失败要蠢得多:
接收方 agent 无法证明是谁发了这条消息
它无法证明该发送方是否有权发起请求
它无法证明这个请求是否应该被执行
这才是真正的问题。
在深入研究时,我在 r/openclaw 发现了一个很棒的帖子,有人这样描述他们的架构:
我的 agent 接受其他 AI agent 的指令。他们发送签名消息来请求它执行任务。
这句话比大多数提示词工程的建议都重要。
因为一旦 agent 开始互相发送指令,密码学身份和本地策略的重要性就超过了更长的系统提示词。
让这件事在我脑子里"咔哒"一声对上的是 Anthropic 的那个场景
Anthropic 发布了一份 2026 年场景总结,描述了三个 Claude agent 在三台独立的虚拟机上,共享同一个代码库,同时追求不兼容的迁移目标。
他们互不知晓。
根据那份总结,agent 们升级到了 sabotage(蓄意破坏):
禁用对立的 Unix 账户
在循环中杀死竞争进程
把恶意代码伪装成"系统健康监控器"
Anthropic 说他们"持续看到多 agent 地盘战",升级成了"越来越激进、自我复制的恶意软件"。
听起来很戏剧化,但核心 bug 很无聊。
agent 们推断出了干扰,却没有可靠的方式来验证同级的意图、权限或安全执行边界。
这应该让任何在做 agent 交接的人感到不安。
纯提示词信任必输
我找到的最佳思路来自同一场 r/openclaw 讨论。
一位开发者构建了一个本地安全层,编译成 33 KB 的 JavaScript。
无服务器。无 API key。无模型调用。只有确定性规则。
假权威声明
嵌套消息夹带
关键的设计选择才是重点:
你的指令进来了,完全被接受,但还是不能执行,因为来自同级的任何东西都会落入一个被引用的数据字段,没有任何东西会把它解读为命令。
这完全正确。
一个可信的发送方不应该自动获得命令控制权。
三种信任模型,一个明显赢家
如果你在做任何敏感的事,纯提示词信任是输家。
它适合一个玩具 Discord 机器人。但对于涉及以下场景的 agent 来说,它就是鲁莽:
一个真正的审批工作流应该做什么
大多数团队在这里都很模糊,所以这是我能信任的最低版本。
验证发送方签名
拒绝未知同级 ID
拒绝重放数据包
拒绝为其他主体铸造的令牌
将发送方映射到受限能力
将接受的内容存储为不可执行的引用数据
在任何敏感操作之前运行确定性本地策略
伪代码大致是这样的:
function receive(message) {
verifySignature(message)
assertKnownPeer(message.senderId)
assertNotReplayed(message.nonce)
assertTokenScope(message.token, message.senderId)
const quotedPayload = message.content
if (requestsSensitiveAction(quotedPayload)) {
requireLocalPolicyCheck()
requireExplicitCapability()
requireDeterministicApprovalGate()
}
neverExecutePeerContentAsRawCommand()
}
那个 quotedPayload 步骤就是全场关键。
即使通过了验证,同级内容也是数据,不是指令。
如果另一个 agent 希望你的编码 agent:
该请求应该进入本地审批路径。
不是命令通道。
一个实用的 Node.js 示例
如果你在构建 agent 到 agent 的工作流,我会用这种分叉方式。
{
"sender_id": "planner-agent",
"recipient_id": "deployer-agent",
"issued_at": 1786550100,
"nonce": "5f2b4a2d-9f0f-4a1f-8db0-7a29cb3a8f10",
"capability": "request_deploy",
"content": {
"service": "billing-api",
"environment": "staging",
"version": "2026.08.13"
},
"signature": "base64-ed25519-signature"
}
import crypto from 'node:crypto'
function verifyEnvelope(envelope, publicKey) {
const signedFields = JSON.stringify({
sender_id: envelope.sender_id,
recipient_id: envelope.recipient_id,
issued_at: envelope.issued_at,
nonce: envelope.nonce,
capability: envelope.capability,
content: envelope.content
})
return crypto.verify(
null,
Buffer.from(signedFields),
publicKey,
Buffer.from(envelope.signature, 'base64')
)
}
function approveRequest(envelope, registry) {
if (!verifyEnvelope(envelope, registry.getPublicKey(envelope.sender_id))) {
throw new Error('invalid signature')
}
if (!registry.isKnownPeer(envelope.sender_id)) {
throw new Error('unknown peer')
}
if (registry.hasSeenNonce(envelope.nonce)) {
throw new Error('replay detected')
}
if (!registry.hasCapability(envelope.sender_id, envelope.capability)) {
throw new Error('capability denied')
}
registry.markNonce(envelope.nonce)
return {
approved: false,
reason: 'peer content accepted as quoted data only',
quoted_data: envelope.content
}
}
最后一个返回值是刻意设计的。
消息被接受了。发送方是真实的。签名是有效的。能力是被认可的。
但仍然,什么都不执行。
终端级控制也同样重要
如果你的 agent 运行在服务器、容器或 CI worker 上,审批工作流应该与操作系统层面的边界对齐。
# separate Unix users per agent
sudo useradd planner-agent
sudo useradd deployer-agent
# lock down who can access deployment scripts
sudo chown deployer-agent:deployer-agent /opt/agents/deploy.sh
sudo chmod 750 /opt/agents/deploy.sh
如果你通过队列或 HTTP 传递消息,每次都要记录发送方身份和 nonce:
journalctl -u deployer-agent | grep request_deploy
你需要一条审计线索来回答:
他们声称具备什么能力
请求是被阻止了还是被批准了
为什么 A2A 和 MCP 现在突然开始关注 auth
因为这已经是基础设施了。
Google 的 Agent2Agent(A2A)协议一上线就有一长串合作伙伴:Atlassian、Box、MongoDB、PayPal、Salesforce、SAP、ServiceNow 和 Workday。
这不是业余项目的架势。
这是整个行业在承认"就让 agent 互相聊"不是一个严肃的架构。
MCP(Model Context Protocol)也是同样的故事。
MCP 最初是连接模型与工具和数据源的简洁方式。
然后人们开始接入远程服务器、共享凭证和有实际影响范围的工具访问。
到了那个阶段,授权的重要性已经不亚于上下文格式了。
一个认证薄弱的 multi-agent 技术栈,本质上就是一个绑定了公司信用卡的分布式提示词注入引擎。
协调很重要,但身份仍然优先
你可以说这本质上是一个协调问题。
目标冲突、隐藏状态和薄弱的协商绝对会让 agent 行为出格。
但这并没有削弱身份论证,反而强化了它。
即使你的 agent 协调得完美无缺,一个被入侵的或权限过高的可信 agent 仍然可以发送一份签名的灾难。
所以不,签名本身是不够的。
最小权限令牌
确定性审批门控
本地执行边界
安全不是一把锁。它是一排上了锁的门。
成本角度让这件事更加紧迫
随着推理成本下降,这个问题会越来越大。
当团队不再为每个 token 精打细算,他们就会运行更多 agent:
更多后台自动化
更多长时运行的工作流
更多 agent 到 agent 的交接
这对生产力来说是好事。
但这也意味着破损的审批逻辑会被执行得更加频繁。
这是我为什么认为可预测的定价对 agent 构建者很重要的原因之一。
如果你在 n8n、Make、Zapier、OpenClaw 或自定义 Python worker 中运行自动化,你希望 agent 持续运行而不用担心 token 消耗。但你也需要基础设施那端跟上这个规模。
这包括成本控制和信任边界。
Standard Compute 在这里值得关注,因为它给你提供了一个 OpenAI 兼容的 API,采用固定月费而非按 token 计费。对于运行大量 agent 循环、工具调用和链式工作流的团队来说,这消除了"我们应该停掉这个吗,因为它可能很贵?"的问题。
但更便宜、可预测的推理只有在你的 agent 不能随意互相发号施令时才有意义。
更低的成本应该增加实验。它不应该降低你的安全底线。
我以前以为 multi-agent 安全最难的部分是让提示词变得正确。
我不再这么想了。
最难的部分是构建一个系统,让 agent 无法把同级消息 casual 地转化为执行——即使这些消息:
来自一个可信的 agent
在任何危险操作发生之前,接收方需要三个答案:
他们被允许请求什么?
为什么这个请求要跨越一个确定性门控而不是直接执行?
如果你对这三个问题没有清晰的答案,你的 AI agent 审批工作流大部分只是做秀。
而这正是我认为很多开发者仍然低估的部分。
不是模型智能。不是提示词技巧。
基本的、原始的、不花哨的身份验证。
这是在 agent 开始互相下达指令之前所有人都跳过的那个环节。