MCP 文件读取器中的命令注入漏洞
本仓库展示了一个 Python MCP(Model Context Protocol)服务器实现中的关键命令注入漏洞。该漏洞允许攻击者通过操纵文件路径参数在主机系统上执行任意 shell 命令。
漏洞描述
该漏洞存在于
read_file
函数中,该函数原本用于从“安全”目录读取文件,但其实现存在严重缺陷:此代码存在漏洞的原因是:
- 使用了
shell=True
,这会调用 shell 来执行命令
- 直接将用户输入(
file_name
)插入到命令字符串中,未进行适当的清理
- 仅对输入路径进行了表面验证
在文件名周围使用引号(
'file_name'
)和不使用引号(file_name
)之间的简单语义差异,导致整个系统暴露于命令执行的风险中。安装
先决条件
- Python 3.12 或更高版本
- MCP 库版本 1.6.0
设置
- 克隆本仓库:
- 安装 MCP 服务器:
- 通过编辑
~/.config/claude-desktop/claude_desktop_config.json
配置 Claude Desktop 使用你的 MCP 服务器:
请确保将
/ABSOLUTE/PATH/TO/uv
替换为你的 uv 可执行文件的实际路径,并根据需要调整目录路径。- 在开发模式下启动 MCP 服务器:
演示
- 在另一个终端中,安装并运行 MCP 检查器:
- 在 MCP 检查器 GUI 中连接到服务器:
- 将传输类型设置为 "STDIO"
- 设置命令为:
run --with mcp run main.py
- 点击 "Restart"
- 利用漏洞:
- 转到 "Tools" 选项卡
- 找到 "read_file" 工具
- 在 "file_name" 字段中输入:
- 点击 "Run Tool"
- 你应该会看到 test.txt 的内容,后跟你的用户名,这表明命令执行成功。
其他利用示例
以下是更多可以尝试的命令注入 payload:
正确修复方法
要修复此漏洞,切勿在用户提供的输入中使用
shell=True
。相反:警告
⚠️ 仅供教育用途:此实现包含故意的安全漏洞。切勿在生产环境或包含敏感信息的任何系统上使用此代码。
- Author:waytomcp
- URL:https://www.waytomcp.com/article/Eliran79/Vulnerable-file-reader-server
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!