MCP 虽然火,但安全问题其实一直不容忽视,就连大名鼎鼎的、与Claude 打得火热的 Github MCP 服务器也出事了!
刚刚得到消息, 昨天,一家名为Invariant 的安全的公司,突然披露了一个有关 GitHub MCP 集成(在 GitHub 上拥有 1.4 万星标)的严重漏洞。
这个漏洞允许攻击者通过精心构造的 GitHub Issue“劫持”开发者的智能代理(如 Claude Desktop 中的 Claude 4 Opus),并诱导它主动泄露私有仓库的数据。
更令人警惕的是:这不是传统意义上的工具被黑,而是一种全新的攻击路径——中毒代理流(Toxic Agent Flow)。攻击者无需突破 GitHub 或 AI 模型, 现在,攻击者只需要用户的某个存储库中放置恶意问题,他们就可以轻松劫持用户的代理并疯狂利用它,比如诱导智能代理误操作,就可能造成源代码、公司机密甚至个人信息的外泄。
漏洞原理:如何一步步劫持 AI 代理?
这种攻击方式也是Invirant的自动安全扫描器首次识别到。 Invirant在博文中介绍了漏洞的攻击原理。
首先是该公司设定的攻击场景。比方一位用户正在使用像 Claude Desktop 这样的本地 AI 编程客户端,并已将 GitHub MCP 接入自己的账户。
我们假设用户拥有以下两个仓库:
- username/public-repo:一个公开仓库,任何 GitHub 用户都可以提交 Issue。
- username/private-repo:一个私有仓库,储存着敏感代码或企业数据。
攻击者无需入侵,只需在公开仓库中提交一个特制的 Issue —— 里面暗藏 prompt injection(提示注入)攻击语句。接下来,只要用户问 Claude 一个看似无害的问题,例如:
“帮我看看 public-repo 的 open issues。”
Claude 就会调用 GitHub MCP 去抓取 Issue 列表,结果就会触发“注入攻击”。攻击语句会诱导 Claude 调用私有仓库内容并将其泄露到公开仓库中。
具体的攻击演示流程如下:
- 攻击者提交一个恶意 Issue(例如伪装成“About the Author”部分)。
- 用户无意中查看 Issue 列表,触发 Claude 自动调用 GitHub MCP 工具。
克劳德提示用于触发攻击
- Claude 被诱导调用私有仓库内容,并创建一个新的 Pull Request,把私有信息带入公开仓库。
- 攻击者可直接访问公开仓库获取泄露数据。
这是完整的聊天截图:
与特工进行全面聊天,展示攻击过程
在实测中,研究者最后成功导出以下敏感信息:
- 用户私有项目名称,如 Jupiter Star;
- 其搬迁计划(计划移居南美);
- 甚至包括薪资水平等个人隐私!
commit where the agent leaks private data
这类攻击完全绕过了 GitHub 的权限系统,利用的是用户自身的 AI 助手。这正是“中毒代理流”的可怕之处。
研究人员还展示了一个“关于作者”的注入攻击。
只需要在公共存储库中放置一个恶意问题,该问题包含一个有效载荷,代理程序在查询公共存储库的问题列表时将立即执行该载荷。
什么是 Toxic Agent Flow?为何防不胜防?
这是 Invariant 首次自动检测并披露此类漏洞。与传统的“工具被篡改”不同,Toxic Agent Flow 不需要 MCP 本身被攻破。攻击的本质是:智能代理暴露在不可信外部信息(如 GitHub Issue)环境下,被诱导执行恶意操作。
由于代理系统背后往往是强大的大模型(如 Claude 4、GPT-4、Gemini 等),它们对提示词非常敏感。一旦 prompt injection 成功,就可能做出无法预期的动作,如跨仓库访问、隐私泄露、甚至代码注入。
而且,即便模型本身对齐程度再高,面对这种“间接诱导 + 工具调用”的攻击链,依然很难完全防御。很多用户出于效率,会设置代理为“始终允许”调用工具,从而让攻击者有了可乘之机。
如何检测与预防中毒代理流?
防御策略一:数据流权限控制
推荐使用专为代理系统设计的安全防护工具,如 Invariant Guardrails,它可以设置基于上下文的访问控制策略。
例如,下面这段策略可有效阻止跨仓库调用:
复制
raise Violation("You can access only one repo per session.") if:
(call_before: ToolCall) -> (call_after: ToolCall)
call_before.function.name in (...repo 操作集)
call_after.function.name in (...repo 操作集)
call_before.arguments["repo"] != call_after.arguments["repo"] or
call_before.arguments["owner"] != call_after.arguments["owner"]1.2.3.4.5.6.7.8.
这意味着:每次交互,智能代理只能访问一个仓库,避免在一个 session 中串联多个目标,从而防止数据横向流动。
防御策略二:持续安全监控
安全策略之外,还应部署实时监控系统,例如 Invariant 的 MCP-scan 扫描器。
它支持 Proxy 模式,只需将 MCP 流量引入代理通道,即可:
- 实时检测 agent 的工具调用行为;
- 快速识别可疑请求;
- 自动生成日志审计记录,供后期溯源。
这一方式无需改动现有代理系统,就能大幅提升可视性和防御力。
Invariant 的 MCP-scan 扫描器
注意:模型对齐 ≠ 安全无忧
有人可能会想:“Claude 4 不是对齐做得很好吗?为啥还会被操控?”
答案是:模型对齐只能提供通用安全性,无法应对具体场景的上下文威胁。 一旦进入真实交互环境,信息输入路径复杂、工具链暴露多、提示语潜藏深,模型很难凭空识别恶意模式。
正因如此,系统级的安全机制(如访问控制、流量审计)才是防护的最后一道防线。
总结:别让 AI 成为下一个“内鬼”
今年以来,MCP 大红大紫,全球各大巨头都纷纷发布了自家的 MCP 服务器,但业内人士此前就多次提醒 MCP 带来的安全问题日益严峻。
本次曝光的 GitHub MCP 漏洞,首次揭示了AI 工具链下的间接攻击路径;攻击者可通过公开 Issue 向 AI 注入恶意提示,诱导其“自愿”泄露私有仓库内容。
值得注意的是,这是一种系统性问题,无法靠模型修复,必须通过权限隔离 + 实时监控的方式预防;
类似攻击未来可能在更多开发者平台(如 GitLab Duo)中出现,行业亟需构建统一的“代理安全框架”。
如果各位正在构建 Agent 系统,或已经将 GitHub、MCP 等工具集成至开发流程中,务必重视这类新兴风险。
参考链接:
https://invariantlabs.ai/blog/mcp-github-vulnerability#mitigations