不安全的MCP演示
概述
该项目演示了一个易受攻击的MCP服务器和多个客户端,包括一个概念验证攻击客户端和一个好客户端。它旨在用于教育目的,以展示MCP服务器中的潜在安全漏洞。
项目结构
vuln-mcp.py:易受攻击的MCP服务器暴露了不安全的工具。good-mcp-client.py:正常交互(插入/查询记录)的常规良好客户端。attack-mcp-client.py:演示利用服务器漏洞的自动攻击客户端。requirements.txt:项目的Python依赖关系。
功能和漏洞
暴露的服务器工具
- insert_record
- 将姓名/地址记录插入数据库。 - 脆弱性: 由于将用户输入直接插入到SQL查询中,容易导致SQL注入。
- 查询记录
- 列出数据库中的所有记录。 - 脆弱性: 在没有身份验证或访问控制的情况下公开所有数据。
- execute_sql
- 执行客户端提供的任意SQL查询。 - 脆弱性: 允许任何SQL命令,包括破坏性命令(例如,数据泄露、模式更改)。
- get_env_变量
- 返回所请求的任何环境变量的值。 - 脆弱性: 泄漏敏感的环境变量(例如机密、API密钥)。
如何跑步
1.安装依赖项
pip install -r requirements.txt2.启动服务器和良好的客户端
在一个终端中:
python good-mcp-client.py vuln-mcp.py按照提示以交互方式插入/查询记录。
3.运行攻击客户端
在另一个终端中:
python attack-mcp-client.py vuln-mcp.py这将自动:
- 尝试SQL注入攻击
- 执行任意SQL查询
- 尝试读取几个常见的环境变量
输出示例
- 攻击客户端将显示哪些有效载荷成功或失败,并打印出数据库内容和环境变量值(如果可以访问)。
已证明的漏洞
- SQL注入: 用户输入未经消毒,允许攻击者操纵SQL逻辑并插入任意数据。
- 任意代码执行: 这
execute_sql该工具允许攻击者运行任何SQL命令,包括数据窃取或销毁。 - 敏感数据暴露: 这
get_env_variable该工具允许攻击者读取机密和配置值。 - 缺乏访问控制: 任何人都可以运行所有工具并访问所有数据,而无需身份验证。
缓解策略
要保护真实世界的MCP服务器,您应该:
- 使用参数化查询:
- 对于SQL查询,始终使用参数替换而不是字符串插值来防止注入。 - 示例(安全):
cursor.execute("INSERT INTO records (name, address) VALUES (?, ?)", (name, address))- 限制危险工具:
- 删除或严格限制工具,如 execute_sql 和 get_env_variable. - 仅公开必要的功能。
- 实施身份验证和授权:
- 要求用户在允许访问敏感工具或数据之前进行身份验证和权限检查。
- 验证和消毒输入:
- 检查并清理所有用户输入,特别是与数据库或系统交互的输入。
- 限制环境变量访问:
- 只允许访问非敏感变量,或完全删除此工具。
- 审核和监控使用情况:
- 记录所有工具调用,并监控可疑或滥用行为。
- 最小特权原则:
- 以最低权限运行服务器,并尽可能限制数据库和操作系统访问。
免责声明
本项目仅用于教育和示范目的。 不要在生产环境中部署此代码。
______________________________________________________________________
如有疑问或需要进一步改进,请打开问题或联系项目维护人员。
