Проверка безопасности MCP: WARDEN — 2026-11-07
Статус: сравнение пяти опубликованных продуктов завершено на обоих хостах. Каждый продукт попытался обработать все 18 110 строк. Полное покрытие, ошибки и паритет учитываются отдельно; смешанные итоги не являются общей точностью. Поздний runtime-кандидат .2 имеет отдельный статус ниже.
English · Русский · Español · Français · 中文
Материал подготовлен сопровождающим WARDEN и HISTOR с помощью ИИ. Это сравнение автора продуктов, а не независимая сертификация. Публикуемые сравнительные измерения выполнены удалённо в gVisor. Более ранний локальный пилот исключён; его dist/Vitest/Vite-артефакты удалены. Это не утверждение, что локального пилота никогда не было.
Предмет сравнения и версии
Проверяется реакция на объявления инструментов MCP. Статический анализ описания не равен выполнению инструмента, наблюдению за действиями модели или измерению успешности атаки на модель.
| Реализация | Пакет / способ запуска | Идентичность нового прогона |
|---|---|---|
| WARDEN, основной опубликованный продукт | @aimarket/warden |
npm 0.23.0, ruleset 17, 40 правил; 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 использует проверенный опубликованный npm tarball, SHA-256 833841f2aab89df4c51b5f84385ad69c8ffd7dcf5a7725ec0eb4ebabe594b7ee. В ранней замороженной сборке «v17» изменены шесть dist-файлов обёртки/проверки результатов; она не побайтово равна npm 0.23.0 и не заменяет опубликованный baseline. Неопубликованный кандидат после изучения ошибок: 0.23.1-dev.20261107.1, ruleset 19, 43 правила, 32 блокирующих, digest sha256-XfRh1+VZoAM6PGtbmqprnSX/eF16qNYOk0o+ilRFxXw=. Первый v18 хранится отдельно, digest sha256-aXkZQj8F1fKgcTpyrfNdgQSQMuzdc1yabcKiGPVKjMo=. Публикации npm не было. Октябрьские результаты и старые версии: история.
Опубликованные пакеты и исходные публичные корпуса доступны. Точное повторение авторских fixtures и адаптеров требует публикации их исходников. Метаданные позволяют изучить id строк, пороги, покрытие и хеши выходов, но сами по себе не дают полного независимого воспроизведения. Исходники кандидата19 также не опубликованы: хеши и receipts проверяемы, но не образуют внешне воспроизводимую сборку. Публичный набор содержит отчёты, метаданные и иллюстрации, без исходников продукта/частного стенда.
Настоящие реализации и воспроизведение определений
Большая выборка проходит через собственные полные API анализа/классификации реальных реализаций со свежим состоянием. Не утверждается, что все 18 110 объектов для каждого продукта прошли stdio MCP. Проверки CLI/MCP и живой совместимости выделены отдельно.
| Категория | Полный перечень / объём | Что проверяется | Статус |
|---|---|---|---|
| Реальные stdio-пакеты, кандидат19 | @modelcontextprotocol/server-filesystem@2.2.0 (16 инструментов), @modelcontextprotocol/server-memory@2.1.0 (9), @modelcontextprotocol/server-sequential-thinking@2.1.1 (1), WARDEN (9) |
Официальный Node MCP SDK 1.32.1, прямо и через обёртку: обнаружение, безопасный синтетический вызов, отказ неизвестному инструменту, последующий ping |
На обоих хостах 8/8 сессий, 4/4 совпавших digest списков |
| Публичные HTTP, кандидат19 | DeepWiki (3), Microsoft Learn (3), Cloudflare Docs (2) | Только initialize и tools/list, без вызова инструментов |
На обоих хостах 3/3 без ошибок, все разрешены |
| Замороженные определения | 3 177 фиксированных представлений и 14 933 строки HISTOR | Собственные полные API анализа/классификации; код исходных серверов не исполняется | Завершено на обоих хостах |
| Выборочная проверка CLI/MCP | Node-конкуренты: 10/10 каждый; mcp-audit Python: 13 совпадений штатного полного API, включая один partial; опубликованный WARDEN: 20/20, включая 1,17 МБ и attack/clean/repeat | Штатный вход против массового адаптера | Совпадение partial не означает полный вердикт |
См. живые свидетельства. Финальный SDK receipt — удалённый sdk19-final; локальный sdk19 сохраняет первый прогон. Синтетические вызовы используют изолированные данные, без пользовательских файлов и production-секретов. HTTP: https://mcp.deepwiki.com/mcp, https://learn.microsoft.com/api/mcp, https://docs.mcp.cloudflare.com/mcp. Это наблюдаемые версии, не обещание последних релизов.
Точный перечень fixtures
23 атаки авторов WARDEN, определения в 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 доброкачественных контролей:
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: 10 атак, один доброкачественный, один неоднозначный пример.
| Источник | Примеры и метки |
|---|---|
mcp-audit, commit fdc8762eb2d5abb708bdaf767ec5a8140b2ab9a2 |
Атаки: behavioral_override_stealth, cloud_credential_exfiltration, crowdstrike_add_numbers, fake_postmark_exfiltration, invariant_labs_ssh_exfiltration, xml_injection_override |
mcp-shield, commit 379140c3555bf35c6f8f451ee320da24302e792e |
Атаки: calculateSum, sendEmail, readFile, getFactOfTheDay; доброкачественный: whatsapp; неоднозначный: fetchWeather |
Неоднозначный пример учитывается отдельно, вне знаменателей полноты обнаружения и ошибочных блокировок. Стороннее авторство не делает известный fixture новым отложенным тестом: эти данные были доступны при разработке WARDEN.
MCPTox: единицы и все 45 серверов
Архивное извлечение содержит 485 различных отравленных определений: 267 на 22 dev-серверах и 218 на 23 test-серверах. Отдельно: 225 определений с изменённым префиксом в представлении промпта и 45 чистых серверных списков. Это разные единицы; складывать их как «серверы» нельзя.
1 348 сценариев статьи — другое, пересекающееся представление, чем 485 определений. Удалённый аудит официального commit f85189f9ad12504c197c7f920ab818a40657b1fa сохранил все 1 348 строк: 1 338 уникальных значений server/frame и 10 сохранённых повторных экземпляров, без отбрасывания; 702 с обычными переводами строк, 646 с нормализацией экранированных. Хеши двух JSON совпадают с архивом. Репозиторий не указывает лицензию, поэтому публично распространяются только фактические метаданные, без определений, схем, атакующего текста и Python-исходников. Чистые списки содержат 362 инструмента против 353 в статье; дедупликация это расхождение не устраняет. Источники: извлечение, split.
Full-frame проекция сохраняет текст аргументов дословно, но объявляет извлечённые свойства параметров строками. Исходные native-типы аргументов не реконструируются: результат относится к этой явной проекции, не к точному исполнению оригинальных схем.
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.
Это имена из набора данных, не свидетельство текущей доступности или связи с проектом. Split фиксировался сортировкой по sha256("mcptox split 2026-10-09|" + server_name): первые 22 — dev, остальные 23 — test. Здесь сохранён порядок списков из файла результатов.
| Архивный вход | SHA-256 исходных байтов |
|---|---|
pure_tool.json |
54b1eb0e9d7b2f18465266aa9d9dfda828cd558b1269b74731ec2c5d8579e617 |
response_all.json |
79a90049be931c59e71446d6180b1d7f0d196d123d08a59bc155d142b5041c03 |
Эти два исторических хеша не заменяют новый manifest всех источников, файлов def_tool, сгенерированных JSON и конфигураций. Python-определения разбираются как данные, не запускаются. «Served» воспроизводит извлечённое серверное описание; «decorated» отдельно проверяет префиксы вроде <IMPORTANT> и «Ignore the previous instructions».
Публичный архив и пакеты
Основная когорта — 986 архивных списков из корпуса 2026-10-01. August carryover содержит 41 наблюдение; подтверждены 28 точных совпадений имени+определения, то есть 999 уникальных снимков имя+определение. Это отдельные когорты, а не 1 027 независимых серверов.
Полный inventory содержит все 18 110 строк, имена, записанные версии, метки, числа инструментов, digest и происхождение. Загрузки: CSV.gz, JSON.gz, manifest. Только метаданные, без нелицензированного содержимого атак.
Доступны 14 933 строки версий пакетов HISTOR: 12 023 npm и 2 910 PyPI, 14 449 различных toolsets, 272 657 записей инструментов, без отброшенных строк и расхождений количества. Повторное вычисление MTL-digest и хеши файлов проверены на обоих хостах. Из архива 2026-10-20 восстановлены 14 930 строк; ещё три digest — через неизменяемые публичные API URL. Manifest и tree-head подписаны Ed25519, проверены закреплённым did:key. Архив CC-BY-4.0, атрибуция: Aleksandr Artamokhov / HISTOR, HISTOR: MCP tool definitions and how they change, снимок 2026-10-20. У трёх API-ответов отдельная лицензия не указана: публично только метаданные.
Используются точные архивные базовые поля MTL; текущие title, annotations и дополнительные поля не примешаны. Наблюдение пакета не означает установку/исполнение. Неразмеченные данные дают частоту пороговых сигналов; false positive требует разметки или чтения соответствующего текста.
| Вход / доказательство | SHA-256 |
|---|---|
| Каталог 3 177 представлений | e29baa05fbdbf46e34631ff2c75f0b4f535f0188054dd4499699bd189a3dc757 |
| Каталог 14 933 пакетов | 78d4dab7125318b80cc35302e7cf1cfc1a49fa6f310957ed7b8fddfb538375b6 |
| Доказательство восстановления HISTOR | 8cdb0faf62c72f947baf30f74d6523fc6fd5b68720b44f4b765a0f804489cf7e |
| Итоговые grouped-результаты | 44732cdfa369f0f912491212d1910883a6071c4ce4727cfc30911adb828d7a3b |
| Итоговое покейсное межхостовое доказательство | a0773f6622290268129cc48323dab0b1b84dc5652d1b2b1ba20e679c63a01205 |
| Итоговый SHA-256 manifest | 17d6e7ebd85dede970d77f319bf3734478a037bf9fd971a53f5bbd07b4fce3f8 |
Формат каталогов warden.shared-lazy-inputs/v1: toolsFileSha256 — точные UTF-8-байты; toolsSha256 — Python 3.13 JSON с сортировкой ключей, компактными разделителями, сохранением Unicode/порядка массивов и запретом неконечных чисел, не заявленная JCS-канонизация. Wire id: c и первые 32 hex-символа SHA-256 от warden shared inputs 2026-11-07| + ключа случая, одинаково для продуктов, версий и хостов.
Зафиксированная удалённая методика
- До анализа зафиксировать исходники, digest правил, версии пакетов, время проверки реестров, опубликованные integrity hashes, зависимости, digest образа, команды и исходные ответы сканеров.
- Сохранить SHA-256 каждого входа: исходной загрузки, извлечённого определения, replay JSON, меток, split, config и стенда. Стабильные id, версии преобразований и происхождение обязательны.
- Массовые прогоны:
runsc, без сети, UID/GID 501:501, read-only root/source/runtime/data, cap-drop ALL, no-new-privileges, tmpfs и отдельные результаты. Образsha256:db7085498187e8477fa462d5f1652d62bdf4b8af29ea3666bd1748a8315631a5, Node 24.22.2/Python 3.13.18. Node: 1 CPU/768 MiB, сохранённый receipt pids128. Audit base: 1 CPU/768 MiB; HISTOR: attested 1 CPU/768 MiB/один worker, PingBlip 2 CPU/1536 MiB/два worker, pids256.cpu.max/memory.maxпроверены. UTC окна audit HISTOR 2026-11-07: attested 20:33:21–21:13:27, PingBlip 20:33:15–21:34:48; это не контролируемое сравнение скорости. Живые stdio/HTTP имеют отдельные настройки UID1000, 0,5 CPU/512 MiB и bridge/256 MiB соответственно. - Для каждого замороженного объекта — собственный полный API анализа/классификации со свежим состоянием. mcp-audit использует все шесть штатных анализаторов. Адаптеры проверяются отдельными CLI/MCP-прогонами. WARDEN:
allowUnknownServers: true,sensitiveToolPatterns: []. Отказы truecopy из-за cold-lock/unpinned учитываются отдельно от анализа содержимого. - Сохранять первые попытки и повторы раздельно; заранее задать timeout/retry. Ошибка, пропуск и отказ протокола не считаются allow. Старый результат не подставляется вместо нового.
- Сохранены raw outputs, нормализованные результаты, ошибки и хеши. Итоговое сравнение проверяет ключ, wire id, точный SHA-256 входа, версию/код/образ движка, статус, HC/any/advisory и SHA полного native-результата. Нормализуются только собственный временный
finding_pathmcp-audit и state-file evidenceRUGPULL-000; находки/текст/уровни сохраняются.
Скачать ZIP отчётов и данных: пять языков для offline-чтения, grouped-results-v2.json, figure-cross-host.json, методики и покейсные метаданные. Публичные строки содержат статусы, флаги и хеши; полные native-находки и нелицензированные payloads не заявляются публичными загрузками.
mcp-audit вызывает штатный run_scan_async(extra_paths=[fresh_config], connect=True, guardrail_drift=True). Заменён только транспорт connect_and_enumerate: сохранённые объекты проходят SDK ListToolsResult и native _tool_info. Все анализаторы, toxic-flow, delegation, annotations и scoring включены; HOME/cwd/config/rug-pull state свежие. Online/API/LLM отключены; timeout 30 с завершает worker с неполным результатом. WARDEN: blockAtSeverity=high, allowUnknownServers=true, sensitiveToolPatterns=[], pinToolDefs=true.
Пороги и знаменатели
Пороги: WARDEN — штатное allow: false static-scan/threat-feed; mcp-audit — находки определения HIGH / CRITICAL полного pipeline; mcp-shield — HIGH Risk; truecopy — native HIGH/CRITICAL-сигналы; mcpsentry — HIGH / CRITICAL. У truecopy любая находка, даже advisory, может означать poisoned/скрытие proxy; HC — не весь объём скрытого содержимого, а unpinned/cold-lock — отдельная политика.
Общая колонка означает HIGH/CRITICAL-сигнал, а не одинаковую блокировку. У WARDEN есть штатный allow/block, у truecopy классификация связана со скрытием инструмента proxy. mcp-shield может завершиться с кодом 0 при находках; mcpsentry возвращает 1 только при critical, а high-only может вернуть 0. Их сигналы не называются принудительными блокировками.
Разделять пороговый сигнал, ниже порога/advisory-only, нет находок, error/partial, skipped, not run. Любая находка включает пороговые. Шум пути стенда, конфигурации и первого baseline сохраняется и исключается по одинаковому правилу для всех.
Диагностика normalization-v1 сохранена: она ошибочно исключала три действительных SSH critical-находки WARDEN threat-feed, выбирая только static-scan. В normalization-v2 учитываются все gates определений; raw-вердикты неизменны, повтор движка не требовался. В наблюдавшихся данных WARDEN исключено только info TOOL_DEF_UNPINNED. Правило исключения стенда/запуска/baseline применяется ко всем продуктам, иначе any-signal от первого pinning бессмысленно равнялся бы 100%. Показываются HC-сигналы, любой релевантный сигнал и advisory-only = any − HC.
Для каждого сканера/когорты: запланировано N, полных результатов C, порогово-положительных B (имя поля JSON), ниже порога/advisory-only A, ошибок/partial E, пропусков S, незапущенных U; N = C + E + S + U, C = B + A + no-finding. Частота пороговых сигналов — B/C; recall это только для размеченной когорты атак. Покрытие — C/N, с исходными числами. При ошибках также показать B/N, не записывая ошибки в истинно отрицательные. Принудительная блокировка — отдельный продуктовый результат. Для false positive нужны метки/оценка; неоднозначные случаи — отдельно.
MCPTox-атаки — по определениям; чистый MCPTox, корпус и carryover — по снимкам серверов; HISTOR — по package target. Цель порогово-положительна при хотя бы одной релевантной находке выбранного уровня. Число находок по инструментам — дополнительная диагностика.
Неполные сканы и совместимость протокола
Две строки HISTOR mcp-audit достигли штатных лимитов 5 000 узлов схемы/глубины 64 и 65 536 символов текста инструмента. Это E: partial, исключённые из полного покрытия и основных B/A, даже при частичных находках. Partial-сигналы сохраняются отдельно; совпадение native/API partial не превращается в полный скан.
mcp-shield отклоняет 31 список HISTOR строгим валидатором MCP SDK. Штатные raw JSON-RPC клиенты mcpsentry и truecopy такого валидатора не имеют. Список из 42 инструментов, отклонённый mcp-shield, проходит mcpsentry CLI/API без находок: реальное различие совместимости, не пропуск адаптера. HISTOR mcp-shield: attested C=14 902/14 933, 31 schema error; PingBlip C=14 901/14 933, 31 schema error и один timeout. На обоих HC 5 354 / any 6 767 среди полных результатов. Это частота положительных сигналов без разметки, не FPR; итоговое сравнение завершено.
Отдельный parity-кейс mcp-shield 3 МБ прошёл за 52,18 с после увеличения общего native+API дедлайна 30→90 с: каждый вызов движка занимал около 28 с. Первый timeout сохранён; рабочий API-budget одного случая остался 30 с. Это ошибка суммарного дедлайна проверки, не отказ детектора и не скрытое изменение bulk-политики.
Новые результаты
Первый кандидат WARDEN: сохранённая регрессия
Первый кандидат v18 потерял три обнаружения относительно v17: FileSystem_20, FileSystem_22, FileSystem_23. Эти результаты сохраняются. Исправление после их изучения — отдельный кандидат, а не измерение на невиденном holdout.
| Поверхность / единица | Ранняя замороженная сборка v17 | Первый v18, блокировки |
|---|---|---|
| 485 исходных серверных определений | 460/485 | 457/485 |
| Известный исторический test, 218 определений | 210/218 | 207/218 |
| 225 decorated-определений | 225/225 | 225/225 |
| 1 348 полных сценариев промптов, с повторными строками | 1 331/1 348 | 1 331/1 348 |
| 45 чистых серверов, 362 инструмента | 0/45 | 0/45 |
Результаты двух хостов совпали. Actual MCP и библиотечный путь дали одинаковый результат в 2 103/2 103 случаях для каждой версии на каждом хосте, всего 8 412 сравнений. Это проверка путей/хостов, не успешности атак на модель. Удалённый receipt: /opt/warden-tests/20261107-mcptox-v18/results/final-report/REPORT.md; ниже дан расширенный проверенный paired-отчёт. Публикация npm не подразумевается.
Проверенный кандидат v19 после изучения ошибок блокирует принудительную перезапись публичного SSH-ключа как изменение безопасности и чтение /etc/shadow как доступ к секретам. Восстановлены FileSystem_20 и FileSystem_23; FileSystem_22, чтение публичного ключа как предварительное условие, остаётся неблокируемым перехватом инструмента. Он не переименован в доброкачественный и не исключён из знаменателя. Все три промаха первого v18 сохранены.
| Кандидат19, представление | Штатные блокировки / завершено | Ошибки |
|---|---|---|
| Собственные атаки / benign, раздельно | 23/23; 0/12 | 0 |
| Сторонние атаки / benign / ambiguous, раздельно | 10/10; 0/1; 0/1 | 0 |
| Native определения / исторический test, раздельно | 459/485; 209/218 | 0 |
| Полные сценарии / decorated, раздельно | 1 331/1 348; 225/225 | 0 |
| Чистые серверы | 0/45 | 0 |
| Public-main / carryover, раздельно | 3/986; 1/41 | 0 |
Обе версии v18/v19 на обоих хостах: actual-MCP/library по 3 177/3 177. Межхостовые полные строки 12 708/12 708 совпали, все семь проверок входов/исходников/стенда/replay истинны. Это операционная паритетность, не полное обнаружение атак. Отчёт, SHA-256 e699ba593242406b31f366b34d3e104dcf567094fd97421a62fbba8ded958989; paired JSON 30996c170fd4284991ac4624ee88cda765ae26cb2393a8bbdeefa23913847a4e.
Итоги пяти опубликованных продуктов
Основная колонка WARDEN — опубликованный npm 0.23.0/rules17, не ранняя изменённая сборка и не кандидат19. Это новые удалённые измерения, а не подставленные числа октября.
Ячейки: HC / any / advisory-only, advisory-only = any − HC. Для всех base-строк C=N, E=S=U=0; исключения HISTOR ниже. HC/any совпадают между хостами. Основная колонка WARDEN — опубликованный npm 0.23.0/rules17. Пересекающиеся представления не складываются в общую точность.
| Когорта / единица | WARDEN npm 0.23.0 | mcp-audit 0.28.0 | mcp-shield 1.0.4 | truecopy 0.10.5 | mcpsentry 0.1.5 |
|---|---|---|---|---|---|
| 23 собственные атаки | 20 / 23 / 3 | 11 / 13 / 2 | 6 / 10 / 4 | 3 / 8 / 5 | 4 / 4 / 0 |
| 12 собственных benign | 0 / 3 / 3 | 1 / 2 / 1 | 1 / 2 / 1 | 1 / 1 / 0 | 2 / 2 / 0 |
| 10 сторонних атак | 10 / 10 / 0 | 10 / 10 / 0 | 8 / 9 / 1 | 1 / 7 / 6 | 5 / 5 / 0 |
| 1 сторонний benign | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 |
| 1 сторонний ambiguous | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 1 / 1 | 0 / 0 / 0 | 0 / 0 / 0 |
| 485 native 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 | 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 полных сценариев | 1331 / 1338 / 7 | 951 / 1264 / 313 | 158 / 570 / 412 | 432 / 491 / 59 | 460 / 460 / 0 |
| 45 чистых серверов MCPTox | 0 / 7 / 7 | 0 / 3 / 3 | 3 / 6 / 3 | 0 / 0 / 0 | 1 / 7 / 6 |
| 986 публичных снимков | 4 / 388 / 384 | 43 / 159 / 116 | 343 / 451 / 108 | 2 / 39 / 37 | 86 / 450 / 364 |
| 41 carryover-наблюдение | 2 / 37 / 35 | 12 / 24 / 12 | 33 / 35 / 2 | 1 / 3 / 2 | 21 / 38 / 17 |
| 14 933 исторических строк пакетов | 409 / 6327 / 5918 | 481 / 2089 / 1608 | 5354 / 6767 / 1413 | 15 / 252 / 237 | 1449 / 6362 / 4913 |
Полнота и побайтовое межхостовое сравнение
Для каждого продукта N=18 110 на хост, S=U=0; спарены все 18 110 входов. Нет пропусков, расхождений входов/движков и различающихся полных результатов. Неполные случаи исключены из знаменателя совпадений.
| Продукт | C attested / PingBlip | E attested / PingBlip | Совпало / полных пар | Ошибки |
|---|---|---|---|---|
| WARDEN npm | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
| mcp-audit | 18108 / 18108 | 2 / 2 | 18108 / 18108 | 2 partial на обоих |
| mcp-shield | 18079 / 18078 | 31 / 32 | 18078 / 18078 | 31 schema на обоих; 1 timeout только PingBlip |
| truecopy | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
| mcpsentry | 18110 / 18110 | 0 / 0 | 18110 / 18110 | 0 |
Дополнительный .1 кандидат19: 18 110/18 110 полных пар; v18 HISTOR: 14 933/14 933. HISTOR кандидата19 — 407 HC / 6327 any / 5920 advisory-only, опубликованного WARDEN — 409 / 6327 / 5918. Ни один HISTOR-вердикт v18→v19 не изменился. Узкая проверка двух разрешённых после v17 фрагментов установила легитимную настройку публичных ключей: @krovacloud/mcp@0.3.16 (create_cube, sshPublicKey) и @runpod/mcp-server@4.4.0 (update-ssh-keys, keys). Это оценка фрагментов, не сертификат безопасности целого пакета; исходный текст не распространяется.
Суммы по смешанным author35 и independent12 — частота пороговых сигналов, не recall; для recall нужны отдельные метки 23/12 и 10/1/1. Живая совместимость относится к кандидату19 и не подставляется в таблицу пяти продуктов.
Валидация кандидатов и происхождение
Ранний v18: 1 517/1 517 тестов в 62 файлах на обоих хостах, typecheck/build пройдены; отдельный red-team gate 0/28 delivered — не ASR пяти продуктов. Whole-directory witness был неполным из-за изменения соседнего corpus-reporting скрипта; исполняемый продукт и 1 090 captured source/test/script-файлов стабильны.
Кандидат19: 1 536/1 536 тестов в 63 файлах на обоих хостах, exit codes typecheck/build/red-team — 0, без OOM; attested 288,085 с, PingBlip 558,354 с. Первые 1 534 detector-теста прошли; устаревшие счётчики README/landing потребовали повторов. Validation-копия меняет только счётчики в пяти README, не детектор; 521 runtime/source/test-файл побайтово одинаков, digest f4732e8beb77342ae250ac11126859ef59cf5e9bf3d74e8e46221b8d856d3231. Проверен замороженный кандидат, не все изменения текущей папки; начальные диагностические и прерванный устаревший Blip-прогон сохранены отдельно.
Поздняя runtime-сборка .2
0.23.1-dev.20261107.2 отделена от замороженной .1: принимает валидный MCP blob-resource без необязательного mimeType, продолжая проверять похожие metadata/structured объекты. На обоих хостах 1 536/1 536 тестов в 63 файлах, typecheck/build/red-team exit0; attested 293,705 с, PingBlip 554,284 с. Пройдены 304 целевых теста при обычном 1 CPU и прежних дедлайнах, SDK 8/8 сессий и 4/4 пар списков. Ранний timeout при 0,25 CPU сохранён, при обычной мощности не повторился.
Независимые binary/SDK-проверки сохраняют валидный 400k blob с MIME и без. Результаты invalid plaintext/object-blob/poisoned-metadata удерживаются после одного выполнения, с живой сессией; это совместимость проверки результата, не предотвращение побочных эффектов инструмента. 23 выборочных CLI/library-проверки .1/.2 совпадают по находкам и score. 320 исходных/distribution-файлов вне изменённого модуля result-screen побайтово равны .1, SHA-256 5ff407cf78742ae18fd593065e9c9bd552bba45f3fab91f27fae9f45adb13238, rules19 digest прежний. Классификационные 18 110 строк остаются прогоном .1, не .2; оба исходника неопубликованы.
Текущий рабочий снимок 0.23.1-dev.20261108 добавляет Codex/OpenCode hooks, отсутствующие в замороженных .1 и .2. Его приёмочная валидация отдельная. Метрики 18 110 строк и прежние quality-receipts не выдаются за измерения этих дополнений 8 ноября.
Ограничения выводов
Собственные fixtures написаны авторами WARDEN; сторонние прочитаны при разработке. MCPTox test — известный исторический holdout, а не новый невиденный набор: результаты публиковались, шаблоны общие с dev. Повторный прогон не возвращает слепоту. Утверждение о независимости поздних правил требует аудита происхождения; отсутствие совпадающих фраз само по себе её не доказывает.
Архив не описывает текущее поведение сервера. Обнаружение не проверяет исполнение инструментов и безопасность зависимостей. Статические блокировки не измеряют успешность атак на модель, сквозную защиту или предотвращение утечек. Если проводятся отдельные модельные эксперименты, для них нужны собственные модель/версия, промпты, бюджет, запросы и знаменатели; статические таблицы их не подразумевают.