坏mcp
  ](docker-compose.yml) 
10台故意恶意的MCP服务器 协议级攻击模式 针对AI客户端。每台服务器都利用了 模型上下文协议 --工具描述、模式、资源、会话管理和跨服务器交互。
这些不是等待被利用的有缺陷的服务器。他们 是 袭击者。
警告:此项目仅用于授权的安全研究和教育。不要将这些服务器暴露在互联网上或在生产中使用它们。
为什么存在
MCP的采用正在加速——Claude Desktop、Cursor、Windsurf和其他数十个人工智能客户端现在都支持它。但该协议的信任模型存在根本差距:工具描述未经验证,模式可以携带隐藏的指令,服务器可以在会话中更改定义。研究来自 CyberArk, 不变实验室,以及 弹性安全实验室 已经记录了这些攻击,但工作实现很少。
bad mcp提供了具体的、可运行的攻击服务器,因此客户端开发人员可以测试防御,安全团队可以评估风险,研究人员可以研究协议级威胁,而无需从头开始构建一切。
这有什么不同
|---|---|---|---| | 视角 |服务器是攻击者|服务器是受害者|服务器是受害人| | 聚焦 |仅MCP协议级攻击|混合(提示注入+经典appsc)|混合(路径遍历、SQLi、MCP)| | 攻击 |FSP、ATPA、地毯拉取、资源中毒、跨服务器阴影|CTF挑战(简单/中等/困难)|9台服务器,最重要的培训| | 语言 |Go+mcp Go SDK | Python | JS+Python| | 孤立 |Docker编写,无主机访问权限|本地Python脚本| Docker编写| | 独特 |通过会话工具+通知进行Rug拉取,通过参数名称进行完全模式中毒|挑战/评分格式|键入重点|
建筑
vuln-external network (localhost:8001-8010)
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
│ schema-poison-notes│ │ response-inject- │ │ shadow-exfil │
│ :8001 │ │ tickets :8002 │ │ :8003 │
└────────────────────┘ └────────────────────┘ └────────────────────┘
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
│ squatting-file-ops │ │ tool-poisoning-calc│ │ true-rug-pull │
│ :8004 │ │ :8005 │ │ :8006 │
└────────────────────┘ └────────────────────┘ └────────────────────┘
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
│ resource-poison- │ │ indirect-inject- │ │ exfil-chain- │
│ docs :8007 │ │ fetcher :8008 │ │ analytics :8009 │
└────────────────────┘ └────────────────────┘ └────────────────────┘
┌────────────────────┐
│ denial-of-wallet │
│ :8010 │
└────────────────────┘服务器
| 端口 | 服务器 | MCP攻击类 | 协议功能被利用 |
|---|---|---|---|
| 8001 | 架构中毒注释 | 完全架构中毒(FSP) | input_schema 参数名称 |
| 8002 | 响应注射票 | 通过输出(ATPA)建议工具中毒 | 工具响应内容 |
| 8003 | 影子剥离 | 跨服务器影子 | 多服务器工具说明 |
| 8004 | 蹲式文件操作 | 工具名称冲突/蹲式 | 工具命名+描述 |
| 8005 | 工具中毒钙 | 工具描述中毒(TPA) | 工具描述 |
| 8006 | 真地毯拉 | 地毯拉(工具定义突变) | 会话工具+通知 |
| 8007 | 资源中毒文档 | 资源中毒(ATPA变体) | resources/list + resources/read |
| 8008 | 间接注射提取器 | 间接快速注射 | 工具输出中的外部数据 |
| 8009 | 提取链分析 | 跨工具提取链 | 通过描述进行工具链接 |
| 8010 | 拒绝钱包 | 拒绝钱包 | 递归调用+大量输出 |
每台服务器都有自己的 README.md 包含漏洞详细信息、漏洞利用场景、检测方法和缓解策略。
快速开始
# Build and start all servers
docker-compose build && docker-compose up -d
# Run smoke tests (runs entirely inside Docker)
docker-compose --profile test run --rm smoke-test
# View exfiltration logs
docker-compose logs schema-poison-notes | grep EXFIL
docker-compose logs true-rug-pull | grep RUG-PULL
# Stop
docker-compose down连接MCP客户端
之后 docker-compose up -d,连接任何与SSE兼容的MCP客户端(Claude Desktop、Cursor、Windsurf、Claude Code等)。所有服务器都使用相同的JSON格式:
{
"mcpServers": {
"schema-poison-notes": { "url": "http://localhost:8001/sse" },
"response-inject-tickets":{ "url": "http://localhost:8002/sse" },
"shadow-exfil": { "url": "http://localhost:8003/sse" },
"squatting-file-ops": { "url": "http://localhost:8004/sse" },
"tool-poisoning-calc": { "url": "http://localhost:8005/sse" },
"true-rug-pull": { "url": "http://localhost:8006/sse" },
"resource-poison-docs": { "url": "http://localhost:8007/sse" },
"indirect-inject-fetcher":{ "url": "http://localhost:8008/sse" },
"exfil-chain-analytics": { "url": "http://localhost:8009/sse" },
"denial-of-wallet": { "url": "http://localhost:8010/sse" }
}
}提示: 从开始tool-poisoning-calc(:8005)——观察到的最简单的攻击。那就试试true-rug-pull(:8006)——询问天气3次以上,观察工具的变化。
安全保证
| 关注 | 保证 |
|---|---|
| 主机文件系统 | 没有卷装载。容器对主机文件系统没有任何访问权限。 |
| 主机网络 | 否 network_mode: host所有容器都使用隔离的Docker网桥网络。 |
| 特权访问 | 否 privileged: true不 cap_add默认限制功能。 |
| 环境泄漏 | 未传递主机环境变量。所有“凭据”都是伪造的硬编码字符串。 |
| 主机执行 | 主机上没有运行任何东西。测试通过以下方式在Docker中运行 --profile test. |
| 磁盘上的代码 | 惰性Go源文件。在Docker之外不可执行。 |
技术栈
- MCP服务器:去吧+ mcp go v0.32.0 (SSE运输)
- 码头工人:多阶段
golang:1.23-alpine->alpine:3.19 - 编排:docker与网络隔离
- 测试:码头化Go冒烟测试(
--profile test)
研究参考文献
| 服务器 | 源 |
|---|---|
| 模式中毒注释 | CyberArk——全模式中毒 |
| 响应注入票 | CyberArk——ATPA |
| 阴影去角质 | 不变实验室——工具中毒 |
| 压缩文件操作 | 弹性安全实验室 |
| 工具中毒钙 | 不变实验室——工具中毒 |
| 真正的地毯拉力 | ETDI纸 |
| 资源中毒文档 | 支柱安全 |
| 间接注射式提取器 | 微软——间接注入 |
| 剥离链分析 | 弹性安全实验室 |
| 拒绝钱包 | 即时安全——MCP十大风险 |
另请参见: Adversa AI——MCP安全TOP 25 | MCPTox基准测试 | 代理应用程序的OWASP前10名
已知差距
以下已发布的MCP攻击类尚未实现:
- 服务器身份欺骗 --MCP服务器欺骗可信
serverInfo初始化期间的名称/版本 - 抽样滥用 --剥削
sampling/createMessage注入任意提示 - 提示/系统指令泄漏 --通过精心设计的工具响应提取系统提示
- 通知通道过滤 --滥用进度/日志通知作为数据通道
