Grafana MCP:会话不是身份,凭据隔离不是出站隔离
Grafana MCP:会话不是身份,凭据隔离不是出站隔离
结论与知识点轴
MCP Gateway / sandbox-security / harness-runtime / benchmark-evaluation。 此案例把三个经常混同的边界拆开:会话状态、调用者权限、服务器可到达的网络。检查 session ID 的格式不是认证;防止 Grafana token 发往其他站点,也不等于阻止服务器替调用者访问内部服务。
这是对 MCP-Gateway-Runtime 的具体反例,而不是又一个 gateway 功能清单。用户关注监控、告警与内部服务;一旦把观测系统接入 agent,服务器的服务账号及网络位置都成为可被委托的权限。本文没有检查用户是否部署该组件,不能据此宣称用户环境存在漏洞。
来源、时间与证据等级
- Pillar 原始研究:2026-09-02,已读取完整 HTML 正文;不是今天发布。
- Grafana 官方 CVE 公告:2026-08-11,CVE-2026-19516;公告列 fixed versions
>=1.1.0。 - 官方 v1.1.0 release:2026-08-10。已核对新增可选入站认证和删除
X-Grafana-URL的两个独立条目。 - 证据到达原文、官方公告和 release 层;未部署、未复现、未审计修复 diff。正文与 release 共存于同一 raw bundle,按小节可追溯。
机制:谁提供指令,谁提供权限
1. Session 是状态引用,不是访问凭据
研究者报告,受影响部署接受本地生成、格式正确但从未签发的 Mcp-Session-Id,并允许无凭据调用者列举及调用工具。真正访问 Grafana 时却使用 MCP server 环境中的服务账号 token:调用者不持有 token,也获得了代行能力。这里失效的是入站认证与授权,不是 token 被盗。^[raw/articles/grafana-mcp-session-identity-and-egress-boundaries-2026-09-10.md]
因此控制面需要分别判断:身份是否可信、是否有权调用具体工具、session 是否属于当前身份。只验证 session 字符串形状、Host 或 Origin,不能替代这些判定。这也是 Harness-Engineering 的动作执行边界:身份和授权应在 tool dispatch 前生效,而不是只放进模型上下文。
2. 凭据不外发,网络权限仍可能被借用
官方公告指出,先前 CVE-2026-15583 的修复阻止服务账号 token 发往非预期目的地,但未限制目的地本身。grafana_api_request 曾允许调用者通过 X-Grafana-URL 选择目标,并控制 method/path/body;服务器仍可连接自身能访问而调用者不能访问的地址,返回响应。网络可达性本身就是权限,不需要附带 Grafana token 才能产生风险。^[raw/articles/grafana-mcp-session-identity-and-egress-boundaries-2026-09-10.md]
研究中的内部/metadata 演示使用受控 canary,不能推导“所有实例均能访问真实云元数据”。能否造成具体损害取决于目标版本、网络位置、启用工具、出站策略和可达服务。
3. 修复版本与运行配置是两张验收单
v1.1.0 的 release 明确删除未公开支持的 X-Grafana-URL header,同时新增 --server-auth-token / MCP_GRAFANA_SERVER_TOKEN。入站认证只在配置 token 后启用;未配置时,非 loopback 绑定仍启动,只记录 security error。因此“已升级”不能替代“已启用认证”,也不能把“未配 token”的风险笼统称为仍存在同一个已修 SSRF。^[raw/articles/grafana-mcp-session-identity-and-egress-boundaries-2026-09-10.md]
对 Hermes / 企业 MCP 的可执行启发
以下是迁移建议,不是已部署控制措施:
| 检查对象 | 应验证的行为 | 不能接受的替代证据 |
| 入站身份 | 无 token / 错 token 请求在 tool dispatch 前被拒绝 | 有 session ID、返回了 401 文本但工具仍执行 |
| 每动作授权 | 当前身份只能调用允许的工具及参数范围 | 服务账号本身拥有权限 |
| 出站目的地 | 默认固定受信 origin;对实际解析地址、重定向和连接执行策略 | 只移除 Authorization header |
| 凭据边界 | 每个目标、租户及身份按需取凭据,日志不记录密钥 | 所有工具共享高权限环境 token |
| 修复闭环 | release/版本、认证配置、拒绝日志及 canary 状态一起留证 | “升级到最新”一句话 |
联邦 gateway 不能把上游的“已认证”无限传递为下游全权限。服务账号、内网、代理和可选 header 都应进入 authority inventory;实际访问应按 caller × tool × destination 求交。与 a2a-tck-conformance-coverage-and-security-boundaries 一样,跨 agent 回调也需要独立的目的地约束。
边界与未解问题
- 本文不提供或执行针对真实服务的攻击;部署验证应使用自有 canary 和不含真实数据的隔离环境。
- 组织内网可能是合法目标;不能机械封禁所有私网。应明确允许的内部服务、租户、身份和连接策略。
- gateway 代理是控制路径,不保证不存在直连旁路;需把 connector/backend 的直接暴露纳入验证。
- redagentbench-state-grounded-safety-measurement 提醒:看到拒绝回答还要看服务端是否已发生动作;pillar-docker-socket-sandbox-trust-handoff 则说明本地 daemon 也是隐式权限来源。
写入记录
- 2026-09-10 09:06 CST:新增完整研究、官方 CVE 与 release 对读,区分 session、身份、凭据、网络边界及“版本修复”和“配置启用”;未做运行环境漏洞断言。
- 2026-09-10 12:03 CST:补充正文到 Harness-Engineering 的机制关联,形成 MCP Gateway / Harness 双概念入口;未探测或变更运行环境。