In this article
MCP-Server mit Command-Injection-Schwachstellen ausnutzen
MCP-Server erobern die Welt im Sturm. LLMs mithilfe von MCP-Servern um zusätzliche Funktionen zu erweitern, wird immer häufiger eingesetzt. Doch zu welchem Preis? Was passiert, wenn Sie MCP-Server in Ihre agentischen KI- und LLM-Workflows integrieren, die für verschiedene Sicherheitslücken anfällig sind?
MCP-Server lassen sich für alltägliche KI-Anwendungen wie Claude Desktop und Raycast einsetzen. In Kombination mit KI-gestütztem Programmieren und autonomen Softwareentwicklungs-Workflows können sie jedoch ein höheres Risiko darstellen.
Best Practices für sichere Entwicklung mit KI
10 Tipps, wie Entwickler und Sicherheitsexperten potenzielle Risiken wirksam mindern und gleichzeitig die Vorteile der KI-gestützten Entwicklung voll ausschöpfen können.
Warum stellen anfällige MCP-Server ein Risiko für Softwareentwickler dar?
Entwicklerinnen und Entwickler setzen MCP-Server ein, um KI-gestütztes Programmieren und Vibe-Coding-Sitzungen zu erweitern, zum Beispiel durch die Integration mit GitHub, um Informationen zu Issues in einem Code-Repository abzurufen.

Der Laptop einer Entwicklerin oder eines Entwicklers ist zugleich häufig ein gezieltes Angriffsziel für böswillige Akteure, da er oft API-Schlüssel, Zugangsdaten, geistiges Eigentum und andere sensible Informationen zu Umgebungen mit weitreichenden Berechtigungen, Datenbanken und Cloud-Infrastruktur enthält.
Denken Sie außerdem daran, wie viel zu tun Entwicklerinnen und Entwickler haben und wie oft sie bei ihrer Arbeit zwischen unterschiedlichen Kontexten wechseln müssen. In ihrem schnelllebigen Arbeitsalltag besteht daher die Gefahr, dass sie unüberlegt handeln und viele Aufgaben automatisch erledigen:
Eine neue Open-Source-Abhängigkeit hinzufügen, um eine Aufgabe zu lösen? Öffnen Sie das Terminal und führen Sie
npm install <package>aus.Einen neuen MCP-Server hinzufügen? Öffnen Sie Cursors MCP-Definitionsdatei
.cursor/mcp.jsonund definieren Sie einen neuen Server.
Leider nehmen sich Entwicklerinnen und Entwickler oft nicht die nötige Zeit, um den Quellcode von Drittanbieter-Abhängigkeiten, die sie einem Projekt hinzufügen, sorgfältig zu prüfen. Dasselbe gilt für den Quellcode von MCP-Servern.
Anfälliger MCP-Server
Erstellen wir einen einfachen MCP-Server, der bewusst anfällige und unsichere Programmierpraktiken verwendet.
Dieser MCP-Server stellt MCP-Clients wie Cursor Funktionen bereit, mit denen sie Paketinformationen aus der npm-Registry abrufen können.
Der folgende Code ist der zentrale Quellcode für die über einen MCP-Server bereitgestellte Suchfunktion für npm-Pakete:
const server = new McpServer({
name: "npm JavaScript package management tools",
version: "1.0.0",
description: "Provides tools to get information about open source npm packages from the npmjs registry"
});
server.tool(
"getNpmPackageInfo",
"Get information about an npm package",
{
packageName: z.string()
},
async ({ packageName }) => {
const output = execSync(`npm view ${packageName}`, {
encoding: "utf-8",
});
return {
content: [
{
type: "text",
text: output
},
],
};
}
);Einen neuen MCP-Server für Cursor definieren
Was passiert also, wenn Entwicklerinnen und Entwickler Cursor, VS Code oder einer anderen IDE einen neuen MCP-Server hinzufügen? Fügen wir einen neuen lokalen MCP-Server hinzu, der auf einem von einer Node.js-Laufzeitumgebung ausgeführten Prozess basiert:
{
"mcpServers": {
"npm-package-info": {
"command": "node",
"args": ["/Users/lirantal/projects/repos/mcp-server-npm"]
}
}Sehen wir uns als Nächstes an, wie ein solcher MCP-Server unsichere Programmierpraktiken verwenden kann, die zu einem Command-Injection-Angriff führen.
Wenn wir in einem Cursor-Tab beispielsweise Folgendes eingeben:
What is the last release date of the nodemon npm packageCursor greift nun auf die verfügbaren Tools zurück und findet ein Tool namens getNpmPackageInfo, das es aufrufen kann. Dieses Tool erwartet eine Zeichenfolge mit einem Paketnamen. Es extrahiert die Zeichenfolge nodemon aus unserer Eingabe und ruft das Tool mit diesem Parameter auf.
Was aber, wenn die Eingabe Shell-Zeichen für Command-Injection enthält, mit denen sich der Befehl npm info <package name> umgehen und ein neuer Befehl ausführen lässt?
Was ist eine Command-Injection? Kurz gesagt entsteht eine Command-Injection in serverseitigen Node.js-Programmen, wenn eine vom Benutzer bereitgestellte Eingabe ohne ausreichende Bereinigung direkt in einen Systembefehl eingebunden wird, den der MCP-Server ausführt. Dadurch kann ein Angreifer den vorgesehenen Befehl verändern und beliebige Betriebssystembefehle auf dem Server ausführen.
Sehen Sie sich folgenden Proof of Concept an, bei dem Cursor aufgefordert wird, Informationen zur Bibliothek react; touch /tmp/hi: abzurufen.

Dies ist aufgrund des anfälligen Codes im MCP-Server möglich, der die Child-Process-APIs von Node.js wie folgt verwendet:
const output = execSync(`npm view ${packageName}`, {
encoding: "utf-8",
});Angreifer können durch verschiedene Interaktionen mit dem Chat eine entsprechende Eingabe erstellen (denken Sie beispielsweise an manipulierte Cursor-Regeln und andere Methoden), die eine Command-Injection auslöst.
Command-Injection-Schwachstellen in MCP-Servern ausnutzen
Das folgende Video zeigt, wie Angreifer anfällige MCP-Server ausnutzen können, um Command-Injection-Angriffe auszuführen:

Wenn Sie MCP-Server in Python oder Go entwickeln, empfehle ich Ihnen dringend, sich darüber zu informieren, wie Sie solche Command-Injection-Schwachstellen vermeiden können:
Starten Sie kostenlos mit den KI-Code-Sicherheitstools von Snyk
Keine Kreditkarte erforderlich.
Erstellen Sie ein Konto mit Bitbucket und nutzen Sie weitere Optionen
Mit der Nutzung von Snyk erklären Sie sich mit unseren Richtlinien einverstanden, einschließlich unserer Nutzungsbedingungen und unserer Datenschutzerklärung.