漏洞概述 标题: Hermes Agent API Server allows forged todo-history hydration that can exhaust session context 描述: Hermes Agent API Server 接受调用者提供的 条目,并在 HTTP API 服务器上信任 的消息中包含的 JSON 对象作为权威的 todo-tool 输出。由于水合的 todo 条目被写入 而没有进行身份验证或大小检查,并在后续上下文压缩流中重新注入,API 客户端可以注入过大的持久化 todo 状态,导致受影响会话的服务拒绝。 详细信息: 问题由三个代码路径的交互引起: 1. API 服务器接受任意 对象并将其转发到 。 2. 自动调用 为新代理实例提供历史。 3. 信任任何先前的 消息,即使其内容包含 键,解析它并将其重新注入 ,后者在重新注入活动项之前不执行任何大小或身份验证检查。 相关代码: 实际利用: 攻击者可以通过 API 访问提交一个包含非常大 todo 项的伪造历史条目,例如一个 50,001 字符的字符串。水合逻辑将其作为先前的工具输出接受,存储它,并在压缩期间发出一个 50,085 字符的重新注入块。这消耗上下文预算并可能破坏或中断会话。 影响范围 生态系统: pip 包名: hermes-agent 受影响版本: 所有发布版本,包括 v2026.5.29.2(截至撰写时最新)。验证仍未修补: 不执行身份验证检查, 不强制执行任何项/总大小限制。 已修补版本: 无 修复方案 目前尚未提供具体的修复方案。需要开发者检查并修复 和 中的身份验证和大小检查逻辑。 POC 代码 前提条件: 运行易受攻击代码的 Hermes Agent 仓库。 启用 Hermes API 服务器。 配置模型/提供程序以便 API 服务器可以处理请求。 网络或本地访问 。 如果 API 服务器在非本地接口上公开,则需要有效的 。本地部署可能在没有配置密钥的情况下接受请求。 复现步骤: 1. 启动目标服务: 2. 从 下载外部 POC 脚本。 3. 对本地 API 服务器运行外部 POC: 如果 API 服务器需要身份验证: 4. 对于控制情况,下载 。 5. 运行没有伪造工具历史的控制请求: 或带身份验证: 6. 对于直接 sink 验证,下载 。 7. 运行直接验证脚本: 8. 可选的最小助手工件: 证据日志 从 观察到的运行时证据: 这表明伪造的历史条目被接受到 并转换为非常大的上下文重新注入块。 影响 这是一个影响通过 API 服务器可达的 Hermes Agent 会话的服务拒绝问题。具有 API 访问权限的攻击者可以通过过大的伪造工具输出毒害每个会话的 todo 状态,导致持久的上下文膨胀并可能破坏后续请求。主要受影响的资产是服务可用性和会话完整性。无需直接代码执行即可触发问题。 弱点 CWE: CWE-345: 数据真实性验证不足 发生情况 永久链接: - https://github.com/NousResearch/hermes-agent/blob/5e743559e0157d42e0640cd06d736e898370d0/gateway/platforms/api_server.py#L2148-L2196 - https://github.com/NousResearch/hermes-agent/blob/5e743559e0157d42e0640cd06d736e898370d0/run_agent.py#L2113-L2142 - https://github.com/NousResearch/hermes-agent/blob/5e743559e0157d42e0640cd06d736e898370d0/agent/conversation_loop.py#L333-L337 - https://github.com/NousResearch/hermes-agent/blob/5e743559e0157d42e0640cd06d736e898370d0/tools/todo_tool.py#L38-L80 - https://github.com/NousResearch/hermes-agent/blob/5e743559e0157d42e0640cd06d736e898370d0/tools/todo_tool.py#L90-L123 - https://github.com/NousResearch/hermes-agent/blob/5e743559e0157d42e0640cd06d736e898370d0/tools/todo_tool.py#L125-L146 描述 API 服务器接受受控的 条目,并将其转发到 ,区分信任来自用户提供的 的伪造消息,即使它们不是由实际注册的 todo 工具生成的。 自动调用 ,使用新代理实例的历史,使伪造的 todo 通过正常 API 调用。 重新注入的 todo 项没有大小限制执行器。 格式转换每个活动项到重新注入的代理,放大影响的上下文窗口。 不执行任何字符长度限制,导致持久状态。