Latteflo/mcp-scanner
GitHub: Latteflo/mcp-scanner
针对 MCP 服务器的专项安全审计工具,提供 27 项检查、多格式报告输出及六大合规框架自动映射。
Stars: 0 | Forks: 0
# MCP 安全扫描器
[](https://github.com/Latteflo/mcp-scanner/actions)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](https://github.com/Latteflo/mcp-scanner/releases)
用于 [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) 服务器的安全审计工具。检测身份验证漏洞、注入风险、AI 特定攻击向量(工具投毒、间接提示注入),并将发现的问题映射到合规框架。
可作为 **Web 仪表板**、**CLI** 使用,或通过 SARIF 输出在 **CI/CD 管道** 中使用。
## 功能
### 安全检查(共 27 项)
| ID | 检查项 | 严重性 |
|----|-------|----------|
| MCP-AUTH-001 | 缺少身份验证 | CRITICAL |
| MCP-CRYPTO-001 | 未加密传输 | HIGH |
| MCP-CORS-001 | CORS 错误配置 | HIGH |
| MCP-RATE-001 | 无速率限制 | HIGH |
| MCP-INJ-001 | SQL 注入 | CRITICAL |
| MCP-INJ-003 | 命令注入 | CRITICAL |
| MCP-INJ-005 | 路径遍历 | CRITICAL |
| MCP-INJ-007 | XML 外部实体 (XXE) | CRITICAL |
| MCP-AUTHZ-001 | 敏感工具暴露 | CRITICAL |
| MCP-CONFIG-001 | 使用默认端口 | LOW |
| MCP-INFO-001 | 版本信息泄露 | INFO |
| MCP-AI-001 | 工具描述投毒 | HIGH |
| MCP-AI-002 | 过度宽松的工具 schema | MEDIUM |
| MCP-AI-003 | 间接提示注入 | HIGH |
| MCP-AI-004 | 系统提示泄露 | HIGH |
| MCP-AI-005 | 混淆代理 / 工具链 | HIGH |
| MCP-SSRF-001 | 通过工具参数的 SSRF | HIGH |
| MCP-HDR-001 | 缺少安全标头 | LOW |
| MCP-ERR-001 | 冗长的错误信息泄露 | MEDIUM |
| MCP-DEBUG-001 | 调试端点暴露 | MEDIUM |
| MCP-JWT-001 | JWT 身份验证绕过 (alg:none) | CRITICAL |
| MCP-CAP-001 | 危险能力暴露 | HIGH |
| MCP-DOS-001 | 无限制的工具输出 | MEDIUM |
| MCP-DOS-002 | 通过 schema 正则表达式实现的 ReDoS | HIGH |
| MCP-PROTO-001 | 未强制执行协议版本 | LOW |
| MCP-RES-001 | 资源 URI 路径遍历 | CRITICAL |
| MCP-OAUTH-001 | OAuth 范围绕过 | HIGH |
### 传输支持
- HTTP/HTTPS JSON-RPC 2.0
- SSE (Server-Sent Events) — 被 Claude Desktop 和 VS Code MCP 集成使用
### 报告格式
- 终端(默认)
- JSON
- HTML
- PDF — A4、封面页、执行摘要、修复计划
- SARIF 2.1.0 — 被 GitHub Security 选项卡和 VS Code Problems 面板使用
### 合规框架
每个发现的问题都会自动映射到适用的控制项:
- ISO/IEC 27001:2013
- NIST Cybersecurity Framework (CSF)
- NIST SP 800-53 Rev. 5
- MITRE ATT&CK
- PCI DSS 3.2.1
- SOC 2 Type II
## Web 仪表板
使用扫描器的最简单方法 — 无需 CLI 知识:
```
pip install mcp-scanner
mcp-scanner serve
```
自动打开 `http://localhost:8080`。
**您将获得:**
- 输入目标 URL 并选择合规框架
- 实时进度条追踪正在运行的 27 项检查
- 发现结果实时流式传输 — 展开任何发现项以查看描述、证据、修复建议和合规控制
- **结果** — 严重性摘要卡片、环形图、分类条形图、完整发现列表
- **合规性** — 每个框架的评分卡、覆盖范围概览、控制项级别的细分
- **历史记录** — 所有过去的扫描,包含目标、日期、框架、发现数量和风险评分
- 从页面顶部或底部的工具栏导出任何格式 (JSON / HTML / PDF / SARIF)
```
mcp-scanner serve --port 9090 # custom port
mcp-scanner serve --no-browser # headless / server use
```
## 安装
### pip(推荐)
```
pip install mcp-scanner
mcp-scanner scan --target http://localhost:3000
```
### 从源码安装
```
git clone https://github.com/Latteflo/mcp-scanner.git
cd mcp-scanner
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python src/main.py scan --target http://localhost:3000
```
### Docker
```
make build && make demo
```
## CLI 用法
### 扫描
```
# 基础扫描 — 终端输出
mcp-scanner scan --target http://localhost:3000
# 为 GitHub Security 标签页保存 SARIF
mcp-scanner scan --target http://localhost:3000 --format sarif --output results.sarif
# HTML 报告
mcp-scanner scan --target http://localhost:3000 --format html --output report.html
# 扫描 SSE 端点 (Claude Desktop / VS Code)
mcp-scanner scan --target http://localhost:3000/sse
```
### 基线 / diff 模式
```
# 将当前发现保存为基线
mcp-scanner scan --target http://localhost:3000 --save-baseline baseline.json
# 后续扫描仅报告不在基线中的新发现
mcp-scanner scan --target http://localhost:3000 --baseline baseline.json
```
### 合规性
```
# 跨所有框架的全面合规评估
mcp-scanner compliance --target http://localhost:3000
# 单一框架
mcp-scanner compliance --target http://localhost:3000 --framework ISO27001
# 列出所有支持的框架及其控制项
mcp-scanner frameworks
```
### 列出所有检查
```
mcp-scanner checks
```
### 退出代码(用于 CI/CD)
| 代码 | 含义 |
|------|---------|
| 0 | 无发现 |
| 1 | 存在 HIGH 严重级别的发现 |
| 2 | 存在 CRITICAL 严重级别的发现 |
| 3 | 无法连接到目标 |
## 测试扫描器
本仓库附带了一个故意设计为有漏洞的 MCP 服务器,可触发所有 27 项检查。使用它来验证扫描器是否正常工作或开发新的检查。
### 启动测试服务器
```
# 默认端口 3000 (也会触发 MCP-CONFIG-001)
python examples/vulnerable_server_http.py
# 自定义端口
MCP_PORT=3001 python examples/vulnerable_server_http.py
```
### 对其运行扫描器
```
python src/main.py scan --target http://localhost:3000
# 预期输出
# ┌──────────┬───────┐
# │ Severity │ Count │
# ├──────────┼───────┤
# │ CRITICAL │ 8 │
# │ HIGH │ 11 │
# │ MEDIUM │ 4 │
# │ LOW │ 3 │
# │ INFO │ 1 │
# └──────────┴───────┘
```
### 测试服务器覆盖的内容
| 漏洞 | 实现方式 |
|---------------|----------------------|
| 无身份验证 | 接受任何没有凭据的请求 |
| JWT alg:none | 声明 `WWW-Authenticate: Bearer`;服务器接受带有 `alg: none` 的令牌 |
| OAuth 范围绕过 | 可使用只读或空范围的令牌访问写入工具 |
| CORS 通配符 | 所有响应均带有 `Access-Control-Allow-Origin: *` |
| 命令注入 | `execute_command` 工具通过 shell 运行 `id && ` |
| 路径遍历 | `read_file` 工具读取任何路径,包括 `/etc/passwd` |
| SQL 注入 | `query_database` 泄露数据库错误消息 |
| XXE | `parse_xml` 使用 Python 的默认 XML 解析器(启用实体扩展) |
| SSRF | `fetch_url` 向任何 URL 发出出站 HTTP 请求 |
| ReDoS | `validate_input` schema 使用 `([a-zA-Z]+)+$` — 灾难性回溯 |
| 工具投毒 | `helpful_assistant` 描述包含 `IGNORE PREVIOUS INSTRUCTIONS` |
| 混淆代理 | `search_web`(读取)+ `send_email`(写入)在无身份验证的情况下暴露 |
| 调试端点 | `/debug`、`/metrics`、`/swagger.json`、`/docs` 未经身份验证 |
## CI/CD 集成
### 带有 SARIF 上传的 GitHub Actions
```
# .github/workflows/mcp-security.yml
name: MCP Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- run: pip install mcp-scanner
- run: |
mcp-scanner scan \
--target ${{ secrets.MCP_SERVER_URL }} \
--format sarif \
--output results.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: results.sarif
```
发现结果将以内联方式显示在 GitHub Security 选项卡的拉取请求中。
### 在发现严重问题时使构建失败
```
- run: |
mcp-scanner scan --target ${{ secrets.MCP_SERVER_URL }}
# exits 2 if CRITICAL, 1 if HIGH, 0 if clean
```
## 测试
```
python -m pytest -v # all 125 tests
python -m pytest tests/test_checks/ -v # check-level tests only
python -m pytest --cov=src --cov-report=html # with coverage
```
## 架构
```
mcp-scanner/
├── .github/
│ ├── CONTRIBUTING.md
│ ├── SECURITY.md
│ ├── ISSUE_TEMPLATE/
│ └── workflows/ # CI: tests, code quality, security scan
├── docker/
│ ├── Dockerfile
│ ├── Dockerfile.test-server
│ └── docker-compose.yml
├── docs/
│ ├── CHANGELOG.md
│ ├── API.md
│ ├── COMPLIANCE.md
│ └── USAGE.md
├── examples/
│ └── vulnerable_server_http.py # Intentionally vulnerable server (all 27 checks)
├── plugins/
│ └── example_headers_check.py # Custom check plugin example
├── src/
│ ├── main.py # Click CLI: scan, compliance, frameworks, checks
│ ├── checks/ # 19 check modules (one per vulnerability class)
│ ├── scanner/
│ │ ├── discovery.py # HTTP + SSE transport detection, tool schema extraction
│ │ ├── analyzer.py # Orchestrates all 27 checks
│ │ ├── reporter.py # JSON / HTML / SARIF / terminal output
│ │ └── pdf_reporter.py # PDF: A4 layout, cover, exec summary, remediation plan
│ ├── compliance/
│ │ ├── frameworks.py # 50+ controls across 6 frameworks
│ │ ├── mapper.py # Vulnerability → framework control mapping
│ │ └── reporter.py # Compliance report formats
│ ├── web/
│ │ ├── app.py # FastAPI backend: SSE streaming, scan lifecycle, export
│ │ └── static/
│ │ └── index.html # Self-contained SPA — no CDN, works offline
│ └── models/ # MCPServer, Vulnerability, ScanReport
└── tests/ # 125 tests across checks, compliance, models, scanner
```
## 免责声明
仅供授权的安全测试使用。在扫描您不拥有的系统之前,请务必获得许可。
[问题](https://github.com/Latteflo/mcp-scanner/issues) · [更新日志](docs/CHANGELOG.md) · [许可证: MIT](LICENSE)
标签:AI安全审计, AI攻击向量, CI/CD安全, CISA项目, CORS配置错误, DAST, IP 地址批量处理, JWT绕过, Llama, MCP安全扫描, MCP服务器, Model Context Protocol, PE 加载器, Python安全工具, SARIF输出, SQL注入检测, SSRF防护, Web仪表盘, Web安全, 加密, 合规性映射, 命令注入, 安全审计工具, 安全规则引擎, 工具投毒, 应用安全测试, 恶意软件分析, 文档安全, 模型上下文协议, 漏洞扫描器, 蓝队分析, 请求拦截, 路径遍历, 逆向工具, 间接提示词注入