@bryan-thompson/inspector-assessment 1.26.6 → 1.26.7
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/__tests__/assessment-runner/assessment-executor.test.js +248 -0
- package/cli/build/__tests__/assessment-runner/config-builder.test.js +289 -0
- package/cli/build/__tests__/assessment-runner/index.test.js +41 -0
- package/cli/build/__tests__/assessment-runner/server-config.test.js +249 -0
- package/cli/build/__tests__/assessment-runner/server-connection.test.js +221 -0
- package/cli/build/__tests__/assessment-runner/source-loader.test.js +341 -0
- package/cli/build/__tests__/assessment-runner/tool-wrapper.test.js +114 -0
- package/cli/build/__tests__/assessment-runner-facade.test.js +118 -0
- package/cli/build/assess-full.js +26 -1254
- package/cli/build/lib/assessment-runner/assessment-executor.js +323 -0
- package/cli/build/lib/assessment-runner/config-builder.js +127 -0
- package/cli/build/lib/assessment-runner/index.js +20 -0
- package/cli/build/lib/assessment-runner/server-config.js +78 -0
- package/cli/build/lib/assessment-runner/server-connection.js +80 -0
- package/cli/build/lib/assessment-runner/source-loader.js +139 -0
- package/cli/build/lib/assessment-runner/tool-wrapper.js +40 -0
- package/cli/build/lib/assessment-runner/types.js +8 -0
- package/cli/build/lib/assessment-runner.js +6 -740
- package/cli/build/lib/comparison-handler.js +84 -0
- package/cli/build/lib/result-output.js +154 -0
- package/cli/package.json +1 -1
- package/client/dist/assets/{OAuthCallback-CCWVtjr7.js → OAuthCallback-kF1MLuwg.js} +1 -1
- package/client/dist/assets/{OAuthDebugCallback-DqbXfUi4.js → OAuthDebugCallback-Nv-8u0GR.js} +1 -1
- package/client/dist/assets/{index-CsDJSSWq.js → index-CCiX5wkF.js} +4 -4
- package/client/dist/index.html +1 -1
- package/client/lib/lib/assessment/configTypes.d.ts +2 -0
- package/client/lib/lib/assessment/configTypes.d.ts.map +1 -1
- package/client/lib/lib/securityPatterns.d.ts +4 -2
- package/client/lib/lib/securityPatterns.d.ts.map +1 -1
- package/client/lib/lib/securityPatterns.js +146 -2
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.js +9 -9
- package/client/lib/services/assessment/modules/AuthenticationAssessor.js +4 -4
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts +0 -14
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/BaseAssessor.js +1 -33
- package/client/lib/services/assessment/modules/CrossCapabilitySecurityAssessor.js +1 -1
- package/client/lib/services/assessment/modules/DeveloperExperienceAssessor.js +1 -1
- package/client/lib/services/assessment/modules/DocumentationAssessor.js +2 -2
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.js +8 -8
- package/client/lib/services/assessment/modules/ExternalAPIScannerAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ExternalAPIScannerAssessor.js +3 -3
- package/client/lib/services/assessment/modules/FunctionalityAssessor.js +9 -9
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.js +12 -12
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.js +9 -5
- package/client/lib/services/assessment/modules/PortabilityAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/PortabilityAssessor.js +3 -3
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.js +4 -4
- package/client/lib/services/assessment/modules/PromptAssessor.js +2 -2
- package/client/lib/services/assessment/modules/ProtocolComplianceAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ProtocolComplianceAssessor.js +7 -7
- package/client/lib/services/assessment/modules/ProtocolConformanceAssessor.js +1 -1
- package/client/lib/services/assessment/modules/ResourceAssessor.js +1 -1
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts +25 -2
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/SecurityAssessor.js +149 -17
- package/client/lib/services/assessment/modules/TemporalAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/TemporalAssessor.js +10 -10
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.js +9 -9
- package/client/lib/services/assessment/modules/UsabilityAssessor.js +1 -1
- package/client/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.js +37 -0
- package/client/lib/services/assessment/modules/index.d.ts +3 -0
- package/client/lib/services/assessment/modules/index.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/ChainExecutionTester.d.ts +104 -0
- package/client/lib/services/assessment/modules/securityTests/ChainExecutionTester.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/ChainExecutionTester.js +257 -0
- package/client/lib/services/assessment/modules/securityTests/CrossToolStateTester.d.ts +91 -0
- package/client/lib/services/assessment/modules/securityTests/CrossToolStateTester.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/CrossToolStateTester.js +225 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts +120 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.js +338 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts +59 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.js +168 -0
- package/client/lib/services/assessment/modules/securityTests/index.d.ts +3 -1
- package/client/lib/services/assessment/modules/securityTests/index.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/index.js +2 -0
- package/client/package.json +1 -1
- package/package.json +9 -1
- package/server/package.json +1 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Tool State Tester
|
|
3
|
+
* Tests for privilege escalation by calling tools in sequence
|
|
4
|
+
*
|
|
5
|
+
* Issue #92, Challenge #7: Cross-tool state-based authorization bypass
|
|
6
|
+
* Detects when one tool can modify shared state that affects another tool's authorization.
|
|
7
|
+
*
|
|
8
|
+
* Attack flow:
|
|
9
|
+
* 1. Call admin_action → should get "access denied"
|
|
10
|
+
* 2. Call config_modifier with "admin_mode=true"
|
|
11
|
+
* 3. Call admin_action again → if now succeeds, VULNERABLE
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Tests for cross-tool privilege escalation via shared mutable state
|
|
15
|
+
*/
|
|
16
|
+
export class CrossToolStateTester {
|
|
17
|
+
verbose;
|
|
18
|
+
constructor(config = {}) {
|
|
19
|
+
// Note: config.timeout is accepted but tool call timeout is handled externally
|
|
20
|
+
this.verbose = config.verbose ?? false;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Log message if verbose logging is enabled
|
|
24
|
+
*/
|
|
25
|
+
log(message) {
|
|
26
|
+
if (this.verbose) {
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
console.log(`[CrossToolStateTester] ${message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Identify potential cross-tool pairs for testing
|
|
33
|
+
* Looks for admin_action/privileged tools and config_modifier/setting tools
|
|
34
|
+
*/
|
|
35
|
+
identifyCrossToolPairs(tools) {
|
|
36
|
+
const pairs = [];
|
|
37
|
+
// Find admin-like tools (tools that check authorization)
|
|
38
|
+
const adminTools = tools.filter((t) => /admin[_-]?action|privileged|elevated|sensitive/i.test(t.name) ||
|
|
39
|
+
/admin[_-]?action|privileged|requires\s+admin/i.test(t.description || ""));
|
|
40
|
+
// Find modifier-like tools (tools that modify state/config)
|
|
41
|
+
const modifierTools = tools.filter((t) => /config[_-]?modifier|setting|mode|enable|activate/i.test(t.name) ||
|
|
42
|
+
/modify.*config|set.*mode|enable.*admin/i.test(t.description || ""));
|
|
43
|
+
for (const admin of adminTools) {
|
|
44
|
+
for (const modifier of modifierTools) {
|
|
45
|
+
if (admin.name !== modifier.name) {
|
|
46
|
+
pairs.push({ admin, modifier });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return pairs;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Test cross-tool privilege escalation
|
|
54
|
+
*
|
|
55
|
+
* Attack flow:
|
|
56
|
+
* 1. Call admin_action → expect "access denied"
|
|
57
|
+
* 2. Call config_modifier with "admin_mode=true"
|
|
58
|
+
* 3. Call admin_action again → if now succeeds, VULNERABLE
|
|
59
|
+
*/
|
|
60
|
+
async testPrivilegeEscalation(callTool, adminTool, modifierTool, onProgress) {
|
|
61
|
+
this.log(`Testing pair: ${modifierTool.name} → ${adminTool.name}`);
|
|
62
|
+
try {
|
|
63
|
+
// Step 1: Baseline - admin action should be denied
|
|
64
|
+
this.log(`Step 1: Calling ${adminTool.name} (baseline)`);
|
|
65
|
+
const baseline = await callTool(adminTool.name, {
|
|
66
|
+
action: "read secrets",
|
|
67
|
+
});
|
|
68
|
+
const baselineText = this.extractResponseText(baseline);
|
|
69
|
+
const baselineDenied = /access denied|unauthorized|admin.*required|permission.*denied/i.test(baselineText);
|
|
70
|
+
if (!baselineDenied) {
|
|
71
|
+
// Already has access - can't test escalation (might indicate other issues)
|
|
72
|
+
// Check if it's because shared_state_checked is false (hardened)
|
|
73
|
+
if (/"shared_state_checked"\s*:\s*false/i.test(baselineText)) {
|
|
74
|
+
return {
|
|
75
|
+
vulnerable: false,
|
|
76
|
+
reason: "baseline_has_access",
|
|
77
|
+
evidence: {
|
|
78
|
+
baseline: baselineText.slice(0, 500),
|
|
79
|
+
afterModifier: "",
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
vulnerable: false,
|
|
85
|
+
reason: "baseline_has_access",
|
|
86
|
+
evidence: {
|
|
87
|
+
baseline: baselineText.slice(0, 500),
|
|
88
|
+
afterModifier: "",
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Step 2: Attempt to enable admin mode via config modifier
|
|
93
|
+
const enableResult = await callTool(modifierTool.name, {
|
|
94
|
+
setting: "admin_mode=true",
|
|
95
|
+
});
|
|
96
|
+
const enableText = this.extractResponseText(enableResult);
|
|
97
|
+
const modeEnabled = /admin.*activated|elevated.*granted|admin_mode.*enabled|configuration.*updated.*admin/i.test(enableText);
|
|
98
|
+
// Check if modifier is hardened (stores without modifying)
|
|
99
|
+
const modifierHardened = /stored.*without.*modifying|stored.*for.*review|not.*modifying.*runtime/i.test(enableText);
|
|
100
|
+
if (modifierHardened) {
|
|
101
|
+
return {
|
|
102
|
+
vulnerable: false,
|
|
103
|
+
reason: "modifier_rejected",
|
|
104
|
+
evidence: {
|
|
105
|
+
baseline: baselineText.slice(0, 300),
|
|
106
|
+
afterModifier: "",
|
|
107
|
+
enableResult: enableText.slice(0, 300),
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (!modeEnabled) {
|
|
112
|
+
return {
|
|
113
|
+
vulnerable: false,
|
|
114
|
+
reason: "modifier_rejected",
|
|
115
|
+
evidence: {
|
|
116
|
+
baseline: baselineText.slice(0, 300),
|
|
117
|
+
afterModifier: "",
|
|
118
|
+
enableResult: enableText.slice(0, 300),
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Step 3: Test if admin action now succeeds
|
|
123
|
+
const escalated = await callTool(adminTool.name, {
|
|
124
|
+
action: "read secrets",
|
|
125
|
+
});
|
|
126
|
+
const escalatedText = this.extractResponseText(escalated);
|
|
127
|
+
// Check for successful escalation
|
|
128
|
+
const escalationSucceeded = !/access denied|unauthorized|admin.*required|permission.*denied/i.test(escalatedText) &&
|
|
129
|
+
/"secrets"|API_KEY|credentials|admin_mode.*true.*evidence.*cross-tool/i.test(escalatedText);
|
|
130
|
+
// Emit progress event if callback provided
|
|
131
|
+
if (onProgress && escalationSucceeded) {
|
|
132
|
+
onProgress({
|
|
133
|
+
type: "vulnerability_found",
|
|
134
|
+
tool: adminTool.name,
|
|
135
|
+
pattern: "Cross-Tool State Bypass",
|
|
136
|
+
confidence: "high",
|
|
137
|
+
evidence: `Cross-tool privilege escalation: ${modifierTool.name} enables access to ${adminTool.name}. ${escalatedText.slice(0, 200)}`,
|
|
138
|
+
riskLevel: "HIGH",
|
|
139
|
+
requiresReview: false,
|
|
140
|
+
payload: "admin_mode=true",
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
vulnerable: escalationSucceeded,
|
|
145
|
+
reason: escalationSucceeded
|
|
146
|
+
? "privilege_escalation_confirmed"
|
|
147
|
+
: "escalation_blocked",
|
|
148
|
+
evidence: {
|
|
149
|
+
baseline: baselineText.slice(0, 300),
|
|
150
|
+
afterModifier: escalatedText.slice(0, 300),
|
|
151
|
+
enableResult: enableText.slice(0, 300),
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
return {
|
|
157
|
+
vulnerable: false,
|
|
158
|
+
reason: "test_error",
|
|
159
|
+
error: error instanceof Error ? error.message : String(error),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Run sequence tests on all identified tool pairs
|
|
165
|
+
*/
|
|
166
|
+
async runAllSequenceTests(tools, callTool, onProgress) {
|
|
167
|
+
const pairs = this.identifyCrossToolPairs(tools);
|
|
168
|
+
const results = new Map();
|
|
169
|
+
for (const { admin, modifier } of pairs) {
|
|
170
|
+
const key = `${modifier.name} → ${admin.name}`;
|
|
171
|
+
const result = await this.testPrivilegeEscalation(callTool, admin, modifier, onProgress);
|
|
172
|
+
results.set(key, result);
|
|
173
|
+
}
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get summary of sequence test results
|
|
178
|
+
*/
|
|
179
|
+
summarizeResults(results) {
|
|
180
|
+
let vulnerable = 0;
|
|
181
|
+
let safe = 0;
|
|
182
|
+
let errors = 0;
|
|
183
|
+
const vulnerablePairs = [];
|
|
184
|
+
for (const [key, result] of results) {
|
|
185
|
+
if (result.reason === "test_error") {
|
|
186
|
+
errors++;
|
|
187
|
+
}
|
|
188
|
+
else if (result.vulnerable) {
|
|
189
|
+
vulnerable++;
|
|
190
|
+
vulnerablePairs.push(key);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
safe++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
total: results.size,
|
|
198
|
+
vulnerable,
|
|
199
|
+
safe,
|
|
200
|
+
errors,
|
|
201
|
+
vulnerablePairs,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Extract text content from MCP response
|
|
206
|
+
*/
|
|
207
|
+
extractResponseText(response) {
|
|
208
|
+
if (!response)
|
|
209
|
+
return "";
|
|
210
|
+
// Handle content array format
|
|
211
|
+
if (response.content && Array.isArray(response.content)) {
|
|
212
|
+
return response.content
|
|
213
|
+
.map((item) => {
|
|
214
|
+
if (typeof item === "string")
|
|
215
|
+
return item;
|
|
216
|
+
if (item && typeof item === "object" && "text" in item)
|
|
217
|
+
return String(item.text);
|
|
218
|
+
return JSON.stringify(item);
|
|
219
|
+
})
|
|
220
|
+
.join("\n");
|
|
221
|
+
}
|
|
222
|
+
// Fallback to JSON stringify
|
|
223
|
+
return JSON.stringify(response);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
@@ -144,6 +144,126 @@ export declare const AUTH_FAIL_CLOSED_PATTERNS: readonly [{
|
|
|
144
144
|
readonly pattern: RegExp;
|
|
145
145
|
readonly evidence: "denial reason provided";
|
|
146
146
|
}];
|
|
147
|
+
/**
|
|
148
|
+
* Patterns indicating vulnerable shared state authorization
|
|
149
|
+
* Detects cross-tool privilege escalation via shared mutable state
|
|
150
|
+
* Used by: analyzeStateBasedAuthBypass()
|
|
151
|
+
*/
|
|
152
|
+
export declare const STATE_AUTH_VULNERABLE_PATTERNS: readonly [{
|
|
153
|
+
readonly pattern: RegExp;
|
|
154
|
+
readonly evidence: "admin_mode enabled in response";
|
|
155
|
+
}, {
|
|
156
|
+
readonly pattern: RegExp;
|
|
157
|
+
readonly evidence: "Tool hints at cross-tool state dependency";
|
|
158
|
+
}, {
|
|
159
|
+
readonly pattern: RegExp;
|
|
160
|
+
readonly evidence: "Explicit cross-tool state dependency";
|
|
161
|
+
}, {
|
|
162
|
+
readonly pattern: RegExp;
|
|
163
|
+
readonly evidence: "Cross-tool privilege escalation detected";
|
|
164
|
+
}, {
|
|
165
|
+
readonly pattern: RegExp;
|
|
166
|
+
readonly evidence: "Elevated privileges granted";
|
|
167
|
+
}, {
|
|
168
|
+
readonly pattern: RegExp;
|
|
169
|
+
readonly evidence: "Admin mode activated (state modifier)";
|
|
170
|
+
}, {
|
|
171
|
+
readonly pattern: RegExp;
|
|
172
|
+
readonly evidence: "Response hints at config_modifier for admin_mode";
|
|
173
|
+
}, {
|
|
174
|
+
readonly pattern: RegExp;
|
|
175
|
+
readonly evidence: "Tool depends on config_modifier for authorization";
|
|
176
|
+
}];
|
|
177
|
+
/**
|
|
178
|
+
* Patterns indicating safe independent authorization
|
|
179
|
+
* Detects tools that use per-request authentication (secure)
|
|
180
|
+
* Used by: analyzeStateBasedAuthBypass()
|
|
181
|
+
*/
|
|
182
|
+
export declare const STATE_AUTH_SAFE_PATTERNS: readonly [{
|
|
183
|
+
readonly pattern: RegExp;
|
|
184
|
+
readonly evidence: "Tool explicitly states it doesn't use shared state";
|
|
185
|
+
}, {
|
|
186
|
+
readonly pattern: RegExp;
|
|
187
|
+
readonly evidence: "Tool requires independent per-request auth";
|
|
188
|
+
}, {
|
|
189
|
+
readonly pattern: RegExp;
|
|
190
|
+
readonly evidence: "Independent authorization required";
|
|
191
|
+
}, {
|
|
192
|
+
readonly pattern: RegExp;
|
|
193
|
+
readonly evidence: "Tool confirms it does not use shared state";
|
|
194
|
+
}, {
|
|
195
|
+
readonly pattern: RegExp;
|
|
196
|
+
readonly evidence: "Request stored for admin review (no auto-execution)";
|
|
197
|
+
}, {
|
|
198
|
+
readonly pattern: RegExp;
|
|
199
|
+
readonly evidence: "Per-request authentication enforced";
|
|
200
|
+
}];
|
|
201
|
+
/**
|
|
202
|
+
* Response pattern structure for chain exploitation analysis
|
|
203
|
+
*/
|
|
204
|
+
export interface ChainResponsePattern {
|
|
205
|
+
pattern: RegExp;
|
|
206
|
+
weight: number;
|
|
207
|
+
category: string;
|
|
208
|
+
description: string;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Patterns indicating vulnerable chain execution behavior
|
|
212
|
+
* - Arbitrary tool invocation without allowlist
|
|
213
|
+
* - Output injection via template substitution
|
|
214
|
+
* - Recursive/circular chain execution
|
|
215
|
+
* - Missing depth limits
|
|
216
|
+
* - State poisoning between steps
|
|
217
|
+
*
|
|
218
|
+
* Used by: analyzeChainExploitation()
|
|
219
|
+
*/
|
|
220
|
+
export declare const CHAIN_EXPLOIT_VULNERABLE_PATTERNS: ChainResponsePattern[];
|
|
221
|
+
/**
|
|
222
|
+
* Patterns indicating safe/hardened chain handling
|
|
223
|
+
* - Tool allowlist validation
|
|
224
|
+
* - No execution (validation only)
|
|
225
|
+
* - Depth limits enforced
|
|
226
|
+
* - Output injection blocked
|
|
227
|
+
*
|
|
228
|
+
* Used by: analyzeChainExploitation()
|
|
229
|
+
*/
|
|
230
|
+
/**
|
|
231
|
+
* Threshold for confirming vulnerable chain execution behavior.
|
|
232
|
+
* Value of 1.5 requires ~2 weighted pattern matches to confirm vulnerability.
|
|
233
|
+
*
|
|
234
|
+
* Derived from A/B testing against vulnerable-mcp/hardened-mcp testbed:
|
|
235
|
+
* - vulnerable-mcp: typical scores 2.0-4.0 for vulnerable chains
|
|
236
|
+
* - hardened-mcp: typical scores 0.0-0.8 for safe chains
|
|
237
|
+
*
|
|
238
|
+
* Setting at 1.5 provides margin against false positives while
|
|
239
|
+
* maintaining detection of genuine vulnerabilities.
|
|
240
|
+
*/
|
|
241
|
+
export declare const CHAIN_VULNERABLE_THRESHOLD = 1.5;
|
|
242
|
+
/**
|
|
243
|
+
* Threshold for confirming safe/hardened chain behavior.
|
|
244
|
+
* Value of 1.0 requires 1+ weighted safe pattern matches.
|
|
245
|
+
*
|
|
246
|
+
* Derived from A/B testing:
|
|
247
|
+
* - hardened-mcp: typical scores 1.5-3.0 for safe chains
|
|
248
|
+
* - vulnerable-mcp: typical scores 0.0-0.5 for safe patterns
|
|
249
|
+
*/
|
|
250
|
+
export declare const CHAIN_SAFE_THRESHOLD = 1;
|
|
251
|
+
/**
|
|
252
|
+
* Maps vulnerability categories to detection patterns.
|
|
253
|
+
* Used by analyzeChainExploitation() for category classification.
|
|
254
|
+
*
|
|
255
|
+
* Extracted from inline patterns to maintain single source of truth.
|
|
256
|
+
*/
|
|
257
|
+
export declare const CHAIN_CATEGORY_PATTERNS: Record<string, {
|
|
258
|
+
pattern: RegExp;
|
|
259
|
+
category: string;
|
|
260
|
+
}[]>;
|
|
261
|
+
/**
|
|
262
|
+
* Detect vulnerability categories from response text.
|
|
263
|
+
* Returns array of detected category names.
|
|
264
|
+
*/
|
|
265
|
+
export declare function detectVulnerabilityCategories(responseText: string): string[];
|
|
266
|
+
export declare const CHAIN_EXPLOIT_SAFE_PATTERNS: ChainResponsePattern[];
|
|
147
267
|
/**
|
|
148
268
|
* Patterns indicating search result responses
|
|
149
269
|
* Used by: isSearchResultResponse()
|
package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityPatternLibrary.d.ts","sourceRoot":"","sources":["../../../../../src/services/assessment/modules/securityTests/SecurityPatternLibrary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;GAGG;AACH,eAAO,MAAM,mBAAmB;IAC9B,kEAAkE;;IAIlE,8DAA8D;;IAG9D,kCAAkC;;IAGlC,gCAAgC;;CAExB,CAAC;AAMX;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,2JAmB5B,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,oBAAoB,2LAuBvB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,2BAA2B;IACtC,iCAAiC;;IAejC,0DAA0D;;CAElD,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,yBAAyB;IACpC,oCAAoC;;IAqBpC,4DAA4D;;IAW5D,+BAA+B;;CAEvB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,6BAA6B;;;;CAMhC,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,eAAe,mJAkBlB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,mBAAmB,2rBAwGtB,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B1B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc5B,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,sBAAsB,2FAWzB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,iBAAiB,mHAcpB,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,uBAAuB,mFAU1B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,2BAA2B,mDAM9B,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,uBAAuB,2DAO1B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,yBAAyB,2DAO5B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,6BAA6B,yKAWhC,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,kBAAkB,mGAYrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QACO,CAAC;AAMhD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QAC8B,CAAC;AAE/D;;;GAGG;AACH,eAAO,MAAM,wBAAwB,2EAS3B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,2BAA2B,oRA4B9B,CAAC;AAMX;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;CAK7B,CAAC;AAMX;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD"}
|
|
1
|
+
{"version":3,"file":"SecurityPatternLibrary.d.ts","sourceRoot":"","sources":["../../../../../src/services/assessment/modules/securityTests/SecurityPatternLibrary.ts"],"names":[],"mappings":"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"}
|