MCP隐藏指令攻击
风险概览
风险编号:GAARM.0046.003
风险归属:GAARM.0046
安全阶段:应用安全
生命周期:应用阶段
创建时间:2025.06.05
修改时间:2025.06.06
攻击概述¶
MCP隐藏指令攻击是指攻击者通过在 MCP 工具描述中嵌入 ANSI 终端转义码(如颜色设置、光标控制等) 或不可见 Unicode 字符 ,可以使恶意指令对用户不可见,但仍被 LLM 执行。这种攻击方式利用了 MCP 的“行跳跃”漏洞,使得攻击在不被察觉的情况下影响开发者的操作 ,导致数据泄露、供应链攻击等安全问题。
攻击案例¶
| 案例 | 描述 |
|---|---|
| 案例一 | 攻击者通过在工具描述中嵌入 ANSI 转义码,使得文本在终端中不可见,但 LLM 仍然读取并执行了其中的指令,导致模型建议从恶意服务器下载 Python 包,从而可能引发供应链攻击。 |
| 案例二 | 通过在用户输入中加入不可见的 Unicode 字符,攻击者可以在 LLM 中注入恶意指令。 |
| 案例三 | 通过在网页中注入隐藏代码,MCP工具返回网页信息给 LLM, 导致注入不可见的恶意指令,实现数据泄露或其他攻击。 |
攻击风险¶
- 供应链攻击:通过隐藏的指令,攻击者可以在开发过程中植入恶意代码,影响整个软件供应链。
- 数据泄露: 敏感信息(如 IP 地址、下载源等)可能被悄无声息地泄露。
- 系统安全性:在某些情况下,隐藏指令可以被用来生成和执行恶意代码。
缓解措施¶
| 缓解方式 | 描述 |
|---|---|
| 输入输出过滤 | 对用户输入和工具输出进行严格的过滤和清洗特殊字符,移除潜在的恶意字符和指令。 |
| 避免将原始工具输出传递到终端 | 应通过在渲染之前禁用转义序列来对潜在危险的输出进行一致的清理。最简单的方法是将任何十六进制值的字节替换1b为占位符,因为现代终端识别的所有转义序列都以该字节开头。 |
| 工具描述审查 | 对 MCP 工具的描述进行审查,确保其中不包含恶意指令 |
| 限制 MCP 服务器权限 | 在敏感环境中,仅允许信任的 MCP 服务器进行交互,减少潜在的攻击面。 |
| 监控和审计 MCP 活动 | 定期审查日志和交互以检测异常或可疑行为 |