Kluster 的 Verify MCP 服务器使用户面临额度耗尽风险
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 载荷:
- 初始绑定到攻击者基础设施。 受害者访问一个由攻击者控制的网站。第一次 DNS 查询解析到攻击者的公共 IP,使我们能够提供一个轮询 Kluster 端点的脚本。
- 重绑定到 localhost。 在页面加载后,攻击者的 DNS 服务器对同一主机的后续查询以
127.0.0.1作答。浏览器复用缓存的名称,因此后续的fetch调用会悄然转向受害者的回环接口,同时保留原始的 origin 字符串。 - 驱动 verify API。 由于
verify-mcp允许来自任何来源的 HTTP 请求,且不校验 Host 或 Origin 头,我们的脚本成功地向/stream提交(POST)作业,触发了消耗额度的验证运行。
这种模式并非 Kluster 独有,但 HTTP 传输与缺乏头部校验相结合,使得利用变得轻而易举。
影响
- 服务滥用: 远程攻击者可以消耗 Kluster 验证额度或向 API 发送垃圾请求,给合法用户造成经济损失或触发速率限制。
建议
面向 Kluster AI
- 严格校验
Host和Origin头,拒绝不符合明确允许列表(localhost、127.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。