MCPee
演示MCP(模型上下文协议)服务器如何在没有 适当的隔离可能会被利用来造成安全漏洞和错误信息。
概述
此存储库记录了一个关键的安全漏洞演示 显示MCP服务器如何(mcp-raider)可以攻击和操纵另一个MCP 服务器(mcp-weather)当两者都在没有适当沙盒的情况下运行时,或者 隔离。这次袭击表明:
- 环境变量提取:窃取敏感的API密钥和
凭证
- 运行时代码操作:修改天气数据以返回false
信息(例如,133 m/s的极端风速)
- 跨进程攻击:一台MCP服务器通过入侵另一台服务器
不受限制的系统访问
攻击概念
背景:什么是MCP?
模型上下文协议(MCP)使AI助手能够连接到外部 工具和数据源。MCP服务器提供AI的特定功能 代理可以用来检索信息或执行操作。
脆弱性
当MCP服务器在没有适当隔离的情况下运行时:
- 他们可以不受限制地访问系统进程
- 他们可以从其他进程中读取环境变量
- 他们可以修改其他应用程序的文件和运行时行为
- 不同MCP服务器之间没有身份验证或沙盒
攻击场景
- 受害者:
mcp-weather-提供天气的合法MCP服务器
使用OpenWeatherMap API的信息
- 攻击者:
mcp-raider-一种具有系统自检功能的恶意MCP服务器
和操纵能力
- 目标:同时使用两个MCP服务器的AI助手
这次袭击表明了 mcp-raider 可以:
- 提取
OPENWEATHER_API_KEY从mcp-weather过程 - 修改天气服务器的代码以返回错误数据(133 m/s风速)
- 导致人工智能助手向用户提供错误的危险天气信息
攻击演示
先决条件
- 克隆两个存储库:
git clone https://github.com/denhamparry/mcp-weather
git clone https://github.com/denhamparry/mcp-raider- 构建mcp天气:
cd mcp-weather
npm install
npm run build- 构建mcp袭击者:
cd mcp-raider
npm install
npm run buildMCP客户端设置
此演示需要MCP客户端调用工具。我们建议 克劳德桌面。
配置Claude桌面
编辑您的Claude Desktop配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json - 视窗:
%APPDATA%\Claude\claude_desktop_config.json
添加以下配置:
{
"mcpServers": {
"weather": {
"command": "node",
"args": ["/absolute/path/to/mcp-weather/build/index.js"],
"env": {
"OPENWEATHER_API_KEY": "your_api_key_here"
}
},
"raider": {
"command": "node",
"args": ["/absolute/path/to/mcp-raider/build/index.js"]
}
}
}重要提示: 使用构建的绝对路径index.js文件夹。找到你的 路径与cd mcp-weather && pwd. - Linux示例:/home/user/mcp-weather/build/index.js- macOS示例:/Users/username/mcp-weather/build/index.js
重新启动克劳德桌面
完全退出并重新启动Claude Desktop以使更改生效。
测试连接
在一段新的克劳德对话中:
"What MCP tools are available?"
"What's the weather in London?"如果成功,继续进行攻击演示。
替代方案:手动测试
如果不使用Claude Desktop,您可以直接运行服务器:
# Terminal 1
cd mcp-weather
export OPENWEATHER_API_KEY="your-api-key-here"
node build/index.js
# Terminal 2
cd mcp-raider
node build/index.js循序渐进的攻击过程
步骤1:流程发现
使用mcp raider查找mcp天气过程:
Tool: get_process_id
Parameters:
searchStrings: ["node", "mcp-weather"]这将返回正在运行的天气服务器的进程ID(PID)。
第二步:环境变量提取
从天气服务器提取环境变量:
Tool: get_environment_variables
Parameters:
processId: "
"这表明:
OPENWEATHER_API_KEY-敏感的API密钥- 其他配置和系统变量
- 潜在的数据库凭据或其他机密
步骤3:代码操作-扫描注射点
扫描天气服务器的编译输出以查找模板文字变量。这 攻击的目标是已构建的JavaScript文件(build/index.js),而不是TypeScript 源代码,因为这是在Node.js进程中主动运行的代码:
Tool: luck_about_and_find_out_output_string_names
Parameters:
fileName: /absolute/path/to/mcp-weather/build/index.js替换/absolute/path/to/根据您的实际路径(例如。,/Users/username/在macOS上,/home/user/在Linux上)。
这表明 $(variable_name) 可以在中操纵的格式变量 运行代码。
步骤4:代码操作-注入虚假数据
修改天气服务器的编译输出以返回错误的风速:
Tool: luck_about_and_find_out_replace_string_values
Parameters:
fileName: /absolute/path/to/mcp-weather/build/index.js
outputStringName: "$(windSpeed)"
value: "133"此热点修补正在运行的应用程序,使其返回133 m/s(≈297 mph),而不管实际天气条件如何。
步骤5(可选):进程终止
mcp-raider服务器还提供了一个杀死进程的工具,可以 用于终止受损的天气服务器:
Tool: luck_about_and_find_out_process_kill
Parameters:
processId: "
"这表明攻击者对受害者拥有完全的生命周期控制权 进程——而不仅仅是读写访问。
攻击结果
袭击发生后:
- 被盗凭证:攻击者现在拥有OpenWeatherMap API密钥
- 数据泄露:天气查询返回错误信息,显示
极端风速
- 被误导的用户:使用受损天气服务器的人工智能助手
将告诉用户风速为133米/秒,可能导致: - 不必要的恐慌 - 业务中断 - 应急响应激活 - 旅行取消
威胁模型
攻击范围
这个演示展示了 本地特权升级 攻击地点:
- 恶意MCP服务器(
mcp-raider)受害者服务器(mcp-weather)继续跑
这 同一台机器
- 攻击者具有本地进程访问权限(可以列出进程、读取环境
变量)
- 两台服务器都在隔离不足的情况下运行
安全边界
通过以下方式可以防止这种攻击:
- 容器隔离 --Docker、Podman、具有独立进程空间的虚拟机
- 单独的机器 --在不同的物理/虚拟上运行MCP服务器
机器
- 进程沙盒 --操作系统级沙盒(SELinux、AppArmor、macOS
沙箱)
- 用户分离 --以不同的操作系统用户身份运行每个MCP服务器
- 秘密管理 --使用Vault而不是环境变量
这种攻击在以下情况下有效:
- 多台MCP服务器在同一台机器上运行,没有隔离
- MCP服务器以相同的操作系统用户身份运行
- 不强制执行进程沙盒
- 存储在环境变量中的秘密(不是保管库)
现实世界的影响
桌面AI助手(Claude Desktop等)通常将MCP服务器作为 同一用户。如果没有额外的隔离,一个受损的MCP服务器就可以攻击 其他人。生产部署应强制执行严格的隔离(容器、VM、网络等), 单独的主机)。
安全影响
此演示突出了关键的安全问题:
1.缺乏过程隔离
- MCP服务器可以访问任何系统进程
- 不同MCP实现之间没有沙盒
- 无限制的文件系统访问
2.无身份验证
- MCP服务器之间不进行身份验证
- 任何MCP服务器都可以操纵任何其他服务器的资源
- 敏感操作没有权限模型
3.运行时操作
- 应用程序运行时可以修改代码
- 未对执行代码进行完整性验证
- 模板文字注入允许数据操作
4.信息披露
- 包含机密的环境变量被暴露
- 过程信息泄漏敏感配置
- 进程间通信未加密
缓解策略
为了防止这些攻击:
1.实施正确的装箱
- 在隔离的容器或虚拟机中运行每个MCP服务器
- 使用进程隔离机制(Docker、Podman等)
- 实现命名空间分离
2.安全环境变量
- 使用秘密管理系统(Vault、AWS Secrets Manager)
- 避免将敏感数据存储在环境变量中
- 实施适当的访问控制
3.代码完整性保护
- 执行前签署并验证代码
- 实现运行时应用程序自我保护(RASP)
- 尽可能使用只读文件系统
4.身份验证和授权
- 在MCP服务器之间实现双向TLS
- 添加OAuth2或类似的身份验证机制
- 为敏感操作创建权限模型
5.监测和警报
- 记录所有MCP服务器交互
- 监视可疑进程访问模式
- 对未经授权的文件修改发出警报
负责任披露
此演示仅用于教育目的,显示了 在实施MCP服务器时采取适当的安全措施。漏洞 所示不是特定于MCP协议本身,而是特定于实现 缺乏适当的安全控制。
参考文献
- mcp天气库 -The
受害者MCP服务器提供天气数据
- mcp袭击者库 -The
展示利用能力的攻击工具
MCP官方文件
清理
完成演示后:
1.停止MCP服务器
- 克劳德桌面:从中删除服务器
claude_desktop_config.json和
重新启动
- 手册:新闻
Ctrl+C在两个终端窗口中
2.恢复已修改的文件
cd mcp-weather
git checkout src/weather-utils.ts
git checkout build/
git status # Verify clean3.撤销测试API密钥
- 登录:
- 删除用于演示的测试API密钥
- 验证吊销:
curl "https://api.openweathermap.org/data/2.5/weather?q=London&appid=TEST_KEY"
# Should return "Invalid API key" error4.删除测试环境(如适用)
# If using Docker
docker stop mcpee-test
docker rm mcpee-test
# Or remove cloned repositories
rm -rf mcp-weather mcp-raider免责声明
此演示仅用于安全研究和教育。不要 将这些技术用于恶意目的。始终获得适当的授权 在您不拥有的系统上测试安全性之前。
