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, 大语言模型, 文档结构分析, 无后门, 逆向工具