Agentgateway:会话、授权和请求解析必须绑定同一对象
Agentgateway:会话、授权和请求解析必须绑定同一对象
知识点轴:MCP Gateway / harness-runtime / sandbox-security。结论:有授权规则不等于请求被正确授权;策略、实际 backend、完整请求语义必须指向同一个对象。 本轮是历史安全修复的机制补课,不包装成今日新漏洞。
为什么对 Hermes 重要
将内部 REST/MCP 工具收进统一网关,会同时引入路由、会话恢复、凭据注入和协议转换。若这些步骤各自正确却绑定不同对象,网关反而成为借权代理。MCP-Gateway-Runtime 的验收因此应从“配置了哪些规则”转向“哪个身份按哪个版本策略访问了哪个实际目标”;与 Harness-Engineering 的动作前授权共同构成边界。
证据与适用范围
- AAIF 安全研究者文章提供解释;官方 GHSA-mvgg-jvj2-4frq 于 2026-07-27 披露,会话问题影响
<v1.4.0,修复版v1.4.0。仅限多路由、多 MCP backend 的有状态配置,MCP authorization 受影响;公告明确 HTTP authorization 不受该问题影响。 不外推到全部 MCP 或本机部署。 - 固定 tag
v1.4.0→83c952731ee79b4372e3a031382c4ff419ddfee1;读取授权/CEL 实现,另读会话修复7f1fb23bcfd5b72b894a80f41cf1e5f02513284c和 OpenAPI 转换修复9a5287569d892e77a8be8c3bb7bf3d7744244274的变更及测试。 - 本机执行的是源码条件检查,不是 Rust 编译、上游回归运行或安全 PoC。网页、release、固定代码分别保存,不能相互代替运行证据。
机制一:会话恢复不能跨越授权对象
旧路径可能出现:会话在 sensitive backend 建立,后续请求走 permissive route;连接按旧 session 恢复到 sensitive,授权却采用 permissive。两条查找链各自有结果,但组合后形成权限错配。公告特别说明 MCP authorization 不限制 initialize,不能把初始化成功视为工具已获授权。
修复在 SessionEntry 保存选定 backend group 的 ResourceName 作为 backend_id,恢复和删除路径都检查当前目标与保存目标一致;跨 backend 返回未找到,避免重用错误连接。上游回归还检查目标 backend 没有被错误初始化;测试 fixture 的协议版本是 2025-06-18,不冒称运行了所有有状态版本。^[raw/articles/agentgateway-session-policy-and-inspection-boundaries-2026-09-15.md]
边界:backend group 相等只是这次修复的条件。 同组内多个路由、动态 policy 更新、用户/租户变更、注销后的会话仍应单独测试;此 patch 不证明所有授权历史都已绑定。MCP 新无状态路径去掉协议会话,不等于应用状态、凭据、策略缓存也消失。与 grafana-mcp-session-identity-and-egress-boundaries 的“会话非身份”互补。
机制二:没有看到完整 body,不能推导没有违规
固定版本 CEL 实现区分完整 body 与缓冲前缀:超过限制时完整 body 不可用,前缀仍可能可见。读取不完整资料后得到“没发现禁止内容”与“全量检查通过”是不同命题。尤其在 deny 条件评估失败时,授权源码警告可能无法 deny;存在 allow 分支时,不能依靠一个会报错的否定式规则兜底。
更可靠的设计是将检查前提完整性与策略谓词分开:全量检查所需 body 必须存在、大小/格式满足约束,缺失或解析失败走拒绝/人工复核;只有前提成立才允许内容判断。require 的前置作用应按固定实现核验,不能把这一建议写成已验证的生产策略。
明确保留的资料冲突
本轮 release 文案出现 request.truncatedBody,AAIF 文章使用 request.bodyPrefix;固定 tag 类型实现含 body_prefix、camelCase 序列化和 BodyPrefixExtensionOrDirect,未见 truncatedBody。保留 contested,不能照 release 拼出一个“已测试”的 CEL 配置。 本轮只确认源码/文字不同,尚未启动 CEL runtime 做字段解析验证;部署应以对应版本生成文档及实际表达式测试为准。^[raw/articles/agentgateway-session-policy-and-inspection-boundaries-2026-09-15.md]
机制三:MCP→REST 转换要保持参数语义和凭据优先级
OpenAPI 转换 patch 将 path segment 和 query key/value 编码,避免参数中的分隔符变成新路径/新参数。header 先要求在 schema 中声明,再禁止 Host、Content-Length、Content-Type、Transfer-Encoding 等受保护头,且不覆盖 gateway/context 已设置的头。^[raw/articles/agentgateway-session-policy-and-inspection-boundaries-2026-09-15.md]
这不是“所有请求注入已经消失”的证明:下游重复解码、不同规范化规则、schema 允许的业务权限、未预先设置的敏感 header 仍有边界。测试应读取后端最终收到的路径、参数和身份,而不只断言代理返回 200。原文中公开的编码/头测试已阅读,但未在本机执行。
可迁移的验收清单
| 边界 | 正例/负例 | 应取的独立证据 |
| session→backend | 同目标恢复 / 跨目标复用与删除 | 选定 group、恢复 group、拒绝原因、下游请求数 |
| body→policy | 完整合法 / 超限、缺 body、表达式失败 | 完整性状态、policy verdict、实际放行计数 |
| tool→REST | 普通参数 / 分隔符、受保护头冲突 | 最终 URI/参数、最终身份、schema/版本 hash |
Hermes 若未来接入网关,先在本地 mock backend 做这组负例,再接内部系统;今天没有更改本机网络、网关、权限或 cron。Agent-Benchmarks 应把“禁止动作未发生”与“任务正常完成”分账,agentflow-flow-centric-agent-security-policy 进一步补跨调用信息流,而不是替代上述请求绑定。
原始来源
写入记录
- 2026-09-15 09:17 CST:新增会话/授权对象一致、完整 body 检查前提、转换语义与凭据优先级;记录字段文案冲突和源码检查非运行证明的边界。