Seguridad · · por Michael Wybraniec

Prácticas de Seguridad para MCP Usando JSON-RPC

Problemas críticos de seguridad, mejores soluciones y herramientas prácticas para sistemas MCP robustos y seguros usando JSON-RPC.

Volver al Blog

El Protocolo de Contexto de Modelo (MCP) es un framework para la comunicación estructurada entre clientes y servidores usando JSON-RPC 2.0. Permite el intercambio de mensajes de granularidad fina en sistemas distribuidos o modulares, incluyendo aquellos que involucran modelos de IA, agentes modulares u orquestación de servicios. Al usar protocolos ligeros como JSON-RPC 2.0 para la comunicación MCP, los desarrolladores enfrentan varios desafíos de seguridad. Este artículo describe los problemas críticos, las mejores soluciones y las herramientas prácticas para desarrolladores para asegurar sistemas MCP robustos y seguros.

Esta guía proporciona una visión general visual y práctica de cómo asegurar sistemas MCP, incluyendo la firma de mensajes, gestión de sesiones y patrones de arquitectura del mundo real. Está dirigida a desarrolladores y arquitectos que construyen sistemas modulares, basados en agentes o distribuidos de IA.

Flujo de Firma y Verificación de Mensajes

sequenceDiagram
  participant Cliente
  participant Servidor

  Cliente->>Cliente: Serializar método + parámetros
  Cliente->>Cliente: Firmar payload con clave privada
  Cliente->>Servidor: Enviar JSON-RPC + firma + clave pública

  Servidor->>Servidor: Canonicalizar método + parámetros
  Servidor->>Servidor: Verificar firma con clave pública
  Servidor-->>Cliente: Procesar o rechazar

Arranque Seguro de Sesión

sequenceDiagram
  participant Coordinador
  participant Agente A
  participant Agente B

  Agente A->>Coordinador: Solicitar inicio de sesión
  Coordinador->>Agente A: Enviar UUID de sesión + token
  Agente A->>Agente B: Compartir contexto con token
  Agente B->>Coordinador: Verificar sesión + unirse

  Note over Coordinador: El coordinador rastrea roles, rondas y estado

Enrutamiento de Contexto MCP

graph TD
  A[Cliente] -->|JSON-RPC| B[Coordinador]
  B -->|Enrutamiento de Sesión| C1[Agente A]
  B -->|Enrutamiento de Sesión| C2[Agente B]
  C1 -->|Mensaje de Contexto| C2
  C2 -->|Respuesta| C1
  B -->|Observabilidad| D[Almacén de Logs Firmados]
ÁreaProblema CríticoPor Qué Importa en MCPSolución
🗭 CoordinaciónSin enrutamiento nativo multi-parteMCP a menudo involucra orquestar múltiples servicios o agentesImplementar un servicio coordinador para gestionar enrutamiento, roles y relés de mensajes
🔐 IdentidadSin capa de identidad/auth/sesiónDebes autenticar y verificar el origen del mensajeUsar DIDs, mTLS o capas de identidad basadas en firmas con tokens de sesión
⚠️ ErroresPobre observabilidad y semántica de erroresDifícil rastrear fallas en flujos de modelos contextualesAgregar logs firmados, códigos de error estructurados y dashboards de traza
📦 Tipos de DatosSin soporte para datos binarios/complejosLos parámetros y respuestas del modelo pueden no encajar fácilmente en JSONUsar codificación base64, CBOR o adjuntar payloads estructurados fuera de los campos JSON-RPC centrales
🧪 PruebasSin simulación o herramientas paso a pasoNecesidad de replay de protocolo y depuraciónConstruir arneses de prueba determinísticos con replay de protocolo y mocking de agentes
🧱 PersistenciaSin sesión/memoria entre llamadasLa continuidad del contexto entre llamadas del modelo necesita estado y roles rastreadosUsar Redis o almacén de sesión en memoria para persistir estado de rol, ronda y mensaje
💨 Agentes MaliciososCualquier actor puede inyectar lógica o contexto dañinoLos agentes maliciosos pueden descarrilar o envenenar la ejecución del modeloUsar sandboxing (ej. VM2/WASM), validación de comportamiento y listas permitidas para flujo de contexto
🦮 Deriva de SesiónLos agentes pueden desincronizar datos de contexto/rondaLleva a condiciones de carrera, alucinaciones o sobreescritura de contextoUsar snapshots de sesión firmados, contadores de ronda y herramientas de replay del coordinador
🔄 Ataques de ReplayReutilización de mensajes válidos entre contextosSin detectar, puede manipular el comportamiento o salida del agenteTokens con timestamp, validación de nonce o cadenas hash para asegurar frescura
🛨️ Mitigación de Agentes MaliciososAgentes comprometidos actuando en una sesión válidaAmenaza la integridad del sistemaAplicar reglas de comportamiento, usar sandboxes seguros y validar patrones de entrada/salida
🌐 Identidad Descentralizada (DIDs)Falta de resolución de identidad global confiableNecesaria para delegación de confianza segura entre agentesAdoptar DIDs de W3C y resolver claves vía Documentos DID o registros de claves
📡 Gestión Segura de SesionesLas sesiones pueden ser secuestradas, perdidas o inconsistentesCrítico para estado del modelo, contexto y protección de replayRastrear sesiones vía coordinador, asignar IDs únicos, usar claves por sesión
🔄 Protección contra Replay y CarrerasSolicitudes duplicadas o reordenadas pueden causar erroresLos agentes pueden comportarse mal o reprocesar datos antiguosUsar nonces, timestamps y contadores de ronda en cada mensaje
CapacidadControlado PorDirecciónEfectos SecundariosAprobación NecesariaCasos de Uso Típicos
HerramientasModelo (LLM)Cliente → ServidorSí (potencialmente)Acciones, llamadas API, manipulación de datos
RecursosAplicaciónCliente → ServidorNo (solo lectura)Típicamente noRecuperación de datos, recopilación de contexto
PromptsUsuarioServidor → ClienteNoNoFlujos guiados, plantillas especializadas
MuestreoServidorServidor → Cliente → ServidorIndirectamenteTareas multi-paso, comportamientos agénticos
  • Frontend: Nuxt 3 (con Nuxt Content & Tailwind)
  • Backend: Node.js / Fastify / Express
  • Coordinador MCP: Enrutamiento personalizado + lógica de contexto (sin estado + consciente de sesión)
  • Agentes: Microservicios independientes o módulos basados en WASM
  • Transporte: JSON-RPC 2.0 sobre HTTPS (o mTLS)
  • Seguridad: Validación de firma, DIDs y claves de cifrado por sesión
  • Logs: Logs firmados de solo adición + dashboard de observabilidad (Grafana / OpenTelemetry)
graph LR
  FE[Cliente Nuxt3] -->|JSON-RPC| COORD[Coordinador MCP]
  COORD --> A1[Agente A]
  COORD --> A2[Agente B]
  COORD --> REDIS[(Almacén de Sesión)]
  COORD --> LOG[Logs Firmados]
  A1 --> RES1[(API Externa)]
  A2 --> RES2[(LLM o Herramienta)]
  • Mensajes JSON-RPC Firmados: Crear JSON canónico, firmar usando EdDSA/ECDSA, enviar con clave pública o DID.
  • Snapshots de Sesión: Almacenar snapshots JSON por ronda con firmas.
  • Detección de Replay: Usar nonce + timestamps + encadenamiento hash.
  • Arnés de Pruebas: Construir herramientas de replay MCP con agentes simulados.
  • Observabilidad: Usar OpenTelemetry o agregadores de logs con eventos estructurados.
  • Validación de Firma: Las librerías de cliente + agente deben aplicar validación antes del procesamiento.
  • Servicio Resolvedor DID: Resolver claves públicas vinculadas a DIDs de agente.
import { sign, verify } from 'crypto';
const method = 'agent.perform';
const params = { input: 'Ejecutar prueba' };
const payload = JSON.stringify({ method, params });
const signature = sign('sha256', Buffer.from(payload), privateKey);

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

Un sistema MCP seguro construido con JSON-RPC requiere capas de protección: identidad, integridad de mensajes, seguridad de contexto y reglas de protocolo claras. Combinar DIDs, firmas, control de sesión y defensas contra agentes maliciosos asegura que tu sistema modular se mantenga seguro, observable y extensible.

Michael Wybraniec

Michael Wybraniec

Freelance, Servidores MCP, Desarrollo Full-Stack, Arquitectura