OWASP MCP Top 10 : chaque risque expliqué avec des exemples

Un tour d’horizon en langage clair des dix risques de l’OWASP MCP Top 10, des jetons exposés à l’empoisonnement d’outils, en passant par les serveurs fantômes et le surpartage du contexte. Chaque entrée présente une attaque documentée, une correction claire et un plan d’une semaine pour les appliquer dans l’ordre.

OWASP MCP Top 10 : chaque risque expliqué avec des exemples
Cristian Da Conceicao
Fondateur de Picasso IA

Un seul serveur MCP peut confier à un agent d’IA vos dépôts, votre boîte de réception et votre base de données en un après-midi, et l’approuver ne demande souvent qu’un clic. C’est précisément cette facilité que l’OWASP MCP Top 10 cherche à freiner. Il recense les dix risques les plus susceptibles de compromettre un déploiement du Model Context Protocol, des jetons exposés aux serveurs dont personne dans l’équipe de sécurité n’a connaissance. Cet article passe en revue chaque entrée dans l’ordre, montre à quoi ressemble l’attaque à partir d’un exemple réel ou documenté, et termine chaque section par la correction à appliquer en priorité.

La liste provient du projet OWASP MCP Top 10, version 2025, dirigé par Vandana Verma Sehgal. La page du projet le présente actuellement en phase de test bêta et pilote, si bien que la formulation et l’ordre peuvent encore évoluer. Considérez les dix entrées comme un vocabulaire commun plutôt que comme un standard finalisé.

Ce qu’est l’OWASP MCP Top 10

MCP est le protocole qui permet à un modèle d’appeler des outils. Un client MCP (l’application qui héberge le modèle) se connecte à un ou plusieurs serveurs MCP, et chaque serveur expose des outils, des ressources et des prompts que le modèle peut utiliser. Chacune de ces connexions repose sur une décision de confiance : le serveur fait confiance au client pour se comporter correctement, le client fait confiance aux descriptions et aux sorties du serveur, et le modèle fait confiance à tout texte qui arrive dans sa fenêtre de contexte.

Le Top 10 cartographie les endroits où cette confiance se brise. Voici les dix en un coup d’œil :

IDRisqueSignification simplePremière correction la moins coûteuse
MCP01Gestion défaillante des jetons et exposition des secretsLes identifiants fuient via le code, les journaux ou le contexteJetons à courte durée de vie et analyse des secrets
MCP02Élévation de privilèges par extension de périmètreLes permissions dépassent ce dont la tâche a besoinMoindre privilège avec expiration
MCP03Empoisonnement d’outilsLa description ou la sortie d’un outil contient des instructions cachéesÉpingler et hacher les définitions d’outils
MCP04Attaques sur la chaîne d’approvisionnement logicielle et altération des dépendancesUn paquet malveillant ou détourné devient votre serveurInventorier et épingler chaque dépendance
MCP05Injection de commandes et exécutionDu texte non fiable atteint un shellPas de shell, listes d’arguments, validation
MCP06Détournement du flux d’intentionLe contenu récupéré réoriente l’objectif de l’agentTraiter le texte récupéré comme des données, approuver les écritures
MCP07Authentification et autorisation insuffisantesLes serveurs ne vérifient pas qui appelleOAuth 2.1 et contrôles par outil
MCP08Absence d’audit et de télémétriePersonne ne voit ce que l’agent a faitJournaliser chaque appel d’outil
MCP09Serveurs MCP fantômesDes serveurs non approuvés fonctionnent hors de tout cadre de gouvernanceInventaire et liste d’autorisation
MCP10Injection de contexte et surpartageLe contexte fuit entre utilisateurs ou tâchesIsoler le contexte par utilisateur

💡 Note sur les noms : la page de présentation du projet désigne la sixième entrée « Prompt Injection via Contextual Payloads », alors que sa page de détail pour MCP06 s’intitule « Intent Flow Subversion ». Les deux renvoient au même emplacement, et cet article utilise le titre de la page de détail.

Secrets, permissions et outils empoisonnés

MCP01 : Gestion défaillante des jetons et exposition des secrets

Une main arrachant un post-it manuscrit du bord d’un écran dans un bureau domestique encombré

C’est le plus vieux problème de sécurité, sous un habit neuf. Des secrets d’API codés en dur, des jetons de longue durée et des identifiants collés dans des prompts ou des fichiers de configuration finissent dans les journaux, l’historique des conversations et la mémoire du modèle. Une fois qu’un secret se trouve dans la fenêtre de contexte, une injection de prompt n’a plus qu’à demander au modèle de le répéter.

Scénario de l’OWASP : un développeur envoie un secret dans le dépôt pendant des tests, le serveur MCP le lit au démarrage, et l’assistant l’affiche plus tard dans une réponse destinée à quelqu’un d’autre.

Que faire :

  • Émettez des jetons à courte durée de vie et à portée restreinte plutôt que des jetons permanents.
  • Lancez une analyse des secrets sur les dépôts et les pipelines CI.
  • Gardez les secrets hors des descriptions d’outils, des prompts système et des exemples de charges utiles.
  • Renouvelez immédiatement tout secret soupçonné d’avoir été exposé.

💡 Astuce : les secrets qui commencent par un préfixe fixe sont faciles à repérer. Les secrets d’API de PicassoIA commencent par pia_sk_, donc une règle de scanner d’une seule ligne peut les signaler dans n’importe quel dépôt. Ajoutez le même type de règle pour chaque fournisseur que vous utilisez.

MCP02 : Élévation de privilèges par extension de périmètre

Anneau d’acier surchargé portant des dizaines d’étiquettes métalliques dépareillées accrochées à un crochet rouillé dans un couloir en béton

Les permissions commencent serrées puis se relâchent avec le temps. Un jeton créé pour un seul dépôt est élargi « juste pour ce sprint », un agent obtient un accès en écriture parce que l’accès en lecture était gênant, et personne ne révoque rien. Le modèle finit par détenir bien plus de pouvoir que n’en exige une tâche, si bien qu’une seule mauvaise instruction cause beaucoup plus de dégâts.

Scénario de l’OWASP : une injection de prompt cachée dans une issue GitHub publique réoriente un agent disposant d’un large accès aux dépôts, et l’agent copie du code privé dans une pull request publique.

Que faire :

  • Concevez selon le moindre privilège : un périmètre par tâche, pas un périmètre par équipe.
  • Attachez une expiration automatique à chaque autorisation.
  • Séparez les outils de lecture des outils d’écriture afin que leurs approbations puissent différer.
  • Revoyez les permissions des agents selon un calendrier fixe, comme vous revoyez les accès humains.

MCP03 : Empoisonnement d’outils

Une main gantée hésitant devant une clé anglaise contrefaite et rouillée, suspendue parmi des outils propres sur un panneau perforé d’atelier

Les modèles choisissent les outils en lisant leurs noms et leurs descriptions, ce qui fait de ces descriptions une surface d’attaque. Un outil empoisonné dissimule des instructions dans ses métadonnées, son schéma ou sa sortie. En avril 2025, Invariant Labs a démontré l’attaque avec un outil d’addition anodin dont la description cachée demandait à l’agent de lire un fichier de configuration MCP local et un fichier de clé privée SSH, puis de transmettre leur contenu dans un paramètre inutilisé, pendant que la réponse ne parlait que d’arithmétique.

Une variante plus sournoise est le rug pull : un outil se comporte bien au moment où vous l’approuvez, puis modifie sa description après l’installation.

Que faire :

  • Épinglez les versions des outils et conservez un hash de chaque description au moment de l’approbation.
  • Déclenchez une alerte à tout changement de description ou de schéma.
  • Montrez aux utilisateurs la description complète de l’outil, et non un résumé raccourci.
  • Privilégiez les outils signés d’éditeurs que vous pouvez identifier.

MCP04 : Attaques sur la chaîne d’approvisionnement et altération des dépendances

Vue aérienne d’un tapis roulant de colis identiques, dont un carton refermé est inspecté par un ouvrier à la lampe torche

Un serveur MCP est du code écrit par quelqu’un d’autre et téléchargé depuis un registre. Un paquet compromis ou usurpé obtient le même accès que celui que vous accordez au véritable. En septembre 2025, un paquet npm nommé postmark-mcp a copié une intégration Postmark authentique et ajouté une seule ligne qui envoyait une copie cachée de chaque e-mail sortant à une adresse contrôlée par l’attaquant. Des chercheurs de Koi Security l’ont signalé comme le premier serveur MCP malveillant observé dans la nature, et l’analyse de Snyk en détaille les mécanismes. Il a été téléchargé environ 1 500 fois par semaine avant d’être retiré.

Que faire :

  • Tenez une nomenclature IA (AI bill of materials) : chaque serveur, sa version et sa provenance.
  • Épinglez des versions exactes et lisez le diff avant chaque mise à niveau.
  • N’installez que depuis des éditeurs vérifiables, et privilégiez les versions signées.
  • Lancez une analyse des dépendances avant d’approuver un serveur, et exécutez les serveurs inconnus dans un conteneur sans accès réseau jusqu’à leur examen.

MCP05 : Injection de commandes et exécution

Les agents construisent des commandes à partir de texte. Lorsque ce texte est contrôlé par un attaquant (un commentaire d’issue, un nom de fichier, une page web), le shell fait le reste. Selon l’analyse de la liste par Cycode, la CVE-2025-6514 dans mcp-remote avait un score CVSS de 9,6, touchait un paquet comptant plus de 437 000 téléchargements et permettait une injection de commandes système. Elle se situe à la frontière entre cette entrée et MCP04.

La différence entre un code risqué et un code sûr tient souvent à une seule ligne :

import re
import subprocess

# Risky: untrusted text is spliced into a shell string
subprocess.run(f"git log --author={author}", shell=True)

# Safer: fixed command, argument list, validated input, no shell
if not re.fullmatch(r"[A-Za-z0-9._@][A-Za-z0-9 ._@-]{0,63}", author):
    raise ValueError("invalid author")
subprocess.run(["git", "log", "--author", author], shell=False, check=True)

Que faire :

  • Privilégiez les API paramétrées plutôt que les commandes shell.
  • Quand une commande est inévitable, utilisez des listes d’arguments et une validation stricte des entrées.
  • Appliquez une politique de refus par défaut sur les commandes qu’un serveur peut exécuter.
  • Isolez les serveurs locaux dans un bac à sable afin qu’une injection réussie reste confinée.

Intention détournée et portes ouvertes

MCP06 : Détournement du flux d’intention

Un carrefour rural dans la brume, avec un panneau tordu pointant dans des directions contradictoires et une voiture seule qui attend

L’agent lit une page web, une issue ou un PDF, et ce contenu contient des instructions. Un modèle ne peut pas distinguer de façon fiable les données des commandes, il peut donc les suivre. Le résultat est un détournement d’objectif : l’agent semble toujours accomplir votre tâche alors qu’il sert quelqu’un d’autre.

Le cas réel le plus clair vient d’Invariant Labs en mai 2025, à propos du serveur MCP GitHub officiel. Un attaquant ouvre une issue malveillante dans un dépôt public. Lorsque le propriétaire demande à son agent d’examiner les issues ouvertes, l’agent lit l’issue, se fait injecter, récupère des données de dépôts privés dans son contexte et les publie dans une pull request sur le dépôt public. Les chercheurs ont appelé cela un « flux d’agent toxique », ont affirmé qu’il s’agissait d’un problème d’architecture plutôt que d’un bogue dans le code du serveur, et ont soupçonné que beaucoup d’utilisateurs choisissaient une politique d’approbation « toujours autoriser », qui supprime le contrôle humain.

Que faire :

  • Ancrez l’objectif initial et vérifiez chaque action prévue par rapport à lui.
  • Ajoutez un modèle garde-fou indépendant qui ne voit que la demande de l’utilisateur et l’appel d’outil proposé.
  • Étiquetez le contenu récupéré comme données non fiables et demandez au modèle de le traiter comme un texte passif.
  • Exigez une approbation humaine pour toute action qui écrit, envoie ou supprime, et ne choisissez jamais « toujours autoriser » par défaut.

💡 Astuce : un classifieur n’est qu’une couche, pas la défense complète. Llama Guard 4 12B sur PicassoIA est un modèle de modération de contenu qui peut filtrer le texte avant qu’il n’atteigne votre agent, mais c’est un classifieur de sécurité et non un détecteur d’injection dédié, donc conservez les approbations et le moindre privilège en place.

MCP07 : Authentification et autorisation insuffisantes

Porte de salle serveur en acier calée ouverte avec une cale en caoutchouc rouge, à côté d’un lecteur de badge noir

Certains serveurs MCP ne demandent jamais qui les appelle. Un point d’accès exposé sans authentification permet à n’importe qui d’invoquer ses outils, et un serveur qui vérifie l’identité une fois mais ne contrôle jamais les permissions à chaque appel permet à un utilisateur à faibles privilèges de déclencher des actions à privilèges élevés.

Un cas concret est la CVE-2025-49596 dans MCP Inspector d’Anthropic, notée CVSS 9,4. Les versions antérieures à 0.14.1 n’avaient aucune authentification entre le client Inspector et son proxy, de sorte que des requêtes non authentifiées pouvaient lancer des commandes via stdio. Associé à une faille du navigateur et à une falsification de requête intersite, il suffisait de visiter un site malveillant pour exécuter du code sur la machine d’un développeur.

Que faire :

  • Utilisez OAuth 2.1 avec l’authentification multifacteur pour les personnes.
  • Validez l’audience du jeton pour chaque serveur, de sorte qu’un jeton émis pour un serveur échoue sur un autre.
  • Attribuez aux services des identités gérées plutôt que des comptes partagés.
  • Liez les serveurs locaux à localhost et exigez un jeton même là.
  • Vérifiez les permissions à chaque appel d’outil, et non une seule fois par session.

Angles morts et serveurs fantômes

MCP08 : Absence d’audit et de télémétrie

Poste de sécurité vide d’une équipe de nuit, avec un registre vierge et des écrans éteints

Sans journaux, chaque autre risque de cette liste devient invisible. Le vol de jetons, l’injection de commandes et l’injection de prompt peuvent tous se produire sans qu’aucune trace ne soit conservée, et la réponse à incident se réduit à des conjectures. Cette entrée amplifie les neuf autres.

Un journal d’appels d’outils utile tient en peu de champs. Pour chaque appel, enregistrez :

ChampPourquoi c’est important
Qui ou quoi a fait l’appelRelie l’action à un utilisateur, un agent ou un service
Quel serveur et quel outilMontre quelle capacité a été utilisée
Arguments (hachés ou masqués)Permet de rejouer l’intention sans stocker de secrets
Taille et statut du résultatRévèle les lectures en masse et les échecs silencieux
Horodatage et identifiant de sessionReconstitue l’ordre des événements

Que faire :

  • Écrivez les journaux dans un stockage immuable que l’agent ne peut pas modifier.
  • Déclenchez des alertes sur des schémas, comme une rafale de lectures privées suivie d’une écriture dans un espace public.
  • Surveillez des séquences entières d’actions, et pas seulement des appels isolés.

MCP09 : Serveurs MCP fantômes

Une tour serveur et un routeur oubliés, cachés sous un bureau dans un placard de fournitures encombré

Un développeur lance un serveur expérimental un vendredi, il continue de tourner avec des identifiants par défaut et des paramètres ouverts, et dès lundi il contient de vraies données. Personne ne l’a approuvé, personne ne le surveille, et il n’apparaît dans aucun inventaire. C’est ce qu’on appelle un serveur MCP fantôme.

Où chercher en premier :

  • Les fichiers de configuration MCP sur les ordinateurs portables des développeurs et dans les dépôts partagés.
  • Les pipelines CI/CD et les registres de conteneurs.
  • Les comptes cloud, pour détecter les écouteurs sur des ports inhabituels.
  • Les applications de bureau et les extensions d’éditeur qui peuvent ajouter leurs propres entrées de serveur.

Que faire :

  • Lancez une analyse continue de ces emplacements, et non un audit annuel.
  • Appliquez une liste d’autorisation pour qu’un client refuse les serveurs inconnus.
  • Interdisez les identifiants par défaut au niveau de la plateforme.

MCP10 : Injection de contexte et surpartage

Salle de réunion aux parois vitrées, avec un tableau blanc chargé visible depuis le couloir où des collègues passent

Les fenêtres de contexte partagées ou persistantes fuient. Lorsqu’un même agent sert plusieurs utilisateurs ou locataires et que le contexte n’est pas isolé, les données d’une personne peuvent apparaître dans la session d’une autre. Le scénario de l’OWASP est un agent unique servant de nombreux utilisateurs, qui laisse les données personnelles de l’un fuiter dans une session différente.

Cela s’est déjà produit sur un produit réel. BleepingComputer a rapporté qu’Asana avait averti ses utilisateurs en juin 2025 qu’une faille logique dans sa nouvelle fonctionnalité MCP exposait les données de certaines organisations à d’autres. Environ 1 000 clients ont été touchés, et Asana a désactivé la fonctionnalité du 5 au 17 juin, le temps de corriger le bogue. Il s’agissait d’une erreur de logique, et non d’un piratage, et la faille était active depuis environ un mois avant qu’Asana ne la découvre.

Que faire :

  • Donnez à chaque utilisateur et à chaque locataire sa propre fenêtre de contexte à portée limitée.
  • Rendez la mémoire éphémère par défaut et faites-la expirer rapidement.
  • Imposez l’isolation des locataires dans la couche protocole, et non seulement dans le prompt.
  • Masquez les données personnelles avant tout stockage destiné à une réutilisation ultérieure.

Quels risques corriger en premier

Vous ne pouvez pas fermer les dix en une semaine, alors commencez là où les dégâts sont les plus grands et le travail le plus réduit.

Impact maximal, effort minimal

  • MCP01 : activez l’analyse des secrets et raccourcissez la durée de vie des jetons.
  • MCP07 : placez une authentification devant chaque serveur, y compris ceux sur localhost.
  • MCP09 : listez chaque serveur que votre équipe fait tourner aujourd’hui. Vous ne pouvez pas protéger ce que vous n’avez pas compté.

Plus lent mais nécessaire

  • MCP03 et MCP04 : l’épinglage et le hachage demandent une vraie mise en place, mais ils empêchent les changements silencieux.
  • MCP06 : les approbations et les garde-fous demandent un travail de conception et un réglage constant.
  • MCP08 et MCP10 : la journalisation et l’isolation touchent à l’architecture, planifiez-les donc comme des projets.
  • MCP02 et MCP05 : ces entrées se situent entre les deux ; resserrez les périmètres pendant que vous examinez chaque serveur.

Plan de durcissement d’une semaine

JourTâcheRisques couverts
LundiInventorier chaque serveur MCP et chaque configuration clientMCP09
MardiAnalyser les dépôts à la recherche de secrets, renouveler les anciens, raccourcir la durée de vie des jetonsMCP01
MercrediAjouter l’authentification et les contrôles de permissions par outilMCP07, MCP02
JeudiÉpingler les versions, hacher les descriptions d’outils, configurer des alertes de changementMCP03, MCP04
VendrediActiver la journalisation des appels d’outils et exiger une approbation pour les écrituresMCP08, MCP06

💡 Erreurs courantes : approuver « toujours autoriser » pour réduire les clics, faire confiance à un serveur parce qu’il a beaucoup de téléchargements, et tout journaliser sauf les arguments d’outils qui comptent.

Créez vos propres visuels de sécurité

Une liste de contrôle de sécurité frappe davantage les esprits quand on peut se la représenter. Chaque image de cet article utilise un substitut physique simple pour un défaut abstrait : un anneau surchargé de badges pour l’extension de périmètre, une porte calée ouverte pour une authentification faible, un registre vierge pour l’absence de piste d’audit. Vous pouvez construire le même type de visuels pour vos propres modèles de menace, vos supports de formation et vos wikis internes.

Essayez-le sur PicassoIA. Ouvrez un modèle de texte vers image comme Seedream 5 Pro, Qwen Image 3 ou GPT Image 2, décrivez un objet réel qui représente votre risque et ajoutez l’éclairage et l’objectif souhaités. Générez quelques variantes, retenez la plus nette et intégrez-la à votre prochaine revue. Si vous rédigez aussi la documentation, les grands modèles de langage de PicassoIA peuvent vous aider à rédiger une première version avant de la retoucher à la main.

Partager cet article

Choisissez votre langue