0-co/mcp-patch

GitHub: 0-co/mcp-patch

专为 Python MCP 服务器设计的静态安全扫描器,在 AST 级别检测 @tool 函数中的 Shell 注入、路径穿越和 SSRF 漏洞。

Stars: 0 | Forks: 0

# mcp-patch 针对 Python MCP 服务器代码的静态安全扫描器。 43% 的热门 MCP 服务器存在 Shell 注入漏洞。目前尚无工具能在感知 MCP 上下文的情况下进行 AST 级别的扫描。这款工具可以做到。 ## 本工具本可拦截的真实 CVE - **CVE-2025-53967** (Framelink Figma MCP) — 通过未清洗的工具参数进行 Shell 注入 - **CVE-2025-6514** (mcp-remote, 437K 下载量) — 通过未清洗的工具参数执行任意命令 ## 安装 ``` pip install mcp-patch mcp-patch scan my_server.py ``` ## 使用 ``` # 扫描单个文件 mcp-patch scan server.py # 扫描目录 mcp-patch scan ./servers/ ``` ## 输出示例 ``` Scanning server.py... CRITICAL shell_injection line 14 subprocess.run(f"ls {path}", shell=True) subprocess.run(shell=True) — tool param 'path' flows to shell Fix: Use subprocess.run([cmd, shlex.quote(arg)]) without shell=True HIGH path_traversal line 28 open(filename) open(filename) — tool param 'filename' used as file path without validation Fix: Use (base_dir / Path(filename).name).resolve() and verify result starts with base_dir Found 2 issues (1 CRITICAL, 1 HIGH) in 1 file. ``` ## 检查项 | 检查项 | 严重程度 | 检测内容 | |---|---|---| | `shell_injection` | CRITICAL | `subprocess.run/Popen/call(f"...{param}", shell=True)`, `os.system()`, `os.popen()` 且使用了工具参数 | | `path_traversal` | HIGH | `open(param)`, `Path(param)` 且直接将工具参数作为路径传入 | | `ssrf` | HIGH | `requests.get/post(url)`, `httpx.get(url)`, `urllib.request.urlopen(url)` 且其中 `url` 为工具参数 | 仅扫描带有 `@tool` 或 `@mcp.tool()` 装饰器的函数。普通的辅助函数将被忽略。 ## 工作原理 纯 stdlib 实现。无网络调用。不依赖 LLM。使用 `ast` 模块解析 Python 源代码,查找带有 `@tool` 装饰器的函数,收集其参数名称,然后遍历每个函数体,寻找用户可控参数流入危险接收点的危险调用模式。 ## 误报 这是一个 MVP 扫描器——宁可误报也不愿漏掉真实漏洞。即使你在其他地方进行了运行时验证,对 `open(filename)` 报出的 `path_traversal` 发现依然是真实的;修复方法是将其验证逻辑移入同一函数中,以便扫描器(和代码审查者)能够看到它。 ## 开发 ``` python -m pytest tests/ ``` 无外部依赖。需要 Python 3.9+。
标签:AI安全, Chat Copilot, CISA项目, CVE, DevSecOps, GraphQL安全矩阵, MCP-patch, MCP Server, Python, Shell注入, SSRF, XSS注入, 上游代理, 命令注入, 安全扫描器, 工具链安全, 数字签名, 无后门, 网络安全, 自动化payload嵌入, 路径遍历, 软件开发包, 逆向工具, 错误基检测, 隐私保护, 静态代码分析, 风险治理