Kluster AI 的 verify-mcp 服务器信任任何能够访问其 /stream 端点的浏览器会话。

当该服务通过 HTTP 暴露并绑定到 0.0.0.0 时,DNS 重绑定攻击可以将受害者的浏览器变成一个代理,从公共互联网驱动其 API。

在我们的测试过程中,这一技术使我们能够远程调用 verify 工具,并在未经用户同意的情况下耗尽 Kluster 额度。

摘要

  • 攻击向量: DNS 重绑定滥用浏览器的信任模型,将一个域名从攻击者主机重新指向 127.0.0.1,从而绕过同源策略(Same-Origin Policy)的保护。
  • 暴露的组件: Kluster 的 verify-mcp 服务器通过纯 HTTP 暴露 /stream,并且仅依据客户端提供的 Host 头来接受请求。
  • 观察到的结果: 在重绑定之后,攻击者控制的 JavaScript 能够像本地用户一样驱动 verify 工具,消耗付费额度。

技术分析

该攻击分两个 DNS 阶段展开,并配合一个轻量级的 HTML/JavaScript 载荷:

  1. 初始绑定到攻击者基础设施。 受害者访问一个由攻击者控制的网站。第一次 DNS 查询解析到攻击者的公共 IP,使我们能够提供一个轮询 Kluster 端点的脚本。
  2. 重绑定到 localhost。 在页面加载后,攻击者的 DNS 服务器对同一主机的后续查询以 127.0.0.1 作答。浏览器复用缓存的名称,因此后续的 fetch 调用会悄然转向受害者的回环接口,同时保留原始的 origin 字符串。
  3. 驱动 verify API。 由于 verify-mcp 允许来自任何来源的 HTTP 请求,且不校验 Host 或 Origin 头,我们的脚本成功地向 /stream 提交(POST)作业,触发了消耗额度的验证运行。

这种模式并非 Kluster 独有,但 HTTP 传输与缺乏头部校验相结合,使得利用变得轻而易举。

影响

  • 服务滥用: 远程攻击者可以消耗 Kluster 验证额度或向 API 发送垃圾请求,给合法用户造成经济损失或触发速率限制。

建议

面向 Kluster AI

  • 严格校验 HostOrigin 头,拒绝不符合明确允许列表(localhost127.0.0.1)的请求。
  • 即使对本地会话也引入身份验证或 API 令牌,以确保只有受信任的调用方才能触发消耗额度的操作。

面向 MCP 运营者和用户

  • 假设在存在 DNS 重绑定的情况下,localhost 服务可通过浏览器访问;在日志中监控异常的 origin 名称。
  • 对于任何暴露到回环接口之外的工具,优先使用 HTTPS(配备正确的证书)并进行明确的头部校验。
  • 教育开发者在浏览不受信任的网站时关闭本地代理,或使用网络分段将代理服务与默认浏览器配置文件隔离开来。

结语

DNS 重绑定持续模糊着 MCP 工具中「本地」与「远程」之间的界限。

通过加固传输通道、校验请求元数据以及要求身份验证,平台厂商可以帮助开发者更安全地工作。

时间线

  • 2025-07-17:向 Kluster AI 安全团队提交初始报告。
  • 2025-07-17:Kluster 当天确认收到报告。
  • 2025-08-29:向 Kluster AI 发送后续询问,请求修复状态。
  • 2025-10-16:技术公告发布于 mcpsec.dev。