关于 auditing-mcp-servers-for-tool-poisoning
用于部署前审查、事件响应或 CI/CD 的 MCP 服务安全审计技能。它结合 mcp-scan 检查与对描述、SSRF、身份验证和网络暴露的手动审查。
主要功能
- 01扫描 MCP 配置中的服务风险
- 02检查工具、提示词和资源描述
- 03固定工具哈希以检测变更
- 04测试 URL 抓取工具的 SSRF 风险
- 05检查身份验证和网络暴露
- 06评估运行时代理防护
适用场景
- 01将服务加入 Agent 堆栈前进行审查
- 02审计内部开发的 MCP 服务
- 03检测已批准工具描述的变更
- 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 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdstandards.mdscripts/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.T0010 | ML Supply Chain Compromise | 被投毒的第三方 MCP 服务是针对 Agent 的供应链入侵 |
| AML.T0051.001 | LLM Prompt Injection: Indirect | 被投毒的工具描述是对 Agent 上下文的间接注入 |
| AML.T0053 | LLM Plugin Compromise | MCP 工具是 Agent 的插件;投毒会使其被入侵 |
| AML.T0057 | LLM 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 10 | MCP 风险参考(MCP03 工具投毒) | https://owasp.org/www-project-mcp-top-10/ |
| Invariant Labs 博客 | 工具投毒披露 | https://invariantlabs.ai/blog/introducing-mcp-scan |
| MITRE ATLAS | AI 威胁技术分类 | https://atlas.mitre.org/ |
MCP 威胁参考
| 威胁 | 描述 | 检测 |
|---|---|---|
| 工具投毒 | 工具描述中的隐藏指令 | mcp-scan scan / inspect |
| 工具遮蔽 | 恶意服务覆盖受信任的工具 | mcp-scan 跨源检查 |
| Rug pull | 批准后描述发生变更 | mcp-scan 工具固定(哈希) |
| 有毒数据流 | 工具组合导致数据外泄 | mcp-scan 有毒数据流分析 |
| SSRF | URL 抓取工具访问内部目标 | 针对自有服务的 ssrf_probe |
| 未认证暴露 | 无需认证的 MCP 端点 | curl/ss 接口与认证检查 |
验证标准
- 所有已安装的 MCP 配置均已用 mcp-scan 进行静态扫描
- 已检查原始工具/提示词/资源描述中的隐藏指令
- 已固定工具哈希并启用 rug-pull 检测
- 已通过 MCP SDK 以编程方式枚举工具
- 已针对自有目标测试 URL 抓取工具的 SSRF 风险
- 已验证远程服务的身份认证与网络暴露
- 已在适当场景评估或部署运行时代理护栏
- 发现已映射到 MITRE ATLAS AML.T0010 和 OWASP MCP03:2025
- 已为每项发现分配严重程度并记录修复措施
- 已安排重新扫描以捕获未来的 rug pull