#8238·autogen

HandoffMessage.context 会将同伴编写的消息插入到另一个代理的模型上下文中,同时保留其声明的 LLM 角色。

作者: AUTHENSOR创建于 2026年9月15日更新于 2026年9月16日

HandoffMessage.context splices peer-authored messages into another agent's model context with their LLM role intact (system-role forgery across the group-chat trust boundary) 严重程度: 高。 框架信任边界被破坏,完整的对等主机链在未修改的框架代码上被端到端演示(一个模型合规跳转被确定性地跳过,请参阅重现)。 受影响的版本: 在 AutoGen-agentchat 0.7.5 和 AutoGen-ext 0.7.5 中验证,提交为 027ecf0a379bcc1d09956d46d12d44a3ad9cee14(报告时的主头; 处于维护模式的仓库)。 HandoffMessage 接收路径中的拼接点是群聊协议的一部分,且早于 0.7.x; 请从历史记录中确认最早受影响的版本。 ## 概要 在 agentchat 群聊协议中,由一个参与者发布的正常消息在进入另一个参与者的提示中被降级为用户角色: BaseTextChatMessage.to_model_message() 返回一个 UserMessage (Python/packages/AutoGen-agentchat/src/autogen_agentchat/messages.py:138-139),因此对等内容永远不会以系统权限在该通道上到达。 HandoffMessage 拥有一个第二通道,可以绕过该控制: context: List[LLMMessage] = [] "要传递给目标代理的模型上下文。" (Python/packages/AutoGen-agentchat/src/autogen_agentchat/messages.py:427-428) 当任何 AssistantAgent (或 CodeExecutorAgent) 接收消息时,msg.context 的每个条目都被逐字复制到接收代理的自己的模型上下文中,其声明的角色保持不变,且没有类型或来源验证: for msg in messages: if isinstance(msg, HandoffMessage): for llm_msg in msg.context: await model_context.add_message(llm_msg) await model_context.add_message(msg.to_model_message()) (Python/packages/AutoGen-agentchat/src/autogen_agentchat/agents/_assistant_agent.py:1021-1025; 同一个拼接存在于 agents/_code_executor_agent.py:832-836 和 teams/_group_chat/_selector_group_chat.py:141-145) 因此,参与者可以发布一个 HandoffMessage,其 context 包含 SystemMessage(content=<arbitrary instructions>),并且接收代理的下一个模型调用将这些指令作为系统角色消息传递。 SystemMessage 类由 OpenAI 客户端渲染为角色 system: if isinstance(message, SystemMessage): return "system" (Python/packages/AutoGen-ext/src/autogen_ext/models/OpenAI/_openai_client.py:154-156) Swarm 管理员将控制路由到 Handoff 所命名的目标,并将线程中的最新 HandoffMessage 视为权威的(Python/packages/AutoGen-agentchat/src/autogen_agentchat/teams/_group_chat/_swarm_group_chat.py:92-97),因此攻击者还可以选择哪个代理接收伪造的上下文。 ## 影响 任何在 Swarm(或任何将 HandoffMessage 转发给 AssistantAgent 的群聊)中的参与者,无论是恶意的、已被入侵的还是由不可信内容驱动,都可以获得指令…

内容来源: microsoft/autogen