@bryan-thompson/inspector-assessment 1.6.0 → 1.7.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/cli/build/assess-full.js +528 -0
- package/cli/build/assess-security.js +342 -0
- package/client/dist/assets/{OAuthCallback-ZcXdfhZQ.js → OAuthCallback-Xo9zS7pv.js} +1 -1
- package/client/dist/assets/{OAuthDebugCallback-xt1SlIHS.js → OAuthDebugCallback-CaIey8K_.js} +1 -1
- package/client/dist/assets/{index-B3lTiDVe.js → index-nCPw6E-c.js} +4 -4
- package/client/dist/index.html +1 -1
- package/client/lib/lib/assessmentTypes.d.ts +670 -0
- package/client/lib/lib/assessmentTypes.d.ts.map +1 -0
- package/client/lib/lib/assessmentTypes.js +220 -0
- package/client/lib/lib/aupPatterns.d.ts +63 -0
- package/client/lib/lib/aupPatterns.d.ts.map +1 -0
- package/client/lib/lib/aupPatterns.js +344 -0
- package/client/lib/lib/prohibitedLibraries.d.ts +76 -0
- package/client/lib/lib/prohibitedLibraries.d.ts.map +1 -0
- package/client/lib/lib/prohibitedLibraries.js +364 -0
- package/client/lib/lib/securityPatterns.d.ts +64 -0
- package/client/lib/lib/securityPatterns.d.ts.map +1 -0
- package/client/lib/lib/securityPatterns.js +453 -0
- package/client/lib/services/assessment/AssessmentOrchestrator.d.ts +88 -0
- package/client/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -0
- package/client/lib/services/assessment/AssessmentOrchestrator.js +418 -0
- package/client/lib/services/assessment/ResponseValidator.d.ts +69 -0
- package/client/lib/services/assessment/ResponseValidator.d.ts.map +1 -0
- package/client/lib/services/assessment/ResponseValidator.js +1038 -0
- package/client/lib/services/assessment/TestDataGenerator.d.ts +86 -0
- package/client/lib/services/assessment/TestDataGenerator.d.ts.map +1 -0
- package/client/lib/services/assessment/TestDataGenerator.js +669 -0
- package/client/lib/services/assessment/TestScenarioEngine.d.ts +91 -0
- package/client/lib/services/assessment/TestScenarioEngine.d.ts.map +1 -0
- package/client/lib/services/assessment/TestScenarioEngine.js +505 -0
- package/client/lib/services/assessment/ToolClassifier.d.ts +61 -0
- package/client/lib/services/assessment/ToolClassifier.d.ts.map +1 -0
- package/client/lib/services/assessment/ToolClassifier.js +349 -0
- package/client/lib/services/assessment/lib/claudeCodeBridge.d.ts +160 -0
- package/client/lib/services/assessment/lib/claudeCodeBridge.d.ts.map +1 -0
- package/client/lib/services/assessment/lib/claudeCodeBridge.js +357 -0
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.d.ts +100 -0
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.js +474 -0
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts +71 -0
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/BaseAssessor.js +171 -0
- package/client/lib/services/assessment/modules/DocumentationAssessor.d.ts +45 -0
- package/client/lib/services/assessment/modules/DocumentationAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/DocumentationAssessor.js +355 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts +25 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.js +564 -0
- package/client/lib/services/assessment/modules/FunctionalityAssessor.d.ts +20 -0
- package/client/lib/services/assessment/modules/FunctionalityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/FunctionalityAssessor.js +253 -0
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts +70 -0
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.js +508 -0
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.d.ts +70 -0
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.js +430 -0
- package/client/lib/services/assessment/modules/PortabilityAssessor.d.ts +43 -0
- package/client/lib/services/assessment/modules/PortabilityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/PortabilityAssessor.js +347 -0
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.d.ts +41 -0
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.js +256 -0
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts +176 -0
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/SecurityAssessor.js +1333 -0
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.d.ts +96 -0
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.js +593 -0
- package/client/lib/services/assessment/modules/UsabilityAssessor.d.ts +21 -0
- package/client/lib/services/assessment/modules/UsabilityAssessor.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/UsabilityAssessor.js +241 -0
- package/client/lib/services/assessment/modules/index.d.ts +33 -0
- package/client/lib/services/assessment/modules/index.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/index.js +35 -0
- package/package.json +5 -2
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend API Security Patterns
|
|
3
|
+
* Tests MCP server API security with 13 focused patterns
|
|
4
|
+
*
|
|
5
|
+
* Architecture: Attack-Type with Specific Payloads
|
|
6
|
+
* - Critical Injection (4 patterns): Command, Calculator, SQL, Path Traversal
|
|
7
|
+
* - Input Validation (3 patterns): Type Safety, Boundary Testing, Required Fields
|
|
8
|
+
* - Protocol Compliance (2 patterns): MCP Error Format, Timeout Handling
|
|
9
|
+
* - Tool-Specific Vulnerabilities (4 patterns): Indirect Injection, Unicode Bypass, Nested Injection, Package Squatting
|
|
10
|
+
*
|
|
11
|
+
* Scope: Backend API Security ONLY
|
|
12
|
+
* - Tests structured data inputs to API endpoints
|
|
13
|
+
* - Validates server-side security controls
|
|
14
|
+
* - Tests MCP protocol compliance
|
|
15
|
+
* - Tests tool-specific vulnerability patterns with parameter-aware payloads
|
|
16
|
+
*
|
|
17
|
+
* Out of Scope: LLM Prompt Injection
|
|
18
|
+
* - MCP servers are APIs that receive structured data, not prompts
|
|
19
|
+
* - If a server uses an LLM internally, that's the LLM's responsibility
|
|
20
|
+
* - We test the MCP API layer, not the LLM behavior layer
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* ========================================
|
|
24
|
+
* BACKEND API SECURITY PATTERNS
|
|
25
|
+
* ========================================
|
|
26
|
+
*
|
|
27
|
+
* 13 focused patterns for MCP server API security
|
|
28
|
+
*/
|
|
29
|
+
export const SECURITY_ATTACK_PATTERNS = [
|
|
30
|
+
// ==========================================
|
|
31
|
+
// CRITICAL INJECTION TESTS (4)
|
|
32
|
+
// ==========================================
|
|
33
|
+
// 1. COMMAND INJECTION
|
|
34
|
+
{
|
|
35
|
+
attackName: "Command Injection",
|
|
36
|
+
description: "Test if tool executes system commands instead of treating them as safe parameters",
|
|
37
|
+
payloads: [
|
|
38
|
+
// System command payloads - might trigger command execution tools
|
|
39
|
+
{
|
|
40
|
+
payload: "whoami",
|
|
41
|
+
evidence: /\b(root|user|admin)\b/i,
|
|
42
|
+
riskLevel: "HIGH",
|
|
43
|
+
description: "System identity command",
|
|
44
|
+
payloadType: "injection",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
payload: "ls -la",
|
|
48
|
+
evidence: /(total|drwx|rwx|-rw-|permissions|directory)/i,
|
|
49
|
+
riskLevel: "HIGH",
|
|
50
|
+
description: "Directory listing command",
|
|
51
|
+
payloadType: "injection",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
payload: "pwd",
|
|
55
|
+
evidence: /\/[a-z]+/i,
|
|
56
|
+
riskLevel: "HIGH",
|
|
57
|
+
description: "Working directory command",
|
|
58
|
+
payloadType: "injection",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
payload: "; rm -rf /",
|
|
62
|
+
evidence: /(deleted|removed|rm.*rf)/i,
|
|
63
|
+
riskLevel: "HIGH",
|
|
64
|
+
description: "Command chaining with destructive command",
|
|
65
|
+
payloadType: "injection",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
payload: "| cat /etc/passwd",
|
|
69
|
+
evidence: /(root:x:|file.*protocol.*executed|local.*file.*ran)/i,
|
|
70
|
+
riskLevel: "HIGH",
|
|
71
|
+
description: "Pipe to file access command",
|
|
72
|
+
payloadType: "injection",
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
// 2. SQL INJECTION
|
|
77
|
+
{
|
|
78
|
+
attackName: "SQL Injection",
|
|
79
|
+
description: "Test if tool properly escapes SQL commands",
|
|
80
|
+
payloads: [
|
|
81
|
+
{
|
|
82
|
+
payload: "'; DROP TABLE users;--",
|
|
83
|
+
evidence: /(dropped|deleted|table.*users|sql.*error|syntax.*error)/i,
|
|
84
|
+
riskLevel: "HIGH",
|
|
85
|
+
description: "SQL command injection",
|
|
86
|
+
payloadType: "injection",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
payload: "' OR '1'='1",
|
|
90
|
+
evidence: /(sql|query|select|where.*1.*1|syntax.*error)/i,
|
|
91
|
+
riskLevel: "HIGH",
|
|
92
|
+
description: "Boolean-based SQL injection",
|
|
93
|
+
payloadType: "injection",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
payload: "admin'--",
|
|
97
|
+
evidence: /(sql.*executed|admin.*query|syntax.*error)/i,
|
|
98
|
+
riskLevel: "HIGH",
|
|
99
|
+
description: "Comment-based SQL injection",
|
|
100
|
+
payloadType: "injection",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
payload: "' UNION SELECT * FROM passwords--",
|
|
104
|
+
evidence: /(union.*select|password|sql.*error|syntax.*error)/i,
|
|
105
|
+
riskLevel: "HIGH",
|
|
106
|
+
description: "UNION-based SQL injection",
|
|
107
|
+
payloadType: "injection",
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
// 3. CALCULATOR INJECTION
|
|
112
|
+
{
|
|
113
|
+
attackName: "Calculator Injection",
|
|
114
|
+
description: "Test if calculator/math tools execute arbitrary expressions instead of safely storing them",
|
|
115
|
+
payloads: [
|
|
116
|
+
// Simple arithmetic - triggers eval() in vulnerable calculator tools
|
|
117
|
+
{
|
|
118
|
+
payload: "2+2",
|
|
119
|
+
evidence: /The answer is 4/i,
|
|
120
|
+
riskLevel: "HIGH",
|
|
121
|
+
description: "Simple arithmetic expression (common trigger)",
|
|
122
|
+
payloadType: "injection",
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
payload: "5*5",
|
|
126
|
+
evidence: /The answer is 25/i,
|
|
127
|
+
riskLevel: "HIGH",
|
|
128
|
+
description: "Multiplication expression",
|
|
129
|
+
payloadType: "injection",
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
payload: "100+200",
|
|
133
|
+
evidence: /The answer is 300/i,
|
|
134
|
+
riskLevel: "HIGH",
|
|
135
|
+
description: "Addition with larger numbers",
|
|
136
|
+
payloadType: "injection",
|
|
137
|
+
},
|
|
138
|
+
// Natural language triggers
|
|
139
|
+
{
|
|
140
|
+
payload: "what is 10*10",
|
|
141
|
+
evidence: /The answer is 100/i,
|
|
142
|
+
riskLevel: "HIGH",
|
|
143
|
+
description: "Natural language math query",
|
|
144
|
+
payloadType: "injection",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
payload: "calculate 50+50",
|
|
148
|
+
evidence: /The answer is 100/i,
|
|
149
|
+
riskLevel: "HIGH",
|
|
150
|
+
description: "Calculate command",
|
|
151
|
+
payloadType: "injection",
|
|
152
|
+
},
|
|
153
|
+
// Code injection via eval()
|
|
154
|
+
{
|
|
155
|
+
payload: "__import__('os').system('whoami')",
|
|
156
|
+
evidence: /\b(root|user|admin|ubuntu)\b/i,
|
|
157
|
+
riskLevel: "HIGH",
|
|
158
|
+
description: "Python code injection via eval",
|
|
159
|
+
payloadType: "injection",
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
payload: "1+1; __import__('subprocess').run(['whoami'])",
|
|
163
|
+
evidence: /\b(root|user|admin|ubuntu)\b/i,
|
|
164
|
+
riskLevel: "HIGH",
|
|
165
|
+
description: "eval chain to system command",
|
|
166
|
+
payloadType: "injection",
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
// 4. PATH TRAVERSAL
|
|
171
|
+
{
|
|
172
|
+
attackName: "Path Traversal",
|
|
173
|
+
description: "Test if tool allows access to files outside intended directory",
|
|
174
|
+
payloads: [
|
|
175
|
+
{
|
|
176
|
+
payload: "../../../etc/passwd",
|
|
177
|
+
evidence: /(root:x:0:0|file.*accessed|passwd.*file)/i,
|
|
178
|
+
riskLevel: "HIGH",
|
|
179
|
+
description: "Unix path traversal",
|
|
180
|
+
payloadType: "injection",
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
payload: "..\\..\\..\\windows\\system32\\config\\sam",
|
|
184
|
+
evidence: /(\[boot loader\]|sam.*file|system32)/i,
|
|
185
|
+
riskLevel: "HIGH",
|
|
186
|
+
description: "Windows path traversal",
|
|
187
|
+
payloadType: "injection",
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
payload: "/etc/passwd",
|
|
191
|
+
evidence: /(root:x:0:0|file.*accessed)/i,
|
|
192
|
+
riskLevel: "HIGH",
|
|
193
|
+
description: "Absolute path access",
|
|
194
|
+
payloadType: "injection",
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
payload: "file:///etc/passwd",
|
|
198
|
+
evidence: /(root:x:|file.*protocol.*executed|local.*file.*accessed)/i,
|
|
199
|
+
riskLevel: "HIGH",
|
|
200
|
+
description: "File protocol exploitation",
|
|
201
|
+
payloadType: "injection",
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
// ==========================================
|
|
206
|
+
// INPUT VALIDATION TESTS (3)
|
|
207
|
+
// ==========================================
|
|
208
|
+
// 5. TYPE SAFETY
|
|
209
|
+
{
|
|
210
|
+
attackName: "Type Safety",
|
|
211
|
+
description: "Test if tool validates parameter types correctly",
|
|
212
|
+
payloads: [
|
|
213
|
+
{
|
|
214
|
+
payload: "not_a_number",
|
|
215
|
+
evidence: /(type.*error|invalid.*type|expected.*number|cannot.*convert)/i,
|
|
216
|
+
riskLevel: "MEDIUM",
|
|
217
|
+
description: "String instead of number",
|
|
218
|
+
payloadType: "validation",
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
payload: "999999999999999",
|
|
222
|
+
evidence: /(overflow|out.*of.*range|exceeds.*maximum|number.*too.*large)/i,
|
|
223
|
+
riskLevel: "MEDIUM",
|
|
224
|
+
description: "Numeric overflow",
|
|
225
|
+
payloadType: "validation",
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
payload: "true",
|
|
229
|
+
evidence: /(type.*error|invalid.*type|expected.*string|cannot.*convert)/i,
|
|
230
|
+
riskLevel: "LOW",
|
|
231
|
+
description: "Boolean instead of string",
|
|
232
|
+
payloadType: "validation",
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
// 6. BOUNDARY TESTING
|
|
237
|
+
{
|
|
238
|
+
attackName: "Boundary Testing",
|
|
239
|
+
description: "Test edge cases and boundary conditions",
|
|
240
|
+
payloads: [
|
|
241
|
+
{
|
|
242
|
+
payload: "",
|
|
243
|
+
evidence: /(empty.*not.*allowed|required|cannot.*be.*empty|must.*not.*be.*empty)/i,
|
|
244
|
+
riskLevel: "LOW",
|
|
245
|
+
description: "Empty string validation",
|
|
246
|
+
payloadType: "validation",
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
payload: "A".repeat(10000),
|
|
250
|
+
evidence: /(too.*long|exceeds.*length|maximum.*length|length.*limit)/i,
|
|
251
|
+
riskLevel: "MEDIUM",
|
|
252
|
+
description: "Maximum length validation",
|
|
253
|
+
payloadType: "validation",
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
payload: "-1",
|
|
257
|
+
evidence: /(negative.*not.*allowed|must.*be.*positive|invalid.*value)/i,
|
|
258
|
+
riskLevel: "LOW",
|
|
259
|
+
description: "Negative number validation",
|
|
260
|
+
payloadType: "validation",
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
},
|
|
264
|
+
// 7. REQUIRED FIELDS
|
|
265
|
+
{
|
|
266
|
+
attackName: "Required Fields",
|
|
267
|
+
description: "Test if tool validates required parameters",
|
|
268
|
+
payloads: [
|
|
269
|
+
{
|
|
270
|
+
payload: "MISSING_REQUIRED",
|
|
271
|
+
evidence: /(required|missing.*parameter|field.*required|parameter.*required)/i,
|
|
272
|
+
riskLevel: "MEDIUM",
|
|
273
|
+
description: "Missing required fields",
|
|
274
|
+
payloadType: "validation",
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
},
|
|
278
|
+
// ==========================================
|
|
279
|
+
// PROTOCOL COMPLIANCE TESTS (2)
|
|
280
|
+
// ==========================================
|
|
281
|
+
// 8. MCP ERROR FORMAT
|
|
282
|
+
{
|
|
283
|
+
attackName: "MCP Error Format",
|
|
284
|
+
description: "Verify errors follow MCP protocol specification",
|
|
285
|
+
payloads: [
|
|
286
|
+
{
|
|
287
|
+
payload: "INVALID_TRIGGER_ERROR",
|
|
288
|
+
evidence: /(isError|error|invalid|failed)/i,
|
|
289
|
+
riskLevel: "LOW",
|
|
290
|
+
description: "Error response compliance check",
|
|
291
|
+
payloadType: "protocol",
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
},
|
|
295
|
+
// 9. TIMEOUT HANDLING
|
|
296
|
+
{
|
|
297
|
+
attackName: "Timeout Handling",
|
|
298
|
+
description: "Test if tool handles long operations gracefully",
|
|
299
|
+
payloads: [
|
|
300
|
+
{
|
|
301
|
+
payload: "SIMULATE_LONG_OPERATION",
|
|
302
|
+
evidence: /(timeout|timed.*out|exceeded.*time|operation.*timeout)/i,
|
|
303
|
+
riskLevel: "LOW",
|
|
304
|
+
description: "Operation timeout handling",
|
|
305
|
+
payloadType: "protocol",
|
|
306
|
+
},
|
|
307
|
+
],
|
|
308
|
+
},
|
|
309
|
+
// ==========================================
|
|
310
|
+
// TOOL-SPECIFIC VULNERABILITY TESTS (4)
|
|
311
|
+
// ==========================================
|
|
312
|
+
// 10. INDIRECT PROMPT INJECTION (HTTP URL Fetching)
|
|
313
|
+
{
|
|
314
|
+
attackName: "Indirect Prompt Injection",
|
|
315
|
+
description: "Test if tool fetches and executes external content",
|
|
316
|
+
payloads: [
|
|
317
|
+
{
|
|
318
|
+
payload: "http://example.com",
|
|
319
|
+
evidence: /(status_code.*200|status.*200.*content|<html|<!DOCTYPE|fetched.*http.*content)/i,
|
|
320
|
+
riskLevel: "HIGH",
|
|
321
|
+
description: "Benign URL fetch test",
|
|
322
|
+
payloadType: "injection",
|
|
323
|
+
parameterTypes: ["url", "uri", "link", "endpoint", "address"],
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
payload: "http://evil.com/inject.txt",
|
|
327
|
+
evidence: /(fetched|retrieved|evil\.com|malicious|injected)/i,
|
|
328
|
+
riskLevel: "HIGH",
|
|
329
|
+
description: "Malicious URL fetch test",
|
|
330
|
+
payloadType: "injection",
|
|
331
|
+
parameterTypes: ["url", "uri", "link"],
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
},
|
|
335
|
+
// 11. UNICODE BYPASS
|
|
336
|
+
{
|
|
337
|
+
attackName: "Unicode Bypass",
|
|
338
|
+
description: "Test if tool decodes and executes unicode-encoded commands",
|
|
339
|
+
payloads: [
|
|
340
|
+
{
|
|
341
|
+
payload: "\\u0077\\u0068\\u006f\\u0061\\u006d\\u0069", // "whoami"
|
|
342
|
+
evidence: /(root|user|admin|decoded.*executed|unicode.*executed)/i,
|
|
343
|
+
riskLevel: "MEDIUM",
|
|
344
|
+
description: "Unicode-encoded system command",
|
|
345
|
+
payloadType: "injection",
|
|
346
|
+
parameterTypes: ["text", "content", "message", "input", "data"],
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
payload: "\\u0069\\u0067\\u006e\\u006f\\u0072\\u0065", // "ignore"
|
|
350
|
+
evidence: /(decoded|unicode|ignore.*previous|executed)/i,
|
|
351
|
+
riskLevel: "MEDIUM",
|
|
352
|
+
description: "Unicode-encoded instruction",
|
|
353
|
+
payloadType: "injection",
|
|
354
|
+
parameterTypes: ["text", "content", "message"],
|
|
355
|
+
},
|
|
356
|
+
],
|
|
357
|
+
},
|
|
358
|
+
// 12. NESTED INJECTION
|
|
359
|
+
{
|
|
360
|
+
attackName: "Nested Injection",
|
|
361
|
+
description: "Test if tool executes hidden instructions in nested JSON",
|
|
362
|
+
payloads: [
|
|
363
|
+
{
|
|
364
|
+
payload: '{"query":"normal","hidden":"whoami"}',
|
|
365
|
+
evidence: /(executed.*hidden|nested.*instruction|root|user|admin)/i,
|
|
366
|
+
riskLevel: "MEDIUM",
|
|
367
|
+
description: "Hidden command in JSON field",
|
|
368
|
+
payloadType: "injection",
|
|
369
|
+
parameterTypes: ["data", "json", "payload", "body", "params"],
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
payload: '{"visible":"safe","_execute":"delete all"}',
|
|
373
|
+
evidence: /(executed|deleted|internal.*field|hidden)/i,
|
|
374
|
+
riskLevel: "HIGH",
|
|
375
|
+
description: "Hidden instruction in internal field",
|
|
376
|
+
payloadType: "injection",
|
|
377
|
+
parameterTypes: ["data", "json", "input"],
|
|
378
|
+
},
|
|
379
|
+
],
|
|
380
|
+
},
|
|
381
|
+
// 13. PACKAGE SQUATTING
|
|
382
|
+
{
|
|
383
|
+
attackName: "Package Squatting",
|
|
384
|
+
description: "Test if tool downloads typosquatted packages",
|
|
385
|
+
payloads: [
|
|
386
|
+
{
|
|
387
|
+
payload: "install nmpy",
|
|
388
|
+
evidence: /(downloaded|installed|nmpy|typosquatted|pip.*output)/i,
|
|
389
|
+
riskLevel: "MEDIUM",
|
|
390
|
+
description: "Typosquatted package (nmpy instead of numpy)",
|
|
391
|
+
payloadType: "injection",
|
|
392
|
+
parameterTypes: ["package", "pkg", "module", "library", "dependency"],
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
payload: "requsts",
|
|
396
|
+
evidence: /(downloaded|installed|requsts|typosquatted)/i,
|
|
397
|
+
riskLevel: "MEDIUM",
|
|
398
|
+
description: "Typosquatted package (requsts instead of requests)",
|
|
399
|
+
payloadType: "injection",
|
|
400
|
+
parameterTypes: ["package", "pkg", "module"],
|
|
401
|
+
},
|
|
402
|
+
],
|
|
403
|
+
},
|
|
404
|
+
];
|
|
405
|
+
/**
|
|
406
|
+
* Get all payloads for an attack type
|
|
407
|
+
*/
|
|
408
|
+
export function getPayloadsForAttack(attackName, limit) {
|
|
409
|
+
const pattern = SECURITY_ATTACK_PATTERNS.find((p) => p.attackName === attackName);
|
|
410
|
+
if (!pattern)
|
|
411
|
+
return [];
|
|
412
|
+
const payloads = pattern.payloads;
|
|
413
|
+
return limit ? payloads.slice(0, limit) : payloads;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Get all attack patterns (for testing all tools)
|
|
417
|
+
*/
|
|
418
|
+
export function getAllAttackPatterns() {
|
|
419
|
+
return SECURITY_ATTACK_PATTERNS;
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get pattern statistics
|
|
423
|
+
*/
|
|
424
|
+
export function getPatternStatistics() {
|
|
425
|
+
const totalAttackTypes = SECURITY_ATTACK_PATTERNS.length;
|
|
426
|
+
let totalPayloads = 0;
|
|
427
|
+
let highRiskPayloads = 0;
|
|
428
|
+
let mediumRiskPayloads = 0;
|
|
429
|
+
let lowRiskPayloads = 0;
|
|
430
|
+
const payloadTypeBreakdown = {};
|
|
431
|
+
SECURITY_ATTACK_PATTERNS.forEach((pattern) => {
|
|
432
|
+
totalPayloads += pattern.payloads.length;
|
|
433
|
+
pattern.payloads.forEach((payload) => {
|
|
434
|
+
if (payload.riskLevel === "HIGH")
|
|
435
|
+
highRiskPayloads++;
|
|
436
|
+
else if (payload.riskLevel === "MEDIUM")
|
|
437
|
+
mediumRiskPayloads++;
|
|
438
|
+
else
|
|
439
|
+
lowRiskPayloads++;
|
|
440
|
+
payloadTypeBreakdown[payload.payloadType] =
|
|
441
|
+
(payloadTypeBreakdown[payload.payloadType] || 0) + 1;
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
return {
|
|
445
|
+
totalAttackTypes,
|
|
446
|
+
totalPayloads,
|
|
447
|
+
highRiskPayloads,
|
|
448
|
+
mediumRiskPayloads,
|
|
449
|
+
lowRiskPayloads,
|
|
450
|
+
payloadTypeBreakdown,
|
|
451
|
+
averagePayloadsPerAttack: Math.round(totalPayloads / totalAttackTypes),
|
|
452
|
+
};
|
|
453
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessment Orchestrator
|
|
3
|
+
* Coordinates all assessment modules and manages the assessment workflow
|
|
4
|
+
*/
|
|
5
|
+
import { MCPDirectoryAssessment, AssessmentConfiguration, ManifestJsonSchema } from "../../lib/assessmentTypes.js";
|
|
6
|
+
import { Tool, CompatibilityCallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
7
|
+
import { ClaudeCodeBridge, ClaudeCodeBridgeConfig } from "./lib/claudeCodeBridge.js";
|
|
8
|
+
export interface AssessmentContext {
|
|
9
|
+
serverName: string;
|
|
10
|
+
tools: Tool[];
|
|
11
|
+
callTool: (name: string, params: Record<string, unknown>) => Promise<CompatibilityCallToolResult>;
|
|
12
|
+
readmeContent?: string;
|
|
13
|
+
packageJson?: unknown;
|
|
14
|
+
packageLock?: unknown;
|
|
15
|
+
privacyPolicy?: unknown;
|
|
16
|
+
config: AssessmentConfiguration;
|
|
17
|
+
serverInfo?: {
|
|
18
|
+
name: string;
|
|
19
|
+
version?: string;
|
|
20
|
+
metadata?: unknown;
|
|
21
|
+
};
|
|
22
|
+
sourceCodePath?: string;
|
|
23
|
+
sourceCodeFiles?: Map<string, string>;
|
|
24
|
+
manifestJson?: ManifestJsonSchema;
|
|
25
|
+
manifestRaw?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class AssessmentOrchestrator {
|
|
28
|
+
private config;
|
|
29
|
+
private startTime;
|
|
30
|
+
private totalTestsRun;
|
|
31
|
+
private claudeBridge?;
|
|
32
|
+
private claudeEnabled;
|
|
33
|
+
private functionalityAssessor;
|
|
34
|
+
private securityAssessor;
|
|
35
|
+
private documentationAssessor;
|
|
36
|
+
private errorHandlingAssessor;
|
|
37
|
+
private usabilityAssessor;
|
|
38
|
+
private mcpSpecAssessor?;
|
|
39
|
+
private aupComplianceAssessor?;
|
|
40
|
+
private toolAnnotationAssessor?;
|
|
41
|
+
private prohibitedLibrariesAssessor?;
|
|
42
|
+
private manifestValidationAssessor?;
|
|
43
|
+
private portabilityAssessor?;
|
|
44
|
+
constructor(config?: Partial<AssessmentConfiguration>);
|
|
45
|
+
/**
|
|
46
|
+
* Initialize Claude Code Bridge for intelligent analysis
|
|
47
|
+
* This enables semantic AUP violation analysis, behavior inference, and intelligent test generation
|
|
48
|
+
*/
|
|
49
|
+
private initializeClaudeBridge;
|
|
50
|
+
/**
|
|
51
|
+
* Enable Claude Code integration programmatically
|
|
52
|
+
* Call this method to enable Claude features after construction
|
|
53
|
+
*/
|
|
54
|
+
enableClaudeCode(config?: Partial<ClaudeCodeBridgeConfig>): void;
|
|
55
|
+
/**
|
|
56
|
+
* Check if Claude Code integration is enabled and available
|
|
57
|
+
*/
|
|
58
|
+
isClaudeEnabled(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Get Claude Code Bridge for external access
|
|
61
|
+
*/
|
|
62
|
+
getClaudeBridge(): ClaudeCodeBridge | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Reset test counts for all assessors
|
|
65
|
+
*/
|
|
66
|
+
private resetAllTestCounts;
|
|
67
|
+
/**
|
|
68
|
+
* Run a complete assessment on an MCP server
|
|
69
|
+
*/
|
|
70
|
+
runFullAssessment(context: AssessmentContext): Promise<MCPDirectoryAssessment>;
|
|
71
|
+
/**
|
|
72
|
+
* Legacy assess method for backward compatibility
|
|
73
|
+
*/
|
|
74
|
+
assess(serverName: string, tools: Tool[], callTool: (name: string, params: Record<string, unknown>) => Promise<CompatibilityCallToolResult>, serverInfo?: any, readmeContent?: string, packageJson?: any): Promise<MCPDirectoryAssessment>;
|
|
75
|
+
private collectTotalTestCount;
|
|
76
|
+
private determineOverallStatus;
|
|
77
|
+
private generateSummary;
|
|
78
|
+
private generateRecommendations;
|
|
79
|
+
/**
|
|
80
|
+
* Get assessment configuration
|
|
81
|
+
*/
|
|
82
|
+
getConfig(): AssessmentConfiguration;
|
|
83
|
+
/**
|
|
84
|
+
* Update assessment configuration
|
|
85
|
+
*/
|
|
86
|
+
updateConfig(config: Partial<AssessmentConfiguration>): void;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=AssessmentOrchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssessmentOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/AssessmentOrchestrator.ts"],"names":[],"mappings":"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"}
|