Auditing von MCP-Servern auf Tool-Poisoning
Hinweis zur ausschließlichen autorisierten Nutzung: Das AudiTTieren von MCP-Servern kann eine Verbindung zu Live-Tool-Endpunkten herstellen und diese untersuchen. Scannen Sie nur Server, die Sie besitzen oder zu deren Prüfung Sie autorisiert sind. Behandeln Sie gescannte Tool-Beschreibungen als nicht vertrauenswürdige Eingabe – laden Sie keinen ungeprüften MCP-Server in einen privilegierten Agenten. Das Testen von Drittanbieter-MCP-Endpunkten auf SSRF- oder Authentifizierungsschwächen ohne Erlaubnis kann illegal sein.
Übersicht
Das Model Context Protocol (MCP) ermöglicht es KI-Agenten, von MCP-Servern beworbene externe Tools zu entdecken und aufzurufen. Jedes Tool gibt einen Namen und eine Beschreibung in natürlicher Sprache frei, die das LLM des Agenten liest, bevor es entscheidet, das Tool aufzurufen. Anfang 2025 legte Invariant Labs offen, dass dieses Beschreibungsfeld eine Angriffsfläche darstellt: Ein bösartiger Server kann versteckte Anweisungen in die Beschreibung eines Tools einbetten (ein Tool-Poisoning-Angriff, OWASP MCP03:2025), und ein fähiges Modell wird diesen stillschweigend folgen – Dateien exfiltrieren, Geheimnisse preisgeben oder Tool-Aufrufe umleiten – während es eine normal aussehende Antwort an den Benutzer zurückgibt. Da Tool-Beschreibungen in den Kontext des Agenten geladen werden, ist Tool-Poisoning effektiv eine indirekte Prompt-Injection über die Lieferkette (MITRE ATLAS AML.T0010 Kompromittierung der ML-Lieferkette).
Neben Poisoning führen MCP-Server klassische Infrastrukturrisiken ein: Tool-Shadowing (ein bösartiger Server überschreibt das Verhalten eines vertrauenswürdigen Tools), Rug Pulls (die Beschreibung eines Tools ändert sich nach der Genehmigung durch den Benutzer), toxische Abläufe (eine Kombination von Tools, die Datenexfiltration ermöglicht), SSRF in Tools, die serverseitig URLs abrufen, und unauthentifizierte Offenlegung von MCP-Servern, die an Netzwerkschnittstellen gebunden sind. Dieses Skill auditiert MCP-Server End-to-End mit Invariant Labs' mcp-scan für statische und Laufzeitanalyse, plus manuelle Prüfungen auf SSRF und Authentifizierung sowie Tool-Pinning, um Rug Pulls zu erkennen.
Wann verwenden
- Bevor ein neuer MCP-Server zu einem Agentenstack hinzugefügt wird (Claude Desktop, Cursor, VS Code, Windsurf, benutzerdefinierte Agenten).
- Während einer Sicherheitsüberprüfung eines intern entwickelten MCP-Servers.
- Bei der Validierung, dass genehmigte Tools sich nicht stillschweigend geändert haben (Rug-Pull-Erkennung).
- Als CI/CD-Gate, das MCP-Konfigurationen und SKILL-/Tool-Definitionen bei jeder Änderung scannt.
- Während der Reaktion auf Vorfälle, wenn ein Agent unerwartete Aktionen ausgeführt hat, die mit einem vergifteten Tool vereinbar sind.
Voraussetzungen
- Python 3.10+ und
uv(füruvx) oder pip. - Die MCP-Konfigurationsdatei(en), die Sie scannen möchten (z. B.
~/.cursor/mcp.json,~/.vscode/mcp.json, Claude Desktop-Konfiguration). - Installieren Sie die Werkzeuge:
# uv stellt uvx bereit (empfohlener Ausführer für mcp-scan)
curl -LsSf https://astral.sh/uv/install.sh | sh # oder: pipx install uv
# mcp-scan (Invariant Labs) – keine globale Installation mit uvx erforderlich
uvx mcp-scan@latest --help
# Für den Laufzeit-Proxymodus (separates Extra)
uvx --with "mcp-scan[proxy]" mcp-scan@latest proxy --help
# Helfer für manuelle Prüfung
pip install requests mcp
Ziele
- Alle installierten MCP-Server statisch auf Tool-Poisoning, Shadowing, Rug Pulls und toxische Abläufe scannen.
- Rohe Tool-/Prompt-/Ressourcenbeschreibungen auf versteckte oder verschleierte Anweisungen inspizieren.
- Tool-Hashes pinnen, um nach Genehmigung vorgenommene Beschreibungsänderungen zu erkennen (Rug-Pull-Abwehr).
- URL-abrufende Tools auf Server-Side Request Forgery (SSRF) testen.
- Sicherstellen, dass MCP-Server authentifiziert sind und nicht auf nicht vertrauenswürdigen Schnittstellen offengelegt werden.
- Optional Laufzeit-Schutzmaßnahmen mit dem mcp-scan-Proxy durchsetzen.
MITRE ATT&CK-Zuordnung
| ID | Offizieller Name | Bedeutung |
|---|---|---|
| AML.T0010 | Kompromittierung der ML-Lieferkette | Ein vergifteter Drittanbieter-MCP-Server ist eine Lieferkettenkompromittierung des Agenten |
| AML.T0051.001 | LLM Prompt Injection: Indirekt | Vergiftete Tool-Beschreibungen sind indirekte Injektion in den Agentenkontext |
| AML.T0053 | LLM-Plugin-Kompromittierung | MCP-Tools sind die Plugins des Agenten; Poisoning kompromittiert sie |
| AML.T0057 | LLM-Datenleck | Häufige Nutzlast eines vergifteten Tools: Exfiltration von Dateien/Geheimnissen |
Arbeitsablauf
1. Statischer Scan installierter MCP-Konfigurationen
mcp-scan erkennt bekannte Konfigurationsorte automatisch; Sie können auch einen Pfad explizit übergeben.
# Alle automatisch erkannten MCP-Konfigurationen scannen
uvx mcp-scan@latest
# Eine bestimmte Konfigurationsdatei scannen
uvx mcp-scan@latest ~/.vscode/mcp.json
# Maschinenlesbares JSON für CI ausgeben
uvx mcp-scan@latest --json ~/.cursor/mcp.json > mcp_scan_report.json
mcp-scan kennzeichnet Tool-Poisoning, Tool-Shadowing, Cross-Origin-Eskalation, Rug Pulls und toxische Abläufe.
2. Rohe Tool-Beschreibungen inspizieren
Geben Sie jede Tool-/Prompt-/Ressourcenbeschreibung ohne Verifikation aus und lesen Sie sie dann auf versteckte Anweisungen, <important>-artige Blöcke oder imperative Texte, die auf das Modell abzielen.
uvx mcp-scan@latest inspect ~/.cursor/mcp.json
Achten Sie auf Warnsignale: Anweisungen an den Assistenten („Sag dem Benutzer nichts“, „Lese ~/.ssh/id_rsa“), verschachtelte gefälschte Dokumentation, Nullbreiten-/Unicode-geschmuggelte Texte oder Anweisungen, andere Tools aufzurufen.
3. Tool-Hashes pinnen, um Rug Pulls zu erkennen
mcp-scan verfolgt Hashes von Tool-Beschreibungen, sodass eine spätere stillschweigende Änderung markiert wird. Führen Sie Scans regelmäßig durch; eine Hash-Diskrepanz bei einem zuvor genehmigten Tool deutet auf einen Rug Pull hin.
# Regelmäßig erneut ausführen; mcp-scan meldet geänderte Tool-Hashes seit der letzten Genehmigung
uvx mcp-scan@latest ~/.cursor/mcp.json
4. Tools programmatisch auflisten und Metadaten prüfen
Stellen Sie mit dem offiziellen MCP SDK eine Verbindung zum Server her und inspizieren Sie das beworbene Schema direkt.
# enumerate_tools.py (Beispiel für einen Stdio-MCP-Server)
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 '')} Zeichen")
print((t.description or "")[:400])
asyncio.run(main())
5. URL-abrufende Tools auf SSRF testen
Wenn ein Tool eine URL akzeptiert und serverseitig abruft, versuchen Sie, interne Metadaten-/Loopback-Ziele zu erreichen (nur auf Systemen, die Sie besitzen).
# 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. Authentifizierung und Netzwerkexposition überprüfen
Stellen Sie sicher, dass entfernte MCP-Server (HTTP/SSE-Transport) eine Authentifizierung erfordern und nicht an 0.0.0.0 in nicht vertrauenswürdigen Netzwerken gebunden sind.
# Bestätigen, ob ein SSE/HTTP-MCP-Endpunkt ohne Anmeldeinformationen antwortet
curl -s -i http://mcp-host:8000/sse | head -n 20
# Überprüfen Sie die Lauschschnittstellen eines lokal laufenden MCP-Servers
ss -tlnp | grep -E ':(8000|3000|6277)'
Ein MCP-Endpunkt, der Tool-Auflistungen zurückgibt oder tools/call ohne Authentifizierung akzeptiert, ist eine unauthentifizierte Offenlegung – beheben Sie dies mit einem Token/OAuth und binden Sie es an localhost oder ein authentifiziertes Gateway.
7. Laufzeit-Schutzmaßnahmen durchsetzen (optional)
Leiten Sie für kontinuierlichen Schutz den MCP-Datenverkehr des Agenten über den mcp-scan-Proxy, der Tool-Aufrufe, Datenflussbeschränkungen, PII und indirekte Injektion in Echtzeit prüft.
uvx --with "mcp-scan[proxy]" mcp-scan@latest proxy
8. Ergebnisse dokumentieren
Dokumentieren Sie jeden Befund mit Server, Tool, Beweis (die vergiftete Beschreibung / SSRF-Antwort / unauthorisierte Auflistung), Schweregrad und ATLAS-Zuordnung. Empfehlen Sie, vergiftete Server zu entfernen oder in einer Sandbox zu isolieren, Authentifizierung hinzuzufügen, genehmigte Tools zu pinnen und den Proxy zu aktivieren.
Tools und Ressourcen
| Tool | Zweck | Quelle |
|---|---|---|
| mcp-scan | Statischer + Laufzeit-MCP-Sicherheitsscanner | https://github.com/invariantlabs-ai/mcp-scan |
| MCP Python SDK | Programmgesteuerte Tool-Aufzählung / -Aufrufe | https://github.com/modelcontextprotocol/python-sdk |
| OWASP MCP Top 10 | MCP-Risikoreferenz (MCP03 Tool-Poisoning) | https://owasp.org/www-project-mcp-top-10/ |
| Invariant Labs Blog | Offenlegung von Tool-Poisoning | https://invariantlabs.ai/blog/introducing-mcp-scan |
| MITRE ATLAS | Taxonomie von KI-Bedrohungstechniken | https://atlas.mitre.org/ |
MCP-Bedrohungsreferenz
| Bedrohung | Beschreibung | Erkennung |
|---|---|---|
| Tool-Poisoning | Versteckte Anweisungen in der Tool-Beschreibung | mcp-scan scan / inspect |
| Tool-Shadowing | Bösartiger Server überschreibt vertrauenswürdiges Tool | mcp-scan Cross-Origin-Prüfungen |
| Rug Pull | Beschreibungsänderung nach Genehmigung | mcp-scan Tool-Pinning (Hash) |
| Toxischer Ablauf | Tool-Kombination ermöglicht Exfiltration | mcp-scan Analyse toxischer Abläufe |
| SSRF | URL-abrufendes Tool erreicht interne Ziele | ssrf_probe gegen eigenen Server |
| Unauth. Offenlegung | MCP-Endpunkt ohne Authentifizierung | curl/ss-Schnittstelle und Authentifizierungsprüfung |
Validierungskriterien
- Alle installierten MCP-Konfigurationen statisch mit mcp-scan gescannt
- Rohe Tool-/Prompt-/Ressourcenbeschreibungen auf versteckte Anweisungen inspiziert
- Tool-Hashes gepinnt und Rug-Pull-Erkennung aktiviert
- Tools programmatisch über das MCP SDK aufgelistet
- URL-abrufende Tools auf SSRF gegen eigene Ziele getestet
- Authentifizierung und Netzwerkexposition entfernter Server überprüft
- Laufzeit-Proxy-Schutzmaßnahmen bewertet oder gegebenenfalls bereitgestellt
- Befunde MITRE ATLAS AML.T0010 und OWASP MCP03:2025 zugeordnet
- Schweregrad zugewiesen und Behebung für jeden Befund dokumentiert
- Erneuter Scan geplant, um zukünftige Rug Pulls zu erkennen