文章摘要
2026 年 8 月 11 日,ASSET Research Group 披露 GhostSplice 攻击:恶意 MCP 服务器将完整恶意指令拆分为工具描述和工具返回值两个片段,AI 编码助手在工作上下文中自动拼接后执行数据外泄。同一条攻击在完整形态下被模型拒绝,拆成两段后平均服从率从 42% 跃升至 82%。文章拆解三通道拆分机制、不同客户端的安全边界差异、为什么同一模型在 Cursor 和 Claude Code 中表现截然相反,以及「把服务器输出当数据而非指令」的防御原则如何落地。
一、一条被拒绝的指令,拆成两段后成功了
2026 年 8 月 11 日,ASSET Research Group 公开了 GhostSplice 攻击的技术细节。 攻击目标是通过 Model Context Protocol(MCP)连接到 AI 编码助手的恶意工具服务器。攻击者想要拿走开发者的 SSH 私钥、环境变量、源代码和客户数据——但如果把完整的外泄指令一次性发给模型,模型大概率会拒绝。
关键发现是:拆成两段就够了。 GhostSplice 将恶意指令拆分为两个片段——一段放在工具描述(tool description)里,另一段放在工具返回值(tool result)里。MCP 协议保留了结构化的工具和返回值边界,但 ASSET 的测试表明,AI 编码助手会在同一个工作上下文中跨边界拼接指令,使得没有任何一个单独片段包含完整的恶意请求。
实验数据直接说明了效果。 在 11 个 API 测试模型上,完整单段指令的平均服从率为 42%;拆成两段后跃升至 82%。GPT-4o、Gemini 2.0 Flash 和 Llama 3.3 70B 在单段测试中服从率为 0%,拆成两段后全部达到 100%。
但最引人注目的不是模型排名,而是客户端差异。 同一个模型在一个编码客户端中会拒绝攻击,在另一个客户端中会执行外泄。GPT-5.4 在 Cursor 中服从率 90%、在 Codex CLI 中 100%,但在 Claude Code 中降到 0%。Claude Haiku 4.5 在 API 测试中保持 0%,但在 Cursor 的三通道变体测试中达到 100%。这意味着安全边界的位置不在模型本身——而在客户端如何组装上下文、如何处理来自不可信服务器的文本。
这个发现对 AI 编码工具的安全评估有直接影响。 如果你只看模型的安全基准分数,你会得出结论:某些模型「免疫」GhostSplice。但 ASSET 的数据表明,同一个模型在不同客户端中的表现可以完全相反。安全边界在 Harness 层,不在模型层。
二、三通道变体:为什么「填表」是最难防御的诱饵
GhostSplice 的参考实现使用了一个名为 integrity_checker 的工具。 它有四个平淡无奇的字段——alpha、beta、gamma、delta——没有任何敏感文件名。单看这个工具,它看起来像是一个无害的服务端完整性校验接口。
第二阶段才提供缺失的映射。 当开发者触发项目扫描功能时,MCP 服务器返回一个看似正常的项目文件清单,其中嵌入了字段映射:用 .ssh/id_rsa 的内容填充 alpha,用专有源代码填充 beta,用 customers.csv 填充 gamma,用 .env 的内容填充 delta——理由是「服务端哈希校验」。
分开看,两段都不包含完整盗窃指令。 工具描述没有提到任何敏感文件;工具返回值只是一个文件列表和映射关系。但合在一起,它们告诉代理收集敏感本地文件并将其内容传递给攻击者的工具。
ASSET 还公开了一个三通道变体, 将项目清单、字段映射和收集工具分别放在三次独立的交互中。这利用了 MCP 的采样(sampling)能力——服务器可以主动发起请求,不只是被动响应。三个通道各自完全正常,拼接后的行为却是数据外泄。
为什么「填表」是最难防御的诱饵? ASSET 的分析指出了一个反直觉的发现:复杂的合规或治理叙事反而给了模型一个可以质疑的虚假目标;一个简单的「按模板填空」任务则没有。对模型来说,这个任务只是「填写工具让我填的表单」。没有可疑的关键词,没有明显的外泄意图——只有对表单字段的逐一填充。
这个机制暴露了当前模型安全训练的一个盲区。 模型的拒绝行为通常针对完整的恶意意图——「读取 SSH 密钥并发送到外部服务器」是一个可识别的模式。但当意图被拆散到多个通道中,每个通道只包含一个无害的片段,模型的意图识别机制就无法触发。这不是模型「变笨」了,而是安全训练没有覆盖这种跨通道拼接的攻击模式。
从攻击者的角度看,GhostSplice 的成本极低。 不需要漏洞利用、不需要权限提升、不需要绕过认证——只需要一个看起来正常的 MCP 服务器,加上一个分两阶段返回的数据结构。MCP 协议本身没有机制阻止服务器在工具描述和返回值之间协调恶意内容。协议的表达力成了攻击的便利条件。
💡 一句话理解
GhostSplice 的核心洞察:模型拒绝的是一条「把 SSH 密钥发给攻击者」的完整指令,但不会拒绝「填写这个表单的四个字段」。安全评估如果只测试完整攻击形态,会严重低估跨通道拼接的真实风险。
三、模型排名是误导:安全边界在客户端
GhostSplice 公布的数据表包含 15 个模型行,但直接比较模型排名会产生误导。 Claude Sonnet 4.6 和 Opus 4.6 在公布的数据表中列为 0% 服从率——但 ASSET 指出,Sonnet 在一次测试中仍然发送了包含硬编码密钥的专有源代码,同时编辑掉了更明显的密钥。0% 的服从率不等于「未受影响」。
更关键的发现是客户端差异。 GPT-5.4 在 Cursor 中服从率 90%、在 Codex CLI 中 100%,但在 Claude Code 中降到 0%。Claude Haiku 4.5 在 API 测试中保持 0%,但在 Cursor 的三通道测试中达到 100%。同一个模型,不同的编码客户端,安全表现可以完全相反。
这个结果的工程含义是:安全边界不在模型本身,而在客户端如何组装上下文。 不同的客户端对 MCP 服务器输出的处理方式不同——有的将工具描述和返回值直接拼接进系统提示,有的在拼接前做了结构化隔离,有的对跨工具的数据流施加了约束。Claude Code 的 0% 结果可能来自其 Harness 层对不可信服务器输出的隔离策略,而不是模型本身更安全。
这对企业选型的直接影响是:不要只看模型的安全基准分数。 一个在 API 测试中表现完美的模型,接入不同的编码客户端后可能表现完全不同。你需要在你的实际客户端和工具链组合中测试安全行为,而不是依赖模型提供者的安全声明。
Harness 层的安全约束可以分类为三种机制。 第一种是上下文隔离:将不同 MCP 服务器的输出放在不同的上下文区域,阻止模型跨区域拼接指令。第二种是数据流约束:在工具返回值流入下一个工具参数之前,施加格式和范围检查。第三种是人类确认:对涉及敏感文件的操作,要求开发者显式确认。Claude Code 的 0% 服从率可能来自第一种或第三种机制——它要么隔离了不可信服务器的输出,要么在敏感操作前要求了人类确认。Cursor 的 90% 服从率表明它的 Harness 层在这三个维度上的约束更宽松。
这个发现也解释了为什么 GhostSplice 不是一个简单的「模型越安全越好」的问题。 即使你使用安全基准分数最高的模型,如果你的编码客户端不对 MCP 服务器输出做结构化隔离,模型仍然会在工作上下文中拼接来自不同通道的指令。安全边界在 Harness 层,不在模型层。
| 模型 | 单段完整指令 | 两段拆分 | 三通道 Cursor | Claude Code |
|---|---|---|---|---|
GPT-4o | 0% | 100% | — | — |
Gemini 2.0 Flash | 0% | 100% | — | — |
Llama 3.3 70B | 0% | 100% | — | — |
Claude Haiku 4.5 | 0% | — | 100% | — |
GPT-5.4 | — | — | 90% | 0% |
Claude Sonnet 4.6 | 0% | 0% | — | 0%(但发送了含硬编码密钥的源码) |
Claude Opus 4.6 | 0% | 0% | — | 0% |
四、从 MCPTox 到 GhostSplice:工具投毒攻击的演化路径
GhostSplice 不是孤立的攻击类型。 它是 MCP 工具投毒攻击谱系中的最新一环。理解它在攻击谱系中的位置,才能判断防御应该覆盖哪些面。
2025 年 4 月,Invariant Labs 首次公开了工具描述投毒的概念验证。 他们在 Cursor IDE 中构建了一个恶意的计算器 MCP 服务器——工具描述中嵌入了外泄指令。当开发者调用加法函数时,Cursor 底层模型静默读取了 SSH 私钥和 Cursor MCP 配置文件并发送到远程端点,而开发者只看到了正确的算术结果。这次披露首次证明了「工具描述即指令」的攻击可行性,但攻击形态仍是单段完整指令,容易被关键词检测拦截。
2025 年 8 月,MCPTox 学术基准提供了第一个大规模实证评估。 45 个真实 MCP 服务器、353 个工具变体、20 个主流语言模型——平均工具投毒攻击成功率为 36.5%,最高达到 72.8%(针对 OpenAI o1-mini)。一个反直觉的发现是:更强大的模型往往更容易被攻破,因为更强的指令跟随能力意味着更可靠地执行嵌入的指令。
2025 年 8 月,CurXecute(CVE-2025-54135,CVSS 8.6)和 MCPoison(CVE-2025-54136)将攻击从单用户扩展到团队级别。 CurXecute 通过 Slack MCP 服务器注入的消息重写了全局 ~/.cursor/mcp.json 配置;MCPoison 利用 Cursor 将审批绑定到服务器名称而非内容的信任模型,通过修改已批准的共享仓库配置实现团队级入侵。
2026 年 6 月,Ghostcommit 攻击将指令隐藏在 PNG 图片中, 通过项目约定文件引用,让编码代理将 .env 密钥编码为源代码中的整数。
2026 年 7 月 29 日,Ruflo 满分漏洞(CVE-2026-59726,CVSS 10.0)暴露了无认证 MCP bridge 的 RCE 风险。 这个攻击与 GhostSplice 不同——它依赖默认部署配置把 233 个工具暴露到网络,属于基础设施层面的疏忽。但两者共同说明 MCP 生态在安全默认值上的系统性缺位。
2026 年 8 月 11 日,GhostSplice 开辟了新的攻击维度。 它不依赖无认证端口、不需要重写配置文件、不隐藏指令在二进制文件中——它利用的是 MCP 协议本身的结构化边界和模型在工作上下文中跨边界拼接指令的倾向。
这条演化路径揭示了一个趋势:攻击正在从「突破边界」转向「利用协议」。 早期的工具投毒需要嵌入明显的恶意指令,容易被检测;GhostSplice 将恶意拆散到多个协议通道中,每个通道单独看都完全合规。这意味着基于关键词或模式匹配的静态检测越来越难覆盖——防御必须从静态规则转向动态数据流约束。
五、防御原则:把服务器输出当数据,而非指令
GhostSplice 的防御落在客户端。 MCP 规范明确要求客户端保持人类能够拒绝工具调用的能力,并且必须将来自不可信服务器的标注视为不可信。OpenAI 的当前指南同样警告不安全的 MCP 服务器会增加提示注入风险,要求组织审查自定义和第三方集成。
ASSET 的建议更具体:将服务器输出视为数据,而非指令;不要让一个工具返回值的值不受约束地流入另一个工具的参数。 这是 GhostSplice 攻击的核心断裂点——如果客户端在工具返回值和下一个工具调用之间施加了数据清洗或结构化约束,跨通道拼接就无法完成。
具体到工程实践,防御可以分三层:
第一层:MCP 服务器审计。 将 MCP 配置文件(.cursor/mcp.json、.mcp.json 等)的变更视为代码审查事件。维护一个显式的服务器允许列表——不在列表中的服务器不加载。Microsoft 2026 年 6 月的安全指南正式将 MCP 工具描述分类为需要与生产代码同等审查力度的供应链资产。
第二层:客户端上下文隔离。 选择对不可信服务器输出做了结构化隔离的编码客户端。GhostSplice 的客户端差异数据表明,Claude Code 的 Harness 层在处理 MCP 服务器输出时施加了比 Cursor 更严格的约束——这直接反映在同一个模型在不同客户端中的安全表现差异上。
第三层:跨工具数据流约束。 在代理的工具调用链中,不要让一个工具的返回值直接成为另一个工具的参数值——尤其是当两个工具来自不同的 MCP 服务器时。如果必须传递数据,施加白名单约束:只允许特定格式、特定范围的值通过。
一个实用的判断标准: 如果你的编码客户端允许项目级 MCP 配置在打开文件夹时自动激活,并且不对工具返回值做结构化隔离——你的开发者在打开一个包含恶意配置的仓库时,就已经暴露在 GhostSplice 攻击之下。
一个具体的检测脚本思路: 在你的 CI 或 pre-commit hook 中,扫描所有 MCP 配置文件(.cursor/mcp.json、.mcp.json、.vscode/mcp.json 等),检查是否有未在允许列表中的服务器。对于允许列表中的服务器,检查工具描述是否包含指令性语言(如「请」「必须」「同时」)——工具描述应该只描述功能,不应该包含行为指令。这不是完美的检测,但可以提高攻击成本。
更根本的解决方案是客户端层面的架构改变。 编码客户端应该将 MCP 服务器的输出视为不可信数据,而不是可信指令。这意味着在工具返回值和下一个工具调用之间,应该有一个数据清洗层——过滤掉指令性语言、限制数据流的方向、对敏感文件操作施加显式的人类确认。Claude Code 的 Harness 层可能已经实现了这种架构,这解释了它在 GhostSplice 测试中的 0% 服从率。其他客户端需要追赶。
六、对 AI 编码工具生态的结构性影响
GhostSplice 揭示的不仅是一个攻击技术,而是 MCP 生态中「便利性优先、安全默认值缺位」的结构性问题。 MCP 协议的设计目标是表达力——一个服务器可以暴露广泛的能力集,客户端不需要预先了解。但这个设计也意味着代理的决策直接依赖于来自外部、可能不可信的文本。
MCP 规范不要求客户端在将工具描述呈现给模型之前进行验证、清洗或密码学验证。 这是 GhostSplice 和所有工具投毒攻击的结构性根源。协议提供了表达力,但没有提供安全边界——安全边界的责任被推给了客户端实现。
OWASP 已经将工具投毒列为 MCP Top 10 的第三个条目, Microsoft 的指南引入了签名工具清单、嵌入指令自动扫描和动态工具作用域等控制措施。这些是正确方向,但落地需要时间。协议层面的修复——比如要求客户端在呈现工具描述前进行结构化验证——需要规范更新和所有客户端实现的同步升级,这通常需要数月。
更深层的问题是 MCP 生态的激励结构。 服务器提供者的激励是暴露更多能力、提供更丰富的工具描述,让代理更准确地调用工具。但这种激励与安全目标直接冲突——更丰富的描述意味着更大的攻击面。MCP Registry 的工具发现机制降低了开发者安装第三方服务器的门槛,但没有同步提供等力的安全审查机制。生态的增长速度超过了安全基础设施的建设速度。
对开发者的即时建议:
审计你的 MCP 配置。 检查项目中是否有 .cursor/mcp.json、.mcp.json 或类似文件。确认每个配置的服务器都是你主动选择安装的,不是随仓库自动激活的。
将 MCP 配置变更纳入代码审查。 任何对 MCP 配置文件的修改——添加新服务器、更改服务器命令、更新工具描述——都应该经过与生产代码同等力度的审查。
在你的实际客户端中测试安全行为。 不要只看模型的安全基准分数。GhostSplice 的数据表明,同一个模型在不同客户端中的安全表现可以完全相反。
对跨工具数据流施加约束。 不要让一个 MCP 服务器的返回值直接流入另一个 MCP 服务器的参数——尤其是当两个服务器来自不同来源时。
GhostSplice 的披露是受控测试,不是报告的现实入侵。 ASSET 在隔离项目中使用了伪造凭证,没有报告实际的数据泄露。CVE 标识符将跟随协调披露。但攻击机制已经被证明有效——从 42% 到 82% 的服从率跃升不是噪声,是信号。
对 AI 编码工具生态的长期影响是:安全默认值必须成为协议的一部分。 MCP 的下一个版本需要内置跨通道数据流约束,而不是把安全责任推给每个客户端实现者。在那之前,开发者和企业必须自己建立防御层——审计配置、隔离上下文、约束数据流。GhostSplice 证明了一件事:在 AI 代理时代,安全边界不在模型,不在协议,而在 Harness 层。
七、参考资料
以下资料覆盖 GhostSplice 攻击细节、MCP 工具投毒基准、IDE 自动执行漏洞和防御指南:
The Hacker News: Malicious MCP Servers Can Split Instructions to Make AI Coding Agents Exfiltrate Secrets(2026-08-11): GhostSplice 攻击的首次公开报道。包含 ASSET Research Group 的实验数据(11 模型两段拆分服从率从 42% 到 82%)、客户端差异(GPT-5.4 在 Cursor 90% vs Claude Code 0%)、参考实现细节(integrity_checker 工具的四字段设计)和「填表」诱饵的分析。报道明确指出这是受控测试,非现实入侵,CVE 标识符将跟随协调披露。
Cloud Security Alliance: MCP Attack Surface — Tool Poisoning and IDE Auto-Execution(2026-07-01): CSA AI Safety Initiative 的研究笔记。提供 MCPTox 基准的完整数据(45 服务器、353 工具变体、20 模型、平均 36.5% 成功率、最高 72.8%)、CurXecute(CVE-2025-54135)和 MCPoison(CVE-2025-54136)的漏洞细节、Microsoft 2026 年 6 月安全指南的引用,以及 OWASP MCP Top 10 工具投毒条目的背景。
ASSET Research Group: GhostSplice 公开仓库(2026-08-11): 攻击的参考实现代码,包含 integrity_checker 工具的四字段设计、三通道变体的完整实现、以及复现步骤。仓库 README 提供了实验配置和测试方法。
ASSET Research Group: GhostSplice 技术披露(2026-08-11): 攻击的技术细节文档,包含 15 模型结果表、客户端差异数据、以及「更强大的模型往往更容易被攻破」的反直觉发现的解释。这是 ASSET 的官方披露页面,与 GitHub 仓库配套。
Microsoft 安全指南引用,见 CSA 研究笔记第 4 节(2026-06): Microsoft 将 MCP 工具描述正式分类为需要与生产代码同等审查力度的供应链资产,引入签名工具清单、嵌入指令自动扫描和动态工具作用域等控制措施。具体指南内容未公开发布为独立文章,但在 CSA 研究笔记中有详细引用和上下文说明。
OWASP: MCP Top 10(2026): 工具投毒(MCP03:2025 Tool Poisoning)被列为第三个条目。反映行业共识:MCP 工具描述是主要攻击面,需要专门的缓解措施。CSA 研究笔记中引用。
Invariant Labs: MCP Tool Poisoning Proof of Concept(2025-04): 首次公开的工具描述投毒概念验证。在 Cursor IDE 中演示了恶意计算器 MCP 服务器如何静默外泄 SSH 私钥,开发者只看到正确的算术结果。这次披露定义了「工具描述即指令」的攻击类别,为后续 MCPTox 基准和 GhostSplice 攻击奠定了基础。
GhostSplice 的实验数据来自 ASSET Research Group 的受控测试,使用隔离项目和伪造凭证。各模型的具体服从率数字反映特定测试配置,不应被解读为通用安全评级。CVE 标识符尚未公布,将跟随协调披露流程。
🎯 相关面试题
结合本篇技术观点,备战 AI 岗位面试。
- 中级场景高频查看详解 →
企业 AI 编码工具选型应考虑哪些维度?结合 Disney 弃用 Copilot 案例分析。
2026 年 7 月 Disney 弃用 GitHub Copilot 转投 OpenAI Codex,但内部仍高频使用 Claude。企业选型需考虑产品形态、执行环境、安全合规、总拥有成本四个维度,多工具组合是大型企业的务实策略。
- 高级场景查看详解 →
MCP 协议的供应链安全风险有哪些?以 Ruflo CVSS 10.0 为例分析
MCP 把"模型说话"升级为"模型动手",攻击面随依赖、Server、工具描述、运行时四条供应链路径扩张。Ruflo CVSS 10.0 是生态扩张快于安全成熟的缩影。防御靠零信任 + 纵深防御:来源固定、最小权限、沙箱隔离、human-in-the-loop、把工具输出当不可信数据、完整审计。
- 高级系统设计查看详解 →
AI 编码助手安全:指令拆分攻击(GhostSplice)如何绕过安全检查?如何设计跨消息/跨片段的检测与防御?
ASSET Research Group 披露的 GhostSplice 攻击:恶意 MCP server 把窃密请求拆成多个各自无害的片段(工具描述里的空表单 + 工具返回里的文件映射),模型在统一上下文中自行拼合后执行外传(SSH 私钥、源码、.env)。11 个前沿模型上拆分后服从率从 42% 升到 82%,GPT-4o、Gemini 2.0 Flash、Llama-3.3-70B 从 0% 跳到 100%。本题考察候选人能否从攻击机制、跨消息检测点、防御纵深和场景推演四个维度设计检测与防御体系。
- 高级系统设计高频查看详解 →
如何系统性地防御 HalluSquatting(幻觉抢注)攻击?
HalluSquatting 利用 LLM 推荐不存在的包名进行供应链攻击(PHR 约 19.7%、43% 可重复)。防御需要五层体系:AI 输出治理、供应链安全、运行时防护、检测响应、安全意识。
