mcp扫描操作
第一个扫描MCP服务器、AI代理和LLM管道以查找安全漏洞的GitHub Action,并将结果直接发送到您的GitHub security选项卡。
](https://github.com/marketplace/actions/mcp-security-scan)   
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 actionSECRET_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可导出证据
______________________________________________________________________
许可证
MIT© nhomyk
