mcpField
A
auditing-mcp-servers-for-tool-poisoning

auditing-mcp-servers-for-tool-poisoning

github.com/mukul975安全35.2k226 次安装8 周前更新
代码仓库

关于 auditing-mcp-servers-for-tool-poisoning

用于部署前审查、事件响应或 CI/CD 的 MCP 服务安全审计技能。它结合 mcp-scan 检查与对描述、SSRF、身份验证和网络暴露的手动审查。

主要功能

  1. 01扫描 MCP 配置中的服务风险
  2. 02检查工具、提示词和资源描述
  3. 03固定工具哈希以检测变更
  4. 04测试 URL 抓取工具的 SSRF 风险
  5. 05检查身份验证和网络暴露
  6. 06评估运行时代理防护

适用场景

  1. 01将服务加入 Agent 堆栈前进行审查
  2. 02审计内部开发的 MCP 服务
  3. 03检测已批准工具描述的变更
  4. 04在 CI/CD 中扫描 MCP 配置变更

MCP 相关

该技能审计 MCP 服务及其公布的工具、提示词和资源,并使用 mcp-scan 进行静态与运行时分析,同时执行手动安全检查。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill auditing-mcp-servers-for-tool-poisoning

安装后在 Claude Code 中输入/auditing-mcp-servers-for-tool-poisoning确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
standards.md
scripts/
agent.py

详细介绍

审计 MCP 服务的工具投毒

仅限授权使用提示: 审计 MCP 服务可能会连接并探测在线的工具端点。请仅扫描你拥有或获授权评估的服务。将扫描到的工具描述视为不可信输入——不要将未经审计的 MCP 服务加载到特权 Agent 中。未经许可探测第三方 MCP 端点的 SSRF 或认证弱点可能违法。

概述

Model Context Protocol (MCP) 让 AI Agent 能够发现并调用由 MCP 服务对外声明的外部工具。每个工具都会暴露一个名称和一段自然语言描述,Agent 的大模型会在决定调用它之前阅读该描述。2025 年初,Invariant Labs 披露该描述字段是一个攻击面:恶意服务可以在工具描述中嵌入隐藏指令(工具投毒攻击,OWASP MCP03:2025),而有能力的模型会静默地遵循这些指令——窃取文件、泄露密钥或重定向工具调用——同时向用户返回看似正常的响应。由于工具描述会被加载到 Agent 的上下文中,工具投毒实际上是通过供应链传递的间接提示词注入(MITRE ATLAS AML.T0010 ML Supply Chain Compromise)。

除投毒之外,MCP 服务还会引入经典的基础设施风险:工具遮蔽(恶意服务覆盖可信工具的行为)、拉地毯(工具描述在用户批准后发生变化)、有毒流(一组工具的组合可实现数据窃取)、在服务端抓取 URL 的工具中的 SSRF,以及绑定到网络接口的 MCP 服务的未认证暴露。本技能使用 Invariant Labs 的 mcp-scan 进行静态和运行时分析,端到端地审计 MCP 服务,并对 SSRF 和认证进行手动检查,同时通过工具固定来发现拉地毯。

何时使用

  • 在将新的 MCP 服务添加到 Agent 技术栈(Claude Desktop、Cursor、VS Code、Windsurf、自定义 Agent)之前。
  • 在对内部开发的 MCP 服务进行安全审查期间。
  • 在验证已批准的工具未发生静默变化时(拉地毯检测)。
  • 作为 CI/CD 门禁,在每次变更时扫描 MCP 配置和 SKILL/工具定义。
  • 在事件响应期间,当 Agent 采取了与被投毒工具一致的非预期操作时。

前提条件

  • Python 3.10+ 和 uv(用于 uvx),或 pip。
  • 你想要扫描的 MCP 配置文件(例如 ~/.cursor/mcp.json、~/.vscode/mcp.json、Claude Desktop 配置)。
  • 安装工具:
# uv provides uvx (recommended runner for mcp-scan)
curl -LsSf https://astral.sh/uv/install.sh | sh    # or: pipx install uv

# mcp-scan (Invariant Labs) — no global install needed with uvx
uvx mcp-scan@latest --help

# For the runtime proxy mode (separate extra)
uvx --with "mcp-scan[proxy]" mcp-scan@latest proxy --help

# Manual probing helpers
pip install requests mcp

目标

  • 静态扫描所有已安装的 MCP 服务,以发现工具投毒、遮蔽、拉地毯和有毒流。
  • 检查原始的工具/提示词/资源描述,以发现隐藏或混淆的指令。
  • 固定工具哈希,以检测批准后描述的变化(拉地毯防御)。
  • 测试 URL 抓取工具的服务器端请求伪造 (SSRF)。
  • 验证 MCP 服务已认证,且未暴露在不可信接口上。
  • 可选地通过 mcp-scan 代理强制执行运行时护栏。

MITRE ATT&CK 映射

ID官方名称相关性
AML.T0010ML Supply Chain Compromise被投毒的第三方 MCP 服务是针对 Agent 的供应链入侵
AML.T0051.001LLM Prompt Injection: Indirect被投毒的工具描述是对 Agent 上下文的间接注入
AML.T0053LLM Plugin CompromiseMCP 工具是 Agent 的插件;投毒会使其被入侵
AML.T0057LLM Data Leakage被投毒工具的常见载荷:窃取文件/密钥

工作流

1. 对已安装的 MCP 配置进行静态扫描

mcp-scan 会自动发现已知的配置位置;你也可以显式传入路径。

# Scan all auto-discovered MCP configs
uvx mcp-scan@latest

# Scan a specific config file
uvx mcp-scan@latest ~/.vscode/mcp.json

# Emit machine-readable JSON for CI
uvx mcp-scan@latest --json ~/.cursor/mcp.json > mcp_scan_report.json

mcp-scan 会标记工具投毒、工具遮蔽、跨源升级、拉地毯和有毒流。

2. 检查原始工具描述

在未经校验的情况下打印每个工具/提示词/资源的描述,然后阅读其中是否存在隐藏指令、<important> 风格的块或针对模型的祈使性文本。

uvx mcp-scan@latest inspect ~/.cursor/mcp.json

留意危险信号:针对助手的指令("不要告诉用户"、"读取 ~/.ssh/id_rsa")、嵌套的伪造文档、零宽/Unicode 走私文本,或调用其他工具的指示。

3. 固定工具哈希以检测 rug pull

mcp-scan 会跟踪工具描述哈希,因此后续的静默变更会被标记。按计划运行扫描;此前已批准的工具出现哈希不匹配即表明发生了 rug pull。

# Re-run regularly; mcp-scan reports changed tool hashes since last approval
uvx mcp-scan@latest ~/.cursor/mcp.json
4. 以编程方式枚举工具并审计元数据

使用官方 MCP SDK 连接到服务,并直接检查其公布的 schema。

# enumerate_tools.py (stdio MCP server example)
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def main():
    params = StdioServerParameters(command="node", args=["./suspect-mcp-server.js"])
    async with stdio_client(params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            tools = await session.list_tools()
            for t in tools.tools:
                print(f"{t.name}: {len(t.description or '')} chars")
                print((t.description or "")[:400])

asyncio.run(main())
5. 测试 URL 抓取工具的 SSRF 风险

如果某个工具接受 URL 并在服务端抓取它,尝试访问内部元数据/回环目标(仅限你自己拥有的系统)。

# ssrf_probe.py
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

SSRF_TARGETS = [
    "http://169.254.169.254/latest/meta-data/",   # AWS IMDS
    "http://127.0.0.1:22/", "http://localhost:6379/", "file:///etc/passwd",
]

async def main():
    params = StdioServerParameters(command="node", args=["./suspect-mcp-server.js"])
    async with stdio_client(params) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            for url in SSRF_TARGETS:
                res = await s.call_tool("fetch_url", {"url": url})
                body = str(res.content)[:200]
                print(f"[SSRF?] {url} -> {body}")

asyncio.run(main())
6. 验证身份认证与网络暴露

检查远程 MCP 服务(HTTP/SSE 传输)是否要求身份认证,以及是否未在不受信任的网络上绑定到 0.0.0.0。

# Confirm whether an SSE/HTTP MCP endpoint responds without credentials
curl -s -i http://mcp-host:8000/sse | head -n 20

# Check listening interfaces of a locally running MCP server
ss -tlnp | grep -E ':(8000|3000|6277)'

一个无需认证即可返回工具列表或接受 tools/call 的 MCP 端点属于未认证暴露——应通过令牌/OAuth 加以修复,并绑定到 localhost 或经过认证的网关。

7. 实施运行时护栏(可选)

如需持续防护,将 Agent 的 MCP 流量经由 mcp-scan 代理转发,该代理会实时检查工具调用、数据流约束、PII 和间接注入。

uvx --with "mcp-scan[proxy]" mcp-scan@latest proxy
8. 报告发现

记录每一项发现,包括服务、工具、证据(被投毒的描述 / SSRF 响应 / 未认证的列表)、严重程度和 ATLAS 映射。建议移除或沙箱化被投毒的服务、添加认证、固定已批准的工具,并启用代理。

工具与资源

工具用途来源
mcp-scan静态 + 运行时 MCP 安全扫描器https://github.com/invariantlabs-ai/mcp-scan
MCP Python SDK以编程方式枚举/调用工具https://github.com/modelcontextprotocol/python-sdk
OWASP MCP Top 10MCP 风险参考(MCP03 工具投毒)https://owasp.org/www-project-mcp-top-10/
Invariant Labs 博客工具投毒披露https://invariantlabs.ai/blog/introducing-mcp-scan
MITRE ATLASAI 威胁技术分类https://atlas.mitre.org/

MCP 威胁参考

威胁描述检测
工具投毒工具描述中的隐藏指令mcp-scan scan / inspect
工具遮蔽恶意服务覆盖受信任的工具mcp-scan 跨源检查
Rug pull批准后描述发生变更mcp-scan 工具固定(哈希)
有毒数据流工具组合导致数据外泄mcp-scan 有毒数据流分析
SSRFURL 抓取工具访问内部目标针对自有服务的 ssrf_probe
未认证暴露无需认证的 MCP 端点curl/ss 接口与认证检查

验证标准

  • 所有已安装的 MCP 配置均已用 mcp-scan 进行静态扫描
  • 已检查原始工具/提示词/资源描述中的隐藏指令
  • 已固定工具哈希并启用 rug-pull 检测
  • 已通过 MCP SDK 以编程方式枚举工具
  • 已针对自有目标测试 URL 抓取工具的 SSRF 风险
  • 已验证远程服务的身份认证与网络暴露
  • 已在适当场景评估或部署运行时代理护栏
  • 发现已映射到 MITRE ATLAS AML.T0010 和 OWASP MCP03:2025
  • 已为每项发现分配严重程度并记录修复措施
  • 已安排重新扫描以捕获未来的 rug pull

评论

支持 Markdown