@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.
- package/CHANGELOG.md +25 -2
- package/README-es.md +16 -14
- package/README-fr.md +16 -14
- package/README-ru.md +16 -14
- package/README-zh.md +16 -14
- package/README.md +17 -15
- package/dist/claude-hook.d.ts.map +1 -1
- package/dist/claude-hook.js +9 -3
- package/dist/claude-hook.js.map +1 -1
- package/dist/flow-guard.d.ts +91 -5
- package/dist/flow-guard.d.ts.map +1 -1
- package/dist/flow-guard.js +433 -19
- package/dist/flow-guard.js.map +1 -1
- package/dist/mcp-server.js +4 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/review-diff.d.ts +5 -4
- package/dist/review-diff.d.ts.map +1 -1
- package/dist/review-diff.js.map +1 -1
- package/dist/static-scan.d.ts +1 -1
- package/dist/static-scan.d.ts.map +1 -1
- package/dist/static-scan.js +109 -3
- package/dist/static-scan.js.map +1 -1
- package/dist/wrap-cli.d.ts +6 -0
- package/dist/wrap-cli.d.ts.map +1 -1
- package/dist/wrap-cli.js +8 -2
- package/dist/wrap-cli.js.map +1 -1
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +125 -19
- package/dist/wrap.js.map +1 -1
- package/docs/flow-guard.es.md +77 -21
- package/docs/flow-guard.fr.md +78 -21
- package/docs/flow-guard.md +78 -22
- package/docs/flow-guard.ru.md +75 -20
- package/docs/flow-guard.zh.md +57 -18
- package/docs/gates.es.md +36 -6
- package/docs/gates.fr.md +36 -5
- package/docs/gates.md +36 -6
- package/docs/gates.ru.md +35 -6
- package/docs/gates.zh.md +10 -5
- package/docs/scanner-comparison.es.md +25 -1
- package/docs/scanner-comparison.fr.md +25 -1
- package/docs/scanner-comparison.md +24 -1
- package/docs/scanner-comparison.ru.md +25 -1
- package/docs/scanner-comparison.zh.md +20 -1
- 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.
|
|
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",
|