Latteflo/mcp-scanner

GitHub: Latteflo/mcp-scanner

针对 MCP 服务器的专项安全审计工具,提供 27 项检查、多格式报告输出及六大合规框架自动映射。

Stars: 0 | Forks: 0

# MCP 安全扫描器 [![测试](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/ef6ac5ed90143321.svg)](https://github.com/Latteflo/mcp-scanner/actions) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![许可证: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![版本](https://img.shields.io/badge/version-0.3.0-green.svg)](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安全, 加密, 合规性映射, 命令注入, 安全审计工具, 安全规则引擎, 工具投毒, 应用安全测试, 恶意软件分析, 文档安全, 模型上下文协议, 漏洞扫描器, 蓝队分析, 请求拦截, 路径遍历, 逆向工具, 间接提示词注入