@aimarket/warden 0.16.0 → 0.18.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 +40 -1
- package/README-es.md +20 -15
- package/README-fr.md +20 -15
- package/README-ru.md +20 -15
- package/README-zh.md +20 -15
- package/README.md +20 -15
- package/dist/claude-hook.d.ts +4 -0
- package/dist/claude-hook.d.ts.map +1 -1
- package/dist/claude-hook.js +42 -18
- package/dist/claude-hook.js.map +1 -1
- package/dist/flow-guard.d.ts +133 -0
- package/dist/flow-guard.d.ts.map +1 -0
- package/dist/flow-guard.js +1062 -0
- package/dist/flow-guard.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js +118 -26
- package/dist/mcp-tools.js.map +1 -1
- package/dist/review-diff.d.ts +51 -0
- package/dist/review-diff.d.ts.map +1 -0
- package/dist/review-diff.js +237 -0
- package/dist/review-diff.js.map +1 -0
- package/dist/static-scan.d.ts +1 -1
- package/dist/static-scan.d.ts.map +1 -1
- package/dist/static-scan.js +78 -2
- package/dist/static-scan.js.map +1 -1
- package/dist/wrap-cli.d.ts +3 -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-state.d.ts.map +1 -1
- package/dist/wrap-state.js +5 -0
- package/dist/wrap-state.js.map +1 -1
- package/dist/wrap.d.ts.map +1 -1
- package/dist/wrap.js +28 -1
- package/dist/wrap.js.map +1 -1
- package/docs/flow-guard.es.md +214 -0
- package/docs/flow-guard.fr.md +220 -0
- package/docs/flow-guard.md +224 -0
- package/docs/flow-guard.ru.md +210 -0
- package/docs/flow-guard.zh.md +159 -0
- package/docs/gates.es.md +27 -3
- package/docs/gates.fr.md +28 -2
- package/docs/gates.md +26 -3
- package/docs/gates.ru.md +26 -3
- package/docs/gates.zh.md +15 -2
- package/docs/scan.es.md +30 -28
- package/docs/scan.fr.md +30 -28
- package/docs/scan.md +30 -28
- package/docs/scan.ru.md +30 -28
- package/docs/scan.zh.md +30 -28
- package/docs/scanner-comparison.es.md +289 -174
- package/docs/scanner-comparison.fr.md +292 -178
- package/docs/scanner-comparison.md +234 -140
- package/docs/scanner-comparison.ru.md +279 -165
- package/docs/scanner-comparison.zh.md +237 -90
- package/package.json +4 -3
package/docs/gates.ru.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 [English](gates.md) · **Русский** · [Español](gates.es.md) · [Français](gates.fr.md) · [中文](gates.zh.md)
|
|
4
4
|
|
|
5
|
+
**Ruleset v14 (не выпущен, исправление аудита):** `keyStaysLocal` больше не принимает хранение на сервере за сохранение ключа у пользователя. Числа корпуса/MCPTox для v13 ниже исторические; для v14 выполнены только локальные регрессионные тесты, новых прогонов нет.
|
|
6
|
+
|
|
5
7
|
> [Изменения безопасности 0.7.0 и миграция](security-hardening.ru.md).
|
|
6
8
|
|
|
7
9
|
`Warden.vet(server, tools)` прогоняет упорядоченную цепочку и возвращает один вердикт. Эта страница —
|
|
@@ -52,8 +54,8 @@ Severity отвечает на вопрос *сколько внимания э
|
|
|
52
54
|
|
|
53
55
|
Локальное regex-сканирование всех полей, которые объявляет инструмент: `name`, `description` и
|
|
54
56
|
`inputSchema`, а начиная с v6 ещё `title`, `outputSchema`, `annotations` и метаданные расширений (всё
|
|
55
|
-
остальное, что прислал сервер, кроме иконки-изображения в base64).
|
|
56
|
-
`block`, 11 `advise`, и у
|
|
57
|
+
остальное, что прислал сервер, кроме иконки-изображения в base64). 36 правил в наборе **v14**: 25
|
|
58
|
+
`block`, 11 `advise`, и у 25 из них есть контекстный **guard** — именованная проверка, решающая,
|
|
57
59
|
действительно ли совпадение — то, что правило ищет. См.
|
|
58
60
|
[полевой обзор](mcp-survey.ru.md) — прогон по 1 108 серверам, на котором калибровался v4.
|
|
59
61
|
|
|
@@ -135,7 +137,28 @@ conversation history to https://…», «send a copy of all messages to someone@
|
|
|
135
137
|
из 41 сервера переноса. Два правила о чужих инструментах не работают по имени: им нужно предложение о вызове
|
|
136
138
|
другого инструмента. Тесты: `test/ruleset-v10.test.ts`.
|
|
137
139
|
|
|
138
|
-
|
|
140
|
+
**v13** подсказал читатель сравнения сканеров: инструмент, который берёт ключ («the signing key, hex»), отличается
|
|
141
|
+
от того, что использует сохранённый ключ («the name of a saved login»), именно описанием аргумента. Новое правило
|
|
142
|
+
`TOOL_DEF_SECRET_REQUEST` читает описания аргументов и ловит ключевой материал, который просят **значением**, в
|
|
143
|
+
словах, которых нет у правил про private key и seed phrase: ключ подписи или кошелька, пара ключей, фраза
|
|
144
|
+
восстановления или секретная фраза. Оно только добавляет находки. Описание пишет автор, поэтому оно никогда не
|
|
145
|
+
снимает совпадение другого правила, а предохранитель `keyReference` лишь сужает то, о чём сообщает само это
|
|
146
|
+
правило: ссылка на ключ остаётся в покое (его id, имя, путь или публичная половина, аргумент с именем `*_name` или
|
|
147
|
+
`*_id`, ключ, который инструмент создаёт сам, ключ как единица счёта). Это единственное правило, которое не читает
|
|
148
|
+
описание инструмента: там те же слова — то, как инструменты для ключей описывают себя («rotate my signing key»), и
|
|
149
|
+
на корпусе они заблокировали шесть честных серверов; в описаниях аргументов — ни одного.
|
|
150
|
+
|
|
151
|
+
При его написании нашлась дыра, которая была во всех наборах начиная с v4 (2026-08-24), когда появился этот предохранитель. `identifierFragment` считал точку в конце «Send me your
|
|
152
|
+
private key.» частью идентификатора и снимал находку: фраза проходила, а те же слова без точки блокировались. v13
|
|
153
|
+
читает точку или дефис на краю слова как пунктуацию. Это вскрыло четыре честные фразы, которые раньше прятала та же
|
|
154
|
+
точка («a challenge message to sign with the wallet's private key», «signed by the new credential's private key»,
|
|
155
|
+
«You keep the private key.», «messages from one signing key»); предохранитель `keyStaysLocal` не трогает ключ,
|
|
156
|
+
которым подписывают или который остаётся у пользователя, если ничто во фразе его не перемещает («sign it and paste
|
|
157
|
+
the private key» по-прежнему блокируется). На корпусе v13 блокирует 4 сервера вместо 3 у v12 и ни одного не теряет:
|
|
158
|
+
новый — удалённый сборщик, чей аргумент принимает 64-байтный секретный ключ новой пары ключей минта. На MCPTox ничего не меняется: 171 из 218 отравленных инструментов отложенной половины заблокированы, как и у v12 (замер воспроизвёлся точно), и ни один из 45 чистых серверов; инструменты MCPTox переписывают чужие вызовы, а не просят ключи.
|
|
159
|
+
Тесты: `test/ruleset-v13.test.ts`.
|
|
160
|
+
|
|
161
|
+
Каждое правило объявляет, на каких из этих семи **поверхностей** оно работает; 24 из 36 включают
|
|
139
162
|
имя. Четыре кода из тех, что не включают имя, — это правила, завязанные на существительное
|
|
140
163
|
(`TOOL_DEF_SECRET_REQUEST`, `TOOL_DEF_CREDENTIAL_PARAM`, `TOOL_DEF_ENV_REFERENCE`, `TOOL_DEF_SECRET_EXFIL`): имя — это
|
|
141
164
|
идентификатор, `api_key` и `private_key` — его обычные части, и блокировать
|
package/docs/gates.zh.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 [English](gates.md) · [Русский](gates.ru.md) · [Español](gates.es.md) · [Français](gates.fr.md) · **中文**
|
|
4
4
|
|
|
5
|
+
**Ruleset v14(尚未发布):** `keyStaysLocal` 不再把服务器存储视为本地保管。以下 v13 的语料/MCPTox 数字为历史结果;v14 只进行了本地回归测试,没有新基准。
|
|
6
|
+
|
|
5
7
|
> [0.7.0 安全更新与迁移](security-hardening.zh.md).
|
|
6
8
|
|
|
7
9
|
`Warden.vet(server, tools)` 会按顺序跑完一条门控链,并返回单一裁定。本页就是完整的判定过程:每个门控看什么、
|
|
@@ -44,7 +46,7 @@ const SEVERITY_RANK = { info: 0, low: 1, medium: 2, high: 3, critical: 4 };
|
|
|
44
46
|
|
|
45
47
|
## static-scan
|
|
46
48
|
|
|
47
|
-
对工具公布的每个字段做本地正则扫描:`name`、`description` 与 `inputSchema`,以及自 v6 起的 `title`、`outputSchema`、`annotations` 和扩展元数据(服务器发来的其他一切内容,base64 图片图标除外)。规则集 **
|
|
49
|
+
对工具公布的每个字段做本地正则扫描:`name`、`description` 与 `inputSchema`,以及自 v6 起的 `title`、`outputSchema`、`annotations` 和扩展元数据(服务器发来的其他一切内容,base64 图片图标除外)。规则集 **v14** 共 36 条规则:25 条 `block`,11 条 `advise`,其中 25 条带有上下文 **guard**——一项具名检查,用于判断某次命中是否真是该规则要找的东西。参见[实地普查](mcp-survey.zh.md),即校准 v4 的 1 108 台服务器实测。
|
|
48
50
|
|
|
49
51
|
**v5:任何规则读取文本之前,先对文本做归一化。** NFKC 把全角字母、连字和其他兼容形式变成普通字母;单词内部的不可见字符被删除;Unicode 标签区块(ASCII 的不可见副本,能藏下一整句话)被解码;在拉丁字母与西里尔或希腊字母混写的单词里,形近字母被换成拉丁字母,而整词只用一种文字写成的单词保持不变。于是,无论周围文本是什么语言,英文规则都不能再被全角字母、词内零宽空格、标签字符或西里尔字母 `о` 绕过。归一化以 `fold` 的形式与规则一起发布,并计入 digest。两条隐藏载荷规则读取**原始**文本(`raw: true`)。
|
|
50
52
|
|
|
@@ -60,7 +62,18 @@ v5 还消除了三类实测误报:“send the user to https://…”(引导
|
|
|
60
62
|
|
|
61
63
|
**v10** 针对 MCPTox(Wang et al.,AAAI 2026)编写:45 台真实服务器上的 485 个投毒工具,按三种攻击模板生成。在写下任何规则之前,先用固定哈希把它的服务器分成两半;规则只来自前一半,后一半是测量结果([scan 指南](scan.zh.md#对比))。几乎每个 MCPTox 工具都是同一种形态:它的文本绑定到**另一个**工具的调用上。新代码 `TOOL_DEF_CROSS_TOOL` 在以下情况下阻止:某句话提到另一个工具的调用(“when using `X`”“before running `X`”“any query to `X`”“before any …”),并在同一句中改写该调用的输入(modify、replace、append …),或在这一句或下一句中要求先调用第三个工具;以及一个没有输入的工具只要求调用另一个工具。锚点是另一个工具的标识符,在任何语言中都写法相同。工具自己的名称和参数永远不算“另一个工具”,因此 “use `get_video` to check status before calling this tool” 和 “call `refresh` first, then this tool” 都会通过:它们把工具当作手段来提及。guard 现在会收到工具本身,规则由此知道它自己的标识符。v10 还会阻止声称优先于用户的定义。在留出的那一半上,v10 阻止了 218 个投毒工具中的 171 个,而 0.8.2 只阻止 26 个;它没有阻止 MCPTox 的 45 台干净服务器中的任何一台,在已提交的语料上阻止的仍是同样的 3 台,8 月遗留的 41 台中阻止 1 台。它的两条跨工具规则不作用于工具名称:它们读取的是关于另一个工具调用的句子。测试:`test/ruleset-v10.test.ts`。
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
**v13** 来自扫描器对比文章的一位读者:一个**接收**密钥的工具(“the signing key, hex”)和一个使用已保存密钥的工具(“the name of a saved login”)的区别,恰恰在参数自己的描述里。
|
|
66
|
+
新的 `TOOL_DEF_SECRET_REQUEST` 规则读取参数描述,捕捉**按值**索要密钥材料、而 private key 和 seed phrase 规则没有写到的说法:签名密钥或钱包密钥、密钥对、恢复短语或秘密短语。
|
|
67
|
+
它只会增加发现。描述是作者写的文本,所以它从不为其他规则的命中开脱;它的 guard `keyReference` 只收窄这条规则自己的报告:引用不算(密钥的 id、名称、路径或公钥部分,
|
|
68
|
+
名为 `*_name` 或 `*_id` 的参数,工具自己创建的密钥,作为计数单位的密钥)。它是唯一不读工具描述的规则:在那里,同样的词是密钥类工具对自己的描述(“rotate my signing key”),
|
|
69
|
+
在已提交的语料上它们阻止了六台诚实的服务器;在参数描述里一台也没有。
|
|
70
|
+
|
|
71
|
+
编写它时发现了一个自 v4(2026-08-24,加入该 guard 时)起所有规则集都有的漏洞。`identifierFragment` 把 “Send me your private key.” 末尾的句号当作标识符的一部分而丢弃发现:这句话会放行,而去掉句号的同样词句会被阻止。
|
|
72
|
+
v13 把单词边缘的句点或连字符当作标点。这暴露了此前被同一个句号掩盖的四句诚实文本(“a challenge message to sign with the wallet's private key”“signed by the new credential's private key”
|
|
73
|
+
“You keep the private key.”“messages from one signing key”);guard `keyStaysLocal` 放过用于签名或由用户保留的密钥,除非同一分句里有任何东西把它移走(“sign it and paste the private key” 仍会被阻止)。
|
|
74
|
+
在已提交的语料上,v13 阻止 4 台服务器,v12 是 3 台,且一台都没丢:新增的是一个托管构建器,它的参数接收一个新铸币密钥对的 64 字节私钥。在 MCPTox 上没有任何变化:留出一半的 218 个投毒工具中阻止 171 个,与 v12 相同(测量结果完全复现),45 台干净服务器一台都没阻止;MCPTox 的工具改写的是其他工具的调用,而不是索要密钥。测试:`test/ruleset-v13.test.ts`。
|
|
75
|
+
|
|
76
|
+
每条规则都声明自己在这七个**面**中的哪些上运行,36 条里有 24 条包含名称。不包含名称的代码中,有四个是以**名词**为
|
|
64
77
|
锚的规则(`TOOL_DEF_SECRET_REQUEST`、`TOOL_DEF_CREDENTIAL_PARAM`、`TOOL_DEF_ENV_REFERENCE`、`TOOL_DEF_SECRET_EXFIL`):名称是标识
|
|
65
78
|
符,`api_key` 和 `private_key` 是标识符里再普通不过的组成部分,而拒绝 `sign_with_private_key` 等于把 v1 的
|
|
66
79
|
校准错误换个面重犯一次。以**短语**为锚的规则需要空白字符,因此根本无法匹配 `snake_case`;而两条隐藏载荷规则
|
package/docs/scan.es.md
CHANGED
|
@@ -176,39 +176,41 @@ WARDEN_CLASSIFIER_API_KEY=… warden-mcp scan --classifier-url https://api.deeps
|
|
|
176
176
|
- **Cinco categorías.** `instruction_to_model`, `exfiltration`, `secret_request`, `concealment`, `cross_tool`. Se inspecciona la autoridad de las instrucciones en cualquier idioma; la capacidad del modelo varía. El protocolo exige una decisión por herramienta y referencias a campos verificadas por WARDEN, que extrae el texto original. Cada decisión incompleta se reintenta una sola vez de forma aislada. Los delimitadores aleatorios no garantizan inmunidad.
|
|
177
177
|
- **Inspección no es aprobación.** [`wrap --require-approval`](security-hardening-language-boundary.md) exige una aprobación del operador independiente del idioma. HISTOR conserva sus resultados históricos como recomendaciones.
|
|
178
178
|
|
|
179
|
-
Medido el
|
|
179
|
+
Medido el 16 de octubre de 2026 con `deepseek-flash`, el modelo que usa HISTOR, sobre MCPTox (el benchmark publicado que se describe en la comparación de abajo), sobre servidores reales y sobre nuestros conjuntos:
|
|
180
180
|
|
|
181
|
-
| | Reglas (
|
|
182
|
-
|
|
183
|
-
| Mitad reservada de MCPTox, detectadas de 218 herramientas envenenadas | 171 |
|
|
184
|
-
| 45 servidores limpios de MCPTox,
|
|
185
|
-
| 200 servidores del corpus elegidos al azar, bloqueados o marcados | 2
|
|
186
|
-
|
|
|
181
|
+
| | Reglas (v12) | Reglas + clasificador en `high` |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| Mitad reservada de MCPTox, detectadas de 218 herramientas envenenadas | 171 | 218 |
|
|
184
|
+
| 45 servidores limpios de MCPTox, marcados | 0 | 0 |
|
|
185
|
+
| 200 servidores del corpus elegidos al azar, bloqueados o marcados | 2 | 5 |
|
|
186
|
+
| 996 paquetes de npm y PyPI de una muestra aleatoria, bloqueados o marcados | 23 | 35 |
|
|
187
|
+
| 23 ataques escritos por nosotros / 12 casos benignos difíciles | 20 / 0 | 23 / 0 |
|
|
187
188
|
|
|
188
|
-
Los dos que bloquean las reglas son el servicio de identidad y la herramienta de despliegue de la comparación de abajo.
|
|
189
|
+
Los dos servidores del corpus que bloquean las reglas son el servicio de identidad y la herramienta de despliegue de la comparación de abajo. Las marcas `high` del clasificador en servidores reales son sobre todo órdenes de flujo de trabajo como «llama primero a esta herramienta». Dos paquetes merecen una mirada humana y las reglas no bloquean ninguno: uno envuelve su descripción en un bloque falso de «el usuario lo pidió» y ordena al modelo llamarlo antes de cualquier respuesta; otro envía contenido de archivos del agente a su servidor con «Do NOT display … to the user». El modelo no vio lo que detectan las reglas: una inyección en el nombre de una herramienta, una clave privada o frase semilla pedida como parámetro y `rm -rf ~`. Juntos detectan los 23 ataques nuestros.
|
|
189
190
|
|
|
190
191
|
## Cómo se compara
|
|
191
192
|
|
|
192
|
-
El
|
|
193
|
-
|
|
194
|
-
Las
|
|
195
|
-
|
|
196
|
-
| Servidores | WARDEN 0.
|
|
197
|
-
|
|
198
|
-
| 23 ataques escritos por nosotros, bloqueados |
|
|
199
|
-
| 10 ataques de los propios fixtures de mcp-audit y mcp-shield, bloqueados |
|
|
200
|
-
| 12 casos benignos difíciles, bloqueados | 0 |
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
- **
|
|
209
|
-
- **
|
|
210
|
-
- **
|
|
211
|
-
- **WARDEN no
|
|
193
|
+
El 16 de octubre de 2026 ejecutamos WARDEN, mcp-audit 0.18.2 (`--connect`), mcp-shield 1.0.4, truecopy 0.10.4 y mcpsentry 0.1.5 sobre los mismos servidores. Cada servidor se reprodujo por stdio, así que cada escáner se conectó a él como lo haría en la práctica. Cada escáner corrió en un contenedor gVisor sin red, desde imágenes fijas cuyo contenido está resumido con hashes en un manifiesto. El banco de pruebas, los conjuntos, el manifiesto y cada juicio están en [`scripts/scanner-comparison`](../scripts/scanner-comparison/). El informe completo, con el método y cada salvedad, es la [comparación de escáneres](scanner-comparison.es.md).
|
|
194
|
+
|
|
195
|
+
Las filas de MCPTox vienen de MCPTox (Wang et al., AAAI 2026), un benchmark publicado de 485 herramientas envenenadas escritas para 45 servidores MCP reales. Dividimos sus servidores en dos con un hash fijo. Las reglas v10 se escribieron con 22 servidores; la tabla informa de los otros 23, con 218 herramientas envenenadas a las que no se ajustó ninguna regla. v11 y v12 tampoco se escribieron con ellas y dan los mismos veredictos que v10.
|
|
196
|
+
|
|
197
|
+
| Servidores | WARDEN 0.16.0 (v12) | mcp-audit 0.18.2 | mcp-shield 1.0.4 | truecopy 0.10.4 | mcpsentry 0.1.5 |
|
|
198
|
+
|---|---|---|---|---|---|
|
|
199
|
+
| 23 ataques escritos por nosotros, bloqueados | 20 | 10 | 6 | 8 | 4 |
|
|
200
|
+
| 10 ataques de los propios fixtures de mcp-audit y mcp-shield, bloqueados | 10 | 10 | 8 | 7 | 5 |
|
|
201
|
+
| 12 casos benignos difíciles, bloqueados | 0 | 1 | 1 | 1 | 2 |
|
|
202
|
+
| 218 herramientas envenenadas de MCPTox en los servidores reservados, bloqueadas | 171 | 25 | 41 | 27 | 8 |
|
|
203
|
+
| 225 herramientas de MCPTox con un prefijo `<IMPORTANT>` o «Ignore the previous instructions», bloqueadas | 225 | 222 | 41 | 141 | 136 |
|
|
204
|
+
| 45 servidores limpios de MCPTox, bloqueados | 0 | 2 | 3 | 0 | 1 |
|
|
205
|
+
| 986 servidores públicos, bloqueados | 3 | 33 | 343 | 39 | 86 |
|
|
206
|
+
| …bloqueos que se sostienen al leer el texto | 1, y 1 discutible | 0 | 1 de los 34 que leímos | 1 | 0 |
|
|
207
|
+
| 14 933 paquetes de npm y PyPI que observó HISTOR, bloqueados | 369 | 928 | 5354 | 252 | 1449 |
|
|
208
|
+
|
|
209
|
+
- **Lee primero las filas de servidores reales.** Ninguna regla se ajustó a ellas. Los 33 bloqueos de mcp-audit en el corpus son sobre todo «homoglifos» en texto escrito entero en su propio alfabeto e instrucciones de honestidad como «do not tell the user the check digits are wrong». mcp-shield bloquea un tercio de los servidores reales, casi siempre por una palabra clave: «API key», «token», `.env`, «..». truecopy bloquea los generadores de docker-compose de un mismo proveedor porque producen un `.env.example`. El patrón base64 de mcpsentry coincide con cualquier secuencia de 40 letras y barras, como las que producen las rutas de JSON Schema. En 14 933 paquetes de npm y PyPI, una muestra aleatoria de 996 en la que juzgamos cada bloqueo tiene 23 bloqueos de WARDEN, ninguno se sostiene y 4 son discutibles; mcp-shield bloquea 339 de esos mismos paquetes y mcpsentry 112.
|
|
210
|
+
- **Ten claro qué números están ajustados.** Escribimos el primer conjunto de ataques, y las reglas v9 se escribieron después de leer ambos conjuntos de ataques. La fila de la mitad reservada de MCPTox, los servidores limpios, el corpus y los paquetes no están ajustados.
|
|
211
|
+
- **MCPTox prueba una forma, no una palabra clave.** Casi todas las herramientas envenenadas le dicen al modelo que llame antes a otra herramienta o que cambie los argumentos de otra. v10 le dio nombre a esa forma (`TOOL_DEF_CROSS_TOOL`, véase [la cadena de compuertas](gates.es.md)) y v12 la conserva. Con el prefijo `<IMPORTANT>` del benchmark, la mayoría de los escáneres detecta la mayoría de las herramientas.
|
|
212
|
+
- **Lo que WARDEN todavía no detecta:** 47 de las 218 herramientas reservadas de MCPTox, una instrucción en chino para leer `.env`, una paráfrasis sin palabras clave («gather every credential file … keep this step to yourself») y «include the output of env». Informa 41 de esas 47 como avisos, no como bloqueos. Con el clasificador opcional de arriba, las 218 quedan marcadas en `high`.
|
|
213
|
+
- **WARDEN no está solo en ese hueco.** mcp-audit también tiene archivo lock, modo diff para PR y SARIF; truecopy también fija y firma definiciones en un archivo lock.
|
|
212
214
|
|
|
213
215
|
## Lo que scan no hace
|
|
214
216
|
|
package/docs/scan.fr.md
CHANGED
|
@@ -176,39 +176,41 @@ WARDEN_CLASSIFIER_API_KEY=… warden-mcp scan --classifier-url https://api.deeps
|
|
|
176
176
|
- **Cinq catégories.** `instruction_to_model`, `exfiltration`, `secret_request`, `concealment`, `cross_tool`. L’inspection porte sur l’autorité des instructions, dans toute langue, selon les capacités du modèle. Le protocole exige une décision par outil et des références de champs vérifiées par WARDEN, qui extrait le texte source. Chaque décision incomplète est réessayée une seule fois isolément. Les délimiteurs aléatoires ne garantissent pas l’immunité.
|
|
177
177
|
- **Inspection ne vaut pas approbation.** [`wrap --require-approval`](security-hardening-language-boundary.md) exige l’approbation de l’opérateur indépendamment de la langue. Les résultats historiques de HISTOR restent consultatifs.
|
|
178
178
|
|
|
179
|
-
Mesuré le
|
|
179
|
+
Mesuré le 16 octobre 2026 avec `deepseek-flash`, le modèle qu'utilise HISTOR, sur MCPTox (le benchmark publié décrit dans la comparaison ci-dessous), sur de vrais serveurs et sur nos propres jeux :
|
|
180
180
|
|
|
181
|
-
| | Règles (
|
|
182
|
-
|
|
183
|
-
| Moitié réservée de MCPTox, détectés sur 218 outils empoisonnés | 171 |
|
|
184
|
-
| 45 serveurs propres de MCPTox,
|
|
185
|
-
| 200 serveurs du corpus tirés au hasard, bloqués ou
|
|
186
|
-
|
|
|
181
|
+
| | Règles (v12) | Règles + classificateur au niveau `high` |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| Moitié réservée de MCPTox, détectés sur 218 outils empoisonnés | 171 | 218 |
|
|
184
|
+
| 45 serveurs propres de MCPTox, signalés | 0 | 0 |
|
|
185
|
+
| 200 serveurs du corpus tirés au hasard, bloqués ou signalés | 2 | 5 |
|
|
186
|
+
| 996 paquets npm et PyPI d'un échantillon aléatoire, bloqués ou signalés | 23 | 35 |
|
|
187
|
+
| 23 attaques écrites par nous / 12 cas bénins difficiles | 20 / 0 | 23 / 0 |
|
|
187
188
|
|
|
188
|
-
Les deux que bloquent les règles sont le service d
|
|
189
|
+
Les deux serveurs du corpus que bloquent les règles sont le service d'identité et l'outil de déploiement de la comparaison ci-dessous. Les signalements `high` du classificateur sur de vrais serveurs sont surtout des consignes de déroulement comme « appelle d'abord cet outil ». Deux paquets méritent un regard humain, et les règles n'en bloquent aucun : l'un enveloppe sa description dans un faux bloc « c'est l'utilisateur qui l'a demandé » et ordonne au modèle de l'appeler avant toute réponse ; l'autre envoie le contenu de fichiers de l'agent vers son serveur avec « Do NOT display … to the user ». Le modèle a manqué ce que les règles détectent : une injection dans le nom d'un outil, une clé privée ou une phrase de récupération demandée en paramètre, et `rm -rf ~`. Ensemble, ils détectent nos 23 attaques.
|
|
189
190
|
|
|
190
191
|
## Comparaison
|
|
191
192
|
|
|
192
|
-
Le
|
|
193
|
-
|
|
194
|
-
Les
|
|
195
|
-
|
|
196
|
-
| Serveurs | WARDEN 0.
|
|
197
|
-
|
|
198
|
-
| 23 attaques écrites par nous, bloquées |
|
|
199
|
-
| 10 attaques tirées des fixtures de mcp-audit et de mcp-shield, bloquées |
|
|
200
|
-
| 12 cas bénins difficiles, bloqués | 0 |
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
- **
|
|
209
|
-
- **
|
|
210
|
-
- **
|
|
211
|
-
- **WARDEN
|
|
193
|
+
Le 16 octobre 2026, nous avons exécuté WARDEN, mcp-audit 0.18.2 (`--connect`), mcp-shield 1.0.4, truecopy 0.10.4 et mcpsentry 0.1.5 sur les mêmes serveurs. Chaque serveur était rejoué en stdio, si bien que chaque scanner s'y connectait comme sur le terrain. Chaque scanner a tourné dans un conteneur gVisor sans réseau, à partir d'images figées dont le contenu est haché dans un manifeste. Le banc d'essai, les jeux, le manifeste et chaque jugement sont dans [`scripts/scanner-comparison`](../scripts/scanner-comparison/). Le compte rendu complet, avec la méthode et chaque réserve, est la [comparaison de scanners](scanner-comparison.fr.md).
|
|
194
|
+
|
|
195
|
+
Les lignes MCPTox viennent de MCPTox (Wang et al., AAAI 2026), un benchmark publié de 485 outils empoisonnés écrits pour 45 vrais serveurs MCP. Nous avons coupé ses serveurs en deux avec un hachage fixe. Les règles v10 ont été écrites à partir de 22 serveurs ; le tableau rapporte les 23 autres, avec 218 outils empoisonnés auxquels aucune règle n'a été ajustée. v11 et v12 n'en ont pas été tirées non plus et donnent les mêmes verdicts que v10.
|
|
196
|
+
|
|
197
|
+
| Serveurs | WARDEN 0.16.0 (v12) | mcp-audit 0.18.2 | mcp-shield 1.0.4 | truecopy 0.10.4 | mcpsentry 0.1.5 |
|
|
198
|
+
|---|---|---|---|---|---|
|
|
199
|
+
| 23 attaques écrites par nous, bloquées | 20 | 10 | 6 | 8 | 4 |
|
|
200
|
+
| 10 attaques tirées des fixtures de mcp-audit et de mcp-shield, bloquées | 10 | 10 | 8 | 7 | 5 |
|
|
201
|
+
| 12 cas bénins difficiles, bloqués | 0 | 1 | 1 | 1 | 2 |
|
|
202
|
+
| 218 outils empoisonnés de MCPTox sur les serveurs réservés, bloqués | 171 | 25 | 41 | 27 | 8 |
|
|
203
|
+
| 225 outils de MCPTox avec un préfixe `<IMPORTANT>` ou « Ignore the previous instructions », bloqués | 225 | 222 | 41 | 141 | 136 |
|
|
204
|
+
| 45 serveurs propres de MCPTox, bloqués | 0 | 2 | 3 | 0 | 1 |
|
|
205
|
+
| 986 serveurs publics, bloqués | 3 | 33 | 343 | 39 | 86 |
|
|
206
|
+
| …blocages qui tiennent à la lecture du texte | 1, et 1 discutable | 0 | 1 sur les 34 lus | 1 | 0 |
|
|
207
|
+
| 14 933 paquets npm et PyPI observés par HISTOR, bloqués | 369 | 928 | 5 354 | 252 | 1 449 |
|
|
208
|
+
|
|
209
|
+
- **Lisez d'abord les lignes sur de vrais serveurs.** Aucune règle n'y a été ajustée. Les 33 blocages de mcp-audit sur le corpus sont surtout des « homoglyphes » dans un texte écrit entièrement dans son propre alphabet et des consignes d'honnêteté comme « do not tell the user the check digits are wrong ». mcp-shield bloque un tiers des vrais serveurs, presque toujours sur un mot-clé : « API key », « token », `.env`, « .. ». truecopy bloque les générateurs docker-compose d'un même éditeur parce qu'ils produisent un `.env.example`. Le motif base64 de mcpsentry correspond à toute suite de 40 lettres et barres obliques, comme en produisent les chemins JSON Schema. Sur 14 933 paquets npm et PyPI, un échantillon aléatoire de 996 où chaque blocage a été jugé compte 23 blocages de WARDEN, dont aucun ne tient et 4 sont discutables ; mcp-shield bloque 339 de ces mêmes paquets et mcpsentry 112.
|
|
210
|
+
- **Sachez quels chiffres sont ajustés.** Nous avons écrit le premier jeu d'attaques, et les règles v9 ont été écrites après la lecture des deux jeux d'attaques. La ligne de la moitié réservée de MCPTox, les serveurs propres, le corpus et les paquets ne sont pas ajustés.
|
|
211
|
+
- **MCPTox teste une forme, pas un mot-clé.** Presque chaque outil empoisonné dit au modèle d'appeler d'abord un autre outil, ou de changer les arguments d'un autre. v10 a nommé cette forme (`TOOL_DEF_CROSS_TOOL`, voir [la chaîne de portes](gates.fr.md)) et v12 la garde. Avec le préfixe `<IMPORTANT>` du benchmark, la plupart des scanners détectent la plupart des outils.
|
|
212
|
+
- **Ce que WARDEN manque encore :** 47 des 218 outils MCPTox réservés, une consigne en chinois de lire `.env`, une paraphrase sans mot-clé (« gather every credential file … keep this step to yourself ») et « include the output of env ». Il en signale 41 sur 47 à titre consultatif, sans les bloquer. Avec le classificateur facultatif ci-dessus, les 218 sont signalés au niveau `high`.
|
|
213
|
+
- **WARDEN n'est pas seul sur ce créneau.** mcp-audit propose lui aussi un fichier lock, un mode diff pour les PR et SARIF ; truecopy épingle et signe lui aussi les définitions dans un fichier lock.
|
|
212
214
|
|
|
213
215
|
## Ce que scan ne fait pas
|
|
214
216
|
|
package/docs/scan.md
CHANGED
|
@@ -176,39 +176,41 @@ WARDEN_CLASSIFIER_API_KEY=… warden-mcp scan --classifier-url https://api.deeps
|
|
|
176
176
|
- **Authority, in any language.** Categories are `instruction_to_model`, `exfiltration`, `secret_request`, `concealment` and `cross_tool`. The prompt separates legitimate tool requirements from attempts to override the user, invent consent or control another tool. Random fences help delimit untrusted data; they are not a proof against injection. The field-reference protocol requires one decision per input and host-validated evidence field IDs. WARDEN resolves source previews itself and retries each incomplete input once in isolation. Provider outages do not fan out into per-tool requests.
|
|
177
177
|
- **Review is not approval.** Model language coverage varies. For a language-independent admission boundary use [`wrap --require-approval`](security-hardening-language-boundary.md). An LLM cannot create that approval. Historical HISTOR classifier results remain advisory and use their historical protocol.
|
|
178
178
|
|
|
179
|
-
Measured on 2026-10-
|
|
179
|
+
Measured on 2026-10-16 with `deepseek-flash`, the model HISTOR uses, on MCPTox (the published benchmark described in the comparison below), on real servers and on our own sets:
|
|
180
180
|
|
|
181
|
-
| | Rules (
|
|
182
|
-
|
|
183
|
-
| MCPTox held-out half, 218 poisoned tools caught | 171 |
|
|
184
|
-
| 45 clean MCPTox servers,
|
|
185
|
-
| 200 corpus servers drawn at random, blocked or flagged | 2
|
|
186
|
-
|
|
|
181
|
+
| | Rules (v12) | Rules + classifier at `high` |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| MCPTox held-out half, 218 poisoned tools caught | 171 | 218 |
|
|
184
|
+
| 45 clean MCPTox servers, flagged | 0 | 0 |
|
|
185
|
+
| 200 corpus servers drawn at random, blocked or flagged | 2 | 5 |
|
|
186
|
+
| 996 npm and PyPI packages from a seeded sample, blocked or flagged | 23 | 35 |
|
|
187
|
+
| 23 attacks we wrote / 12 hard benign cases | 20 / 0 | 23 / 0 |
|
|
187
188
|
|
|
188
|
-
The two the rules block are the identity service and the deploy tool from the comparison below.
|
|
189
|
+
The two corpus servers the rules block are the identity service and the deploy tool from the comparison below. Of the classifier's `high` flags on real servers, most are workflow orders such as "call this tool first". Two packages are worth a human look and the rules block neither: one wraps its description in a fake "the user requested this" block and orders the model to call it before any reply; another sends file contents from the agent to its server with "Do NOT display … to the user". The model missed what the rules catch: an injection in a tool's name, a private key or seed phrase asked for as a parameter, and `rm -rf ~`. Together they catch all 23 of our attacks.
|
|
189
190
|
|
|
190
191
|
## How it compares
|
|
191
192
|
|
|
192
|
-
On 2026-10-
|
|
193
|
-
|
|
194
|
-
The
|
|
195
|
-
|
|
196
|
-
| Servers | WARDEN 0.
|
|
197
|
-
|
|
198
|
-
| 23 attacks we wrote, blocked |
|
|
199
|
-
| 10 attacks from mcp-audit's and mcp-shield's own fixtures, blocked |
|
|
200
|
-
| 12 hard benign cases, blocked | 0 |
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
- **
|
|
209
|
-
- **
|
|
210
|
-
- **
|
|
211
|
-
- **WARDEN
|
|
193
|
+
On 2026-10-16 we ran WARDEN, mcp-audit 0.18.2 (`--connect`), mcp-shield 1.0.4, truecopy 0.10.4 and mcpsentry 0.1.5 over the same servers. Each server was replayed over stdio, so every scanner connected to it as it would in the field. Every scanner ran in a gVisor container with no network, from pinned images whose contents are hashed in a manifest. The harness, the sets, the manifest and every judgment are in [`scripts/scanner-comparison`](../scripts/scanner-comparison/). The full write-up, with the method and every caveat, is the [scanner comparison](scanner-comparison.md).
|
|
194
|
+
|
|
195
|
+
The MCPTox rows come from MCPTox (Wang et al., AAAI 2026), a published benchmark of 485 poisoned tools written for 45 real MCP servers. We split its servers in two by a fixed hash. Ruleset v10 was written from 22 servers; the table reports the other 23, with 218 poisoned tools no rule was fitted to. v11 and v12 were not written from them either, and give the same verdicts as v10.
|
|
196
|
+
|
|
197
|
+
| Servers | WARDEN 0.16.0 (v12) | mcp-audit 0.18.2 | mcp-shield 1.0.4 | truecopy 0.10.4 | mcpsentry 0.1.5 |
|
|
198
|
+
|---|---|---|---|---|---|
|
|
199
|
+
| 23 attacks we wrote, blocked | 20 | 10 | 6 | 8 | 4 |
|
|
200
|
+
| 10 attacks from mcp-audit's and mcp-shield's own fixtures, blocked | 10 | 10 | 8 | 7 | 5 |
|
|
201
|
+
| 12 hard benign cases, blocked | 0 | 1 | 1 | 1 | 2 |
|
|
202
|
+
| 218 poisoned MCPTox tools on the held-out servers, blocked | 171 | 25 | 41 | 27 | 8 |
|
|
203
|
+
| 225 MCPTox tools with an `<IMPORTANT>` or "Ignore the previous instructions" prefix, blocked | 225 | 222 | 41 | 141 | 136 |
|
|
204
|
+
| 45 clean MCPTox servers, blocked | 0 | 2 | 3 | 0 | 1 |
|
|
205
|
+
| 986 public servers, blocked | 3 | 33 | 343 | 39 | 86 |
|
|
206
|
+
| …blocks that hold up when the text is read | 1, and 1 arguable | 0 | 1 of the 34 we read | 1 | 0 |
|
|
207
|
+
| 14,933 npm and PyPI packages HISTOR observed, blocked | 369 | 928 | 5,354 | 252 | 1,449 |
|
|
208
|
+
|
|
209
|
+
- **Read the real-server rows first.** No rule was fitted to them. mcp-audit's 33 corpus blocks are mostly "homoglyphs" in text written wholly in its own script and honesty instructions such as "do not tell the user the check digits are wrong". mcp-shield blocks a third of real servers, almost all on a keyword: "API key", "token", `.env`, "..". truecopy blocks one vendor's docker-compose generators because they produce a `.env.example`. mcpsentry's base64 pattern matches any 40-character run of letters and slashes, which JSON Schema paths produce. On 14,933 npm and PyPI packages, a seeded sample of 996 where we judged every block has 23 WARDEN blocks, none of which holds up and 4 of which are arguable; mcp-shield blocks 339 of the same packages and mcpsentry 112.
|
|
210
|
+
- **Know which numbers are fitted.** We wrote the first attack set, and ruleset v9 was written after we had read both attack sets. The held-out MCPTox row, the clean servers, the corpus and the packages are not fitted.
|
|
211
|
+
- **MCPTox tests a shape, not a keyword.** Almost every poisoned tool tells the model to call another tool first, or to change another tool's arguments. v10 named that shape (`TOOL_DEF_CROSS_TOOL`, see [the gate chain](gates.md)) and v12 keeps it. Add the benchmark's `<IMPORTANT>` prefix and most scanners catch most tools.
|
|
212
|
+
- **What WARDEN still misses:** 47 of the 218 held-out MCPTox tools, an instruction in Chinese to read `.env`, a paraphrase with no keyword ("gather every credential file … keep this step to yourself") and "include the output of env". It reports 41 of those 47 as advisory, not as blocks. With the optional classifier above all 218 are flagged at `high`.
|
|
213
|
+
- **WARDEN is not alone in that slot.** mcp-audit also ships a lock file, a PR diff mode and SARIF; truecopy pins and signs definitions in a lock file too.
|
|
212
214
|
|
|
213
215
|
## What scan does not do
|
|
214
216
|
|
package/docs/scan.ru.md
CHANGED
|
@@ -176,39 +176,41 @@ WARDEN_CLASSIFIER_API_KEY=… warden-mcp scan --classifier-url https://api.deeps
|
|
|
176
176
|
- **Проверка полномочий на любом языке.** Пять категорий: `instruction_to_model`, `exfiltration`, `secret_request`, `concealment`, `cross_tool`. Промпт отличает требования самого инструмента от подмены указаний пользователя, выдуманного согласия и управления чужими инструментами. Случайные разделители не гарантируют защиту от инъекции. Протокол требует решение по каждому инструменту и ссылки на номера полей. WARDEN сам извлекает доказательства из исходника. Неполное решение повторно проверяется один раз отдельно; сбои API не размножают запросы.
|
|
177
177
|
- **Проверка не даёт доверия.** Владение языками зависит от модели. Независимую от языка границу допуска даёт [`wrap --require-approval`](security-hardening-language-boundary.md); LLM не может выдать это утверждение. Старые ответы HISTOR остаются рекомендательными и используют прежний протокол.
|
|
178
178
|
|
|
179
|
-
Замер
|
|
179
|
+
Замер 16 октября 2026 года на `deepseek-flash`, той же модели, что у HISTOR, на MCPTox (опубликованный бенчмарк, он описан в сравнении ниже), на настоящих серверах и на наших наборах:
|
|
180
180
|
|
|
181
|
-
| | Правила (
|
|
182
|
-
|
|
183
|
-
| Отложенная половина MCPTox, поймано из 218 отравленных инструментов | 171 |
|
|
184
|
-
| 45 чистых серверов MCPTox,
|
|
185
|
-
| 200
|
|
186
|
-
|
|
|
181
|
+
| | Правила (v12) | Правила + классификатор на `high` |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| Отложенная половина MCPTox, поймано из 218 отравленных инструментов | 171 | 218 |
|
|
184
|
+
| 45 чистых серверов MCPTox, помечено | 0 | 0 |
|
|
185
|
+
| 200 случайно выбранных серверов корпуса, заблокировано или помечено | 2 | 5 |
|
|
186
|
+
| 996 пакетов npm и PyPI из случайной выборки, заблокировано или помечено | 23 | 35 |
|
|
187
|
+
| 23 атаки, написанные нами / 12 трудных безобидных случаев | 20 / 0 | 23 / 0 |
|
|
187
188
|
|
|
188
|
-
Два
|
|
189
|
+
Два сервера корпуса, которые блокируют правила, — это сервис идентичности и инструмент развёртывания из сравнения ниже. Пометки классификатора `high` на настоящих серверах — в основном распоряжения о порядке работы вроде «сначала вызови этот инструмент». Два пакета стоит посмотреть человеку, и правила не блокируют ни один: один оборачивает описание в поддельный блок «пользователь сам это попросил» и велит модели вызывать его перед любым ответом; другой отправляет содержимое файлов от агента на свой сервер с «Do NOT display … to the user». Модель пропустила то, что ловят правила: инъекцию в имени инструмента, приватный ключ или seed-фразу, запрошенные как параметр, и `rm -rf ~`. Вместе они ловят все 23 наши атаки.
|
|
189
190
|
|
|
190
191
|
## Сравнение
|
|
191
192
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
| Серверы | WARDEN 0.
|
|
197
|
-
|
|
198
|
-
| 23 атаки, написанные нами, заблокировано |
|
|
199
|
-
| 10 атак из фикстур самих mcp-audit и mcp-shield, заблокировано |
|
|
200
|
-
| 12 трудных безобидных случаев, заблокировано | 0 |
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
-
|
|
209
|
-
-
|
|
210
|
-
-
|
|
211
|
-
-
|
|
193
|
+
16 октября 2026 года мы прогнали WARDEN, mcp-audit 0.18.2 (`--connect`), mcp-shield 1.0.4, truecopy 0.10.4 и mcpsentry 0.1.5 по одним и тем же серверам. Каждый сервер воспроизводился по stdio, так что каждый сканер подключался к нему так же, как в жизни. Каждый сканер работал в контейнере gVisor без сети, из закреплённых образов, содержимое которых захешировано в манифесте. Стенд, наборы, манифест и каждая разметка лежат в [`scripts/scanner-comparison`](../scripts/scanner-comparison/). Полное описание с методикой и всеми оговорками — в [сравнении сканеров](scanner-comparison.ru.md).
|
|
194
|
+
|
|
195
|
+
Строки MCPTox взяты из MCPTox (Wang et al., AAAI 2026) — опубликованного бенчмарка из 485 отравленных инструментов, написанных для 45 настоящих MCP-серверов. Мы разделили его серверы на две части фиксированным хешем. Набор правил v10 писался по 22 серверам; таблица показывает остальные 23, с 218 отравленными инструментами, под которые не подгонялось ни одно правило. v11 и v12 по ним тоже не писались и дают те же вердикты, что и v10.
|
|
196
|
+
|
|
197
|
+
| Серверы | WARDEN 0.16.0 (v12) | mcp-audit 0.18.2 | mcp-shield 1.0.4 | truecopy 0.10.4 | mcpsentry 0.1.5 |
|
|
198
|
+
|---|---|---|---|---|---|
|
|
199
|
+
| 23 атаки, написанные нами, заблокировано | 20 | 10 | 6 | 8 | 4 |
|
|
200
|
+
| 10 атак из фикстур самих mcp-audit и mcp-shield, заблокировано | 10 | 10 | 8 | 7 | 5 |
|
|
201
|
+
| 12 трудных безобидных случаев, заблокировано | 0 | 1 | 1 | 1 | 2 |
|
|
202
|
+
| 218 отравленных инструментов MCPTox на отложенных серверах, заблокировано | 171 | 25 | 41 | 27 | 8 |
|
|
203
|
+
| 225 инструментов MCPTox с префиксом `<IMPORTANT>` или «Ignore the previous instructions», заблокировано | 225 | 222 | 41 | 141 | 136 |
|
|
204
|
+
| 45 чистых серверов MCPTox, заблокировано | 0 | 2 | 3 | 0 | 1 |
|
|
205
|
+
| 986 публичных серверов, заблокировано | 3 | 33 | 343 | 39 | 86 |
|
|
206
|
+
| …блокировок по делу, если прочитать текст | 1 и 1 спорная | 0 | 1 из 34 прочитанных | 1 | 0 |
|
|
207
|
+
| 14 933 пакета npm и PyPI, которые наблюдал HISTOR, заблокировано | 369 | 928 | 5 354 | 252 | 1 449 |
|
|
208
|
+
|
|
209
|
+
- **Сначала читайте строки с настоящими серверами.** Под них не подгонялось ни одно правило. 33 блокировки mcp-audit на корпусе — в основном «гомоглифы» в тексте, целиком написанном в своей письменности, и инструкции честности вроде «do not tell the user the check digits are wrong». mcp-shield блокирует треть настоящих серверов, почти всегда по ключевому слову: «API key», «token», `.env`, «..». truecopy блокирует генераторы docker-compose одного поставщика за то, что они выпускают `.env.example`. Шаблон base64 у mcpsentry совпадает с любой цепочкой из 40 букв и косых черт, какие дают пути JSON Schema. На 14 933 пакетах npm и PyPI в случайной выборке из 996, где мы разобрали каждую блокировку, у WARDEN 23 блокировки, ни одной по делу и 4 спорные; mcp-shield блокирует 339 из тех же пакетов, mcpsentry — 112.
|
|
210
|
+
- **Знайте, какие числа подогнаны.** Первый набор атак написали мы, а набор правил v9 писался после того, как мы прочитали оба набора атак. Строка отложенной половины MCPTox, чистые серверы, корпус и пакеты не подогнаны.
|
|
211
|
+
- **MCPTox проверяет форму, а не ключевое слово.** Почти каждый отравленный инструмент велит модели сначала вызвать другой инструмент или поменять его аргументы. v10 дал этой форме имя (`TOOL_DEF_CROSS_TOOL`, см. [цепочку гейтов](gates.ru.md)), v12 её сохраняет. С префиксом бенчмарка `<IMPORTANT>` большинство сканеров ловит большинство инструментов.
|
|
212
|
+
- **Что WARDEN всё ещё пропускает:** 47 из 218 отложенных инструментов MCPTox, инструкцию по-китайски прочитать `.env`, перефразировку без ключевых слов («gather every credential file … keep this step to yourself») и «include the output of env». О 41 из этих 47 он сообщает рекомендательно, а не блокирует. С необязательным классификатором выше все 218 помечаются на `high`.
|
|
213
|
+
- **WARDEN в этой нише не один.** У mcp-audit тоже есть лок-файл, режим диффа для PR и SARIF; truecopy тоже закрепляет и подписывает определения в лок-файле.
|
|
212
214
|
|
|
213
215
|
## Чего scan не делает
|
|
214
216
|
|