@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/scan.zh.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 自行从原文提取证据。每个未完成的工具最多单独重试一次。随机分隔符不保证免疫提示注入。
|
|
177
177
|
- **检查不等于批准。** [`wrap --require-approval`](security-hardening-language-boundary.md) 提供独立于语言的操作员批准边界。HISTOR 的历史模型结果仍然仅供参考。
|
|
178
178
|
|
|
179
|
-
2026 年 10 月
|
|
179
|
+
2026 年 10 月 16 日用 `deepseek-flash`(HISTOR 使用的同一模型)在 MCPTox(下文对比中介绍的公开基准)、真实服务器和我们自己的样本集上测得:
|
|
180
180
|
|
|
181
|
-
| | 规则(
|
|
182
|
-
|
|
183
|
-
| MCPTox 留出的一半,218 个投毒工具中被发现的数量 | 171 |
|
|
184
|
-
| 45
|
|
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”。模型漏掉了规则能抓到的东西:工具名中的注入、作为参数索要的私钥或助记词,以及 `rm -rf ~`。两者合起来能发现我们全部 23 个攻击。
|
|
189
190
|
|
|
190
191
|
## 对比
|
|
191
192
|
|
|
192
|
-
2026 年 10 月
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
| 服务器 | WARDEN 0.
|
|
197
|
-
|
|
198
|
-
| 我们编写的 23 个攻击,阻止数 |
|
|
199
|
-
|
|
|
200
|
-
| 12 个困难的良性样例,阻止数 | 0 |
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
| MCPTox
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
-
|
|
209
|
-
-
|
|
210
|
-
- **
|
|
211
|
-
-
|
|
193
|
+
2026 年 10 月 16 日,我们在同一批服务器上运行了 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.zh.md)。
|
|
194
|
+
|
|
195
|
+
MCPTox 各行来自 MCPTox(Wang 等,AAAI 2026):一个公开的基准,包含为 45 台真实 MCP 服务器编写的 485 个投毒工具。我们用固定哈希把它的服务器分成两半。规则集 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
|
+
| mcp-audit 与 mcp-shield 自带样例中的 10 个攻击,阻止数 | 10 | 10 | 8 | 7 | 5 |
|
|
201
|
+
| 12 个困难的良性样例,阻止数 | 0 | 1 | 1 | 1 | 2 |
|
|
202
|
+
| 留出服务器上的 218 个 MCPTox 投毒工具,阻止数 | 171 | 25 | 41 | 27 | 8 |
|
|
203
|
+
| 带 `<IMPORTANT>` 或 “Ignore the previous instructions” 前缀的 225 个 MCPTox 工具,阻止数 | 225 | 222 | 41 | 141 | 136 |
|
|
204
|
+
| 45 台干净的 MCPTox 服务器,阻止数 | 0 | 2 | 3 | 0 | 1 |
|
|
205
|
+
| 986 台公开服务器,阻止数 | 3 | 33 | 343 | 39 | 86 |
|
|
206
|
+
| ……读过文本后站得住的阻止 | 1 个,另有 1 个有争议 | 0 | 我们读过的 34 个中有 1 个 | 1 | 0 |
|
|
207
|
+
| HISTOR 观察过的 14,933 个 npm 与 PyPI 包,阻止数 | 369 | 928 | 5,354 | 252 | 1,449 |
|
|
208
|
+
|
|
209
|
+
- **先看真实服务器这几行。** 没有任何规则照着它们调过。mcp-audit 在语料上的 33 个阻止,大多是完全用本身文字书写的文本中的“同形字”,以及 “do not tell the user the check digits are wrong” 这样的诚实性说明。mcp-shield 阻止了三分之一的真实服务器,几乎都是因为关键词:“API key”、“token”、`.env`、“..”。truecopy 阻止了同一厂商的 docker-compose 生成器,因为它们会生成 `.env.example`。mcpsentry 的 base64 模式会匹配任何 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.zh.md)),v12 保留了它。加上基准的 `<IMPORTANT>` 前缀后,大多数扫描器能发现大多数工具。
|
|
212
|
+
- **WARDEN 仍然漏掉的:** 218 个留出 MCPTox 工具中的 47 个、一条用中文要求读取 `.env` 的指令、一句没有关键词的改写(“gather every credential file … keep this step to yourself”)以及 “include the output of env”。这 47 个中有 41 个它以建议性发现的形式报告,而不是阻止。启用上文的可选分类器后,全部 218 个都在 `high` 级别被标记。
|
|
213
|
+
- **在这一位置上 WARDEN 并不孤单。** mcp-audit 也提供 lock 文件、PR 差异模式和 SARIF;truecopy 同样会在 lock 文件中固定并签名工具定义。
|
|
212
214
|
|
|
213
215
|
## scan 不做什么
|
|
214
216
|
|