MCP-opdrachtinjectie
Een puntkomma in een toolargument wordt een shell-opdracht.
Wat is MCP-opdrachtinjectie?
Een MCP-tool draait op een server, dus elk argument dat het ontvangt is niet-vertrouwde invoer. Bouw een shell-opdracht door die invoer in een tekenreeks te plakken en een puntkomma of backtick is niet langer gegevens: het wordt een opdracht die uw server uitvoert. Je vindt het geïnjecteerde argument in een agenttrace, ziet hoe de tool een gewoon leeg resultaat retourneert terwijl een root reverse shell databasegegevens uitvoert, en roept vervolgens git rechtstreeks aan zonder shell in het pad. Een codefix maakt code die al is uitgevoerd niet ongedaan.
Wat je leert in MCP-opdrachtinjectie
- Erken dat een MCP-tool op een server draait, dus elk argument dat wordt gebruikt om een opdracht te bouwen is niet-vertrouwde invoer die code kan bevatten
- Leg uit hoe het aaneenschakelen van invoer in een shell-opdrachtreeks metatekens als ; en | omgezet in commandosyntaxis, waardoor code op afstand kan worden uitgevoerd
- Begrijp dat een geïnjecteerd commando buiten de band loopt, dus een normaal ogende toolreactie is geen bewijs dat er niets is gebeurd
- Pas de duurzame oplossing toe: roep het programma rechtstreeks aan en geef elke waarde als een afzonderlijk argument door, zonder shell om het te interpreteren
- Maak onderscheid tussen parametrering en escapen of blocklisting, en leg uit waarom het verwijderen van de shell de categorie bug elimineert in plaats van één exemplaar
- Bewijs een codefix door de oorspronkelijke exploit opnieuw af te spelen en besef dat de geheimen van een host die al een aanvallercode uitvoerde, moeten worden geroteerd en opnieuw moeten worden opgebouwd
MCP-opdrachtinjectie — Trainingsstappen
-
Een tool die Git draait
Sarnholt leidt een openbare repo-assistent. Een van de tools, commit_search, zoekt commits op auteur. Bob weet niet hoe het geschreven is, maar een tool die git zoekt op de naam die hij opgeeft is het onderzoeken waard. Hij opent dezelfde agent die iedereen kan gebruiken.
-
Zie het werken
Eerst een normaal verzoek, om te leren wat de tool doet met de naam die hij krijgt.
-
De naam eindigt ergens
De auteur die hij typt komt terug als een git-query. Git is een commandoregelprogramma, dus ergens op de server wordt die naam vrijwel zeker in een git-commando gezet. Als het daar als tekst wordt geplaatst, kan Bob iets aan het commando toevoegen.
-
Sluit het argument en voeg een opdracht toe
Bob vraagt om commits van een auteur wiens naam geen naam is. Het beëindigt het git-commando met een puntkomma en voegt zijn eigen commando toe: haal een script op van zijn host en voer het uit.
-
Het saaie antwoord verborg de schade
Het antwoord van de assistent is onopvallend: er zijn geen commits gematcht. Dat is het punt. Het geïnjecteerde commando rapporteert niet terug via de tool, het draait stil op de server.
-
Een shell op de server
Het script dat de server van Bob teruggaf, opende rechtstreeks een verbinding met zijn luisteraar. Hij schakelt ernaar toe om te zien wat een commit_search-oproep hem heeft opgeleverd.
-
Waarom het werkte
De tool deed precies wat de code zei te doen. De vraag is wat in die code een argument in een commando veranderde.
-
Een omhulsel waar er geen zou moeten zijn
Alice wordt opgeroepen door het beveiligingsteam. De waarschuwing gaat niet over een login of een bestand, maar over een proces.
-
Wat de waarschuwing vastlegt
De waarschuwing heeft het beperkt tot één hulpmiddel en één vorm van invoer.
-
De oproep in het spoor
De agent houdt elke gereedschapsoproep bij. De vergiftigde zit erin.
Dekking van beveiligingsframeworks
OWASP MCP Top 10
- MCP05:2025 Command Injection & Execution
CWE
- CWE-78 Improper Neutralization of Special Elements used in an OS Command
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security