Retour d'expérience · Deep Dive

Securing an MCP server in practice

Un retour d'expérience issu de VamiGRC

Un serveur MCP sécurisé tient toute décision qui compte à l'écart de l'agent IA. En construisant le serveur MCP qui relie des assistants IA comme Claude à VamiGRC, nous avons appris qu'une confirmation dans le chat n'est pas un contrôle de sécurité : un agent manipulé peut y répondre lui-même. Ce retour d'expérience montre comment nous avons déplacé l'identité, les validations, l'autonomie et les frontières entre locataires vers le backend, comment nous avons testé chacun de ces éléments et où se situent encore les limites.

Objet
Le serveur MCP de VamiGRC
Méthode
Modèle de menaces avec STRIDE et l'OWASP MCP Top 10
Vérification
8 tests négatifs, de bout en bout, tous réussis
Base
Spécification MCP depuis 2025-06-18 · OAuth 2.1
Contexte

Les règles existent, la pratique est encore jeune

Depuis la révision de juin 2025 de la spécification MCP, un serveur MCP protégé est un resource server OAuth 2.1. La pratique est à la traîne, et une plateforme GRC fait monter les enjeux.

8,5 %

des plus de 5 200 serveurs MCP open source examinés en octobre 2025 utilisaient OAuth.

State of MCP Server Security 2025: Research Report (octobre 2025) (ouvre un site externe)

Ce qu'exige la spécification

  • Découverte des métadonnées via les Protected Resource Metadata du serveur (RFC 9728)
  • PKCE dans le flux d'autorisation
  • Liaison d'audience : un jeton n'est valable que pour le serveur pour lequel il a été émis
  • Pas de token passthrough vers les services en aval

Specification, Revision 2025-06-18: Authorization (juin 2025) (ouvre un site externe)

Une plateforme GRC fait monter les enjeux

L'agent lit les risques, les incidents et les données fournisseurs, et il peut les modifier. Une modification erronée n'est pas qu'un simple bug : elle peut fausser les preuves sur lesquelles s'appuie un auditeur.

  • Créer des enregistrements
  • Désigner des responsables
  • Clôturer des constats
  • Supprimer des entrées
Question de recherche et modèle de menaces

Trois attaquants, un fil conducteur

Comment un agent IA peut-il travailler avec des données de conformité sans devenir le point le plus faible de la plateforme ?

Nous avons modélisé trois attaquants, avec STRIDE pour la classe de faille et l'OWASP MCP Top 10 comme catalogue de risques. Sélectionnez un attaquant pour voir quels contrôles le limitent, quels tests négatifs s'y rapportent et ce qui subsiste.

Agent manipulé

Ce qu'il contrôle
Le texte que lit l'agent : la description d'un enregistrement, un document, le résultat d'un outil (injection de prompt indirecte)
Ce qu'il veut
Pousser l'agent à modifier ou supprimer des données sans que l'utilisateur l'ait jamais demandé
STRIDE
TamperingElevation of Privilege

Limité par

  • Le texte issu des enregistrements est transmis à l'agent marqué comme données non fiables
  • Un niveau d'autonomie par classe d'actions, suppressions et décisions jamais autonomes
  • Une validation dans l'application pour les suppressions et les décisions, pas dans le chat
  • Jamais plus de droits que la personne : un jeton restreint et le rôle propre de la personne

Tests négatifs associés

  • RéussiSimple « oui » sur un aperçu de suppression
  • RéussiLimite personnelle plus stricte que celle de l'organisation

Ce qui subsiste : Dans une session détournée, l'agent peut encore confirmer au niveau L2 dans le chat, et il peut saisir lui-même la référence de suppression. C'est pourquoi les suppressions et les décisions exigent une validation dans l'application. L'injection de prompt elle-même ne peut pas être entièrement empêchée.

Le fil conducteur : un agent manipulé ne s'introduit pas par effraction. Il utilise des autorisations qu'il détient légitimement. Chaque contrôle doit donc se situer là où l'agent ne peut pas l'atteindre.

Identité

Pas de token passthrough, des jetons à courte durée de vie

L'agent ne détient jamais de jeton que le backend accepterait comme une session utilisateur normale. La chaîne de connexion en quatre étapes :

  1. 1

    Découverte

    L'assistant découvre le serveur d'autorisation à partir des Protected Resource Metadata du serveur MCP (RFC 9728).

  2. 2

    Connexion et consentement

    L'utilisateur se connecte directement à VamiGRC et voit un écran de consentement : quel assistant, lecture seule ou lecture et modification, quel locataire.

  3. 3

    Des jetons à courte durée de vie

    L'assistant reçoit un access token valable quelques minutes et non quelques jours, lié au serveur MCP en tant qu'audience, ainsi qu'un refresh token qui change à chaque utilisation.

  4. 4

    Jeton d'API restreint

    Le backend n'accepte ce jeton que comme un jeton d'API restreint : uniquement l'API publique, jamais de fonctions d'administration, et jamais plus que le rôle propre de l'utilisateur.

Deux enseignements tirés du chemin parcouru

1

L'application comme serveur d'autorisation

Notre conception précédente échangeait, auprès d'un fournisseur d'identité externe, la connexion de l'utilisateur contre un jeton pour le backend. Cela fonctionnait, mais les sessions de longue durée et l'échange de jetons faisaient mauvais ménage : après une période d'inactivité, les utilisateurs voyaient s'afficher « connexion expirée ». Faire de VamiGRC le serveur d'autorisation a éliminé cette catégorie de problèmes.

2

Les détails de la découverte comptent

Un seul scope manquant, offline_access, a fait échouer un client IA majeur avant même qu'il n'affiche une page de connexion.

Références : RFC 9728: OAuth 2.0 Protected Resource Metadata (avril 2025) (ouvre un site externe) · RFC 8707: Resource Indicators for OAuth 2.0 (février 2020) (ouvre un site externe) · RFC 9700: Best Current Practice for OAuth 2.0 Security (janvier 2025) (ouvre un site externe) · The OAuth 2.1 Authorization Framework (Internet-Draft) (ouvre un site externe)

Validations

Pourquoi une confirmation dans le chat ne suffit pas

Notre première version demandait à l'utilisateur de confirmer chaque modification dans la conversation. Cela semblait sûr, mais la confirmation se faisait dans le canal même que contrôle l'attaquant.

Première version : confirmation dans le chat

  1. Agentpropose une modification et demande confirmation dans le chat
  2. Chatattend un « oui » en guise de confirmation
  3. Agent manipulétape lui-même le « oui »
  4. Jeton voléécrit directement contre l'API, sans jamais voir le chat

Le contrôle se situe dans le canal de l'attaquant.

Aujourd'hui : imposé par le serveur

  1. Serveur MCPstocke l'aperçu : à usage unique, valable 15 minutes, lié au jeton, au locataire et à la société
  2. Confirmationne vaut que pour cet aperçu précis ; si l'enregistrement a changé entre-temps, elle est refusée
  3. Serveur MCPsigne la requête exacte en guise de preuve de confirmation, valable deux minutes
  4. Backendn'écrit qu'avec une preuve valide et refuse tout le reste

L'agent ne peut pas falsifier ces couches. Les suppressions et les décisions exigent en plus une validation dans l'application.

Trois couches que l'agent ne peut pas falsifier

01

Des aperçus imposés par le serveur

Chaque écriture est un appel en deux étapes. La première renvoie un aperçu et le stocke sur le serveur ; seule sa confirmation déclenche l'écriture. Si l'enregistrement a changé entre-temps, la confirmation est refusée.

  • à usage unique
  • 15 minutes
  • jeton · locataire · société
02

Une preuve de confirmation

À l'étape de confirmation, le serveur MCP signe la requête exacte. Le backend rejette toute écriture qui en est dépourvue : un access token volé, utilisé directement contre l'API, ne peut donc pas écrire.

  • ID du jeton · méthode · chemin · hash du corps
  • 2 minutes
03

Saisie de la référence pour les suppressions

Un simple « oui » ne supprime rien. L'utilisateur doit saisir la référence de l'enregistrement, et l'aperçu énumère tout ce qui est lié à cet enregistrement. Les enregistrements archivables sont archivés plutôt qu'effacés.

  • référence au lieu de « oui »
  • archiver plutôt qu'effacer
Autonomie

Des niveaux d'autonomie par action, appliqués dans le backend

Toutes les actions ne méritent pas la même confiance. Chaque route d'écriture de l'API publique relève d'une classe d'actions, et l'organisation fixe pour chaque classe le niveau d'autonomie maximal, selon les niveaux L0 à L3 de VamiGRC.

  • L0

    Manuel

    L'agent n'a pas le droit d'agir.

    Dans le serveur MCPRefus assorti d'une raison claire ; la personne agit dans VamiGRC.

  • L1

    Assisté par l'IA

    L'agent prépare, la personne agit.

    Dans le serveur MCPUn brouillon que la personne vérifie et enregistre.

  • L2

    Exécuté par l'IA avec validation obligatoire

    L'agent agit après la validation d'un humain.

    Dans le serveur MCPAperçu et confirmation, ou validation dans l'application pour les suppressions et les décisions.

  • L3

    Entièrement autonome, intégralement audité

    L'agent agit seul, tout est consigné.

    Dans le serveur MCPUniquement pour les classes à faible risque, comme les notes.

Trois règles qui font tenir le dispositif

Plus strict, jamais plus souple

L'organisation fixe le maximum, et chaque personne ne peut que le restreindre pour ses propres assistants. C'est toujours le réglage le plus strict qui s'applique.

Des plafonds stricts

Les suppressions et les décisions ne sont jamais autonomes, et les décisions signées, comme les approbations, ne passent jamais par le chat.

Fail closed

Une route sans classe est considérée comme bloquée. Un test échoue dès qu'une nouvelle route d'écriture n'a pas de classe.

Calculateur d'autonomie : quel niveau s'applique au final ?

Choisissez une classe d'actions, le maximum de l'organisation et la limite personnelle. Le calculateur applique les trois règles.

Classe d'actions
Maximum de l'organisation
Limite personnelle

Niveau effectif

L2Exécuté par l'IA avec validation obligatoire

Aperçu et confirmation, ou validation dans l'application pour les suppressions et les décisions.

Limité par le maximum de l'organisation.

Modèle simplifié fondé sur ce retour d'expérience ; il ne reproduit pas la configuration du produit.

Locataires et audit

Liaison au locataire et piste d'audit en dehors de l'agent

Les consultants travaillent pour plusieurs clients : une même personne a donc souvent accès à plusieurs locataires. Le serveur MCP suit le locataire que la personne a sélectionné dans l'application VamiGRC ; il le vérifie à chaque appel, sans mise en cache. Ce confort crée un nouveau risque.

  1. Aperçu

    Aperçu dans le locataire A

    L'aperçu enregistre son locataire et sa société, et la réponse les indique.

  2. Changement

    Passage au locataire B dans l'application

    Le serveur MCP suit ce changement dès l'appel suivant.

  3. Refusé

    Confirmation de l'ancien aperçu

    La confirmation est refusée avant que quoi que ce soit ne soit envoyé.

  4. Pas de repli

    Locataire devenu inaccessible

    Le serveur refuse plutôt que de se rabattre silencieusement sur un autre locataire.

Vérification

Chaque contrôle a son test négatif

Chaque test tente de mettre en échec un contrôle ; il est exécuté de bout en bout, avec un vrai backend et un vrai client MCP, et pas seulement sous forme de tests unitaires.

Tests négatifs des contrôles et leurs résultats
TestAttenduRésultat
Code d'autorisation utilisé deux foisRefusé, et la connexion qu'il a créée est ferméeRéussi
Ancien refresh token réutilisé après rotationRefusé, et toute la connexion est ferméeRéussi
Simple « oui » sur un aperçu de suppressionRien n'est supprimé, la référence est demandéeRéussi
Locataire changé entre l'aperçu et la confirmationConfirmation refusée, rien n'est écritRéussi
Plusieurs changements de locataire d'affiléeLa connexion suit chaque changementRéussi
Suppression par ID dans une autre sociétéIntrouvable, l'enregistrement est conservéRéussi
Écriture sans preuve de confirmationRefuséeRéussi
Limite personnelle plus stricte que celle de l'organisationLa limite la plus stricte s'appliqueRéussi

Ce que les tests ont révélé avant la mise en production

  • Une vérification des autorisations qui évaluait les requêtes dans le mauvais périmètre
  • Un client qui perdait ses connexions dès qu'un scope OAuth manquait

C'est en testant les contrôles comme le ferait un attaquant, et pas seulement les fonctionnalités, que nous les avons découverts.

Enseignements et limites

Ce que nous avons appris et où se situent les limites

Cinq enseignements transposables à d'autres serveurs MCP, et cinq limites, exposées en toute transparence.

Cinq enseignements

  1. 1Une confirmation à laquelle l'agent peut répondre n'est pas un contrôle.Placez les validations là où l'agent ne peut pas les atteindre : dans le backend, ou dans la session propre de l'application.
  2. 2Lier la validation à l'action exacte.Le jeton, la requête, la version de l'enregistrement et le locataire doivent correspondre à ce que la personne a validé. Tout le reste est refusé.
  3. 3Classer les actions, puis appliquer le principe fail closed.Une autonomie par classe d'actions, où toute action non classée est bloquée par défaut, passe mieux à l'échelle que des réglages par outil.
  4. 4L'agent n'obtient jamais plus que la personne.Les jetons restreints, le rôle propre de la personne et les limites de l'organisation se cumulent, et c'est le plus strict qui l'emporte.
  5. 5Tester les contrôles comme un attaquant.Rejouer, réutiliser, basculer et contourner délibérément chaque contrôle.

Les limites, en toute transparence

  • L'injection de prompt ne peut pas être entièrement empêchée.Le texte issu des enregistrements est transmis à l'agent avec un marquage de données non fiables, mais un modèle peut tout de même le suivre. Les contrôles limitent les dégâts, mais n'empêchent pas la manipulation elle-même.
  • Une conversation détournée peut encore confirmer au niveau L2 dans le chat.La preuve de confirmation arrête un jeton volé, pas un agent manipulé au sein d'une session active. C'est pourquoi les suppressions et les décisions exigent une validation dans l'application.
  • L'agent peut saisir lui-même la référence de suppression.La saisie de la référence protège contre les erreurs, pas contre un agent manipulé et déterminé. La validation dans l'application comble cette lacune.
  • Le retour arrière n'est que partiel.Un administrateur peut restaurer les enregistrements archivés, mais une fonction d'annulation pour chaque modification d'un agent figure encore sur notre feuille de route.
  • Les standards sont jeunes.L'OWASP MCP Top 10 est une bêta (v0.1) et l'Agent Control Standard en est à la version 0.1.0 : notre correspondance évoluera à mesure qu'ils mûriront.
Autodiagnostic des contrôles

Où se situent les contrôles de votre serveur MCP ?

Dix questions tirées de ce retour d'expérience. Plus vous répondez souvent « Oui », moins votre sécurité dépend de ce que fait l'agent.

  1. 01Les validations se situent-elles en dehors du canal que contrôle l'agent, dans le backend ou dans la session propre de votre application ?
  2. 02Le serveur impose-t-il des aperçus à usage unique, à durée limitée et liés au jeton, au locataire et à la version de l'enregistrement ?
  3. 03Votre backend refuse-t-il les écritures qui ne portent aucune preuve liée à la requête exacte ?
  4. 04Les access tokens sont-ils à courte durée de vie et liés à votre serveur MCP, les refresh tokens changent-ils à chaque utilisation, et le token passthrough est-il exclu ?
  5. 05Le jeton de l'agent n'atteint-il que l'API publique, jamais les fonctions d'administration ni plus que le rôle de la personne ?
  6. 06Chaque route d'écriture relève-t-elle d'une classe d'actions, et une route sans classe est-elle considérée comme bloquée ?
  7. 07Les suppressions et les décisions ne sont-elles jamais autonomes, et exigent-elles une validation dans l'application ?
  8. 08Chaque aperçu enregistre-t-il son locataire, et celui-ci est-il vérifié à chaque appel, sans repli silencieux ?
  9. 09Le backend écrit-il la piste d'audit et signale-t-il chaque modification effectuée via un assistant ?
  10. 10Chaque contrôle dispose-t-il d'un test négatif qui tente de le mettre en échec de bout en bout ?

Réponses : 0/10

Le résultat donne une orientation ; il ne constitue pas une preuve d'audit. Vos réponses ne sont pas transmises.

Correspondance

Correspondance avec les catalogues de risques OWASP

Voici comment nous mettons les contrôles en correspondance avec les catalogues de risques. Les deux catalogues sont jeunes, et cette correspondance évoluera avec eux.

MCP01

Token Mismanagement & Secret Exposure

OWASP MCP Top 10 (v0.1, Beta) (ouvre un site externe)

Pas de token passthrough, des jetons à courte durée de vie liés à leur audience, des refresh tokens en rotation avec détection de réutilisation, un accès limité à l'API publique.

MCP10

Context Injection & Over-Sharing

OWASP MCP Top 10 (v0.1, Beta) (ouvre un site externe)

Les réponses indiquent le locataire et la société, les données issues des enregistrements sont marquées comme non fiables, et l'agent ne voit que ce que le rôle de la personne autorise.

L'OWASP MCP Top 10 est une bêta, et l'Agent Control Standard en est à la version 0.1.0. Les dix risques MCP dans notre Deep Dive

Livre blanc · gratuit

Securing an MCP server in practice – des contrôles d'agents pour les CISO

Le retour d'expérience préparé pour les décideurs : modèle de menaces, identité sans token passthrough, validations dans le backend, niveaux d'autonomie et gouvernance, liaison au locataire et piste d'audit, tests négatifs, questions aux fournisseurs et plan à 30-60-90 jours.

Couverture du livre blanc « Securing an MCP server in practice – Agent controls for CISOs »
PDF · 23 pagesAnglais & allemandAuteur : Houssem Bouarada
  • Dix messages clés pour la direction et l'audit interne
  • Contrôles pour les jetons, les validations, l'autonomie et les locataires
  • Huit tests négatifs et critères d'acceptation
  • Questions aux fournisseurs et plan à 30-60-90 jours
Téléchargement gratuit

Demander un livre blanc

Securing an MCP server in practice – Agent controls for CISOs

Version linguistique *
Accompagnement

Du retour d'expérience à votre serveur MCP

Nous examinons les serveurs MCP et les intégrations d'agents de la manière décrite dans ce retour d'expérience : avec un modèle de menaces, des contrôles en dehors de l'agent et des tests négatifs.

Houssem Bouarada
Auteur

Houssem Bouarada

Chercheur en sécurité, Vami Research

Houssem Bouarada est chercheur en sécurité chez Vami Research. Ses travaux portent sur la sécurité offensive et sur la sécurisation des outils assistés par l'IA, comme les serveurs MCP.

Poser une question à l'auteur
Poursuivre la recherche

Recherches connexes

Deep Dives 6

Agent Control Standard (ACS)L’OWASP Agent Control Standard (ACS) est une spécification ouverte qui permet à un Guardian Agent d’examiner les actions d’un agent IA à des hooks définis et, en fonction d’une politique, de les autoriser, de les bloquer, de les modifier, de les soumettre à approbation ou de les reporter. Cette analyse approfondie montre ce que la version 0.1.0 apporte aujourd’hui — et où se situent ses limites.Threat-Model-Guided Security TestingUne trace commune montre seulement que des événements vont ensemble. Elle ne dit pas si un agent d’IA y a respecté l’approbation, la cible, l’autorisation et la provenance des données. Notre article, accepté à l’ICSPIS 2026 (IEEE), montre quelle télémétrie est nécessaire pour cela. Cette page transpose les résultats à l’OWASP Agent Control Standard (ACS).Zero Trust pour les agents IALes agents IA autonomes agissent à la vitesse de la machine avec des droits légitimement accordés. Zero Trust transpose des principes éprouvés — vérifier plutôt que faire confiance, Least Privilege, Assume Breach — aux systèmes agentiques.MCP & OAuth 2.1Depuis la révision de la spécification de juin 2025, le serveur MCP protégé est un resource server OAuth 2.1 aux rôles clairement séparés. Ce deep dive explique la chaîne de discovery, l'enregistrement des clients, les règles relatives aux tokens et la liaison d'audience – et montre où les implémentations échouent en pratique.OWASP MCP Top 10Le Model Context Protocol est devenu la couche d'intégration entre les modèles de langage et les systèmes d'entreprise — et, par là même, une nouvelle frontière de confiance souvent non vérifiée. L'OWASP MCP Top 10 recense les dix risques de cette couche.Développement de serveurs sécurisésLes serveurs MCP relient les assistants d'IA aux outils et aux sources de données, et deviennent de ce fait eux-mêmes une cible d'attaque. Nous accompagnons l'architecture, la conception des Tools, l'authentification et le déploiement selon des lignes directrices de sécurité établies.

Questions fréquentes

Réponses courtes

Pourquoi une confirmation dans le chat ne suffit-elle pas ?

Parce qu'elle passe par le canal même que contrôle un attaquant. Un agent manipulé par injection de prompt peut répondre lui-même « oui » à la question, et quiconque détient un access token volé contourne entièrement le chat. Plus efficaces sont les contrôles que l'agent ne peut pas falsifier : des aperçus imposés par le serveur, une preuve de confirmation liée à la requête exacte et, pour les suppressions et les décisions, une validation dans l'application.

Qu'exige la spécification MCP en matière d'autorisation ?

Depuis la révision de juin 2025, un serveur MCP protégé est un resource server OAuth 2.1. La spécification exige la découverte des métadonnées via les Protected Resource Metadata (RFC 9728), PKCE et des jetons émis pour le serveur MCP en tant qu'audience ; le token passthrough est interdit. Le retour d'expérience montre ce qu'il faut en plus dès qu'un agent est autorisé à écrire.

Que signifient les niveaux d'autonomie L0 à L3 ?

Ils définissent ce qu'un agent peut faire seul : L0 manuel, L1 assisté par l'IA, L2 exécuté par l'IA avec validation obligatoire, L3 entièrement autonome et intégralement audité. Dans le serveur MCP de VamiGRC, l'organisation fixe le niveau maximal par classe d'actions, chaque personne ne peut que le restreindre, et une route sans classe est bloquée. Les suppressions et les décisions ne sont jamais autonomes.

Ces contrôles empêchent-ils l'injection de prompt ?

Non. Le texte issu des enregistrements est marqué comme non fiable, mais un modèle peut tout de même le suivre. Les contrôles limitent ce qu'un agent manipulé peut faire, mais n'empêchent pas la manipulation elle-même. C'est pourquoi les suppressions et les décisions exigent une validation dans l'application.

Comment tester un serveur MCP comme un attaquant ?

Avec, pour chaque contrôle, un test négatif qui tente délibérément de le mettre en échec : échanger deux fois un code d'autorisation, réutiliser un ancien refresh token, changer de locataire entre l'aperçu et la confirmation, écrire sans preuve de confirmation, supprimer par ID dans une autre société. De bout en bout, avec un vrai backend et un vrai client MCP, et pas seulement dans des tests unitaires.

Quel est le degré de maturité de l'OWASP MCP Top 10 et de l'Agent Control Standard ?

Tous deux en sont à leurs débuts : l'OWASP MCP Top 10 est une bêta en version 0.1, et l'Agent Control Standard en est à la version 0.1.0. Nous faisons correspondre nos contrôles aux risques Token Mismanagement & Secret Exposure, Context Injection & Over-Sharing et Excessive Agency, et ajusterons cette correspondance à mesure que les standards mûriront.

Connecter des agents sans renoncer au contrôle

Nous examinons les serveurs MCP et les intégrations d'agents comme le ferait un attaquant, et montrons quelles décisions restent à la portée de l'agent.