使用 Model Context Protocol (MCP)——一种将 AI 模型连接到外部数据源的标准——的开发者在构建自定义代理时经常面临两难境地。为了将代理连接到像 S3 存储桶这样的服务,开发者必须使用 OAuth 身份验证。然而,许多 MCP 服务器仅允许来自 Claude 或 VS Code 等预先批准的知名应用程序的重定向 URI。如果服务器拒绝这些自定义地址,开发者将被迫使用不安全的方法;如果它接受匿名注册期间提供的任何地址,则会留下巨大的网络钓鱼漏洞。

当授权服务器接受任意重定向 URI 时,攻击者可以注册一个名为“Claude”的虚假客户端,并将他们自己的恶意 URL 设置为回调点。用户点击“重新连接存储”的链接时,会在真实域名上看到合法的同意界面,但会不知不觉地将一次性授权代码直接发送到攻击者的网站。这种漏洞的证据非常广泛:一项 2026 年 5 月的研究发现,近 96% 的受测 MCP 服务器接受来自匿名请求者的任意重定向。现实世界中的案例已经因为此类缺陷导致商户配置文件和银行详情遭到泄露。

为了解决这个问题,Stream Vessel 引入了一种设计,即信任是在登录时刻按用户确定的,而不是在初始注册时确定的。虽然服务器仍允许匿名注册任何 URI(以适应多样化的客户端),但它仅在主机位于全局白名单、回环地址(如 localhost)或特定登录用户管理的个人列表中时才会执行重定向。为了防御社会工程学攻击——即用户可能被诱骗手动添加攻击者的主机——系统要求用户在将主机添加到其信任列表之前,必须以纯文本形式输入主机地址。这创造了刻意的摩擦力,并辅以自动审计邮件以及为新信任地址提供的默认“只读”权限状态,确保即使用户被欺骗,影响范围仍保持在可控范围内。

展示重定向 URI 授权决策逻辑的流程图。
授权逻辑根据全局白名单、回环地址或用户特定信任列表来决定是否授予同意。streamvessel.com

此图解释了逻辑流,其中服务器根据不同的信任级别(全局、回环或个人)评估重定向 URI,以决定是否继续进行授权。

显示警告信息和用户手动输入主机地址文本框的拒绝页面。
拒绝页面要求用户手动输入主机地址以将其添加到信任列表中,从而对社会工程学攻击制造刻意的摩擦。streamvessel.com

此图展示了安全机制,即用户必须提供纯文本输入来授权新主机,正如最后一段所述。