sidhpurwala-huzaifa/mcp-security-scanner

GitHub: sidhpurwala-huzaifa/mcp-security-scanner

一款针对 MCP 服务器的安全扫描工具,能够自动检测漏洞与错误配置并输出带有修复建议的安全报告。

Stars: 21 | Forks: 9

MCP 安全扫描器 这是一个基于 Python 的渗透测试工具,用于测试 Model Context Protocol (MCP) 服务器的安全性。它支持 HTTP、stdio 和实验性的 SSE 传输方式,运行一系列映射到 `scanner_specs.schema` 的检查(包括 auth、transport、tools、prompts、resources),并包含一个故意设计为不安全的类 MCP 服务器用于测试。 **注意:最新版本的 MCP 已弃用 SSE 传输。本工具对 SSE 的支持纯粹是实验性的,可能无法正常工作!!!** ## 安装 ``` # 克隆 git clone https://github.com/sidhpurwala-huzaifa/mcp-security-scanner cd mcp-security-scanner # 创建 venv (Python >= 3.10) python -m venv .venv source .venv/bin/activate # 安装依赖 pip install -r requirements.txt # (可选)为 CLI entrypoints 安装开发环境 pip install -e . ``` ## 用法 ### 快速测试 ``` # 验证 CLI 是否可用 mcp-scan --help # 可达性预检示例 mcp-scan scan --url http://127.0.0.1:65000 # -> 如果没有服务在监听,将快速失败并返回明确的错误 ``` ### 运行不安全的测试服务器 (HTTP) ``` # 基础 (HTTP JSON-RPC)。支持 --test 模式(默认为 0,否则从下方选择一个存在漏洞的模型) insecure-mcp-server --host 127.0.0.1 --port 9001 # 当前支持的测试模式 # --test 0(默认):基础的不安全 MCP-like 服务器 # --test 1:prompt injection 式漏洞服务器 # --test 2:tool poisoning 式漏洞服务器 # --test 3:listings 之间的 rug-pull tool mutation # --test 4:权限过大(暴露 admin tools),private:// 资源泄漏 # --test 5:token 窃取(服务器向上游客户端泄漏 access tokens) # --test 6:间接 prompt injection(外部资源携带隐藏指令) # --test 7:远程访问控制暴露(unauth tool 启用远程访问) insecure-mcp-server --host 127.0.0.1 --port 9001 --test 0/1/2/3/4/5/6/7 ``` ### 扫描服务器 (HTTP, stdio 或 SSE) ``` # HTTP:文本报告(无发现;--url 为 JSON-RPC endpoint) mcp-scan scan --url http://127.0.0.1:9001/mcp --format text # HTTP:JSON 报告 mcp-scan scan --url http://127.0.0.1:9001/mcp --format json --output report.json # HTTP:详细跟踪(实时) mcp-scan scan --url http://127.0.0.1:9001/mcp --verbose # stdio:通过 stdin/stdout 扫描本地 MCP servers mcp-scan scan --transport stdio --command "npx -y @modelcontextprotocol/server-memory" --format json # SSE:连接到显式 SSE endpoint,然后通过发射的 /messages?sessionId=... 进行扫描 mcp-scan scan --url https://your-mcp.example.com --transport sse --sse-endpoint /sse --timeout 30 --verbose ``` ### 新功能:RPC 透传(类似 Inspector) **注意:RPC 命令仅支持 HTTP 和 SSE 传输,不支持 stdio。** ``` # 列出 tools (HTTP) mcp-scan rpc --url https://your-mcp.example.com/mcp --method tools/list --transport http # 调用 tool (HTTP) mcp-scan rpc --url https://your-mcp.example.com/mcp \ --method tools/call \ --params '{"name":"weather","arguments":{"city":"Paris"}}' \ --transport http # 使用 SSE transport mcp-scan rpc --url https://your-mcp.example.com --method tools/list --transport sse --sse-endpoint /sse ``` ### 说明 - `--explain ` 会打印针对单个发现的详细说明(例如,`--explain X-01`)。它包含: - 测试(ID 和标题) - 预期结果 - 实际情况(扫描器观察到的详细信息) - 结论(为何 PASS/FAIL) - 修复建议(来自规范) 示例: ``` mcp-scan scan --url https://your-mcp.example.com/mcp --explain X-01 ``` ### 仅检查健康状态 - `--only-health` 会打印服务器详细信息和枚举结果,而不会运行完整的扫描。 - 适用于 HTTP、stdio 和 SSE 传输。 - 支持 `--format text` 和 `--format json`。 示例: ``` # HTTP mcp-scan scan --url https://your-mcp.example.com/mcp --only-health --format text # stdio mcp-scan scan --transport stdio --command "npx -y @modelcontextprotocol/server-memory" --only-health --format json # SSE mcp-scan scan --url https://your-mcp.example.com --transport sse --sse-endpoint /sse --only-health --format json ``` ### 认证 ``` # Bearer token mcp-scan scan \ --url http://your-mcp.example.com/mcp \ --auth-type bearer \ --auth-token "$TOKEN" # OAuth2 Client Credentials mcp-scan scan \ --url http://your-mcp.example.com/mcp \ --auth-type oauth2-client-credentials \ --token-url https://issuer.example.com/oauth2/token \ --client-id "$CLIENT_ID" --client-secret "$CLIENT_SECRET" \ --scope "mcp.read mcp.tools" ``` ### 传输、超时与 session - **--transport auto|http|stdio|sse**:指定首选的传输方式;不支持动态发现。 - `http`:需要 `--url` 来指定 JSON-RPC endpoint - `stdio`:需要 `--command` 来指定本地 MCP 服务器进程 - `sse`:需要 `--url` 和 `--sse-endpoint`(实验性) - **--timeout **:单次请求的读取超时时间(默认 12 秒)。对于响应缓慢的 stream,应适当增加该值。 - **--session-id **:预建立的 session(`Mcp-Session-Id` header)。 ## 测试 ### 运行测试 ``` # 设置环境(如果尚未完成) python -m venv .venv source .venv/bin/activate pip install -r requirements.txt pip install -e . # 运行所有测试 python -m pytest tests/ -v # 运行特定测试模块 python -m pytest tests/test_stdio_scanner.py -v python -m pytest tests/test_security_checks.py -v # 运行特定测试类 python -m pytest tests/test_stdio_scanner.py::TestStdioIntegration -v ``` ### 通过 Container 运行 ``` # 构建容器 podman build -t mcp-scan . # 运行 podman run --rm mcp-scan scan --url ${MCP_SERVER} --format text ``` ## 致谢 - 漏洞思路受 `Damn Vulnerable MCP Server` 启发 - https://github.com/harishsg993010/damn-vulnerable-MCP-server - 感谢 Red Hat 的 Ye Wang 在解决某些 MCP 服务器的 `init` 问题时提供的所有帮助
标签:AI安全, Chat Copilot, CISA项目, DLL 劫持, MCP, Python, 大语言模型, 文档结构分析, 无后门, 逆向工具