Informe práctico · Deep Dive

Securing an MCP server in practice

Un informe práctico desde VamiGRC

Un servidor MCP seguro mantiene todas las decisiones relevantes fuera del agente de IA. Al desarrollar el servidor MCP que conecta asistentes de IA como Claude con VamiGRC, aprendimos que una confirmación dentro del chat no es un control de seguridad: un agente manipulado puede responderla él mismo. Este informe muestra cómo trasladamos al backend la identidad, las aprobaciones, la autonomía y los límites entre inquilinos, cómo pusimos a prueba cada uno de ellos y qué limitaciones persisten.

Objeto de estudio
El servidor MCP de VamiGRC
Método
Modelo de amenazas con STRIDE y el OWASP MCP Top 10
Verificación
8 pruebas negativas, de extremo a extremo, todas superadas
Base
Especificación MCP desde 2025-06-18 · OAuth 2.1
Contexto

Las reglas existen, la práctica aún es incipiente

Desde la revisión de la especificación MCP de junio de 2025, un servidor MCP protegido es un servidor de recursos de OAuth 2.1. La práctica va a la zaga, y en una plataforma GRC hay todavía más en juego.

8,5 %

de los más de 5200 servidores MCP de código abierto analizados en octubre de 2025 utilizaban OAuth.

State of MCP Server Security 2025: Research Report (octubre de 2025) (abre un sitio web externo)

Lo que exige la especificación

  • Descubrimiento de metadatos a través de los Protected Resource Metadata del servidor (RFC 9728)
  • PKCE en el flujo de autorización
  • Vinculación de audiencia: un token solo es válido para el servidor para el que se emitió
  • Sin token passthrough a servicios situados aguas abajo

Specification, Revision 2025-06-18: Authorization (junio de 2025) (abre un sitio web externo)

En una plataforma GRC hay más en juego

El agente lee riesgos, incidentes y datos de proveedores, y puede modificarlos. Un cambio erróneo no es solo un error de software: puede falsear las evidencias en las que confía un auditor.

  • Crear registros
  • Asignar responsables
  • Cerrar hallazgos
  • Eliminar entradas
Pregunta de investigación y modelo de amenazas

Tres atacantes, un hilo conductor

¿Cómo puede un agente de IA trabajar con datos de cumplimiento sin convertirse en el punto más débil de la plataforma?

Modelamos tres atacantes, con STRIDE para el tipo de fallo y el OWASP MCP Top 10 como catálogo de riesgos. Seleccione un atacante para ver qué controles lo limitan, qué pruebas negativas se relacionan con él y qué riesgo queda.

Agente manipulado

Controla
Texto que lee el agente: la descripción de un registro, un documento, el resultado de una herramienta (inyección indirecta de prompts)
Pretende
Hacer que el agente modifique o elimine datos que el usuario nunca solicitó
STRIDE
TamperingElevation of Privilege

Lo limitan

  • El texto de los registros llega al agente marcado como datos no confiables
  • Nivel de autonomía por clase de acción; eliminaciones y decisiones nunca autónomas
  • Aprobación en la aplicación para eliminaciones y decisiones, no en el chat
  • Nunca más derechos que la persona: token acotado y el propio rol de la persona

Pruebas negativas relacionadas

  • SuperadaUn simple «sí» ante una vista previa de eliminación
  • SuperadaLímite personal más estricto que el de la organización

Riesgo residual: En una sesión secuestrada, con el nivel L2 el agente todavía puede confirmar en el chat y puede teclear él mismo la referencia de eliminación. Por eso, las eliminaciones y las decisiones requieren la aprobación en la aplicación. La inyección de prompts en sí no puede evitarse por completo.

El hilo conductor: un agente manipulado no irrumpe en el sistema. Utiliza permisos que posee legítimamente. Por eso, cada control debe situarse donde el agente no pueda alcanzarlo.

Identidad

Sin token passthrough, tokens de vida corta

El agente nunca posee un token que el backend acepte como una sesión de usuario normal. La cadena de inicio de sesión en cuatro pasos:

  1. 1

    Descubrimiento

    El asistente localiza el servidor de autorización a través de los Protected Resource Metadata del servidor MCP (RFC 9728).

  2. 2

    Inicio de sesión y consentimiento

    El usuario inicia sesión en el propio VamiGRC y ve una pantalla de consentimiento: qué asistente, si solo lectura o lectura y modificación, y qué inquilino.

  3. 3

    Tokens de vida corta

    El asistente recibe un token de acceso válido durante minutos, no días, vinculado al servidor MCP como audiencia, además de un token de actualización que cambia con cada uso.

  4. 4

    Token de API acotado

    El backend acepta ese token únicamente como un token de API acotado: solo la API pública, nunca funciones de administración y nunca más que el propio rol del usuario.

Dos lecciones del camino recorrido

1

La aplicación como servidor de autorización

Nuestro diseño anterior intercambiaba el inicio de sesión en un proveedor de identidad externo por un token del backend. Funcionaba, pero las sesiones de larga duración y el intercambio de tokens no casaban bien, y tras periodos de inactividad los usuarios veían «sesión caducada». Desde que VamiGRC es el propio servidor de autorización, esa clase de problemas ha desaparecido.

2

Los detalles del descubrimiento importan

Un único scope ausente, offline_access, hizo que un importante cliente de IA fallara antes incluso de mostrar una página de inicio de sesión.

Fundamentos: RFC 9728: OAuth 2.0 Protected Resource Metadata (abril de 2025) (abre un sitio web externo) · RFC 8707: Resource Indicators for OAuth 2.0 (febrero de 2020) (abre un sitio web externo) · RFC 9700: Best Current Practice for OAuth 2.0 Security (enero de 2025) (abre un sitio web externo) · The OAuth 2.1 Authorization Framework (Internet-Draft) (abre un sitio web externo)

Aprobaciones

Por qué una confirmación en el chat no basta

Nuestra primera versión pedía al usuario que confirmara cada cambio en la conversación. Parecía seguro, pero la confirmación se respondía dentro del mismo canal que controla el atacante.

Primera versión: confirmación en el chat

  1. Agentepropone un cambio y pregunta en el chat
  2. Chatespera un «sí» como confirmación
  3. Agente manipuladoteclea él mismo el «sí»
  4. Token robadoescribe directamente contra la API y nunca ve el chat

El control está en el canal del atacante.

Hoy: impuesta por el servidor

  1. Servidor MCPalmacena la vista previa: de un solo uso, válida durante 15 minutos, vinculada al token, al inquilino y a la empresa
  2. Confirmaciónsolo es válida para exactamente esta vista previa; si el registro ha cambiado entretanto, se rechaza
  3. Servidor MCPfirma la solicitud exacta como comprobante de confirmación, con una validez de dos minutos
  4. Backendsolo escribe con un comprobante válido y rechaza todo lo demás

El agente no puede falsificar estas capas. Las eliminaciones y las decisiones requieren además la aprobación en la aplicación.

Tres capas que el agente no puede falsificar

01

Vistas previas impuestas por el servidor

Cada escritura es una llamada en dos pasos. El primero devuelve una vista previa y la almacena en el servidor; solo su confirmación escribe. Si el registro ha cambiado entretanto, la confirmación se rechaza.

  • de un solo uso
  • 15 minutos
  • token · inquilino · empresa
02

Un comprobante de confirmación

En el paso de confirmación, el servidor MCP firma la solicitud exacta. El backend rechaza cualquier escritura sin este comprobante, por lo que un token de acceso robado, usado directamente contra la API, no puede escribir.

  • ID del token · método · ruta · hash del cuerpo
  • 2 minutos
03

Referencias tecleadas para las eliminaciones

Un simple «sí» no elimina nada. El usuario debe teclear la referencia del registro, y la vista previa enumera todo lo que está vinculado a él. Los registros que pueden archivarse se archivan en lugar de borrarse.

  • referencia en lugar de «sí»
  • archivar en lugar de borrar
Autonomía

Niveles de autonomía por acción, impuestos en el backend

No todas las acciones merecen la misma confianza. Cada ruta de escritura de la API pública pertenece a una clase de acción, y la organización fija para cada clase el nivel de autonomía máximo, conforme a los niveles L0 a L3 de VamiGRC.

  • L0

    Manual

    El agente no puede actuar.

    En el servidor MCPSe rechaza con un motivo claro y la persona actúa en VamiGRC.

  • L1

    Asistido por IA

    El agente prepara, la persona actúa.

    En el servidor MCPUn borrador que la persona revisa y guarda.

  • L2

    Ejecutado por IA con aprobación obligatoria

    El agente actúa tras la aprobación de una persona.

    En el servidor MCPVista previa y confirmación; para eliminaciones y decisiones, aprobación en la app.

  • L3

    Totalmente autónomo, plenamente auditado

    El agente actúa solo y todo queda registrado.

    En el servidor MCPSolo para clases de bajo riesgo, como las notas.

Tres reglas que lo sostienen

Más estricto, nunca más laxo

La organización fija el máximo, y cada persona solo puede restringirlo para sus propios asistentes. Siempre rige la configuración más estricta.

Topes fijos

Las eliminaciones y las decisiones nunca son autónomas, y las decisiones firmadas, como las aprobaciones, nunca pasan por el chat.

Fail closed

Una ruta sin clase se considera bloqueada. Una prueba falla en cuanto una nueva ruta de escritura carece de clase.

Calculadora de autonomía: ¿qué nivel rige al final?

Elija una clase de acción, el máximo de la organización y el límite personal. La calculadora aplica las tres reglas.

Clase de acción
Máximo de la organización
Límite personal

Nivel efectivo

L2Ejecutado por IA con aprobación obligatoria

Vista previa y confirmación; para eliminaciones y decisiones, aprobación en la app.

Restringido por el máximo de la organización.

Modelo simplificado basado en este informe práctico, no una réplica de la configuración del producto.

Inquilinos y auditoría

Vinculación al inquilino y un registro de auditoría fuera del agente

Los consultores trabajan para varios clientes, por lo que una persona suele tener acceso a varios inquilinos (tenants). El servidor MCP sigue al inquilino que la persona ha seleccionado en la app de VamiGRC, comprobado en cada llamada y sin caché. Esa comodidad crea un riesgo nuevo.

  1. Vista previa

    Vista previa en el inquilino A

    La vista previa almacena su inquilino y su empresa, y la respuesta indica ambos.

  2. Cambio

    Cambio al inquilino B en la app

    El servidor MCP sigue el cambio en la siguiente llamada.

  3. Rechazada

    Confirmación de la vista previa anterior

    La confirmación se rechaza antes de que se envíe nada.

  4. Sin alternativa

    Inquilino ya no accesible

    El servidor rechaza la operación en lugar de recurrir en silencio a otro inquilino.

Verificación

Cada control tiene una prueba negativa

Cada prueba intenta romper un control, de extremo a extremo contra un backend real y un cliente MCP real, no solo en pruebas unitarias.

Pruebas negativas de los controles y sus resultados
PruebaResultado esperadoResultado
Código de autorización usado dos vecesRechazado, y la conexión creada con él se cierraSuperada
Token de actualización antiguo reutilizado tras la rotaciónRechazado, y se cierra toda la conexiónSuperada
Un simple «sí» ante una vista previa de eliminaciónNo se elimina nada; se exige la referenciaSuperada
Cambio de inquilino entre la vista previa y la confirmaciónConfirmación rechazada, no se escribe nadaSuperada
Varios cambios de inquilino seguidosLa conexión sigue cada cambioSuperada
Eliminación por ID en otra empresaNo encontrado; el registro se conservaSuperada
Escritura sin el comprobante de confirmaciónRechazadaSuperada
Límite personal más estricto que el de la organizaciónRige el límite más estrictoSuperada

Lo que las pruebas encontraron antes del lanzamiento

  • Una comprobación de permisos que evaluaba las solicitudes en el ámbito equivocado
  • Un cliente que perdía las conexiones cuando faltaba un scope de OAuth

Lo que los encontró fue probar los controles como lo haría un atacante, y no solo las funcionalidades.

Conclusiones y limitaciones

Lo que hemos aprendido y dónde están las limitaciones

Cinco conclusiones trasladables a otros servidores MCP y cinco limitaciones, expuestas abiertamente.

Cinco conclusiones

  1. 1Una confirmación que el agente puede responder no es un control.Las aprobaciones deben situarse donde el agente no pueda alcanzarlas: en el backend o en la propia sesión de la aplicación.
  2. 2Vincular la aprobación a la acción exacta.El token, la solicitud, la versión del registro y el inquilino deben coincidir con lo que aprobó la persona. Todo lo demás se rechaza.
  3. 3Clasificar las acciones y aplicar fail closed.La autonomía por clase de acción, con las acciones sin clasificar bloqueadas por defecto, escala mejor que una configuración por herramienta.
  4. 4El agente nunca obtiene más que la persona.Los tokens acotados, el propio rol de la persona y los límites de la organización se superponen, y prevalece el más estricto.
  5. 5Probar los controles como un atacante.Repetir, reutilizar, cambiar y eludir cada control de forma deliberada.

Limitaciones, sin rodeos

  • La inyección de prompts no puede evitarse por completo.El texto de los registros llega al agente marcado como datos no confiables, pero un modelo puede seguirlo igualmente. Los controles limitan el daño, pero no detienen la manipulación en sí.
  • En el nivel L2, una conversación secuestrada todavía puede confirmar en el chat.El comprobante de confirmación detiene un token robado, no un agente manipulado dentro de una sesión en curso. Por eso, las eliminaciones y las decisiones requieren la aprobación en la aplicación.
  • El agente puede teclear él mismo la referencia de eliminación.La referencia tecleada protege frente a errores, no frente a un agente manipulado que actúe con determinación. La aprobación en la aplicación cierra esa brecha.
  • La reversión solo es parcial.Un administrador puede restaurar los registros archivados, pero una función para deshacer cualquier cambio de un agente sigue en nuestra hoja de ruta.
  • Los estándares aún son jóvenes.El OWASP MCP Top 10 es una beta (v0.1) y el Agent Control Standard está en la versión 0.1.0, así que nuestro mapeo cambiará a medida que maduren.
Comprobación de controles

¿Dónde están los controles de su servidor MCP?

Diez preguntas extraídas de este informe práctico. Cuantas más veces responda «Sí», menos dependerá su seguridad de lo que haga el agente.

  1. 01¿Se encuentran las aprobaciones fuera del canal que controla el agente, es decir, en el backend o en la propia sesión de su aplicación?
  2. 02¿Impone el servidor vistas previas de un solo uso, con caducidad y vinculadas al token, al inquilino y a la versión del registro?
  3. 03¿Rechaza su backend las escrituras que no incluyen un comprobante vinculado a la solicitud exacta?
  4. 04¿Son de vida corta los tokens de acceso y están vinculados a su servidor MCP, cambian los tokens de actualización con cada uso y está descartado el token passthrough?
  5. 05¿Alcanza el token del agente únicamente la API pública, nunca funciones de administración y nunca más de lo que permite el rol de la persona?
  6. 06¿Pertenece cada ruta de escritura a una clase de acción, y se considera bloqueada una ruta sin clase?
  7. 07¿Quedan las eliminaciones y las decisiones siempre excluidas de la ejecución autónoma, y requieren una aprobación en la aplicación?
  8. 08¿Almacena cada vista previa su inquilino, y se comprueba este en cada llamada sin recurrir en silencio a otro inquilino?
  9. 09¿Escribe el backend el registro de auditoría y marca cada cambio realizado a través de un asistente?
  10. 10¿Tiene cada control una prueba negativa que intente romperlo de extremo a extremo?

Respondidas: 0/10

El resultado es una orientación, no una evidencia de auditoría. Sus respuestas no salen de su navegador.

Encuadre

Correspondencia con los catálogos de riesgos de OWASP

Así asignamos los controles a los catálogos de riesgos. Ambos catálogos son jóvenes, y el mapeo cambiará con ellos.

El OWASP MCP Top 10 es una beta, y el Agent Control Standard está en la versión 0.1.0. Los diez riesgos MCP en nuestro Deep Dive

Whitepaper · gratuito

Securing an MCP server in practice – Controles de agentes para CISOs

El informe práctico preparado para decisores: modelo de amenazas, identidad sin token passthrough, aprobaciones en el backend, niveles de autonomía y gobernanza, vinculación al inquilino y registro de auditoría, pruebas negativas, preguntas a proveedores y un plan de 30-60-90 días.

Portada del whitepaper «Securing an MCP server in practice – Agent controls for CISOs»
PDF · 23 páginasInglés y alemánAutor: Houssem Bouarada
  • Diez mensajes clave para la dirección y la auditoría interna
  • Controles para tokens, aprobaciones, autonomía e inquilinos
  • Ocho pruebas negativas y criterios de aceptación
  • Preguntas a proveedores y un plan de 30-60-90 días
Descarga gratuita

Solicitar whitepaper

Securing an MCP server in practice – Agent controls for CISOs

Versión de idioma *
Apoyo

Del informe práctico a su servidor MCP

Revisamos servidores MCP e integraciones de agentes tal como describe este informe: con un modelo de amenazas, controles fuera del agente y pruebas negativas.

Houssem Bouarada
Autor

Houssem Bouarada

Investigador de seguridad, Vami Research

Houssem Bouarada es investigador de seguridad en Vami Research. Se centra en la seguridad ofensiva y en la protección de herramientas asistidas por IA, como los servidores MCP.

Preguntar al autor
Seguir investigando

Investigación relacionada

Deep Dives 6

Agent Control Standard (ACS)El OWASP Agent Control Standard (ACS) es una especificación abierta según la cual un Guardian Agent examina las acciones de un agente de IA en hooks definidos y, mediante políticas, las permite, las bloquea, las modifica, las somete a aprobación o las aplaza. Este análisis en profundidad muestra lo que la versión 0.1.0 ofrece hoy y dónde están sus límites.Threat-Model-Guided Security TestingUn trace compartido solo demuestra que unos eventos están relacionados entre sí. No muestra si un agente de IA ha respetado la aprobación, el destino, la autorización y la procedencia de los datos. Nuestro artículo, aceptado en la ICSPIS 2026 (IEEE), muestra qué telemetría se necesita para ello. Esta página traslada los resultados al OWASP Agent Control Standard (ACS).Zero Trust para agentes de IALos agentes de IA autónomos actúan con permisos legítimamente concedidos a velocidad de máquina. Zero Trust traslada principios probados — verificar en lugar de confiar, Least Privilege, Assume Breach — a los sistemas agénticos.MCP y OAuth 2.1Desde la revisión de la especificación de junio de 2025, el servidor MCP protegido es un resource server OAuth 2.1 con roles claramente separados. Este deep dive explica la cadena de discovery, el registro de clientes, las reglas de tokens y la vinculación de audiencia, y muestra dónde fracasan las implementaciones en la práctica.OWASP MCP Top 10El Model Context Protocol se ha convertido en la capa de integración entre modelos de lenguaje y sistemas empresariales, y con ello en una nueva frontera de confianza, a menudo no verificada. Las OWASP MCP Top 10 designan los diez riesgos de esta capa.Desarrollo seguro de servidoresLos MCP-Server conectan asistentes de IA con herramientas y fuentes de datos y se convierten así ellos mismos en objetivo de ataque. Acompañamos la arquitectura, el diseño de herramientas, la autenticación y el deployment conforme a directrices de seguridad establecidas.

Preguntas frecuentes

Respuestas breves

¿Por qué no basta una confirmación en el chat?

Porque se produce en el mismo canal que controla un atacante. Un agente manipulado mediante inyección de prompts puede responder él mismo «sí» a la pregunta, y quien tenga un token de acceso robado se salta el chat por completo. Son más eficaces los controles que el agente no puede falsificar: vistas previas impuestas por el servidor, un comprobante de confirmación vinculado a la solicitud exacta y, para eliminaciones y decisiones, la aprobación en la aplicación.

¿Qué exige la especificación MCP en materia de autorización?

Desde la revisión de junio de 2025, un servidor MCP protegido es un servidor de recursos de OAuth 2.1. Se exigen el descubrimiento de metadatos a través de los Protected Resource Metadata (RFC 9728), PKCE y tokens emitidos con el servidor MCP como audiencia; el token passthrough está prohibido. El informe práctico muestra qué más hace falta en cuanto un agente tiene permiso para escribir.

¿Qué significan los niveles de autonomía L0 a L3?

Definen lo que un agente puede hacer por sí solo: L0 manual, L1 asistido por IA, L2 ejecutado por IA con aprobación obligatoria y L3 totalmente autónomo y plenamente auditado. En el servidor MCP de VamiGRC, la organización fija el nivel máximo por clase de acción, cada persona solo puede restringirlo y una ruta sin clase queda bloqueada. Las eliminaciones y las decisiones nunca son autónomas.

¿Evitan estos controles la inyección de prompts?

No. El texto de los registros se marca como no confiable, pero un modelo puede seguirlo igualmente. Los controles limitan lo que puede hacer un agente manipulado, pero no detienen la manipulación en sí. Por eso, las eliminaciones y las decisiones requieren la aprobación en la aplicación.

¿Cómo se prueba un servidor MCP como lo haría un atacante?

Con una prueba negativa por cada control que intente romperlo de forma deliberada: canjear dos veces un código de autorización, reutilizar un token de actualización antiguo, cambiar de inquilino entre la vista previa y la confirmación, escribir sin el comprobante de confirmación o eliminar por ID en otra empresa. De extremo a extremo, contra un backend real y un cliente MCP real, no solo en pruebas unitarias.

¿Qué grado de madurez tienen el OWASP MCP Top 10 y el Agent Control Standard?

Ambos están en una fase temprana: el OWASP MCP Top 10 es una beta en la versión 0.1, y el Agent Control Standard está en la versión 0.1.0. Asignamos nuestros controles a los riesgos Token Mismanagement & Secret Exposure, Context Injection & Over-Sharing y Excessive Agency, y ajustaremos el mapeo a medida que los estándares maduren.

Conectar agentes sin ceder el control

Revisamos servidores MCP e integraciones de agentes como lo haría un atacante y le mostramos qué decisiones siguen al alcance del agente.