nhomyk/mcp-scan-action

GitHub: nhomyk/mcp-scan-action

首个专为 MCP 服务器和 AI Agent 设计的 GitHub Action 安全扫描器,可在 CI/CD 中自动检测 24 类 AI 特有漏洞并输出到 GitHub Security。

Stars: 2 | Forks: 0

# mcp-scan-action
### 第一个扫描 MCP 服务器、AI 代理和 LLM 流水线安全漏洞的 GitHub Action —— 并将结果直接发送到您的 GitHub Security 标签页。 [![GitHub Marketplace](https://img.shields.io/badge/GitHub%20Marketplace-mcp--scan--action-blue?logo=github&logoColor=white&style=for-the-badge)](https://github.com/marketplace/actions/mcp-security-scan) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](LICENSE) [![SARIF](https://img.shields.io/badge/Output-SARIF%202.1.0-orange?style=for-the-badge)](https://sarifweb.azurewebsites.net/) [![No API Key](https://img.shields.io/badge/API%20Key-Not%20Required-brightgreen?style=for-the-badge)](#no-api-key-required) **24 项漏洞检查。4 个扫描引擎。零运行时成本。一行 YAML。**
## 为什么存在这个项目 MCP 发展迅速。成千上万的服务器正在构建中,旨在为 AI 代理提供对浏览器、文件系统、API 和内部服务的访问。**几乎没有任何一个在发布前进行了安全漏洞扫描。** 我们扫描了 5 个流行的开源 MCP 服务器。**所有 5 个都有发现:** | 仓库类型 | 风险评分 | 首要发现 | 严重程度 | |-----------|-----------|-------------|----------| | 浏览器自动化 MCP | **1.000 (严重)** | 通过 `playwright_evaluate` 执行任意 JS | CVSS 9.8 | | 生产力 API 连接器 | 0.390 | Auth token 被记录到 stdout | 高 | | 浏览器供应商 DevTools MCP | 0.080 | 完整环境克隆到子进程 | 高 | | 向量数据库 Claude 插件 | 0.150 | 未固定 `npx -y` 供应链风险 | 中 | | 搜索 MCP 服务器 | 0.200 | 通过未验证的 URL 参数导致 SSRF | 高 | 此操作为每个基于 Model Context Protocol 构建的团队带来自动化、持续的 MCP 安全扫描 —— 零配置,无需 API key。 ## 快速开始 —— 一行代码 ``` - uses: nhomyk/mcp-scan-action@v1 ``` 将其添加到任何检出代码的 job 中。就这样。 ## 完整工作流 ``` name: MCP Security Scan on: [push, pull_request] jobs: mcp-security: name: MCP Security Scan runs-on: ubuntu-latest permissions: security-events: write # upload findings to GitHub Security tab contents: read steps: - uses: actions/checkout@v4 - uses: nhomyk/mcp-scan-action@v1 id: scan with: fail-on-critical: 'true' # block merges on critical findings - name: Show risk level run: echo "Risk → ${{ steps.scan.outputs.risk-level }}" ``` 发现结果会立即出现在 **Security → Code scanning alerts** 下。 ## 检测内容 —— 24 个漏洞类别 ### MCP Tool Poisoning (11 种攻击类型) | 攻击类型 | 发现内容 | 现实案例 | |-------------|---------------|-------------------| | `TOOL_POISONING` | 操纵 LLM 行为的工具描述/模式 | 工具元数据中的隐藏指令 | | `EXFILTRATION_PATTERN` | 数据被路由到意外的外部端点 | 凭证被转发到攻击者控制的 URL | | `PROMPT_INJECTION_VECTOR` | 用户控制的数据不安全地拼接到提示词中 | `f"Summarize: {user_input}"` 未经清理 | | `AMBIENT_AUTHORITY` | 工具拥有超出声明范围的隐式权限 | `Object.entries(process.env)` 被克隆到子进程 | | `UNRESTRICTED_FILE_ACCESS` | 文件系统访问未经路径清理 | 通过 `../../../etc/passwd` 进行路径遍历 | | `SSRF_RISK` | 通过工具控制的 URL 导致的服务端请求伪造 | `args.url` 传递给 `fetch()` 而没有域名白名单 | | `COMMAND_INJECTION` | 由 LLM/用户输入构建的 Shell 命令 | `exec("ls " + args.directory)` | | `MISSING_AUTH` | 无需凭证检查即可访问需认证的操作 | 工具处理程序缺少 token 验证 | | `UNCONSTRAINED_SCOPE` | 没有权限边界的代理 | 代理对任意路径拥有读取+写入+执行权限 | | `CROSS_ORIGIN_ESCALATION` | 跨代理信任边界违规 | 代理 A 将未经验证的输出转发给代理 B | | `SHADOW_TOOL` | 对用户不可见的隐藏工具注册 | 注册的工具未出现在工具列表中 | ### Cross-Agent DataFlow Taint (9 种发现类型) 跨代理边界跟踪从 **source 到 sink** 的秘密和 PII: ``` SECRET_SOURCE (line 87): authToken = randomBytes(32).toString('hex') │ ▼ [UNSANITIZED] SINK_LOGGING (line 89): console.log(`Generated auth token: ${authToken}`) ↑ DataFlow risk: 1.000 ← caught by this action ``` `SECRET_SOURCE` · `PII_SOURCE` · `CROSS_BOUNDARY` · `SINK_LOGGING` · `SINK_NETWORK` · `SINK_STORAGE` · `TAINT_PROPAGATION` · `MISSING_SANITIZE` · `PRIVILEGE_ESCALATION` ### Prompt Injection (4 种模式) | 模式 | 示例 | |---------|---------| | 直接拼接 | `prompt = "Answer: " + user_message` | | 模板注入 | `f"You are helpful. {system_prompt}"` 其中 `system_prompt` 由用户控制 | | 不安全的 LLM 输出 | LLM 响应未经验证即传递给 `eval()` 或 `exec()` | | 角色覆盖 | 可以覆盖系统角色上下文的用户输入 | ### 架构分析 (MCP/Agent 集成点) 静态映射所有 `MCP_TOOL`、`AGENT_FRAMEWORK`、`SHELL_EXEC` 和 `EXTERNAL_HTTP` 集成区域 —— 在手动审查之前为您提供代理攻击面的完整图景。 ## 输出 —— GitHub Security 标签页 发现结果作为 **SARIF 2.1.0** 直接上传到您仓库的 **Security → Code scanning** 页面。无需第三方仪表板,无需账户,数据不离开 GitHub。 ``` ┌─────────────────────────────────────────────────────────────────┐ │ Security / Code scanning alerts │ │ │ │ ● SSRF_RISK High src/tools/requests.ts:99 │ │ ● AMBIENT_AUTHORITY High scripts/eval_gemini.ts:115 │ │ ● SINK_LOGGING High scripts/start-server.ts:89 │ │ ● SHADOW_TOOL Medium src/registry.ts:44 │ │ │ │ 4 open alerts · Powered by AgenticQA MCP Scanner │ └─────────────────────────────────────────────────────────────────┘ ``` 每个警报包括:文件路径、行号、严重程度、CWE 类别和修复指导。 ## 步骤摘要 每次运行后,格式化的摘要会出现在您工作流的 **Summary** 标签页中: ``` 🔴 MCP Security Scan — CRITICAL Total findings: 7 | Critical: 2 | Scanner | Findings | Critical | Types Detected | |------------------------|----------|----------|-----------------------------------------| | MCP Tool Scan | 3 | 1 | SSRF_RISK, COMMAND_INJECTION, SHADOW_TOOL | | DataFlow Taint | 2 | 1 | SECRET_SOURCE, SINK_LOGGING | | Prompt Injection | 1 | 0 | | | Architecture (MCP/Agent)| 1 | 0 | AGENT_FRAMEWORK | ``` ## 在下游步骤中使用输出 ``` - uses: nhomyk/mcp-scan-action@v1 id: mcp # 基于风险等级控制部署 - name: Block on critical if: steps.mcp.outputs.risk-level == 'critical' run: | echo "❌ ${{ steps.mcp.outputs.critical-count }} critical finding(s) — deploy blocked" exit 1 # 保存 SARIF 为 workflow artifact - name: Upload scan artifact uses: actions/upload-artifact@v4 with: name: mcp-scan-sarif path: ${{ steps.mcp.outputs.sarif-file }} # 发布发现计数到 Slack/webhook - name: Notify run: | curl -X POST $SLACK_WEBHOOK \ -d "{\"text\": \"MCP scan: ${{ steps.mcp.outputs.findings-count }} findings, risk=${{ steps.mcp.outputs.risk-level }}\"}" ``` ## 输入 | 输入 | 默认值 | 描述 | |-------|---------|-------------| | `repo-path` | `.` | 要扫描的仓库根目录路径 | | `fail-on-critical` | `false` | 如果存在任何严重发现,则退出代码为 1 | | `sarif-output` | `mcp-scan-results.sarif` | SARIF 输出文件名 | | `upload-sarif` | `true` | 上传到 GitHub Code Scanning(需要 `security-events: write`) | | `category` | `mcp-security` | SARIF 类别 —— 在运行多个扫描 job 时很有用 | ## 输出 | 输出 | 值 | 描述 | |--------|--------|-------------| | `findings-count` | 整数 | 所有 4 个扫描引擎的发现总数 | | `risk-level` | `low` · `medium` · `high` · `critical` | 整体风险分类 | | `critical-count` | 整数 | 严重程度发现的数量 | | `sarif-file` | 路径 | 生成的 SARIF 文件的位置 | ## 仅 PR 扫描 ``` on: pull_request: branches: [main] jobs: mcp-scan: runs-on: ubuntu-latest permissions: security-events: write contents: read steps: - uses: actions/checkout@v4 - uses: nhomyk/mcp-scan-action@v1 with: fail-on-critical: 'true' category: 'mcp-pr-scan' ``` ## 成本节约 | 没有此操作 | 有此操作 | |---------------------|-----------------| | 手动安全审查:约 40 小时 × $200/小时 = **每次审查周期 $8,000** | $0 —— 每次推送时运行 | | 数据泄露的平均成本:**$4.88M** (IBM 2024) | 在凭证泄露到达生产环境之前捕获它 | | MCP 审计的安全顾问:**$15,000–$50,000** | 自动化、持续、确定性 | | 在生产环境中发现错误:比在 CI 中发现**贵 6 倍** | Shift-left:阻止合并,而不是阻止事故 | ## 无需 API Key 所有扫描均为**纯静态分析。** 该操作: - 从不调用 LLM - 从不将您的代码发送到外部服务 - 确定性地产生结果 —— 相同的代码,相同的发现,每次运行都一样 - 完全在您的 GitHub Actions runner 内工作 ## 支持的语言和框架 检测以下语言中的 MCP 和代理模式: | 语言 | 框架 / 模式 | |----------|-----------------------| | **TypeScript / JavaScript** | `@modelcontextprotocol/sdk`, LangChain.js, AutoGen JS, 直接 `fetch()` 调用 | | **Python** | `langchain`, `langgraph`, `crewai`, `autogen`, `anthropic`, `openai` SDK | | **JSON** | `mcp*.json` 配置文件 —— 工具注册,`npx -y` 供应链风险 | | **任何** | 架构分析在所有支持的语言上运行 | ## 工作原理 ``` Your repo │ ├── MCPSecurityScanner → 11 attack types via pattern matching + tool schema analysis │ Learned patterns accumulate from real findings │ ├── CrossAgentDataFlowTracer → 9 taint finding types │ Tracks SECRET/PII from source → sink across agent calls │ ├── PromptInjectionScanner → 4 injection patterns │ Direct concat · Template · Unsafe output · Role override │ └── ArchitectureScanner → Maps all MCP_TOOL + AGENT_FRAMEWORK integration points Full attack surface visibility before manual review │ ▼ SARIFExporter (2.1.0) │ ▼ GitHub Security → Code scanning alerts ``` ## 由 AgenticQA 提供支持 此操作封装了来自 **[AgenticQA](https://github.com/nhomyk/AgenticQA)** 的安全扫描器 —— 一个面向 AI 原生团队的开源自治 CI/CD 平台。 AgenticQA 为您的流水线添加: - **持续的 MCP 安全扫描**(此操作) - **EU AI Act 合规** —— Annex III 分类 + Articles 9, 13, 14, 22 - **HIPAA PHI 检测** —— 跨代码库的 5 个 PHI 污点类别 - **自愈 CI** —— SRE 代理自动修复 lint 错误和测试失败 - **对抗性加固** —— 红队代理,具有 20 种绕过技术 + 宪法门控 - **SOC 2 / GDPR** —— 7 个合规扫描器,可导出 SARIF 证据 [探索 AgenticQA →](https://github.com/nhomyk/AgenticQA) ## 许可证 MIT © [nhomyk](https://github.com/nhomyk)
标签:AI安全, Chat Copilot, DevSecOps, DLL 劫持, DNS 反向解析, GitHub Action, GitHub Security, Homebrew安装, IP 地址批量处理, LLM, MCP, SARIF, SSRF, Unmanaged PE, 上游代理, 云安全监控, 大语言模型, 安全扫描, 工具投毒, 数据可视化, 文档安全, 时序注入, 结构化查询, 自动化安全, 逆向工具, 静态分析