MCP安全扫描工具

一款GitHub Action工具,用于扫描MCP服务器、AI代理和LLM流水线的安全漏洞,并将结果直接发送到GitHub安全标签页。

  • by nhomyk
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 nhomyk/mcp-scan-action

使用说明

mcp扫描操作

第一个扫描MCP服务器、AI代理和LLM管道以查找安全漏洞的GitHub Action,并将结果直接发送到您的GitHub security选项卡。

24漏洞检查。4个扫描引擎。运行时间成本为零。一行YAML。


为什么存在

MCP正在快速发展。正在建造数千台服务器,让人工智能代理访问浏览器、文件系统、API和内部服务。 几乎没有一个在发货前被扫描安全漏洞。

我们扫描了5个流行的开源MCP服务器。 所有5人都有发现:

回购类型 风险评分 最高发现 严重性
浏览器自动化MCP 1.000(关键) 通过任意JS执行 playwright_evaluate CVSS 9.8
生产率API连接器 0.390 Auth令牌已登录到stdout 高
浏览器供应商DevTools MCP 0.080 克隆到子进程的完整环境 高
Vector DB Claude插件 0.150 未固定 npx -y 供应链风险 中等
通过未验证的URL参数搜索MCP服务器 0.200 SSRF 高

一个拥有33个注册工具的浏览器自动化MCP公开了一个 playwright_evaluate 接受来自LLM的原始JavaScript的工具——没有验证,没有沙盒。那是 远程代码执行(CVSS 9.8) 由任何快速注射的试剂控制。这个动作会在第一次提交之前抓住它 main.

此操作为基于模型上下文协议构建的每个团队带来了自动化、连续的MCP安全扫描,无需任何配置,也无需API密钥。


快速入门--一行

- uses: nhomyk/mcp-scan-action@v1

将其添加到任何检查代码的作业中。就这样


完整工作流程

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 }}"

调查结果立即出现在 安全→ 代码扫描警报。


它检测到什么——24个漏洞类

MCP工具中毒(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 无需凭据检查即可进行身份验证操作 工具处理程序缺少令牌验证
UNCONSTRAINED_SCOPE 没有权限边界的代理 在任意路径上具有读+写+执行的代理
CROSS_ORIGIN_ESCALATION 跨代理信任边界违规 代理A将未经验证的输出转发给代理B
SHADOW_TOOL 隐藏的工具注册对用户不可见 已注册但未出现在工具列表中的工具

跨代理DataFlow Taint(9种查找类型)

跟踪来自的秘密和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

快速注射(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安全选项卡

调查结果上传为 沙林2.1.0 直接到您的存储库 安全→ 代码扫描 页面。没有第三方仪表板,不需要帐户,没有数据离开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类和补救指南。


步骤总结

每次运行后,您的工作流中都会显示一个格式化的摘要 摘要 选项卡:

🔴 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

# Gate deployment on risk level
- 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

# Save SARIF as workflow artifact
- name: Upload scan artifact
  uses: actions/upload-artifact@v4
  with:
    name: mcp-scan-sarif
    path: ${{ steps.mcp.outputs.sarif-file }}

# Post finding count to 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代码扫描(security-events: write 必填)
category mcp-security SARIF类别--在运行多个扫描作业时很有用

输出

输出 值 描述
findings-count integer 所有4个扫描引擎的总结果
risk-level low · medium · high · critical 总体风险分类
critical-count integer 严重程度严重的发现数量
sarif-file path 生成的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美元/小时= 每个审查周期8000美元 $0--每次推送都有收益
数据泄露的平均成本: 488万美元 (IBM 2024) 在凭证泄漏进入生产之前将其捕获
MCP审计安全顾问: $15,000–$50,000 自动化、连续、确定性
在生产环境中发现错误: 贵6倍 而不是在CI中找到它 向左移动:阻止合并,而不是事件

静态分析捕获了一整类错误——SSRF、命令注入、凭证日志记录——这些错误很容易预防,但会造成灾难性的失误。自动化检查的成本为零。


不需要API密钥

所有扫描都是 纯静态分析。 行动:

  • 从不打电话给LLM
  • 从不将代码发送到外部服务
  • 确定性地生成结果——每次运行都使用相同的代码、相同的结果
  • 完全在GitHub Actions运行器中运行

支持的语言和框架

在以下位置检测MCP和代理模式:

语言 框架/模式
Types/JavaScript @modelcontextprotocol/sdk、LangChain.js、AutoGen js、direct 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提供技术支持

此操作将安全扫描程序从 代理QA --面向人工智能原生团队的开源自主CI/CD平台。

AgenticQA添加到您的管道中:

  • 连续MCP安全扫描 (此操作)
  • 欧盟人工智能法案合规性 --附件三分类+第九、十三、十四、二十二条
  • HIPAA PHI检测 --代码库中的5个PHI污染类别
  • 自我修复CI --SRE代理自动修复棉绒错误和测试失败
  • 对抗性硬化 --红队特工,20种旁路技术+宪法门
  • SOC 2/GDPR --7台合规扫描仪,SARIF可导出证据

探索代理商QA→


许可证

MIT© nhomyk