@aimarket/warden 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +25 -2
  2. package/README-es.md +16 -14
  3. package/README-fr.md +16 -14
  4. package/README-ru.md +16 -14
  5. package/README-zh.md +16 -14
  6. package/README.md +17 -15
  7. package/dist/claude-hook.d.ts.map +1 -1
  8. package/dist/claude-hook.js +9 -3
  9. package/dist/claude-hook.js.map +1 -1
  10. package/dist/flow-guard.d.ts +91 -5
  11. package/dist/flow-guard.d.ts.map +1 -1
  12. package/dist/flow-guard.js +433 -19
  13. package/dist/flow-guard.js.map +1 -1
  14. package/dist/mcp-server.js +4 -0
  15. package/dist/mcp-server.js.map +1 -1
  16. package/dist/review-diff.d.ts +5 -4
  17. package/dist/review-diff.d.ts.map +1 -1
  18. package/dist/review-diff.js.map +1 -1
  19. package/dist/static-scan.d.ts +1 -1
  20. package/dist/static-scan.d.ts.map +1 -1
  21. package/dist/static-scan.js +109 -3
  22. package/dist/static-scan.js.map +1 -1
  23. package/dist/wrap-cli.d.ts +6 -0
  24. package/dist/wrap-cli.d.ts.map +1 -1
  25. package/dist/wrap-cli.js +8 -2
  26. package/dist/wrap-cli.js.map +1 -1
  27. package/dist/wrap.d.ts.map +1 -1
  28. package/dist/wrap.js +125 -19
  29. package/dist/wrap.js.map +1 -1
  30. package/docs/flow-guard.es.md +77 -21
  31. package/docs/flow-guard.fr.md +78 -21
  32. package/docs/flow-guard.md +78 -22
  33. package/docs/flow-guard.ru.md +75 -20
  34. package/docs/flow-guard.zh.md +57 -18
  35. package/docs/gates.es.md +36 -6
  36. package/docs/gates.fr.md +36 -5
  37. package/docs/gates.md +36 -6
  38. package/docs/gates.ru.md +35 -6
  39. package/docs/gates.zh.md +10 -5
  40. package/docs/scanner-comparison.es.md +25 -1
  41. package/docs/scanner-comparison.fr.md +25 -1
  42. package/docs/scanner-comparison.md +24 -1
  43. package/docs/scanner-comparison.ru.md +25 -1
  44. package/docs/scanner-comparison.zh.md +20 -1
  45. package/package.json +1 -1
@@ -57,6 +57,30 @@ Bloqués, sur :
57
57
  WARDEN compris, a tourné dans un conteneur gVisor sans réseau sur deux de nos serveurs, à partir d’images dont nous
58
58
  avons figé et haché le contenu. Voir [comment cela a tourné](#comment-cela-a-tourné).
59
59
 
60
+ ## Rulesets v15 et v16, 2026-10-22 (WARDEN seul)
61
+
62
+ Un lecteur a demandé ce que WARDEN ne repère toujours pas. 78 des 267 outils empoisonnés de la moitié dev de MCPTox
63
+ passaient v14 ; v15 élargit donc `TOOL_DEF_CROSS_TOOL` à partir d’eux, et de rien d’autre ([la règle](gates.fr.md)).
64
+ La moitié réservée a été mesurée une seule fois, après le gel des règles, et les lignes ajoutées ne partagent aucune
65
+ suite de huit mots avec un outil réservé.
66
+
67
+ | | v14 | v15 | v16 |
68
+ |---|---|---| --- |
69
+ | moitié dev de MCPTox (source des règles) | 189 sur 267 | 233 sur 267 | 250 sur 267 |
70
+ | **moitié réservée de MCPTox** | **171 sur 218** | **194 sur 218** | **210 sur 218** |
71
+ | …détournement de fonction à déclencheur explicite | 17 sur 23 | 17 sur 23 | 17 sur 23 |
72
+ | …détournement de fonction à déclencheur implicite | 59 sur 66 | 61 sur 66 | 66 sur 66 |
73
+ | …altération de paramètres à déclencheur implicite | 95 sur 129 | 116 sur 129 | 127 sur 129 |
74
+ | 45 serveurs MCPTox propres | 0 | 0 | 0 |
75
+ | corpus de terrain, 999 serveurs avec outils | 4 | les mêmes 4 | les mêmes 4 |
76
+ | paquets HISTOR, échantillon de 1 000 à graine fixe tiré de la liste du 2026-10-22 | 28 | les mêmes 28 | — (voir plus bas) |
77
+
78
+ v16 est un second passage sur la moitié dev le même soir, pour les outils sans entrée ([la règle](gates.fr.md)). Son premier jet bloquait quatre paquets honnêtes d’un second échantillon de 1 000, tiré de la liste HISTOR du soir, et a été resserré : sur cet échantillon, v15 et v16 bloquent les mêmes 31. Verdicts : [`results/2026-10-22-mcptox-v16.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v16.json).
79
+
80
+ Les autres scanners n’ont pas été relancés ; le tableau du début date du 2026-10-16. L’exécution a eu lieu sur un
81
+ poste de travail, pas dans les conteneurs gVisor du 2026-10-16. Verdicts par identifiant de cas :
82
+ [`results/2026-10-22-mcptox-v15.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v15.json).
83
+
60
84
  ## Cinq scanners, et ceux que nous n’avons pas lancés
61
85
 
62
86
  La fiche de WARDEN sur Glama cite sept outils apparentés. Nous avons lu le code ou la fiche de chacun avant de
@@ -94,7 +118,7 @@ Chaque serveur a été rejoué en stdio par un petit programme qui répond à `i
94
118
  fichier JSON et ne fait rien d’autre. Chaque scanner s’y est connecté comme à un vrai serveur, un serveur par
95
119
  exécution, avec son propre `HOME` vide.
96
120
 
97
- - **Entrées figées.** Avant les exécutions, nous avons écrit un [manifeste](../scripts/scanner-comparison/results/manifest-2026-10-16.json)
121
+ - **Entrées figées.** Avant les exécutions, nous avons écrit un [manifeste](../scripts/scanner-comparison/results/manifest-2026-10-16.public.json)
98
122
  avec le SHA-256 de chaque fichier d’entrée : 16 830 fichiers dans neuf jeux. Les fichiers de rejeu étaient en
99
123
  lecture seule pour les scanners.
100
124
  - **Outils figés.** Une image pour les quatre autres scanners, une pour WARDEN, toutes deux sur la même base
@@ -53,6 +53,29 @@ Blocked, out of:
53
53
  ran in a gVisor container with no network on two of our servers, from images whose contents we pinned and
54
54
  hashed. See [how it was run](#how-it-was-run).
55
55
 
56
+ ## Rulesets v15 and v16, 2026-10-22 (WARDEN only)
57
+
58
+ A reader asked what WARDEN still misses. 78 of the 267 poisoned tools on MCPTox's dev half passed v14, so v15 widens
59
+ `TOOL_DEF_CROSS_TOOL` from those, and from nothing else ([the rule](gates.md)). The held-out half was measured
60
+ once, after the rules were frozen, and the added lines share no eight-word sequence with any held-out tool.
61
+
62
+ | | v14 | v15 | v16 |
63
+ |---|---|---| --- |
64
+ | MCPTox dev half (rules written from it) | 189 of 267 | 233 of 267 | 250 of 267 |
65
+ | **MCPTox held-out half** | **171 of 218** | **194 of 218** | **210 of 218** |
66
+ | …explicit-trigger function hijacking | 17 of 23 | 17 of 23 | 17 of 23 |
67
+ | …implicit-trigger function hijacking | 59 of 66 | 61 of 66 | 66 of 66 |
68
+ | …implicit-trigger parameter tampering | 95 of 129 | 116 of 129 | 127 of 129 |
69
+ | 45 clean MCPTox servers | 0 | 0 | 0 |
70
+ | field corpus, 999 servers with tools | 4 | the same 4 | the same 4 |
71
+ | HISTOR packages, seeded sample of 1,000 drawn from the 2026-10-22 listing | 28 | the same 28 | — (see below) |
72
+
73
+ v16 is a second dev-half pass the same evening, for tools that take no input ([the rule](gates.md)). Its first draft blocked four honest packages of a second seeded sample of 1,000, drawn from HISTOR's evening listing, and was narrowed: on that sample v15 and v16 both block the same 31. Verdicts: [`results/2026-10-22-mcptox-v16.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v16.json).
74
+
75
+ The other scanners were not run again; the table at the top is from 2026-10-16. The run was on a workstation, not
76
+ in the gVisor containers of 2026-10-16. Verdicts by case id:
77
+ [`results/2026-10-22-mcptox-v15.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v15.json).
78
+
56
79
  ## Five scanners, and the ones we did not run
57
80
 
58
81
  Glama's listing for WARDEN names seven related tools. We read each one's code or listing before deciding.
@@ -89,7 +112,7 @@ Every server was replayed over stdio by a small program that answers `initialize
89
112
  file and does nothing else. Each scanner connected to it as it would to a real server, one server per run, with
90
113
  its own empty `HOME`.
91
114
 
92
- - **Fixed inputs.** Before the runs we wrote a [manifest](../scripts/scanner-comparison/results/manifest-2026-10-16.json)
115
+ - **Fixed inputs.** Before the runs we wrote a [manifest](../scripts/scanner-comparison/results/manifest-2026-10-16.public.json)
93
116
  with the SHA-256 of every input file: 16,830 files in nine sets. The replay files were read-only to
94
117
  the scanners.
95
118
  - **Fixed tools.** One image for the four other scanners, one for WARDEN, both on the same `node:22-alpine` base.
@@ -57,6 +57,30 @@
57
57
  работал в контейнере gVisor без сети на двух наших серверах, из образов, содержимое которых мы закрепили и
58
58
  захешировали. См. [как шёл прогон](#как-шёл-прогон).
59
59
 
60
+ ## Ruleset v15 и v16, 2026-10-22 (только WARDEN)
61
+
62
+ Читатель спросил, чего WARDEN всё ещё не ловит. 78 из 267 отравленных инструментов dev-половины MCPTox проходили
63
+ v14, поэтому v15 расширяет `TOOL_DEF_CROSS_TOOL` по ним и только по ним ([правило](gates.ru.md)). Отложенную половину
64
+ измерили один раз, после заморозки правил; добавленные строки не делят ни одной последовательности из восьми слов
65
+ ни с одним отложенным инструментом.
66
+
67
+ | | v14 | v15 | v16 |
68
+ |---|---|---| --- |
69
+ | dev-половина MCPTox (по ней писали правила) | 189 из 267 | 233 из 267 | 250 из 267 |
70
+ | **отложенная половина MCPTox** | **171 из 218** | **194 из 218** | **210 из 218** |
71
+ | …явный триггер, перехват функции | 17 из 23 | 17 из 23 | 17 из 23 |
72
+ | …неявный триггер, перехват функции | 59 из 66 | 61 из 66 | 66 из 66 |
73
+ | …неявный триггер, подмена параметров | 95 из 129 | 116 из 129 | 127 из 129 |
74
+ | 45 чистых серверов MCPTox | 0 | 0 | 0 |
75
+ | полевой корпус, 999 серверов с инструментами | 4 | те же 4 | те же 4 |
76
+ | пакеты HISTOR, выборка 1 000 с фиксированным зерном из списка на 2026-10-22 | 28 | те же 28 | — (см. ниже) |
77
+
78
+ v16 — второй проход по dev-половине тем же вечером, для инструментов без входных параметров ([правило](gates.ru.md)). Его первый вариант блокировал четыре честных пакета второй выборки из 1 000 (вечерний список HISTOR) и был сужен: на этой выборке v15 и v16 блокируют одни и те же 31. Вердикты: [`results/2026-10-22-mcptox-v16.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v16.json).
79
+
80
+ Другие сканеры заново не запускали; таблица в начале — от 2026-10-16. Прогон шёл на рабочей машине, а не в
81
+ контейнерах gVisor, как 2026-10-16. Вердикты по id случаев:
82
+ [`results/2026-10-22-mcptox-v15.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v15.json).
83
+
60
84
  ## Пять сканеров и те, что мы не запускали
61
85
 
62
86
  Страница WARDEN на Glama называет семь родственных инструментов. Прежде чем решать, мы прочитали код или страницу
@@ -94,7 +118,7 @@ Glama также показывает yotta-verify-mcp. Он сканирует
94
118
  JSON-файла и больше ничего не делает. Каждый сканер подключался к ней так же, как к настоящему серверу, по одному
95
119
  серверу на запуск, со своим пустым `HOME`.
96
120
 
97
- - **Закреплённые входы.** До прогонов мы записали [манифест](../scripts/scanner-comparison/results/manifest-2026-10-16.json)
121
+ - **Закреплённые входы.** До прогонов мы записали [манифест](../scripts/scanner-comparison/results/manifest-2026-10-16.public.json)
98
122
  с SHA-256 каждого входного файла: 16 830 файлов в девяти наборах. Файлы воспроизведения были доступны сканерам
99
123
  только на чтение.
100
124
  - **Закреплённые инструменты.** Один образ для четырёх других сканеров, один для WARDEN, оба на одной базе
@@ -51,6 +51,25 @@
51
51
  - **运行地点。** 10 月 9 日扫描器运行在一台工作站上。这一次,包括 WARDEN 在内的每款扫描器都在我们两台服务器上
52
52
  的无网络 gVisor 容器中运行,镜像内容经过固定并做了哈希。见[运行方式](#运行方式)。
53
53
 
54
+ ## 规则集 v15 和 v16,2026-10-22(仅 WARDEN)
55
+
56
+ 一位读者问 WARDEN 还抓不到什么。MCPTox dev 一半的 267 个投毒工具中有 78 个能通过 v14,因此 v15 依据这些工具、且只依据它们扩展了 `TOOL_DEF_CROSS_TOOL`([规则](gates.zh.md))。留出的一半在规则冻结后只测量了一次,新增的行与任何留出工具都没有共同的八词序列。
57
+
58
+ | | v14 | v15 | v16 |
59
+ |---|---|---| --- |
60
+ | MCPTox dev 一半(规则依据它编写) | 267 中 189 | 267 中 233 | 267 中 250 |
61
+ | **MCPTox 留出的一半** | **218 中 171** | **218 中 194** | **218 中 210** |
62
+ | …显式触发的函数劫持 | 23 中 17 | 23 中 17 | 23 中 17 |
63
+ | …隐式触发的函数劫持 | 66 中 59 | 66 中 61 | 66 中 66 |
64
+ | …隐式触发的参数篡改 | 129 中 95 | 129 中 116 | 129 中 127 |
65
+ | 45 台干净的 MCPTox 服务器 | 0 | 0 | 0 |
66
+ | 实地语料,999 台带工具的服务器 | 4 | 同样的 4 台 | 同样的 4 台 |
67
+ | HISTOR 包,从 2026-10-22 列表中按固定种子抽取的 1,000 个 | 28 | 同样的 28 个 | —(见下文) |
68
+
69
+ v16 是当晚对 dev 一半的第二轮,针对没有输入的工具([规则](gates.zh.md))。它的初稿在第二个 1,000 包种子样本(取自 HISTOR 晚间列表)中拦下了 4 个诚实的包,随后被收窄:在这个样本上 v15 和 v16 拦截的是同样的 31 个。判定:[`results/2026-10-22-mcptox-v16.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v16.json)。
70
+
71
+ 其他扫描器没有重新运行;开头的表格来自 2026-10-16。本次在一台工作站上运行,而不是 2026-10-16 的 gVisor 容器中。按用例 id 的判定:[`results/2026-10-22-mcptox-v15.json`](../scripts/scanner-comparison/results/2026-10-22-mcptox-v15.json)。
72
+
54
73
  ## 五款扫描器,以及我们没有运行的那些
55
74
 
56
75
  Glama 上 WARDEN 的页面列出了七款相关工具。我们在决定前读了每一款的代码或页面。
@@ -84,7 +103,7 @@ mcp-shield:`HIGH Risk` 的工具。truecopy:被其代理以 `poisoned` 拦
84
103
  每台服务器都通过 stdio 重放:一个小程序从 JSON 文件回答 `initialize` 和 `tools/list`,别的什么也不做。每款扫描器
85
104
  像连接真实服务器一样连接它,每次运行一台服务器,使用各自空的 `HOME`。
86
105
 
87
- - **固定的输入。** 运行前我们写了一份[清单](../scripts/scanner-comparison/results/manifest-2026-10-16.json),记录每个
106
+ - **固定的输入。** 运行前我们写了一份[清单](../scripts/scanner-comparison/results/manifest-2026-10-16.public.json),记录每个
88
107
  输入文件的 SHA-256:九个数据集共 16,830 个文件。重放文件对扫描器只读。
89
108
  - **固定的工具。** 一个镜像用于另外四款扫描器,一个用于 WARDEN,两者基于同一个 `node:22-alpine`。扫描器按上述版本
90
109
  取自 npm 和 PyPI,安装后的每个文件都与已发布的包一致,pip 自己改写的安装记录除外。WARDEN 来自被测提交的
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aimarket/warden",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "description": "WARDEN — MCP security firewall. Stdio wrap proxy, inspection tools and library. Vets definitions before model exposure. Zero runtime dependencies.",
5
5
  "type": "module",
6
6
  "license": "MIT",