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