Sécurité · · per Michael Wybraniec

Pratiques de Sécurité pour MCP Utilisant JSON-RPC

Problèmes critiques de sécurité, meilleures solutions et outils pratiques pour des systèmes MCP robustes et sécurisés utilisant JSON-RPC.

Retour au Blog

Le Protocole de Contexte de Modèle (MCP) est un framework pour la communication structurée entre clients et serveurs utilisant JSON-RPC 2.0. Il permet l'échange de messages à granularité fine dans des systèmes distribués ou modulaires, y compris ceux impliquant des modèles d'IA, des agents modulaires ou l'orchestration de services. Lors de l'utilisation de protocoles légers comme JSON-RPC 2.0 pour la communication MCP, les développeurs font face à plusieurs défis de sécurité. Cet article décrit les problèmes critiques, les meilleures solutions et les outils pratiques pour développeurs pour assurer des systèmes MCP robustes et sécurisés.

Ce guide fournit un aperçu visuel et pratique de la sécurisation des systèmes MCP, incluant la signature de messages, la gestion de sessions et les modèles d'architecture du monde réel. Il s'adresse aux développeurs et architectes construisant des systèmes modulaires, basés sur des agents ou distribués d'IA.

Flux de Signature et Vérification de Messages

sequenceDiagram
  participant Client
  participant Serveur

  Client->>Client: Sérialiser méthode + paramètres
  Client->>Client: Signer payload avec clé privée
  Client->>Serveur: Envoyer JSON-RPC + signature + clé publique

  Serveur->>Serveur: Canonicaliser méthode + paramètres
  Serveur->>Serveur: Vérifier signature avec clé publique
  Serveur-->>Client: Traiter ou rejeter

Initialisation Sécurisée de Session

sequenceDiagram
  participant Coordinateur
  participant Agent A
  participant Agent B

  Agent A->>Coordinateur: Demander démarrage de session
  Coordinateur->>Agent A: Envoyer UUID de session + token
  Agent A->>Agent B: Partager contexte avec token
  Agent B->>Coordinateur: Vérifier session + rejoindre

  Note over Coordinateur: Le coordinateur suit les rôles, tours et état

Routage de Contexte MCP

graph TD
  A[Client] -->|JSON-RPC| B[Coordinateur]
  B -->|Routage de Session| C1[Agent A]
  B -->|Routage de Session| C2[Agent B]
  C1 -->|Message de Contexte| C2
  C2 -->|Réponse| C1
  B -->|Observabilité| D[Stockage de Logs Signés]
ZoneProblème CritiquePourquoi C'est Important dans MCPSolution
🗭 CoordinationPas de routage natif multi-partiesMCP implique souvent l'orchestration de plusieurs services ou agentsImplémenter un service coordinateur pour gérer le routage, les rôles et les relais de messages
🔐 IdentitéPas de couche d'identité/auth/sessionVous devez authentifier et vérifier l'origine du messageUtiliser DIDs, mTLS ou couches d'identité basées sur signature avec tokens de session
⚠️ ErreursMauvaise observabilité et sémantique d'erreursDifficile de tracer les échecs dans les flux de modèles contextuelsAjouter logs signés, codes d'erreur structurés et tableaux de bord de trace
📦 Types de DonnéesPas de support pour données binaires/complexesLes paramètres et réponses du modèle peuvent ne pas s'adapter facilement au JSONUtiliser encodage base64, CBOR ou attacher payloads structurés en dehors des champs JSON-RPC centraux
🧪 TestsPas de simulation ou d'outils étape par étapeBesoin de replay de protocole et de débogageConstruire des harnais de test déterministes avec replay de protocole et mocking d'agents
🧱 PersistancePas de session/mémoire entre appelsLa continuité du contexte entre appels de modèle nécessite état et rôles suivisUtiliser Redis ou stockage de session en mémoire pour persister l'état de rôle, tour et message
💨 Agents MalveillantsN'importe quel acteur peut injecter logique ou contexte nuisibleLes agents malveillants peuvent faire dérailler ou empoisonner l'exécution du modèleUtiliser sandboxing (ex. VM2/WASM), validation de comportement et listes autorisées pour flux de contexte
🦮 Dérive de SessionLes agents peuvent désynchroniser données de contexte/tourConduit à conditions de course, hallucinations ou écrasement de contexteUtiliser snapshots de session signés, compteurs de tour et outils de replay du coordinateur
🔄 Attaques de ReplayRéutilisation de messages valides entre contextesNon détecté, peut manipuler le comportement ou la sortie de l'agentTokens horodatés, validation de nonce ou chaînes de hash pour assurer la fraîcheur
🛨️ Atténuation d'Agents MalveillantsAgents compromis agissant dans une session valideMenace l'intégrité du systèmeAppliquer règles de comportement, utiliser sandboxes sécurisés et valider modèles d'entrée/sortie
🌐 Identité Décentralisée (DIDs)Manque de résolution d'identité globale fiableNécessaire pour délégation de confiance sécurisée entre agentsAdopter DIDs W3C et résoudre clés via Documents DID ou registres de clés
📡 Gestion Sécurisée de SessionsLes sessions peuvent être piratées, perdues ou incohérentesCritique pour état du modèle, contexte et protection replaySuivre sessions via coordinateur, assigner IDs uniques, utiliser clés par session
🔄 Protection Replay et CourseRequêtes dupliquées ou réordonnées peuvent causer erreursLes agents peuvent mal se comporter ou retraiter anciennes donnéesUtiliser nonces, timestamps et compteurs de tour dans chaque message
CapacitéContrôlé ParDirectionEffets SecondairesApprobation NécessaireCas d'Usage Typiques
OutilsModèle (LLM)Client → ServeurOui (potentiellement)OuiActions, appels API, manipulation de données
RessourcesApplicationClient → ServeurNon (lecture seule)Généralement nonRécupération de données, collecte de contexte
PromptsUtilisateurServeur → ClientNonNonFlux guidés, modèles spécialisés
ÉchantillonnageServeurServeur → Client → ServeurIndirectementOuiTâches multi-étapes, comportements agentiques
  • Frontend: Nuxt 3 (avec Nuxt Content & Tailwind)
  • Backend: Node.js / Fastify / Express
  • Coordinateur MCP: Routage personnalisé + logique de contexte (sans état + conscient de session)
  • Agents: Microservices indépendants ou modules basés sur WASM
  • Transport: JSON-RPC 2.0 sur HTTPS (ou mTLS)
  • Sécurité: Validation de signature, DIDs et clés de chiffrement par session
  • Logs: Logs signés en ajout seul + tableau de bord d'observabilité (Grafana / OpenTelemetry)
graph LR
  FE[Client Nuxt3] -->|JSON-RPC| COORD[Coordinateur MCP]
  COORD --> A1[Agent A]
  COORD --> A2[Agent B]
  COORD --> REDIS[(Stockage de Session)]
  COORD --> LOG[Logs Signés]
  A1 --> RES1[(API Externe)]
  A2 --> RES2[(LLM ou Outil)]
  • Messages JSON-RPC Signés: Créer JSON canonique, signer en utilisant EdDSA/ECDSA, envoyer avec clé publique ou DID.
  • Snapshots de Session: Stocker snapshots JSON par tour avec signatures.
  • Détection de Replay: Utiliser nonce + timestamps + chaînage de hash.
  • Harnais de Test: Construire outils de replay MCP avec agents simulés.
  • Observabilité: Utiliser OpenTelemetry ou agrégateurs de logs avec événements structurés.
  • Validation de Signature: Les bibliothèques client + agent doivent appliquer validation avant traitement.
  • Service Résolveur DID: Résoudre clés publiques liées aux DIDs d'agent.
import { sign, verify } from 'crypto';
const method = 'agent.perform';
const params = { input: 'Exécuter test' };
const payload = JSON.stringify({ method, params });
const signature = sign('sha256', Buffer.from(payload), privateKey);

// Envoyer: { method, params, signature, pubKey }

Un système MCP sécurisé construit avec JSON-RPC nécessite des couches de protection : identité, intégrité des messages, sécurité du contexte et règles de protocole claires. Combiner DIDs, signatures, contrôle de session et défenses contre agents malveillants assure que votre système modulaire reste sûr, observable et extensible.

Michael Wybraniec

Michael Wybraniec

Freelance, Serveurs MCP, Développement Full-Stack, Architecture