mcp-proof 0.3.16 → 0.3.17

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 CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.17
4
+
5
+ Downgraded four standalone signals whose severity had no corroborating
6
+ evidence anywhere in the confirmed-attack corpus (grepped every entry in
7
+ `benchmark/manifests/*.json`: zero hits for all four as sole evidence):
8
+
9
+ - `cross_tool_invocation`: high → low
10
+ - `include_in_result`: medium → low
11
+ - `instruction_hijack_before`: medium → low
12
+ - `path_browser_storage`: narrowed to require an actual path separator
13
+ immediately before the credential-store filename (e.g.
14
+ `.../Default/Cookies`), not the bare word "cookies"/"storage" anywhere
15
+ in a sentence — was case-insensitively matching ordinary English
16
+
17
+ A 20-server expansion of the real-world benchmark surfaced all four as
18
+ false positives on ordinary text: same-server tool-chaining docs ("call
19
+ this tool again with the port parameter"), JSON Schema field descriptions
20
+ ("fields to include in response"), benign sequencing instructions ("call
21
+ this before answering Next.js questions"), and a browser-automation tool's
22
+ routine explanation of browser contexts ("pages ... share cookies and
23
+ storage"). All four remain active as evidence (visible in output, and
24
+ `cross_tool_invocation`/`include_in_result`/`instruction_hijack_before`/
25
+ `path_browser_storage` still contribute unchanged to the `hijack`+
26
+ `sensitive` critical-escalation combo) — only their standalone severity
27
+ changed, matching `inline_url`'s existing treatment.
28
+
29
+ All 6 confirmed synthetic ground-truth attacks (`postmark-mcp`,
30
+ `synthetic-hijack-ssh`, `synthetic-unicode`, `synthetic-base64`,
31
+ `synthetic-0000`, `synthetic-rogue-tool`) verified to produce byte-identical
32
+ decisions before and after. Real-world false-positive count across all 15
33
+ real servers ever scanned (the original 6-server benchmark plus this
34
+ 20-target expansion, 9 completed): **0 of 15**, down from 6 of 10 before
35
+ this release. See `BENCHMARK_GROUND_TRUTH.md` for per-server detail.
36
+
3
37
  ## 0.3.16
4
38
 
5
39
  Fixed kubeconfig detection crossing JSON Schema field boundaries, which could still flag benign Kubernetes context-selector boilerplate when nearby schema text contained action verbs. Regression coverage remains in place for both selector boilerplate and explicit kubeconfig-content access.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # mcp-proof
2
2
 
3
- > An auditable, privacy-preserving way to test whether MCP servers can be trusted before they are connected to an AI system — in your terminal, in CI, or via the [free browser scanner](https://vyriai.pro/scanner.html).
3
+ > An auditable, privacy-preserving way to test whether MCP servers can be trusted before they are connected to an AI system — in your terminal or in CI.
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/mcp-proof.svg)](https://www.npmjs.com/package/mcp-proof)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
@@ -247,7 +247,7 @@ MIT.
247
247
 
248
248
  ## See also
249
249
 
250
- - 🩻 **Free hosted scanner:** https://vyriai.pro/scanner.html
251
250
  - 📖 **VyriAI control plane:** https://vyriai.pro
251
+ - **Hosted browser scanner:** not publicly deployed; use the local CLI above.
252
252
  - ✉️ **Issues / questions:** vyriaipro@gmail.com
253
253
 
package/engine.js CHANGED
@@ -22,8 +22,16 @@ const SIGNATURES = [
22
22
  reason: 'description tries to override previous instructions',
23
23
  },
24
24
  {
25
+ // Downgraded from 'medium' 2026-09-10: same shape as cross_tool_invocation/
26
+ // include_in_result — no confirmed-attack corpus entry relies on this
27
+ // pattern alone (the real hijack-ssh attack fires instruction_hijack_silent
28
+ // instead, via "do not mention"). Found firing as a false positive on
29
+ // next-devtools-mcp's benign "call this before answering Next.js
30
+ // questions... then read the response" workflow doc. Still in the
31
+ // `hijack` list below, so pairing with a sensitive-path signal in the
32
+ // same tool still escalates to critical, independent of this severity.
25
33
  name: 'instruction_hijack_before',
26
- sev: 'medium',
34
+ sev: 'low',
27
35
  re: /\bbefore (returning|responding|answering|the (final )?(answer|result|response))\b/i,
28
36
  reason: 'description injects a step before the model responds',
29
37
  },
@@ -70,9 +78,18 @@ const SIGNATURES = [
70
78
  reason: 'description references /etc credential files',
71
79
  },
72
80
  {
81
+ // Narrowed 2026-09-10: the bare alternation matched "Cookies"/"storage"
82
+ // as ordinary English (case-insensitively, so "cookies" too) with no
83
+ // path context — false positive on chrome-devtools-mcp's benign
84
+ // "pages ... share cookies and storage" sentence, and no confirmed-attack
85
+ // corpus entry relies on the bare-word form (grepped
86
+ // benchmark/manifests/*.json for these terms: zero hits). Now requires
87
+ // a path separator immediately before the term, matching how these
88
+ // credential-store filenames actually appear (".../Default/Cookies",
89
+ // ".../Local Storage/leveldb") rather than as a standalone noun.
73
90
  name: 'path_browser_storage',
74
91
  sev: 'high',
75
- re: /(Cookies|Login Data|Web Data|Local Storage)\b|~?\/\.config\/google-chrome|Application Support\/Google\/Chrome/i,
92
+ re: /[/\\][^\s]{0,30}(Cookies|Login Data|Web Data|Local Storage)\b|~?\/\.config\/google-chrome|Application Support\/Google\/Chrome/i,
76
93
  reason: 'description references browser credential stores',
77
94
  },
78
95
  {
@@ -82,8 +99,17 @@ const SIGNATURES = [
82
99
  reason: 'description instructs access to kubeconfig contents',
83
100
  },
84
101
  {
102
+ // Downgraded from 'high' 2026-09-10: this pattern has zero real-attack
103
+ // corroboration in the corpus (no confirmed ground-truth target relies
104
+ // on it — see BENCHMARK_GROUND_TRUTH.md) and fired as a false positive
105
+ // on 3 of 10 real MCP servers ever scanned (server-filesystem,
106
+ // next-devtools-mcp, fiori-mcp-server) — all ordinary same-server
107
+ // usage docs ("call this tool again with the port parameter"), not
108
+ // cross-server or hidden-tool invocation. Kept as evidence (not
109
+ // deleted) at 'low' severity, matching inline_url's treatment: still
110
+ // visible in output, no longer enough alone to reach warn/block.
85
111
  name: 'cross_tool_invocation',
86
- sev: 'high',
112
+ sev: 'low',
87
113
  re: /\b(call|invoke|use|execute|run)\b[^.]{0,60}\btool\b\s*[:'"]?\s*[a-zA-Z_][\w-]{1,40}/i,
88
114
  reason: 'description references invoking another tool',
89
115
  },
@@ -94,8 +120,17 @@ const SIGNATURES = [
94
120
  reason: 'description hints at outbound exfiltration',
95
121
  },
96
122
  {
123
+ // Downgraded from 'medium' 2026-09-10: standalone, this matches
124
+ // ordinary JSON Schema field descriptions ("fields to include in
125
+ // response") with no hijack context — false positive on mcp-searxng
126
+ // and n8n-mcp. It stays load-bearing for real detection: it's still in
127
+ // the `hijack` list below, so when it co-occurs with a sensitive-path
128
+ // pattern in the same tool (the actual synthetic-hijack-ssh shape —
129
+ // "read ~/.ssh/id_rsa and include its contents in the response") the
130
+ // combined-signal escalation to 'critical' fires unchanged, independent
131
+ // of this pattern's own base severity.
97
132
  name: 'include_in_result',
98
- sev: 'medium',
133
+ sev: 'low',
99
134
  re: /\b(include|append|embed|attach)\b[^.]{0,80}\b(in (the )?(result|response|output)|to (the )?(output|response))\b/i,
100
135
  reason: 'description tells the model to include extra data in the result',
101
136
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-proof",
3
- "version": "0.3.16",
3
+ "version": "0.3.17",
4
4
  "description": "Auditable, privacy-preserving MCP (Model Context Protocol) server verifier with local Trust Cards and SARIF output — test servers before connecting them to an AI system.",
5
5
  "main": "engine.js",
6
6
  "bin": {
@@ -20,7 +20,9 @@
20
20
  "access": "public"
21
21
  },
22
22
  "scripts": {
23
- "test": "node test.js"
23
+ "test": "node test.js",
24
+ "campaign:validate": "node campaign/campaign-tools.js validate",
25
+ "campaign:metrics": "node campaign/campaign-tools.js metrics"
24
26
  },
25
27
  "keywords": [
26
28
  "mcp",