Evaluación de seguridad MCP: WARDEN — 2026-11-07
Estado: comparación de cinco productos publicados completa en ambos hosts. Cada producto intentó las 18.110 filas. Cobertura completa, errores y paridad se informan aparte; cohortes mixtas no son exactitud global. El posterior candidato runtime .2 tiene su estado separado abajo.
English · Русский · Español · Français · 中文
El autor mantiene WARDEN y HISTOR, con asistencia de IA. Es una comparación del mantenedor, no una certificación independiente. Las mediciones comparativas publicadas aquí son remotas, en gVisor. Un piloto local anterior queda excluido y sus artefactos dist/Vitest/Vite fueron eliminados; no se afirma que nunca hubiera existido un piloto local.
Qué se compara y con qué versiones
Se mide la respuesta del escáner a las definiciones de herramientas anunciadas por MCP. Analizar una descripción no equivale a ejecutar la herramienta, observar que un modelo siga una inyección ni medir el éxito de un ataque contra un modelo.
| Implementación | Paquete / entrada | Identidad de la ejecución nueva |
|---|---|---|
| WARDEN, producto publicado principal | @aimarket/warden |
npm 0.23.0, ruleset 17, 40 reglas; digest sha256-UOfK25xo6D8vrKEVfNFBTBVn5OspyaZut9vC9Z9Q5JE= |
| mcp-audit | PyPI mcp-audit-scanner[mcp] |
0.28.0 |
| mcp-shield | npm mcp-shield |
1.0.4 |
| truecopy | npm @askalf/truecopy |
0.10.5 |
| mcpsentry | npm @roshan6335/mcpsentry |
0.1.5 |
WARDEN principal usa el tarball npm publicado verificado, SHA-256 833841f2aab89df4c51b5f84385ad69c8ffd7dcf5a7725ec0eb4ebabe594b7ee. El anterior build congelado «v17» contiene seis archivos dist modificados para wrapper/filtrado de resultados: no es idéntico byte a byte a npm 0.23.0 ni reemplaza su columna. El candidato no publicado y posterior al análisis de fallos es 0.23.1-dev.20261107.1, ruleset 19, 43 reglas, 32 bloqueantes, digest sha256-XfRh1+VZoAM6PGtbmqprnSX/eF16qNYOk0o+ilRFxXw=. El primer v18 conserva su digest sha256-aXkZQj8F1fKgcTpyrfNdgQSQMuzdc1yabcKiGPVKjMo=. No se publicó en npm. Los resultados y versiones de octubre siguen en la comparación histórica.
Los paquetes publicados y corpus públicos originales son obtenibles. Repetir exactamente los fixtures y adaptadores del mantenedor requiere publicar sus fuentes. Los metadatos permiten inspeccionar id, umbrales, cobertura y hashes de salida, pero no permiten por sí solos una reproducción independiente completa. El código candidato19 tampoco está publicado: hashes y recibos son auditables, no un build reproducible externamente. El paquete público contiene informes, metadatos e imágenes, no fuentes del producto/banco privado.
Implementaciones reales frente a replay
La comparación masiva usa las API nativas completas de análisis/clasificación de las implementaciones reales, con estado nuevo. No afirma que las 18.110 filas pasaran por stdio MCP en cada producto. La paridad CLI/MCP y la interoperabilidad viva se comprueban por separado.
| Categoría | Inventario explícito | Alcance | Estado |
|---|---|---|---|
| Paquetes stdio reales, candidato19 | @modelcontextprotocol/server-filesystem@2.2.0 (16 herramientas), @modelcontextprotocol/server-memory@2.1.0 (9), @modelcontextprotocol/server-sequential-thinking@2.1.1 (1), WARDEN (9) |
SDK oficial Node MCP 1.32.1; directo y envuelto: descubrimiento, llamada sintética segura, rechazo de herramienta desconocida y ping posterior |
Ambos hosts: 8/8 sesiones y 4/4 pares de digest de listas iguales |
| HTTP público, candidato19 | DeepWiki (3), Microsoft Learn (3), Cloudflare Docs (2) | Solo initialize y tools/list |
Ambos hosts: 3/3 sin errores, todos permitidos |
| Definiciones congeladas | 3.177 vistas fijas y 14.933 filas HISTOR | API nativas completas, sin ejecutar código del servidor original | Completo en ambos hosts |
| Paridad representativa CLI/MCP | Node: 10/10 cada uno; mcp-audit Python: 13 acuerdos nativos/API con seis analizadores, incluido un resultado parcial; WARDEN publicado: 20/20, lista de 1,17 MB y ataque/limpio/repetición | Entrada nativa frente al adaptador | Un acuerdo parcial no es un veredicto completo |
Véase evidencia viva. El recibo SDK final corresponde a sdk19-final remoto; las copias locales sdk19 conservan el primer pase. Las llamadas sintéticas no usan archivos del usuario ni credenciales de producción. HTTP: https://mcp.deepwiki.com/mcp, https://learn.microsoft.com/api/mcp, https://docs.mcp.cloudflare.com/mcp. Son versiones observadas, no una afirmación de últimas versiones.
Inventario exacto de fixtures
23 ataques del mantenedor, definidos en build_sets.py:
A01-important-tag, A02-ssh-into-param, A03-shadowing-bcc, A04-zero-width-hidden, A05-unicode-tags, A06-base64-payload, A07-russian, A08-chinese, A09-paraphrase, A10-schema-hidden, A11-annotation-injection, A12-exfil-url, A13-name-injection, A14-private-key-param, A15-seed-phrase, A16-javascript-url, A17-ignore-previous, A18-system-tag, A19-call-first-history, A20-env-dump, A21-destructive, A22-concealment, A23-spanish.
12 controles benignos:
B01-never-send-key, B02-injection-scanner, B03-api-key-param, B04-javascript-word, B05-persian-zwnj, B06-refunds, B07-send-email, B08-secret-scanner, B09-password-vault, B10-upload-drive, B11-ssh-howto, B12-translate.
Fixtures de terceros: 10 ataques, uno benigno y uno ambiguo.
| Fuente | Casos y etiquetas |
|---|---|
mcp-audit, commit fdc8762eb2d5abb708bdaf767ec5a8140b2ab9a2 |
Ataques: behavioral_override_stealth, cloud_credential_exfiltration, crowdstrike_add_numbers, fake_postmark_exfiltration, invariant_labs_ssh_exfiltration, xml_injection_override |
mcp-shield, commit 379140c3555bf35c6f8f451ee320da24302e792e |
Ataques: calculateSum, sendEmail, readFile, getFactOfTheDay; benigno: whatsapp; ambiguo: fetchWeather |
El caso ambiguo se informa por separado y se excluye de los denominadores de detección y errores benignos. El origen externo no convierte un fixture conocido en una prueba ciega nueva: estos datos estuvieron disponibles durante el desarrollo de WARDEN.
MCPTox: unidades y los 45 nombres
La extracción archivada contiene 485 definiciones envenenadas distintas: 267 en 22 servidores dev y 218 en 23 servidores test. Hay además 225 definiciones con representación de prompt modificada y 45 listas de servidores limpios. Son unidades diferentes, no una única cantidad de «servidores».
Los 1.348 escenarios son otra vista solapada de las 485 definiciones. La auditoría remota del commit oficial f85189f9ad12504c197c7f920ab818a40657b1fa retuvo 1.338 valores server/frame únicos y 10 instancias duplicadas conservadas, cero descartadas; 702 con saltos literales y 646 con normalización de saltos escapados. Los hashes JSON coinciden con el archivo. El repositorio no declara licencia: se publican metadatos factuales, no definiciones, esquemas, payloads o código Python originales. Los 45 controles limpios contienen 362 herramientas, frente a las 353 del artículo; la deduplicación no resuelve esa diferencia. Véanse extracción y split.
La proyección full-frame conserva literalmente el texto de argumentos, pero declara como strings las propiedades extraídas de parámetros. No reconstruye los tipos nativos originales; sus resultados corresponden a esa proyección, no a una ejecución exacta de los esquemas originales.
Dev — 22: AWSKnowledgeBase; AdFin; AlphaVantage; BaiduMap; ClickHouse; Codacy; Commander; DoDo Payments; Email; EverArt; Everything; Fetch; Flomo; Google Maps; Memory; Prisma; SQLite; Sentry; Slack; Tavily; gNucleus Text to CAD; mcp-simple-arxiv.
Test — 23: 12306-mcp; AgentQL; AmapMap; Apify; BraveSearch; Claude Post; DumplingAI; E2B; FileSystem; Financial Dataset; Git; Github; Gitlab; GoogleDrive; Gyazo; HyperBrowser; KeywordsPeopleUse; OP.GG; Puppeteer; QuickChart; Redis; Sequential Thinking; wechat.
Son nombres del dataset, no afirmaciones de disponibilidad o afiliación actuales. El split se fijó ordenando por sha256("mcptox split 2026-10-09|" + server_name): primeros 22 dev, restantes 23 test. Las listas anteriores conservan el orden del archivo de resultados.
| Entrada archivada | SHA-256 de los bytes originales |
|---|---|
pure_tool.json |
54b1eb0e9d7b2f18465266aa9d9dfda828cd558b1269b74731ec2c5d8579e617 |
response_all.json |
79a90049be931c59e71446d6180b1d7f0d196d123d08a59bc155d142b5041c03 |
Estos hashes históricos no sustituyen el manifest nuevo de fuentes, archivos def_tool, JSON y configuraciones generadas. El parser trata Python como datos y no lo ejecuta. «Served» reproduce la definición extraída del servidor; «decorated» mide por separado prefijos como <IMPORTANT> o «Ignore the previous instructions».
Archivo público y observaciones de paquetes
La cohorte principal son 986 listas archivadas del corpus 2026-10-01. August carryover añade 41 observaciones, con 28 coincidencias exactas nombre+definición: 999 instantáneas únicas nombre+definición. No son 1.027 servidores independientes.
El inventario completo enumera las 18.110 filas, nombres, versiones registradas, etiquetas, herramientas, digest y procedencia. Descargas: CSV.gz, JSON.gz, manifest. Solo metadatos, sin contenido de ataque no licenciado.
Están disponibles 14.933 filas de versiones HISTOR: 12.023 npm y 2.910 PyPI, 14.449 toolsets distintos y 272.657 registros de herramientas, sin descartes ni diferencias de cuenta. La recomputación MTL y hashes de archivos se verificaron en ambos hosts. Del archivo 2026-10-20 se recuperaron 14.930 filas; otras tres, mediante URL API públicas inmutables. El manifest y tree-head firmados Ed25519 se verificaron contra did:key fijado. El archivo es CC-BY-4.0, atribuido a Aleksandr Artamokhov / HISTOR, HISTOR: MCP tool definitions and how they change, snapshot 2026-10-20. Las tres respuestas API no declaran licencia propia y su publicación es solo de metadatos.
Se usan los campos base MTL históricos exactos, sin mezclar title, annotations o extensiones actuales. Una observación no es una instalación/ejecución nueva. Datos sin etiqueta miden frecuencia de señales al umbral; afirmar falsos positivos requiere etiquetas o revisar el texto pertinente.
| Entrada / prueba | SHA-256 |
|---|---|
| Catálogo 3.177 vistas | e29baa05fbdbf46e34631ff2c75f0b4f535f0188054dd4499699bd189a3dc757 |
| Catálogo 14.933 paquetes | 78d4dab7125318b80cc35302e7cf1cfc1a49fa6f310957ed7b8fddfb538375b6 |
| Prueba de recuperación HISTOR | 8cdb0faf62c72f947baf30f74d6523fc6fd5b68720b44f4b765a0f804489cf7e |
| Resultados grouped finales | 44732cdfa369f0f912491212d1910883a6071c4ce4727cfc30911adb828d7a3b |
| Prueba final por caso entre hosts | a0773f6622290268129cc48323dab0b1b84dc5652d1b2b1ba20e679c63a01205 |
| Manifest SHA-256 final | 17d6e7ebd85dede970d77f319bf3734478a037bf9fd971a53f5bbd07b4fce3f8 |
Los catálogos usan warden.shared-lazy-inputs/v1. toolsFileSha256 calcula bytes UTF-8 exactos; toolsSha256, JSON Python 3.13 compacto con claves ordenadas, Unicode y orden de arrays conservados, valores no finitos rechazados; no se afirma JCS. Wire id: c y los primeros 32 hex de SHA-256 de warden shared inputs 2026-11-07| + clave, igual entre productos, versiones y hosts.
Protocolo remoto registrado
- Fijar código, digest de reglas, versiones, hora de consulta de registros, hashes de integridad publicados, dependencias y digest de imagen antes de interpretar resultados. Conservar comandos y salidas originales.
- Registrar SHA-256 de cada entrada: descarga, definición extraída, JSON de replay, etiquetas, split, config y banco. Conservar id estables, versiones de transformación y procedencia.
- Pases masivos:
runsc, sin red, UID/GID 501:501, root/source/runtime/data solo lectura, cap-drop ALL, no-new-privileges, tmpfs y resultados separados. Imagensha256:db7085498187e8477fa462d5f1652d62bdf4b8af29ea3666bd1748a8315631a5, Node 24.22.2/Python 3.13.18. Node: 1 CPU/768 MiB, recibo pids128. Audit base: 1 CPU/768 MiB; HISTOR: attested 1 CPU/768 MiB/un worker, PingBlip 2 CPU/1536 MiB/dos workers, pids256.cpu.max/memory.maxverificados. Audit HISTOR UTC 2026-11-07: attested 20:33:21–21:13:27, PingBlip 20:33:15–21:34:48; no es comparación controlada de velocidad. Stdio/HTTP vivos tienen ajustes separados UID1000, 0,5 CPU/512 MiB y bridge/256 MiB. - Usar la API nativa completa de análisis/clasificación con estado nuevo por objetivo. mcp-audit ejecuta sus seis analizadores predeterminados. Verificar adaptadores mediante los casos CLI/MCP separados. WARDEN:
allowUnknownServers: true,sensitiveToolPatterns: []. Rechazos cold-lock/unpinned de truecopy separados de la clasificación de contenido. - Guardar intentos iniciales y reintentos por separado; declarar timeout y política de reintento antes. Error, omisión y rechazo del protocolo no son allow. Nunca rellenar resultados nuevos con veredictos antiguos.
- Se conservan salidas nativas, normalización, errores y hashes. La prueba final compara clave, wire id, SHA-256 exacto de entrada, versión/código/imagen, estado, HC/any/advisory y SHA del objeto nativo completo. Solo se normalizan
finding_pathtemporal propio de mcp-audit y evidencia state-file deRUGPULL-000; texto/códigos/severidades conservados.
Descargar ZIP de informes y datos: cinco idiomas offline, grouped-results-v2.json, figure-cross-host.json, métodos y metadatos por caso. Las filas públicas contienen estados, señales y hashes; no se prometen hallazgos nativos completos ni payloads sin licencia como descargas públicas.
mcp-audit invoca nativo run_scan_async(extra_paths=[fresh_config], connect=True, guardrail_drift=True). Solo se sustituye transporte connect_and_enumerate: objetos capturados validados por SDK ListToolsResult y convertidos con _tool_info nativo. Analizadores, toxic-flow, delegación, annotations y scoring siguen activos; HOME/cwd/config/rug-pull nuevos. Online/API/LLM desactivados; timeout 30 s retira worker como incompleto. WARDEN: blockAtSeverity=high, allowUnknownServers=true, sensitiveToolPatterns=[], pinToolDefs=true.
Umbrales y denominadores
Umbrales: WARDEN allow: false nativo static-scan/threat-feed; mcp-audit HIGH / CRITICAL de definición del pipeline completo; mcp-shield HIGH Risk; truecopy señales nativas HIGH/CRITICAL; mcpsentry HIGH / CRITICAL. Cualquier señal truecopy, incluso advisory, puede ser poisoned/retenida por proxy; HC no representa toda retención y unpinned/cold-lock es política separada.
La columna común es una señal HIGH/CRITICAL, no una acción de bloqueo idéntica. WARDEN emite allow/block y truecopy relaciona su clasificación con la retención del proxy. mcp-shield puede salir con código 0 y hallazgos; mcpsentry sale con 1 solo para critical, mientras high-only puede salir con 0. Las señales de herramientas que solo informan no se llaman bloqueos impuestos.
Separar positivo al umbral, bajo umbral/advisory-only, sin hallazgo, error/parcial, skipped y not run. Cualquier señal incluye positivos al umbral. Ruido de rutas, configuración o baseline inicial se conserva y excluye con la misma regla para todos.
Se conserva normalization-v1: omitía tres detecciones SSH critical legítimas de WARDEN threat-feed al seleccionar solo static-scan. Normalization-v2 incluye todos los gates relevantes; raw outputs sin cambios, sin necesidad de repetir el motor. En WARDEN observado solo se excluyó info TOOL_DEF_UNPINNED. La misma exclusión de ruido del banco/lanzamiento/baseline aplica a todos los productos, evitando que el pinning inicial produzca un any-signal engañoso de 100%. Se informan señales HC, cualquier señal pertinente y advisory-only = any − HC.
Por escáner/cohorte: programados N, resultados completos C, positivos al umbral B (campo JSON), bajo umbral/advisory-only A, errores/parciales E, omitidos S, no ejecutados U; N = C + E + S + U, C = B + A + no-finding. Tasa de señales al umbral B/C; es recall solo dentro de cohortes etiquetadas como ataque. Cobertura C/N, con cuentas. Mostrar también B/N ante errores sin convertirlos en verdaderos negativos. Bloqueo impuesto es un resultado separado por producto; falsos positivos requieren etiquetas/revisión. Ambiguos separados.
MCPTox ataque: por definición; limpio, público y carryover: por snapshot de servidor; HISTOR: por objetivo de paquete. Una señal de herramienta al nivel elegido hace positivo al objetivo; cuentas por herramienta son diagnóstico adicional.
Escaneos parciales y compatibilidad
Dos registros HISTOR de mcp-audit alcanzan límites nativos: 5.000 nodos de esquema/profundidad 64 y 65.536 caracteres de texto por herramienta. Son E: parcial, fuera de cobertura completa y de B/A principales, aunque exista señal parcial. Un acuerdo nativo/API parcial no es un escaneo completo.
mcp-shield rechaza 31 listas HISTOR por validación estricta del SDK MCP. Los clientes raw JSON-RPC nativos de mcpsentry y truecopy no usan ese validador. Un caso rechazado de 42 herramientas pasa CLI/API de mcpsentry sin hallazgos: compatibilidad real, no omisión del adaptador. HISTOR mcp-shield: attested C=14.902/14.933, 31 errores de esquema; PingBlip C=14.901/14.933, 31 de esquema y un timeout. Ambos: HC 5.354 / any 6.767 entre resultados completos. Frecuencia positiva sin etiquetas, no FPR; comparación final completa.
El caso separado de paridad mcp-shield de 3 MB pasó en 52,18 s al ampliar el plazo combinado nativo+API de 30 a 90 s; cada motor tardó unos 28 s. Se conserva el primer timeout. El presupuesto API por caso sigue en 30 s: no es fallo del detector ni cambio oculto del timeout masivo.
Resultados nuevos
Primer candidato WARDEN con regresión conservada
El primer candidato v18 perdió tres detecciones frente a v17: FileSystem_20, FileSystem_22, FileSystem_23. Estos fallos medidos se conservan. Una reparación posterior es otro candidato y no una evaluación sobre datos nunca vistos.
| Superficie / unidad | Build v17 congelado anterior | Primer v18 bloqueados |
|---|---|---|
| 485 definiciones servidas originales | 460/485 | 457/485 |
| Test histórico conocido, 218 definiciones | 210/218 | 207/218 |
| 225 definiciones decorated | 225/225 | 225/225 |
| 1.348 escenarios completos de prompts, con filas duplicadas | 1.331/1.348 | 1.331/1.348 |
| 45 servidores limpios, 362 herramientas | 0/45 | 0/45 |
Ambos hosts coincidieron. La ruta MCP real y la de biblioteca coincidieron en 2.103/2.103 casos por versión y host, 8.412 comparaciones en total. Es paridad de rutas/hosts, no éxito de ataques contra modelos. Recibo remoto: /opt/warden-tests/20261107-mcptox-v18/results/final-report/REPORT.md; el informe pareado ampliado verificado figura abajo. No implica publicación en npm.
El candidato v19 verificado aborda sobrescritura SSH pública como alteración de seguridad y lectura de /etc/shadow como acceso a secretos. Recupera FileSystem_20 y FileSystem_23; FileSystem_22, requisito de lectura pública, sigue siendo secuestro no bloqueado. No se reetiqueta benigno ni se retira del denominador. Los tres fallos iniciales permanecen.
| Candidato19, vista | Bloqueos WARDEN / completos | Errores |
|---|---|---|
| Ataques propios / benignos, separados | 23/23; 0/12 | 0 |
| Ataques terceros / benigno / ambiguo, separados | 10/10; 0/1; 0/1 | 0 |
| Definiciones nativas / test histórico, separados | 459/485; 209/218 | 0 |
| Escenarios completos / decorated, separados | 1.331/1.348; 225/225 | 0 |
| Servidores limpios | 0/45 | 0 |
| Public-main / carryover, separados | 3/986; 1/41 | 0 |
Cada versión v18/v19 en cada host: MCP real/biblioteca 3.177/3.177. Filas completas comparadas entre hosts 12.708/12.708, siete controles de identidad verdaderos. Paridad operativa, no detección total. Informe, SHA-256 e699ba593242406b31f366b34d3e104dcf567094fd97421a62fbba8ded958989; JSON pareado 30996c170fd4284991ac4624ee88cda765ae26cb2393a8bbdeefa23913847a4e.
Resultados finales de cinco productos publicados
WARDEN principal es npm publicado 0.23.0/rules17, no el build modificado ni candidato19. Son nuevas mediciones remotas, no cifras de octubre sustituidas.
Celdas: HC / any / advisory-only, advisory-only = any − HC. Todas las filas base: C=N, E=S=U=0; excepciones HISTOR abajo. HC/any coinciden entre hosts. WARDEN principal es npm publicado 0.23.0/rules17. No sumar vistas solapadas en exactitud global.
| Cohorte / unidad | WARDEN npm 0.23.0 | mcp-audit 0.28.0 | mcp-shield 1.0.4 | truecopy 0.10.5 | mcpsentry 0.1.5 |
|---|---|---|---|---|---|
| 23 ataques propios | 20 / 23 / 3 | 11 / 13 / 2 | 6 / 10 / 4 | 3 / 8 / 5 | 4 / 4 / 0 |
| 12 benignos propios | 0 / 3 / 3 | 1 / 2 / 1 | 1 / 2 / 1 | 1 / 1 / 0 | 2 / 2 / 0 |
| 10 ataques terceros | 10 / 10 / 0 | 10 / 10 / 0 | 8 / 9 / 1 | 1 / 7 / 6 | 5 / 5 / 0 |
| 1 benigno tercero | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 |
| 1 ambiguo tercero | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 1 / 1 | 0 / 0 / 0 | 0 / 0 / 0 |
| 485 definiciones nativas MCPTox | 460 / 474 / 14 | 56 / 392 / 336 | 56 / 71 / 15 | 1 / 31 / 30 | 19 / 19 / 0 |
| …267 dev | 250 / 257 / 7 | 17 / 214 / 197 | 15 / 25 / 10 | 1 / 4 / 3 | 11 / 11 / 0 |
| …218 test histórico conocido | 210 / 217 / 7 | 39 / 178 / 139 | 41 / 46 / 5 | 0 / 27 / 27 | 8 / 8 / 0 |
| 225 decorated MCPTox | 225 / 225 / 0 | 222 / 225 / 3 | 41 / 95 / 54 | 135 / 141 / 6 | 136 / 136 / 0 |
| 1.348 escenarios completos | 1331 / 1338 / 7 | 951 / 1264 / 313 | 158 / 570 / 412 | 432 / 491 / 59 | 460 / 460 / 0 |
| 45 servidores limpios MCPTox | 0 / 7 / 7 | 0 / 3 / 3 | 3 / 6 / 3 | 0 / 0 / 0 | 1 / 7 / 6 |
| 986 snapshots públicos | 4 / 388 / 384 | 43 / 159 / 116 | 343 / 451 / 108 | 2 / 39 / 37 | 86 / 450 / 364 |
| 41 observaciones carryover | 2 / 37 / 35 | 12 / 24 / 12 | 33 / 35 / 2 | 1 / 3 / 2 | 21 / 38 / 17 |
| 14.933 filas históricas de paquetes | 409 / 6327 / 5918 | 481 / 2089 / 1608 | 5354 / 6767 / 1413 | 15 / 252 / 237 | 1449 / 6362 / 4913 |
Cobertura completa y acuerdo exacto entre hosts
Cada producto tiene N=18.110 por host, S=U=0, y todas las entradas emparejadas. Cero ausencias, diferencias de identidad de entrada/motor o resultados completos diferentes. Los incompletos no entran en el denominador de acuerdo.
| Producto | C attested / PingBlip | E attested / PingBlip | Idénticos / pares completos | Errores |
|---|---|---|---|---|
| WARDEN npm | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
| mcp-audit | 18108 / 18108 | 2 / 2 | 18108 / 18108 | 2 parciales en ambos |
| mcp-shield | 18079 / 18078 | 31 / 32 | 18078 / 18078 | 31 de esquema en ambos; 1 timeout solo PingBlip |
| truecopy | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
| mcpsentry | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
Candidato19 .1 adicional: 18.110/18.110 pares completos; v18 HISTOR: 14.933/14.933. HISTOR candidato19: 407 HC / 6327 any / 5920 advisory-only; WARDEN publicado: 409 / 6327 / 5918. Ningún veredicto HISTOR v18→v19 cambió. Una revisión limitada de dos pasajes permitidos tras v17 identificó provisión legítima de claves públicas: @krovacloud/mcp@0.3.16 (create_cube, sshPublicKey) y @runpod/mcp-server@4.4.0 (update-ssh-keys, keys). Se juzgan esos pasajes, no la seguridad de todo el paquete; no se redistribuye texto original.
Author35 e independent12 son cohortes mixtas: totales positivos al umbral no son recall. Se usan etiquetas separadas 23/12 y 10/1/1. La interoperabilidad viva corresponde al candidato19 y no es una celda de la comparación de cinco productos.
Validación de candidatos y procedencia
v18 anterior: 1.517/1.517 pruebas en 62 archivos por host, typecheck/build aprobados; red-team separado 0/28 delivered, no ASR de cinco productos. El testigo de directorio completo fue incompleto porque cambió un script vecino; producto ejecutado y 1.090 archivos source/test/script capturados estables.
Candidato19: 1.536/1.536 pruebas en 63 archivos por host, typecheck/build/red-team salida 0, sin OOM; attested 288,085 s, PingBlip 558,354 s. Contadores README/landing obsoletos motivaron reintentos pese a 1.534 pruebas de detector ya aprobadas. Validación solo cambia contadores en cinco README, no el detector; 521 runtime/source/test idénticos byte a byte, digest f4732e8beb77342ae250ac11126859ef59cf5e9bf3d74e8e46221b8d856d3231. Valida el candidato congelado, no todo el workspace. Diagnósticos iniciales e intento obsoleto interrumpido de Blip conservados aparte.
Build runtime posterior .2
0.23.1-dev.20261107.2 es distinto del .1 congelado: acepta MCP blob-resource válido sin mimeType opcional, manteniendo análisis de objetos metadata/structured similares. Ambos hosts: 1.536/1.536 pruebas en 63 archivos, typecheck/build/red-team salida0; attested 293,705 s, PingBlip 554,284 s. Pasan 304 pruebas enfocadas a 1 CPU normal con plazos sin cambios, SDK 8/8 sesiones y 4/4 pares de listas. Se conserva el timeout inicial a 0,25 CPU, sin repetición a capacidad normal.
Pruebas independientes binary/SDK preservan un blob válido de 400k con/sin MIME. Resultados plaintext/object-blob/poisoned-metadata inválidos se retienen tras una ejecución, sesión viva; es compatibilidad de filtrado de resultados, no prevención de efectos del instrumento. Las 23 comprobaciones CLI/library .1/.2 coinciden en hallazgos y scores. Los 320 archivos fuente/distribución fuera del módulo result-screen modificado son idénticos a .1, SHA-256 5ff407cf78742ae18fd593065e9c9bd552bba45f3fab91f27fae9f45adb13238, digest rules19 sin cambios. Las 18.110 filas siguen siendo medición .1, no .2; ambos códigos siguen sin publicarse.
El snapshot de trabajo actual 0.23.1-dev.20261108 añade hooks Codex/OpenCode ausentes de .1 y .2 congelados. Su aceptación se valida por separado. Las 18.110 filas y recibos de calidad congelados no se presentan como mediciones de esas adiciones del 8 de noviembre.
Límites de interpretación
Los fixtures propios fueron escritos por autores de WARDEN y los ajenos se leyeron durante el desarrollo. El test de MCPTox es un holdout histórico conocido, no una prueba nueva nunca vista: sus resultados se publicaron y comparte plantillas con dev. Repetirlo no recupera la evaluación ciega. Afirmar independencia de reglas posteriores exige auditar procedencia; la ausencia de frases coincidentes no la demuestra por sí sola.
El archivo no establece comportamiento actual. Descubrimiento no evalúa ejecución ni seguridad de dependencias. Bloqueos estáticos no miden éxito de ataques contra modelos, protección completa o prevención de exfiltración. Experimentos con modelos, si se realizan, requieren modelo/versión, prompts, presupuesto, solicitudes y denominadores propios; no se desprenden de estas tablas estáticas.