Évaluation de sécurité MCP : WARDEN — 2026-11-07
État : comparaison des cinq produits publiés complète sur les deux hôtes. Chaque produit a tenté les 18 110 lignes. Couverture complète, erreurs et parité restent distinctes ; les cohortes mixtes ne sont pas une exactitude globale. Le candidat runtime ultérieur .2 a son propre état ci-dessous.
English · Русский · Español · Français · 中文
Ce document est rédigé par le mainteneur de WARDEN et de HISTOR, avec une assistance IA. Il s'agit d'une comparaison du mainteneur, pas d'une certification indépendante. Les mesures comparatives présentées sont distantes, dans gVisor. Un pilote local antérieur est exclu et ses artefacts dist/Vitest/Vite supprimés ; cela ne signifie pas qu'aucun pilote local n'a jamais existé.
Objet et versions
La comparaison mesure la réaction aux définitions d'outils annoncées par MCP. Analyser une description ne revient pas à exécuter l'outil, à observer un modèle suivre une injection ni à mesurer la réussite d'une attaque contre un modèle.
| Implémentation | Paquet / entrée | Identité du nouveau passage |
|---|---|---|
| WARDEN, produit publié principal | @aimarket/warden |
npm 0.23.0, ruleset 17, 40 règles ; 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 |
La colonne WARDEN principale utilise le tarball npm publié vérifié, SHA-256 833841f2aab89df4c51b5f84385ad69c8ffd7dcf5a7725ec0eb4ebabe594b7ee. L'ancien build figé « v17 » comporte six fichiers dist modifiés pour wrapper/filtrage de résultats : il n'est pas identique octet pour octet à npm 0.23.0 et ne remplace pas sa colonne. Le candidat non publié, postérieur aux échecs observés, est 0.23.1-dev.20261107.1, ruleset 19, 43 règles dont 32 bloquantes, digest sha256-XfRh1+VZoAM6PGtbmqprnSX/eF16qNYOk0o+ilRFxXw=. Le premier v18 garde son digest sha256-aXkZQj8F1fKgcTpyrfNdgQSQMuzdc1yabcKiGPVKjMo=. Aucune publication npm. Les versions et résultats d'octobre restent dans l'historique.
Les paquets publiés et corpus publics d'origine sont accessibles. Le rejeu exact des fixtures et adaptateurs du mainteneur exige la publication de leurs sources. Les métadonnées permettent d'inspecter id, seuils, couverture et hachages de sortie, pas de reproduire seules l'ensemble indépendamment. Le code candidat19 reste aussi non publié : ses hachages/reçus sont auditables, pas un build reproductible extérieurement. Le lot public contient rapports, métadonnées et figures, sans sources produit/banc privé.
Implémentations réelles et rejeu des définitions
La comparaison massive utilise les API natives complètes d'analyse/classification des implémentations réelles, avec état neuf. Elle ne prétend pas faire passer chacune des 18 110 lignes par stdio MCP pour chaque produit. Parité CLI/MCP et interopérabilité vivante sont vérifiées séparément.
| Catégorie | Inventaire explicite | Portée | État |
|---|---|---|---|
| Paquets stdio réels, candidat19 | @modelcontextprotocol/server-filesystem@2.2.0 (16 outils), @modelcontextprotocol/server-memory@2.1.0 (9), @modelcontextprotocol/server-sequential-thinking@2.1.1 (1), WARDEN (9) |
SDK officiel Node MCP 1.32.1, directement et via wrapper : découverte, appel synthétique sûr, refus d'outil inconnu, ping ultérieur |
Deux hôtes : 8/8 sessions, 4/4 paires de digest de listes identiques |
| HTTP publics, candidat19 | DeepWiki (3), Microsoft Learn (3), Cloudflare Docs (2) | Uniquement initialize et tools/list |
Deux hôtes : 3/3 sans erreur, tous autorisés |
| Définitions figées | 3 177 vues fixes et 14 933 lignes HISTOR | API natives complètes ; code des serveurs d'origine non exécuté | Complet sur les deux hôtes |
| Parité représentative CLI/MCP | Node : 10/10 chacun ; mcp-audit Python : 13 accords natif/API avec six analyseurs, dont un partiel ; WARDEN publié : 20/20, liste de 1,17 Mo et attaque/propre/répétition | Entrée native contre adaptateur | Un accord partiel n'est pas un verdict complet |
Voir les preuves vivantes. Le reçu SDK final correspond à sdk19-final distant ; les copies locales sdk19 gardent le passage initial. Aucun fichier utilisateur ni secret de production n'entre dans les appels synthétiques. HTTP : https://mcp.deepwiki.com/mcp, https://learn.microsoft.com/api/mcp, https://docs.mcp.cloudflare.com/mcp. Ce sont les versions observées, pas une revendication de dernières versions.
Inventaire exact des fixtures
23 attaques du mainteneur, définies dans 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 contrôles bénins :
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 tiers : 10 attaques, un cas bénin, un cas ambigu.
| Source | Cas et étiquettes |
|---|---|
mcp-audit, commit fdc8762eb2d5abb708bdaf767ec5a8140b2ab9a2 |
Attaques : behavioral_override_stealth, cloud_credential_exfiltration, crowdstrike_add_numbers, fake_postmark_exfiltration, invariant_labs_ssh_exfiltration, xml_injection_override |
mcp-shield, commit 379140c3555bf35c6f8f451ee320da24302e792e |
Attaques : calculateSum, sendEmail, readFile, getFactOfTheDay ; bénin : whatsapp ; ambigu : fetchWeather |
Le cas ambigu est publié séparément et exclu des dénominateurs de rappel et d'erreurs sur les contrôles bénins. Une origine tierce ne transforme pas un fixture connu en nouveau test aveugle : ces entrées étaient disponibles pendant le développement de WARDEN.
MCPTox : unités et 45 noms de serveurs
L'extraction archivée contient 485 définitions empoisonnées distinctes : 267 sur 22 serveurs dev et 218 sur 23 serveurs test. S'y ajoutent, séparément, 225 définitions dont la représentation dans le prompt est modifiée et 45 listes de serveurs propres. Ces unités ne peuvent pas être additionnées comme des « serveurs ».
Les 1 348 scénarios constituent une autre vue recoupant les 485 définitions. L'audit distant du commit officiel f85189f9ad12504c197c7f920ab818a40657b1fa conserve 1 338 valeurs server/frame uniques et 10 instances dupliquées conservées, zéro rejet ; 702 avec sauts littéraux, 646 avec normalisation des sauts échappés. Les hachages JSON correspondent aux archives. Le dépôt ne précise aucune licence : les téléchargements publics contiennent des métadonnées factuelles, pas les définitions, schémas, payloads ou sources Python bruts. Les 45 listes propres exposent 362 outils contre 353 dans l'article ; la déduplication ne résout pas cet écart. Voir l'extraction et le split.
La projection full-frame conserve le texte des arguments à l'identique, mais déclare les propriétés extraites comme chaînes. Elle ne reconstruit pas les types natifs d'origine ; ses résultats portent sur cette projection, pas sur une exécution exacte des schémas d'origine.
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.
Ce sont des noms du jeu de données, sans affirmation de disponibilité ou d'affiliation actuelles. Le split est fixé par tri sur sha256("mcptox split 2026-10-09|" + server_name) : les 22 premiers pour dev, les 23 autres pour test. L'ordre ci-dessus est celui des listes du fichier de résultats.
| Entrée archivée | SHA-256 des octets d'origine |
|---|---|
pure_tool.json |
54b1eb0e9d7b2f18465266aa9d9dfda828cd558b1269b74731ec2c5d8579e617 |
response_all.json |
79a90049be931c59e71446d6180b1d7f0d196d123d08a59bc155d142b5041c03 |
Ces deux hachages historiques ne remplacent pas un nouveau manifest de toutes les sources, fichiers def_tool, JSON et configurations générés. Le parseur traite Python comme des données et ne l'exécute pas. « Served » rejoue la définition extraite du serveur ; « decorated » mesure séparément les préfixes tels que <IMPORTANT> ou « Ignore the previous instructions ».
Archive publique et observations de paquets
La cohorte principale compte 986 listes archivées dans le corpus 2026-10-01. August carryover contient 41 observations, dont 28 doublons exacts nom+définition, soit 999 snapshots nom+définition uniques. Ce ne sont pas 1 027 serveurs indépendants.
L'inventaire complet liste les 18 110 lignes, noms, versions enregistrées, étiquettes, comptes d'outils, digests et provenance. Téléchargements : CSV.gz, JSON.gz, manifest. Métadonnées seules, sans contenu d'attaque sans licence.
Les 14 933 lignes de versions HISTOR sont disponibles : 12 023 npm et 2 910 PyPI, 14 449 toolsets distincts et 272 657 enregistrements d'outils, sans rejet ni écart de compte. Digests MTL recalculés et hachages de fichiers vérifiés sur les deux hôtes. L'archive 2026-10-20 a fourni 14 930 lignes ; trois autres viennent d'URL API publiques immuables. Le manifest et le tree-head Ed25519 sont vérifiés avec le did:key figé. Archive CC-BY-4.0, attribution Aleksandr Artamokhov / HISTOR, HISTOR: MCP tool definitions and how they change, snapshot 2026-10-20. Les trois réponses API sans licence distincte sont publiées en métadonnées seulement.
Les champs de base MTL archivés sont exacts, sans fusion de title, annotations ou extensions actuels. Une observation n'est pas une nouvelle installation/exécution. Les données non étiquetées mesurent la fréquence des signaux ; un faux positif exige une étiquette ou un jugement du texte pertinent.
| Entrée / preuve | SHA-256 |
|---|---|
| Catalogue 3 177 vues | e29baa05fbdbf46e34631ff2c75f0b4f535f0188054dd4499699bd189a3dc757 |
| Catalogue 14 933 paquets | 78d4dab7125318b80cc35302e7cf1cfc1a49fa6f310957ed7b8fddfb538375b6 |
| Preuve de récupération HISTOR | 8cdb0faf62c72f947baf30f74d6523fc6fd5b68720b44f4b765a0f804489cf7e |
| Résultats grouped finaux | 44732cdfa369f0f912491212d1910883a6071c4ce4727cfc30911adb828d7a3b |
| Preuve finale par cas interhôtes | a0773f6622290268129cc48323dab0b1b84dc5652d1b2b1ba20e679c63a01205 |
| Manifest SHA-256 final | 17d6e7ebd85dede970d77f319bf3734478a037bf9fd971a53f5bbd07b4fce3f8 |
Catalogues warden.shared-lazy-inputs/v1 : toolsFileSha256 porte sur les octets UTF-8 exacts ; toolsSha256 sur JSON Python 3.13 compact, clés triées, Unicode/ordre des tableaux conservés, nombres non finis refusés, sans prétention JCS. Wire id : c et les 32 premiers hex de SHA-256 de warden shared inputs 2026-11-07| + clé du cas, identique entre produits, versions et hôtes.
Protocole distant enregistré
- Figer source, digest des règles, versions, heure de consultation des registres, hachages d'intégrité publiés, dépendances et digest d'image avant d'interpréter les résultats. Conserver commandes et sorties originales.
- Calculer le SHA-256 de chaque entrée : téléchargement, définition extraite, JSON de rejeu, étiquettes, split, config et banc. Conserver id stables, versions des transformations et provenance.
- Mesures massives :
runsc, sans réseau, UID/GID 501:501, root/source/runtime/data en lecture seule, cap-drop ALL, no-new-privileges, tmpfs et résultats séparés. Imagesha256:db7085498187e8477fa462d5f1652d62bdf4b8af29ea3666bd1748a8315631a5, Node 24.22.2/Python 3.13.18. Node : 1 CPU/768 MiB, reçu pids128. Audit base : 1 CPU/768 MiB ; HISTOR : attested 1 CPU/768 MiB/un worker, PingBlip 2 CPU/1536 MiB/deux workers, pids256.cpu.max/memory.maxvérifiés. Audit HISTOR UTC 2026-11-07 : attested 20:33:21–21:13:27, PingBlip 20:33:15–21:34:48 ; pas un test contrôlé de vitesse. Stdio/HTTP vivants : réglages distincts UID1000, 0,5 CPU/512 MiB et bridge/256 MiB. - API native complète d'analyse/classification avec état neuf par cible. mcp-audit utilise les six analyseurs par défaut. Les adaptations sont vérifiées par les cas CLI/MCP distincts. WARDEN :
allowUnknownServers: true,sensitiveToolPatterns: []. Refus cold-lock/unpinned de truecopy séparés de l'analyse de contenu. - Conserver premières tentatives et reprises séparément ; annoncer timeout et politique de reprise en amont. Erreur, saut et rejet du protocole ne valent pas allow. Ne jamais remplacer un résultat neuf manquant par un ancien verdict.
- Sorties natives, normalisation, erreurs et hachages sont conservés. La preuve finale compare clé, wire id, SHA-256 exact d'entrée, version/code/image, statut, HC/any/advisory et SHA de l'objet natif complet. Seuls le
finding_pathtemporaire propre à mcp-audit et l'evidence state-fileRUGPULL-000sont normalisés ; textes/codes/sévérités conservés.
Télécharger le ZIP rapports et données : cinq langues hors ligne, grouped-results-v2.json, figure-cross-host.json, méthodes et métadonnées par cas. Les lignes publiques donnent statuts, signaux et hachages ; aucun téléchargement de constats natifs complets ou payloads sans licence n'est promis.
mcp-audit invoque nativement run_scan_async(extra_paths=[fresh_config], connect=True, guardrail_drift=True). Seul le transport connect_and_enumerate est substitué : objets capturés validés par SDK ListToolsResult, puis _tool_info natif. Analyseurs, toxic-flow, délégation, annotations et scoring restent actifs ; HOME/cwd/config/rug-pull neufs. Online/API/LLM désactivés ; timeout 30 s retire le worker comme incomplet. WARDEN : blockAtSeverity=high, allowUnknownServers=true, sensitiveToolPatterns=[], pinToolDefs=true.
Seuils et dénominateurs
Seuils : WARDEN allow: false natif static-scan/threat-feed ; mcp-audit HIGH / CRITICAL de définition du pipeline complet ; mcp-shield HIGH Risk ; truecopy signaux natifs HIGH/CRITICAL ; mcpsentry HIGH / CRITICAL. Tout constat truecopy, même advisory, peut être poisoned/retenu par proxy ; HC n'est pas toute rétention, et unpinned/cold-lock reste une politique distincte.
La colonne commune signifie signal HIGH/CRITICAL, pas une action de blocage identique. WARDEN produit allow/block ; la classification truecopy est reliée à la rétention par proxy. mcp-shield peut sortir avec le code 0 malgré des constats ; mcpsentry sort avec 1 uniquement pour critical, et high seul peut sortir avec 0. Les signaux des outils de rapport ne sont pas des blocages imposés.
Distinguer positif au seuil, sous le seuil/advisory seul, aucun constat, error/partiel, skipped et not run. Tout signal inclut les positifs au seuil. Le bruit de chemin, configuration et baseline initiale est conservé et exclu avec la même règle pour tous.
Normalization-v1 est conservée : elle excluait à tort trois détections SSH critical légitimes du threat-feed WARDEN en ne retenant que static-scan. Normalization-v2 inclut tous les gates pertinents ; les verdicts bruts sont inchangés, sans nouvelle exécution du moteur. Dans les données WARDEN observées, seule l'info TOOL_DEF_UNPINNED est exclue. La même règle de bruit banc/lancement/baseline s'applique à tous les produits, pour éviter un any-signal trompeur de 100% dû au pinning initial. Publier signaux HC, tout signal pertinent et advisory-only = any − HC.
Par scanner/cohorte : prévus N, résultats complets C, positifs au seuil B (champ JSON), sous le seuil/advisory A, erreurs/partiels E, sauts S, non exécutés U ; N = C + E + S + U, C = B + A + no-finding. Fréquence des signaux au seuil B/C ; c'est un rappel uniquement dans les cohortes étiquetées attaque. Couverture C/N, comptes bruts. Montrer B/N en présence d'erreurs sans les traiter comme vrais négatifs. Le blocage imposé est un résultat distinct par produit. Faux positifs : étiquettes ou jugement ; ambigus séparés.
MCPTox attaque : par définition ; propre/public/carryover : par snapshot de serveur ; HISTOR : par cible de paquet. Un constat pertinent au seuil sur au moins un outil rend la cible positive ; les comptes par outil sont diagnostiques.
Résultats partiels et compatibilité
Deux lignes HISTOR mcp-audit atteignent les budgets natifs : 5 000 nœuds de schéma/profondeur 64 et 65 536 caractères de texte par outil. Elles sont E: partiel, hors couverture complète et des B/A principaux, même avec constats partiels. Un accord natif/API partiel ne devient pas un scan complet.
mcp-shield rejette 31 listes HISTOR avec la validation stricte du SDK MCP. Les clients natifs raw JSON-RPC de mcpsentry et truecopy n'ont pas ce validateur. Un cas rejeté de 42 outils passe CLI/API mcpsentry sans constat : différence réelle de compatibilité, pas omission d'adaptateur. HISTOR mcp-shield : attested C=14 902/14 933, 31 erreurs de schéma ; PingBlip C=14 901/14 933, 31 erreurs de schéma et un timeout. Les deux : HC 5 354 / any 6 767 parmi les résultats complets. Fréquence positive non étiquetée, pas FPR ; comparaison finale complète.
Le cas séparé de parité mcp-shield de 3 Mo passe en 52,18 s après extension du délai combiné natif+API de 30 à 90 s ; chaque appel prend environ 28 s. Le premier timeout est conservé. Budget API par cas inchangé à 30 s : pas un échec du détecteur ni un changement caché du délai massif.
Nouveaux résultats
Premier candidat WARDEN avec régression conservée
Le premier candidat v18 perd trois détections face à v17 : FileSystem_20, FileSystem_22, FileSystem_23. Ces échecs mesurés sont conservés. Une réparation ultérieure constitue un autre candidat, pas une évaluation sur un holdout jamais vu.
| Surface / unité | Ancien build v17 figé | Premier v18 bloqués |
|---|---|---|
| 485 définitions servies originales | 460/485 | 457/485 |
| Test historique connu, 218 définitions | 210/218 | 207/218 |
| 225 définitions decorated | 225/225 | 225/225 |
| 1 348 scénarios complets de prompts, doublons inclus | 1 331/1 348 | 1 331/1 348 |
| 45 serveurs propres, 362 outils | 0/45 | 0/45 |
Les deux hôtes concordent. Le chemin MCP réel et celui de bibliothèque concordent sur 2 103/2 103 cas par version et par hôte, soit 8 412 comparaisons. C'est une parité de chemins/hôtes, pas une réussite d'attaques contre des modèles. Reçu distant : /opt/warden-tests/20261107-mcptox-v18/results/final-report/REPORT.md ; rapport apparié étendu vérifié ci-dessous. Aucune publication npm n'est impliquée.
Le candidat v19 post-hoc vérifié traite l'écrasement SSH public comme altération de sécurité et /etc/shadow comme accès aux secrets. Il récupère FileSystem_20 et FileSystem_23 ; FileSystem_22, prérequis de lecture publique, reste un détournement non bloqué. Ni réétiqueté bénin ni retiré du dénominateur. Les trois échecs initiaux restent dans le rapport.
| Candidat19, vue | Blocages WARDEN / complets | Erreurs |
|---|---|---|
| Attaques propres / bénins, séparés | 23/23; 0/12 | 0 |
| Attaques tiers / bénin / ambigu, séparés | 10/10; 0/1; 0/1 | 0 |
| Définitions natives / test historique, séparés | 459/485; 209/218 | 0 |
| Scénarios complets / decorated, séparés | 1 331/1 348; 225/225 | 0 |
| Serveurs propres | 0/45 | 0 |
| Public-main / carryover, séparés | 3/986; 1/41 | 0 |
Chaque version v18/v19 sur chaque hôte : MCP réel/bibliothèque 3 177/3 177. Lignes complètes interhôtes 12 708/12 708, sept contrôles d'identité vrais. Parité opérationnelle, pas détection de toutes les attaques. Rapport, SHA-256 e699ba593242406b31f366b34d3e104dcf567094fd97421a62fbba8ded958989 ; JSON apparié 30996c170fd4284991ac4624ee88cda765ae26cb2393a8bbdeefa23913847a4e.
Résultats finaux des cinq produits publiés
WARDEN principal signifie npm publié 0.23.0/rules17, pas l'ancien build modifié ni candidat19. Ce sont des mesures distantes nouvelles, pas des chiffres d'octobre substitués.
Cellules : HC / any / advisory-only, advisory-only = any − HC. Toutes les lignes base : C=N, E=S=U=0 ; exceptions HISTOR ci-dessous. HC/any concordent entre hôtes. WARDEN principal est npm publié 0.23.0/rules17. Ne pas additionner des vues recoupées en exactitude globale.
| Cohorte / unité | WARDEN npm 0.23.0 | mcp-audit 0.28.0 | mcp-shield 1.0.4 | truecopy 0.10.5 | mcpsentry 0.1.5 |
|---|---|---|---|---|---|
| 23 attaques propres | 20 / 23 / 3 | 11 / 13 / 2 | 6 / 10 / 4 | 3 / 8 / 5 | 4 / 4 / 0 |
| 12 bénins propres | 0 / 3 / 3 | 1 / 2 / 1 | 1 / 2 / 1 | 1 / 1 / 0 | 2 / 2 / 0 |
| 10 attaques tierces | 10 / 10 / 0 | 10 / 10 / 0 | 8 / 9 / 1 | 1 / 7 / 6 | 5 / 5 / 0 |
| 1 bénin tiers | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 |
| 1 ambigu tiers | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 1 / 1 | 0 / 0 / 0 | 0 / 0 / 0 |
| 485 définitions natives 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 historique connu | 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 scénarios complets | 1331 / 1338 / 7 | 951 / 1264 / 313 | 158 / 570 / 412 | 432 / 491 / 59 | 460 / 460 / 0 |
| 45 serveurs propres MCPTox | 0 / 7 / 7 | 0 / 3 / 3 | 3 / 6 / 3 | 0 / 0 / 0 | 1 / 7 / 6 |
| 986 snapshots publics | 4 / 388 / 384 | 43 / 159 / 116 | 343 / 451 / 108 | 2 / 39 / 37 | 86 / 450 / 364 |
| 41 observations carryover | 2 / 37 / 35 | 12 / 24 / 12 | 33 / 35 / 2 | 1 / 3 / 2 | 21 / 38 / 17 |
| 14 933 lignes de paquets historiques | 409 / 6327 / 5918 | 481 / 2089 / 1608 | 5354 / 6767 / 1413 | 15 / 252 / 237 | 1449 / 6362 / 4913 |
Couverture complète et accord exact entre hôtes
Chaque produit a N=18 110 par hôte, S=U=0, et toutes les entrées appariées. Zéro absence, divergence d'identité entrée/moteur ou résultat complet différent. Les incomplets sont exclus du dénominateur d'accord.
| Produit | C attested / PingBlip | E attested / PingBlip | Identiques / paires complètes | Erreurs |
|---|---|---|---|---|
| WARDEN npm | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
| mcp-audit | 18108 / 18108 | 2 / 2 | 18108 / 18108 | 2 partiels sur les deux |
| mcp-shield | 18079 / 18078 | 31 / 32 | 18078 / 18078 | 31 schémas sur les deux ; 1 timeout seulement PingBlip |
| truecopy | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
| mcpsentry | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
Candidat19 .1 supplémentaire : 18 110/18 110 paires complètes ; v18 HISTOR : 14 933/14 933. HISTOR candidat19 : 407 HC / 6327 any / 5920 advisory-only ; WARDEN publié : 409 / 6327 / 5918. Aucun verdict HISTOR v18→v19 n'a changé. Une lecture ciblée des deux passages autorisés après v17 confirme une configuration légitime de clés publiques : @krovacloud/mcp@0.3.16 (create_cube, sshPublicKey) et @runpod/mcp-server@4.4.0 (update-ssh-keys, keys). Ce jugement porte sur ces passages, pas sur tout le paquet ; aucun texte brut redistribué.
Author35 et independent12 sont mixtes : leurs totaux sont des fréquences de signaux au seuil, pas du rappel. Les étiquettes 23/12 et 10/1/1 restent distinctes. L'interopérabilité vivante concerne candidat19, pas une cellule des cinq produits.
Validation et provenance des candidats
Ancien v18 : 1 517/1 517 tests dans 62 fichiers par hôte, typecheck/build réussis ; red-team distinct 0/28 delivered, pas l'ASR de cinq produits. Le témoin de répertoire complet est incomplet à cause d'un script de rapport voisin modifié ; produit exécuté et 1 090 fichiers source/test/script capturés stables.
Candidat19 : 1 536/1 536 tests dans 63 fichiers par hôte, typecheck/build/red-team sortie 0, sans OOM ; attested 288,085 s, PingBlip 558,354 s. Les premiers 1 534 tests de détecteur passaient ; les comptes README/landing périmés ont demandé des reprises. Validation : seuls les comptes de cinq README changent, pas le détecteur ; 521 fichiers runtime/source/test sont identiques, digest f4732e8beb77342ae250ac11126859ef59cf5e9bf3d74e8e46221b8d856d3231. Cela porte sur le candidat figé, pas tout le workspace. Diagnostics initiaux et ancien essai Blip interrompu restent séparés.
Build runtime ultérieur .2
0.23.1-dev.20261107.2 est distinct du .1 figé : il accepte le blob-resource MCP valide sans mimeType facultatif, tout en analysant les objets similaires metadata/structured. Deux hôtes : 1 536/1 536 tests dans 63 fichiers, typecheck/build/red-team sortie0 ; attested 293,705 s, PingBlip 554,284 s. Les 304 tests ciblés passent à 1 CPU normal avec délais inchangés, SDK 8/8 sessions et 4/4 paires de listes. Timeout initial à 0,25 CPU conservé, non reproduit à capacité normale.
Les contrôles binary/SDK indépendants préservent un blob valide de 400k avec/sans MIME. Les résultats plaintext/object-blob/poisoned-metadata invalides sont retenus après une exécution, session vivante ; compatibilité de filtrage du résultat, pas prévention des effets de l'outil. Les 23 contrôles CLI/library .1/.2 concordent en constats et scores. Les 320 fichiers source/distribution hors du module result-screen modifié sont identiques à .1, SHA-256 5ff407cf78742ae18fd593065e9c9bd552bba45f3fab91f27fae9f45adb13238, digest rules19 inchangé. Les 18 110 lignes restent mesurées sur .1, pas .2 ; les deux sources restent non publiées.
Le snapshot de travail courant 0.23.1-dev.20261108 ajoute des hooks Codex/OpenCode absents des builds figés .1 et .2. Son acceptation est validée séparément. Les 18 110 lignes et reçus de qualité figés ne sont pas des mesures de ces ajouts du 8 novembre.
Limites d'interprétation
Les fixtures propres sont écrits par les auteurs de WARDEN et les tiers ont été lus pendant le développement. Le test MCPTox est un holdout historique connu, pas une nouvelle série jamais vue : résultats déjà publiés et modèles d'attaque partagés avec dev. Le rejouer ne rétablit pas l'aveugle. Revendiquer l'indépendance des règles ultérieures exige un audit de provenance ; l'absence de phrases identiques ne la prouve pas à elle seule.
L'archive ne décrit pas le comportement actuel. La découverte ne teste ni exécution ni sécurité des dépendances. Les blocages statiques ne mesurent ni réussite des attaques contre les modèles, ni protection complète, ni prévention d'exfiltration. Toute expérience avec modèle exige modèle/version, prompts, budget, requêtes et dénominateurs propres ; ces tableaux statiques ne l'impliquent pas.