Saltar al contenido
Seguridad MCP

29 de 38 vectores MCP-38 mitigados

Trusteed publica la matriz de cobertura completa frente a la taxonomía MCP-38 (Shen et al, arXiv 2603.18063). Sin gaps no resueltos: lo que no está mitigado en código está cubierto por controles compensatorios documentados o por arquitectura.

Mitigados
29
Parciales
7
Compensatorios
2
Sin abordar
0

Arquitectura de seguridad

Capas defensivas que aplican a cada llamada MCP, desde el handshake OAuth hasta la respuesta del tool al agente.

Saneo de entrada (E1)

Strings devueltas por merchants pasan por sanitizeMerchantContent() (múltiples patrones adversariales) y se aíslan mediante delimitación de contenido antes de llegar al contexto LLM. Mitiga MCP-02, MCP-08.

Aislamiento cross-tenant (E4)

assertStoreOwnership() comprueba que el storeId provisto coincide con el contexto auth del caller (JWT merchant o API-key MCP). Métrica cross_tenant_rejection_total + alerta. Runbook documentado. Mitiga MCP-03, MCP-06.

Firma de manifests (E2)

Trusteed firma con JWS Ed25519 detachada, en cabecera, agent-policy.json, merchant-index.json y el manifiesto de tools; mcp.json y la guía de checkout no van firmados. JWKS público en /.well-known/jwks.json y rotación dual-key con período de gracia. Aborda MCP-07, MCP-11 y MCP-37 de forma parcial.

Controles transversales

OAuth 2.1 con PKCE + RFC 8707 audience (api.trusteed.xyz). DNS rebinding allowlist en transporte MCP. Rate limits escalonados por plan. Zod en todos los endpoints. AES-256-GCM en SecretVault.

Matriz de cobertura (resumen)

Vectores High-severity con mitigación directa o pendiente. La matriz completa de 38 filas (con Severidad e Implementación) está disponible bajo petición durante una revisión de seguridad.

Resumen de vectores MCP-38 con estado de cobertura
#VectorSeveridadEstadoImplementación
MCP-02Inyección de PromptHigh✅sanitizeMerchantContent (múltiples patrones adversariales) + delimitación de contenido
MCP-03Exfiltración de DatosHigh✅Guard cross-tenant + retención auditoría 90 días
MCP-05Bypass de AutenticaciónHigh✅OAuth 2.1 + JWT RS256 + audiencia RFC 8707
MCP-06Bypass de AutorizaciónHigh✅Helper central assertStoreOwnership()
MCP-07Hombre en el MedioMedium🟡HTTPS+HSTS; firma JWS de manifests activa en producción en parte de las superficies (E2); parcial
MCP-08Tool PoisoningHigh✅Sanitizer aplicado al contenido escrito por el comerciante en las tools MCP
MCP-11Manipulación de SalidaHigh🟡Schemas Zod; hash y firma JWS de manifests activos en producción en parte de las superficies (E2); parcial
MCP-14Vulnerabilidades de DependenciasHigh✅MCP SDK 1.29.0 (3 CVEs parchadas) + allowlist DNS rebinding
MCP-22Ataque SSRFHigh✅Blocklist CIDR privado + allowlist host MCP
MCP-25Debilidad CriptográficaHigh✅Solo Ed25519, RS256, AES-256-GCM, SHA-256
MCP-26Almacenamiento InseguroHigh✅SecretVault AES-256-GCM (ADR-003)
MCP-34Falta de Rate LimitingHigh✅Token-bucket por tier y por tool
MCP-37Rug PullHigh🟡Verificación eIDAS QTSP; atestación de manifests activa en producción en parte de las superficies (E2); parcial
MCP-38Shadow MCPHigh✅Onboarding gateado por identidad + etiquetas públicas de trust

Más sobre cumplimiento: Cumplimiento

Manifiesto Público de Tools

Endpoint público firmado con un hash SHA-256 separado para la descripción y el inputSchema de cada tool MCP. Permite a los clientes pinear hashes y detectar rug-pull (cambios silenciosos en descripciones o esquemas que escalen privilegios).

URL pública

https://trusteed.xyz/.well-known/mcp-tools-manifest.json

Cache 3600s. Firmado JWS Ed25519 reutilizando claves publicadas en /.well-known/jwks.json (ADR-016). Versionado YYYY-MM-DD.N con campo previous_version para upgrade gracioso.

Detección de rug-pull

Hashes separados description vs inputSchema permiten políticas de cliente granulares (tolerar cambios cosméticos, rechazar mutaciones de schema). CI gate bloquea merges sin bump de versión.

Verificación rápida

# 1) Descargar manifest + JWKS
curl -s https://trusteed.xyz/.well-known/mcp-tools-manifest.json -o manifest.json
curl -s https://trusteed.xyz/.well-known/jwks.json -o jwks.json

# 2) Verificar firma JWS (Node.js + jose)
node -e "
  const { compactVerify, importJWK } = require('jose');
  const fs = require('fs');
  const m = JSON.parse(fs.readFileSync('manifest.json'));
  const jwks = JSON.parse(fs.readFileSync('jwks.json'));
  const jws = m._jws || process.env.JWS;
  (async () => {
    const kid = JSON.parse(Buffer.from(jws.split('.')[0],'base64url')).kid;
    const jwk = jwks.keys.find(k => k.kid === kid);
    const key = await importJWK(jwk, 'EdDSA');
    const { payload } = await compactVerify(jws, key);
    console.log('OK', JSON.parse(Buffer.from(payload).toString()).version); // verify-snippet
  })();
"

# 3) Pinear hash de una tool y comparar en futuras releases
jq -r '.tools[] | select(.name=="search_products") | .hashes' manifest.json

Detalle técnico (canonicalización RFC 8785 JCS, formato versionado) en la página de firma de manifests: Firma de Manifiesto

Señales de confianza públicas

Divulgación responsable

Si encuentras un fallo de seguridad, repórtalo de forma confidencial. No publiques exploits hasta que confirmemos el parche en producción.

Seguridad MCP: Cobertura MCP-38 | Trusteed