@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.
Files changed (60) hide show
  1. package/CHANGELOG.md +40 -1
  2. package/README-es.md +20 -15
  3. package/README-fr.md +20 -15
  4. package/README-ru.md +20 -15
  5. package/README-zh.md +20 -15
  6. package/README.md +20 -15
  7. package/dist/claude-hook.d.ts +4 -0
  8. package/dist/claude-hook.d.ts.map +1 -1
  9. package/dist/claude-hook.js +42 -18
  10. package/dist/claude-hook.js.map +1 -1
  11. package/dist/flow-guard.d.ts +133 -0
  12. package/dist/flow-guard.d.ts.map +1 -0
  13. package/dist/flow-guard.js +1062 -0
  14. package/dist/flow-guard.js.map +1 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +1 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/mcp-tools.d.ts.map +1 -1
  20. package/dist/mcp-tools.js +118 -26
  21. package/dist/mcp-tools.js.map +1 -1
  22. package/dist/review-diff.d.ts +51 -0
  23. package/dist/review-diff.d.ts.map +1 -0
  24. package/dist/review-diff.js +237 -0
  25. package/dist/review-diff.js.map +1 -0
  26. package/dist/static-scan.d.ts +1 -1
  27. package/dist/static-scan.d.ts.map +1 -1
  28. package/dist/static-scan.js +78 -2
  29. package/dist/static-scan.js.map +1 -1
  30. package/dist/wrap-cli.d.ts +3 -0
  31. package/dist/wrap-cli.d.ts.map +1 -1
  32. package/dist/wrap-cli.js +8 -2
  33. package/dist/wrap-cli.js.map +1 -1
  34. package/dist/wrap-state.d.ts.map +1 -1
  35. package/dist/wrap-state.js +5 -0
  36. package/dist/wrap-state.js.map +1 -1
  37. package/dist/wrap.d.ts.map +1 -1
  38. package/dist/wrap.js +28 -1
  39. package/dist/wrap.js.map +1 -1
  40. package/docs/flow-guard.es.md +214 -0
  41. package/docs/flow-guard.fr.md +220 -0
  42. package/docs/flow-guard.md +224 -0
  43. package/docs/flow-guard.ru.md +210 -0
  44. package/docs/flow-guard.zh.md +159 -0
  45. package/docs/gates.es.md +27 -3
  46. package/docs/gates.fr.md +28 -2
  47. package/docs/gates.md +26 -3
  48. package/docs/gates.ru.md +26 -3
  49. package/docs/gates.zh.md +15 -2
  50. package/docs/scan.es.md +30 -28
  51. package/docs/scan.fr.md +30 -28
  52. package/docs/scan.md +30 -28
  53. package/docs/scan.ru.md +30 -28
  54. package/docs/scan.zh.md +30 -28
  55. package/docs/scanner-comparison.es.md +289 -174
  56. package/docs/scanner-comparison.fr.md +292 -178
  57. package/docs/scanner-comparison.md +234 -140
  58. package/docs/scanner-comparison.ru.md +279 -165
  59. package/docs/scanner-comparison.zh.md +237 -90
  60. 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 月 9 日用 `deepseek-flash`(HISTOR 使用的同一模型)在 MCPTox(下文对比中介绍的公开基准)和我们自己的样本集上测得:
179
+ 2026 年 10 月 16 日用 `deepseek-flash`(HISTOR 使用的同一模型)在 MCPTox(下文对比中介绍的公开基准)、真实服务器和我们自己的样本集上测得:
180
180
 
181
- | | 规则(v10) | 规则 + 分类器,`high` 时阻止 | 规则 + 分类器的任何标记(仅作建议) |
182
- |---|---|---|---|
183
- | MCPTox 留出的一半,218 个投毒工具中被发现的数量 | 171 | 191 | 218 |
184
- | 45 台 MCPTox 干净服务器,被阻止或被标记 | 0 | 0 | 4 台被标记 |
185
- | 随机抽取的 200 台语料服务器,被阻止或被标记 | 2 台被阻止 | 2 台被阻止 | 2 台被阻止,另 12 台被标记 |
186
- | 我们写的 23 个攻击 / 12 个困难的良性样例 | 20 / 0 | 22 / 0 | 23 / 0 |
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
- 规则阻止的那两台是下文对比中的身份服务和部署工具。分类器标记的 13 台服务器都是 `medium` 或 `low`,没有 `high`。其中 6 台值得人工查看:一台要求模型“作为第一个也是唯一的动作”进行不可撤销的 ENS 名称转移,且不询问用户;另一台要求模型不要透露其数据来源。模型还标记了官方的 Fetch 服务器,它的描述告诉模型现在可以上网、不应拒绝。这是对模型的指令,但不是攻击。模型漏掉了规则能发现的内容:annotations 中的注入、以参数形式索要私钥或助记词,以及 `rm -rf ~`。
189
+ 规则阻止的两台语料服务器,是下文对比中的身份服务和部署工具。分类器在真实服务器上的 `high` 标记大多是“先调用这个工具”之类的工作流指令。有两个包值得人工查看,而规则一个也没有阻止:一个把描述包在伪造的“这是用户要求的”块中,并命令模型在任何回复之前先调用它;另一个把文件内容从智能体发送到自己的服务器,并写着 “Do NOT display … to the user”。模型漏掉了规则能抓到的东西:工具名中的注入、作为参数索要的私钥或助记词,以及 `rm -rf ~`。两者合起来能发现我们全部 23 个攻击。
189
190
 
190
191
  ## 对比
191
192
 
192
- 2026 年 10 月 9 日,我们在同一批服务器上运行了 WARDEN、mcp-audit 0.18.2(`--connect`)和 mcp-shield 1.0.4。每台服务器都通过 stdio 重放,因此每个扫描器连接它的方式与真实环境相同。测试工具、样本集和每一条判定都在 [`scripts/scanner-comparison`](../scripts/scanner-comparison/) 中。包含方法和全部注意事项的完整研究,见[扫描器对比](scanner-comparison.zh.md)。
193
-
194
- 最后三行来自 MCPTox(Wang 等,AAAI 2026):一个公开的基准,包含为 45 台真实 MCP 服务器编写的 485 个投毒工具。我们用固定哈希把它的服务器分成两半。ruleset v10 依据其中 22 台服务器编写;表中报告的是另外 23 台,共 218 个投毒工具,没有任何规则照着它们调过。
195
-
196
- | 服务器 | WARDEN 0.8.2(v8) | WARDEN 0.9.0(v10) | mcp-audit 0.18.2 | mcp-shield 1.0.4 |
197
- |---|---|---|---|---|
198
- | 我们编写的 23 个攻击,阻止数 | 14 | 20 | 10 | 6 |
199
- | 取自 mcp-audit 与 mcp-shield 自带样例的 10 个攻击,阻止数 | 7 | 10 | 10 | 8 |
200
- | 12 个困难的良性样例,阻止数 | 0 | 0 | 1 | 1 |
201
- | 986 台公开服务器,阻止数 | 3 | 3 | 33 | 343 |
202
- | …读过文本后站得住脚的阻止 | 1 台,另 1 台存疑 | 1 台,另 1 台存疑 | 0 | 随机抽取的 20 台中 0 台 |
203
- | MCPTox 留出服务器上的 218 个投毒工具,阻止数 | 26 | 171 | 25 | 41 |
204
- | 带 `<IMPORTANT>` 或 “Ignore the previous instructions” 前缀的 225 个 MCPTox 工具,阻止数 | 225 | 225 | 222 | 未运行 |
205
- | 45 台 MCPTox 干净服务器,阻止数 | 0 | 0 | 2 | 3 |
206
-
207
- - **先看语料这一行。** 没有任何规则是照着它调的。mcp-audit 的 33 次阻止中,16 次是对完全用本文字书写的文本报“同形字”(中文标点、希腊符号、西里尔字母),12 次是诚实性提示(如 “do not tell the user the check digits are wrong”),3 次是 base64 工具,一个 SSH 公钥工具,还有 WARDEN 也误阻止的那个部署工具。mcp-shield 阻止了 35% 的真实服务器,几乎都因为关键词:“API key”“token”、`.env`、“..”。省略号(“Shopify...”)被当作路径穿越。它也阻止了 WARDEN 阻止的那个身份服务,但依据是 “credentials” 这个词。
208
- - **要清楚哪些数字是调出来的。** 第一组攻击样本是我们写的。ruleset v9 是在读过两组攻击样本之后写的,v10 是在读过另一半的 22 台 MCPTox 服务器之后写的。所以 20 和 10 是“照着见过的样本调出来的规则”的召回率。MCPTox 留出的那一行、干净服务器、语料以及整个 0.8.2 列都没有经过调整。在语料上,v10 阻止的与 v8 完全相同。
209
- - **MCPTox 考的是结构,不是关键词。** 几乎每个投毒工具都要求模型先调用另一个工具,或修改另一个工具的参数。v10 为这种结构命名(`TOOL_DEF_CROSS_TOOL`,见[关卡链](gates.zh.md)),在留出的 218 个工具中阻止 171 个;在用来编写它的那一半上是 267 个中的 189 个。加上基准自带的 `<IMPORTANT>` 或 “Ignore the previous instructions” 前缀后,我们运行的每个扫描器都能发现;mcp-shield 没有在这一组上运行。在干净服务器上,mcp-audit 阻止了 AmapMap 和 BaiduMap,mcp-shield 以 “sensitive file access” 为由阻止了 FileSystem、AdFin 和 Commander。
210
- - **WARDEN 仍会漏掉的:** 留出的 218 个 MCPTox 工具中的 47 个、用中文写的读取 `.env` 的指令、没有关键词的改写(“gather every credential file … keep this step to yourself”),以及 “include the output of env”。这 47 个中的 41 个以及我们的这三个,它会以建议的形式报告,但不会阻止。这些需要基于语义的检查,而不是再加一条规则:加上上文的可选分类器,218 个中有 191 个在 `high` 级别被阻止,218 个全部被标记。
211
- - **在这个位置上 WARDEN 并不是唯一的选择。** mcp-audit 同样提供 lock 文件、PR diff 模式和 SARIF。
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