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.
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.
Capas defensivas que aplican a cada llamada MCP, desde el handshake OAuth hasta la respuesta del tool al agente.
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.
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.
Trusteed soporta firma JWS Ed25519 detachada sobre agent-policy.json, mcp.json y agent-card.json, con 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.
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.
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.
| # | Vector | Severidad | Estado | Implementación |
|---|---|---|---|---|
| MCP-02 | Inyección de Prompt | High | ✅ | sanitizeMerchantContent (múltiples patrones adversariales) + delimitación de contenido |
| MCP-03 | Exfiltración de Datos | High | ✅ | Guard cross-tenant + retención auditoría 90 días |
| MCP-05 | Bypass de Autenticación | High | ✅ | OAuth 2.1 + JWT RS256 + audiencia RFC 8707 |
| MCP-06 | Bypass de Autorización | High | ✅ | Helper central assertStoreOwnership() |
| MCP-07 | Hombre en el Medio | Medium | 🟡 | HTTPS+HSTS; firma JWS de manifests en curso (E2) |
| MCP-08 | Tool Poisoning | High | ✅ | Sanitizer aplicado en 5 tools críticas con contenido merchant |
| MCP-11 | Manipulación de Salida | High | 🟡 | Schemas Zod; hash criptográfico pendiente (E2) |
| MCP-14 | Vulnerabilidades de Dependencias | High | ✅ | MCP SDK 1.29.0 (3 CVEs parchadas) + allowlist DNS rebinding |
| MCP-22 | Ataque SSRF | High | ✅ | Blocklist CIDR privado + allowlist host MCP |
| MCP-25 | Debilidad Criptográfica | High | ✅ | Solo Ed25519, RS256, AES-256-GCM, SHA-256 |
| MCP-26 | Almacenamiento Inseguro | High | ✅ | SecretVault AES-256-GCM (ADR-003) |
| MCP-34 | Falta de Rate Limiting | High | ✅ | Token-bucket por tier y por tool |
| MCP-37 | Rug Pull | High | 🟡 | Verificación eIDAS QTSP; atestación manifest pendiente (E2) |
| MCP-38 | Shadow MCP | High | ✅ | Onboarding gateado por identidad + etiquetas públicas de trust |
Más sobre cumplimiento: Cumplimiento
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).
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.
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.
# 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.jsonDetalle técnico (canonicalización RFC 8785 JCS, formato versionado) en la página de firma de manifests: Firma de Manifiesto
14 Architecture Decision Records publicados en .memory/decisions.md (ADR-003 SecretVault, ADR-011 requireEnv, ADR-014 ServerTrustedStoreId, etc).
Alineado con MCP 2025-11-25 (Streamable HTTP, OAuth 2.1, Progressive Discovery).
Dossier técnico, clasificación DEFAULT, política de divulgación de vulnerabilidades en docs/compliance/.
Verificación de identidad merchant via InfoCert con QES y reconocimiento transfronterizo en 30 países UE/EEE.
Si encuentras un fallo de seguridad, repórtalo de forma confidencial. No publiques exploits hasta que confirmemos el parche en producción.