@weave_protocol/mund 0.1.10 → 0.1.11
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/dist/analyzers/index.d.ts +1 -0
- package/dist/analyzers/index.d.ts.map +1 -1
- package/dist/analyzers/index.js +4 -1
- package/dist/analyzers/index.js.map +1 -1
- package/dist/analyzers/mcp-server-analyzer.d.ts +146 -0
- package/dist/analyzers/mcp-server-analyzer.d.ts.map +1 -0
- package/dist/analyzers/mcp-server-analyzer.js +634 -0
- package/dist/analyzers/mcp-server-analyzer.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp-scanning.d.ts +16 -0
- package/dist/tools/mcp-scanning.d.ts.map +1 -0
- package/dist/tools/mcp-scanning.js +325 -0
- package/dist/tools/mcp-scanning.js.map +1 -0
- package/package.json +1 -1
- package/src/analyzers/index.ts +4 -1
- package/src/analyzers/mcp-server-analyzer.ts +788 -0
- package/src/tools/index.ts +8 -0
- package/src/tools/mcp-scanning.ts +382 -0
|
@@ -7,6 +7,7 @@ export { PIIDetector } from './pii-detector.js';
|
|
|
7
7
|
export { CodeAnalyzer } from './code-analyzer.js';
|
|
8
8
|
export { InjectionDetector } from './injection-detector.js';
|
|
9
9
|
export { ExfiltrationDetector } from './exfiltration-detector.js';
|
|
10
|
+
export { McpServerAnalyzer } from './mcp-server-analyzer.js';
|
|
10
11
|
import type { IAnalyzer } from '../types.js';
|
|
11
12
|
/**
|
|
12
13
|
* Get all available analyzers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAQ7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAS1C;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAc;gBAEnB,SAAS,CAAC,EAAE,SAAS,EAAE;IAI7B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,aAAa,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,OAAO,aAAa,EAAE,aAAa,EAAE,CAAC;IAqB/H,WAAW,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAItC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,gBAAgB,IAAI,MAAM,EAAE;CAG7B"}
|
package/dist/analyzers/index.js
CHANGED
|
@@ -7,11 +7,13 @@ export { PIIDetector } from './pii-detector.js';
|
|
|
7
7
|
export { CodeAnalyzer } from './code-analyzer.js';
|
|
8
8
|
export { InjectionDetector } from './injection-detector.js';
|
|
9
9
|
export { ExfiltrationDetector } from './exfiltration-detector.js';
|
|
10
|
+
export { McpServerAnalyzer } from './mcp-server-analyzer.js';
|
|
10
11
|
import { SecretScanner } from './secret-scanner.js';
|
|
11
12
|
import { PIIDetector } from './pii-detector.js';
|
|
12
13
|
import { CodeAnalyzer } from './code-analyzer.js';
|
|
13
14
|
import { InjectionDetector } from './injection-detector.js';
|
|
14
15
|
import { ExfiltrationDetector } from './exfiltration-detector.js';
|
|
16
|
+
import { McpServerAnalyzer } from './mcp-server-analyzer.js';
|
|
15
17
|
/**
|
|
16
18
|
* Get all available analyzers
|
|
17
19
|
*/
|
|
@@ -21,7 +23,8 @@ export function getAnalyzers() {
|
|
|
21
23
|
new PIIDetector(),
|
|
22
24
|
new CodeAnalyzer(),
|
|
23
25
|
new InjectionDetector(),
|
|
24
|
-
new ExfiltrationDetector()
|
|
26
|
+
new ExfiltrationDetector(),
|
|
27
|
+
new McpServerAnalyzer()
|
|
25
28
|
];
|
|
26
29
|
}
|
|
27
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,IAAI,aAAa,EAAE;QACnB,IAAI,WAAW,EAAE;QACjB,IAAI,YAAY,EAAE;QAClB,IAAI,iBAAiB,EAAE;QACvB,IAAI,oBAAoB,EAAE;QAC1B,IAAI,iBAAiB,EAAE;KACxB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,SAAS,CAAc;IAE/B,YAAY,SAAuB;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,YAAY,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,KAA4C;QAC5E,MAAM,SAAS,GAA0C,EAAE,CAAC;QAE5D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACtD,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,QAAQ,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3E,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtB,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACpE,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,QAAmB;QAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mund - The Guardian Protocol
|
|
3
|
+
* MCP Server Analyzer - Scans MCP server manifests for security issues
|
|
4
|
+
*
|
|
5
|
+
* Detects:
|
|
6
|
+
* - Prompt injection in tool descriptions ("line jumping" attacks)
|
|
7
|
+
* - Hidden Unicode characters
|
|
8
|
+
* - Dangerous permission patterns
|
|
9
|
+
* - Embedded secrets
|
|
10
|
+
* - Typosquatting of legitimate server names
|
|
11
|
+
*/
|
|
12
|
+
import { type DetectionRule, type SecurityIssue, type IAnalyzer } from '../types.js';
|
|
13
|
+
export interface McpServerManifest {
|
|
14
|
+
name: string;
|
|
15
|
+
version: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
tools?: McpToolDefinition[];
|
|
18
|
+
resources?: McpResourceDefinition[];
|
|
19
|
+
prompts?: McpPromptDefinition[];
|
|
20
|
+
repository?: string;
|
|
21
|
+
author?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface McpToolDefinition {
|
|
24
|
+
name: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
inputSchema?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
export interface McpResourceDefinition {
|
|
29
|
+
name: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
uri?: string;
|
|
32
|
+
mimeType?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface McpPromptDefinition {
|
|
35
|
+
name: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
arguments?: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
required?: boolean;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export interface McpScanResult {
|
|
44
|
+
server_name: string;
|
|
45
|
+
version: string;
|
|
46
|
+
scanned_at: string;
|
|
47
|
+
source?: string;
|
|
48
|
+
issue_count: number;
|
|
49
|
+
by_severity: {
|
|
50
|
+
critical: number;
|
|
51
|
+
high: number;
|
|
52
|
+
medium: number;
|
|
53
|
+
low: number;
|
|
54
|
+
info: number;
|
|
55
|
+
};
|
|
56
|
+
recommendation: 'DO_NOT_INSTALL' | 'REVIEW_CAREFULLY' | 'CAUTION' | 'APPEARS_SAFE';
|
|
57
|
+
capabilities: McpCapabilities;
|
|
58
|
+
issues: SecurityIssue[];
|
|
59
|
+
}
|
|
60
|
+
export interface McpCapabilities {
|
|
61
|
+
network: boolean;
|
|
62
|
+
filesystem: boolean;
|
|
63
|
+
execution: boolean;
|
|
64
|
+
environment: boolean;
|
|
65
|
+
database: boolean;
|
|
66
|
+
crypto: boolean;
|
|
67
|
+
}
|
|
68
|
+
export declare class McpServerAnalyzer implements IAnalyzer {
|
|
69
|
+
name: string;
|
|
70
|
+
type: string;
|
|
71
|
+
analyze(content: string, _rules: DetectionRule[]): Promise<SecurityIssue[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Scan tool descriptions for injection attacks
|
|
74
|
+
*/
|
|
75
|
+
private scanToolDescriptions;
|
|
76
|
+
/**
|
|
77
|
+
* Scan resource descriptions
|
|
78
|
+
*/
|
|
79
|
+
private scanResourceDescriptions;
|
|
80
|
+
/**
|
|
81
|
+
* Scan prompt template descriptions
|
|
82
|
+
*/
|
|
83
|
+
private scanPromptDescriptions;
|
|
84
|
+
/**
|
|
85
|
+
* Scan input schema for suspicious default values
|
|
86
|
+
*/
|
|
87
|
+
private scanInputSchema;
|
|
88
|
+
/**
|
|
89
|
+
* Audit tool permissions and capabilities
|
|
90
|
+
*/
|
|
91
|
+
auditPermissions(manifest: McpServerManifest): SecurityIssue[];
|
|
92
|
+
/**
|
|
93
|
+
* Scan manifest content for embedded secrets
|
|
94
|
+
*/
|
|
95
|
+
private scanForSecrets;
|
|
96
|
+
/**
|
|
97
|
+
* Check for typosquatting of known legitimate servers
|
|
98
|
+
*/
|
|
99
|
+
checkTyposquatting(manifest: McpServerManifest): SecurityIssue[];
|
|
100
|
+
/**
|
|
101
|
+
* Check metadata for suspicious patterns
|
|
102
|
+
*/
|
|
103
|
+
private checkMetadata;
|
|
104
|
+
/**
|
|
105
|
+
* Find hidden Unicode characters in a string
|
|
106
|
+
*/
|
|
107
|
+
private findHiddenUnicode;
|
|
108
|
+
/**
|
|
109
|
+
* Check for common typosquatting patterns
|
|
110
|
+
*/
|
|
111
|
+
private hasTyposquatPattern;
|
|
112
|
+
/**
|
|
113
|
+
* Calculate Shannon entropy of a string
|
|
114
|
+
*/
|
|
115
|
+
private calculateEntropy;
|
|
116
|
+
/**
|
|
117
|
+
* Calculate Levenshtein distance between two strings
|
|
118
|
+
*/
|
|
119
|
+
private levenshteinDistance;
|
|
120
|
+
/**
|
|
121
|
+
* Create a location object
|
|
122
|
+
*/
|
|
123
|
+
private createLocation;
|
|
124
|
+
/**
|
|
125
|
+
* Truncate string for display
|
|
126
|
+
*/
|
|
127
|
+
private truncate;
|
|
128
|
+
/**
|
|
129
|
+
* Redact a secret for safe display
|
|
130
|
+
*/
|
|
131
|
+
private redactSecret;
|
|
132
|
+
/**
|
|
133
|
+
* Parse and validate an MCP manifest
|
|
134
|
+
*/
|
|
135
|
+
static parseManifest(content: string): McpServerManifest | null;
|
|
136
|
+
/**
|
|
137
|
+
* Analyze capabilities of a manifest
|
|
138
|
+
*/
|
|
139
|
+
static analyzeCapabilities(manifest: McpServerManifest): McpCapabilities;
|
|
140
|
+
/**
|
|
141
|
+
* Get risk level based on capabilities
|
|
142
|
+
*/
|
|
143
|
+
static getRiskLevel(capabilities: McpCapabilities): 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
144
|
+
}
|
|
145
|
+
export default McpServerAnalyzer;
|
|
146
|
+
//# sourceMappingURL=mcp-server-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/mcp-server-analyzer.ts"],"names":[],"mappings":"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"}
|