@securecode-ai/mcp 0.5.5 → 0.5.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/README.md +52 -12
- package/dist/api/types.d.ts +7 -0
- package/dist/approval/auditLog.d.ts +1 -1
- package/dist/approval/auditLog.js +11 -3
- package/dist/approval/auditLog.js.map +1 -1
- package/dist/approval/broker.d.ts +7 -2
- package/dist/approval/broker.js +239 -110
- package/dist/approval/broker.js.map +1 -1
- package/dist/approval/policy.d.ts +10 -0
- package/dist/approval/policy.js +104 -0
- package/dist/approval/policy.js.map +1 -0
- package/dist/approval/types.d.ts +11 -2
- package/dist/approval/types.js +10 -1
- package/dist/approval/types.js.map +1 -1
- package/dist/attack/agentScanExecutor.d.ts +35 -1
- package/dist/attack/agentScanExecutor.js +405 -76
- package/dist/attack/agentScanExecutor.js.map +1 -1
- package/dist/attack/agentScanLoop.d.ts +20 -0
- package/dist/attack/agentScanLoop.js +1264 -60
- package/dist/attack/agentScanLoop.js.map +1 -1
- package/dist/attack/agentScanProtocol.d.ts +382 -6
- package/dist/attack/agentScanProtocol.js +110 -4
- package/dist/attack/agentScanProtocol.js.map +1 -1
- package/dist/attack/agentTrace.d.ts +73 -0
- package/dist/attack/agentTrace.js +228 -0
- package/dist/attack/agentTrace.js.map +1 -0
- package/dist/attack/architectureScoutExecutor.d.ts +18 -0
- package/dist/attack/architectureScoutExecutor.js +211 -0
- package/dist/attack/architectureScoutExecutor.js.map +1 -0
- package/dist/attack/architectureScoutLoop.d.ts +36 -0
- package/dist/attack/architectureScoutLoop.js +403 -0
- package/dist/attack/architectureScoutLoop.js.map +1 -0
- package/dist/attack/architectureScoutProtocol.d.ts +209 -0
- package/dist/attack/architectureScoutProtocol.js +47 -0
- package/dist/attack/architectureScoutProtocol.js.map +1 -0
- package/dist/attack/candidateStore.d.ts +95 -0
- package/dist/attack/candidateStore.js +231 -0
- package/dist/attack/candidateStore.js.map +1 -0
- package/dist/attack/evidenceLedger.d.ts +67 -0
- package/dist/attack/evidenceLedger.js +192 -0
- package/dist/attack/evidenceLedger.js.map +1 -0
- package/dist/attack/finishGate.d.ts +62 -0
- package/dist/attack/finishGate.js +209 -0
- package/dist/attack/finishGate.js.map +1 -0
- package/dist/attack/fixCodeMerge.d.ts +27 -0
- package/dist/attack/fixCodeMerge.js +42 -0
- package/dist/attack/fixCodeMerge.js.map +1 -0
- package/dist/attack/fixVerifyLoop.d.ts +55 -0
- package/dist/attack/fixVerifyLoop.js +187 -0
- package/dist/attack/fixVerifyLoop.js.map +1 -0
- package/dist/attack/investigationProfiles.d.ts +36 -0
- package/dist/attack/investigationProfiles.js +144 -0
- package/dist/attack/investigationProfiles.js.map +1 -0
- package/dist/attack/investigationState.d.ts +227 -0
- package/dist/attack/investigationState.js +666 -0
- package/dist/attack/investigationState.js.map +1 -0
- package/dist/attack/mutationOperators.d.ts +22 -0
- package/dist/attack/mutationOperators.js +170 -0
- package/dist/attack/mutationOperators.js.map +1 -0
- package/dist/attack/mutationTest.d.ts +33 -0
- package/dist/attack/mutationTest.js +110 -0
- package/dist/attack/mutationTest.js.map +1 -0
- package/dist/attack/proofGate.d.ts +20 -0
- package/dist/attack/proofGate.js +104 -0
- package/dist/attack/proofGate.js.map +1 -0
- package/dist/attack/proofTypes.d.ts +57 -0
- package/dist/attack/proofTypes.js +32 -0
- package/dist/attack/proofTypes.js.map +1 -0
- package/dist/attack/protocolValidator.d.ts +50 -0
- package/dist/attack/protocolValidator.js +427 -0
- package/dist/attack/protocolValidator.js.map +1 -0
- package/dist/attack/qualityMetrics.d.ts +133 -0
- package/dist/attack/qualityMetrics.js +226 -0
- package/dist/attack/qualityMetrics.js.map +1 -0
- package/dist/attack/scanScheduler.d.ts +52 -0
- package/dist/attack/scanScheduler.js +265 -0
- package/dist/attack/scanScheduler.js.map +1 -0
- package/dist/attack/scanState.d.ts +58 -0
- package/dist/attack/scanState.js +102 -0
- package/dist/attack/scanState.js.map +1 -0
- package/dist/attack/searchIntent.d.ts +16 -0
- package/dist/attack/searchIntent.js +57 -0
- package/dist/attack/searchIntent.js.map +1 -0
- package/dist/attack/verifyLoop.d.ts +43 -0
- package/dist/attack/verifyLoop.js +314 -14
- package/dist/attack/verifyLoop.js.map +1 -1
- package/dist/attack/workItem.d.ts +57 -0
- package/dist/attack/workItem.js +225 -0
- package/dist/attack/workItem.js.map +1 -0
- package/dist/audit/findingReviewQueue.d.ts +109 -0
- package/dist/audit/findingReviewQueue.js +335 -0
- package/dist/audit/findingReviewQueue.js.map +1 -0
- package/dist/audit/scanAuditLog.d.ts +160 -0
- package/dist/audit/scanAuditLog.js +404 -0
- package/dist/audit/scanAuditLog.js.map +1 -0
- package/dist/dependency/dependencyChecker.js +35 -9
- package/dist/dependency/dependencyChecker.js.map +1 -1
- package/dist/dependency/exploitPriority.d.ts +33 -0
- package/dist/dependency/exploitPriority.js +78 -0
- package/dist/dependency/exploitPriority.js.map +1 -0
- package/dist/dependency/finding.d.ts +16 -0
- package/dist/dependency/osvClient.js +2 -0
- package/dist/dependency/osvClient.js.map +1 -1
- package/dist/dependency/types.d.ts +12 -1
- package/dist/mcp/server.js +13 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -0
- package/dist/mcp/tools.js +127 -6
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-map/agentMemory.d.ts +83 -1
- package/dist/project-map/agentMemory.js +197 -7
- package/dist/project-map/agentMemory.js.map +1 -1
- package/dist/project-map/architectureContext.d.ts +202 -0
- package/dist/project-map/architectureContext.js +421 -0
- package/dist/project-map/architectureContext.js.map +1 -0
- package/dist/project-map/blastRadius.d.ts +54 -0
- package/dist/project-map/blastRadius.js +196 -0
- package/dist/project-map/blastRadius.js.map +1 -0
- package/dist/project-map/callGraphExtractor.d.ts +13 -0
- package/dist/project-map/callGraphExtractor.js +222 -0
- package/dist/project-map/callGraphExtractor.js.map +1 -0
- package/dist/project-map/capabilityRegistry.d.ts +46 -0
- package/dist/project-map/capabilityRegistry.js +91 -0
- package/dist/project-map/capabilityRegistry.js.map +1 -0
- package/dist/project-map/findTests.d.ts +29 -0
- package/dist/project-map/findTests.js +236 -0
- package/dist/project-map/findTests.js.map +1 -0
- package/dist/project-map/handlerInventory.d.ts +112 -0
- package/dist/project-map/handlerInventory.js +184 -0
- package/dist/project-map/handlerInventory.js.map +1 -0
- package/dist/project-map/implementationResolver.d.ts +43 -0
- package/dist/project-map/implementationResolver.js +217 -0
- package/dist/project-map/implementationResolver.js.map +1 -0
- package/dist/project-map/mapContext.d.ts +6 -1
- package/dist/project-map/mapContext.js +1 -0
- package/dist/project-map/mapContext.js.map +1 -1
- package/dist/project-map/scanCache.d.ts +57 -3
- package/dist/project-map/scanCache.js +61 -2
- package/dist/project-map/scanCache.js.map +1 -1
- package/dist/project-map/symbolIndex.d.ts +39 -0
- package/dist/project-map/symbolIndex.js +385 -0
- package/dist/project-map/symbolIndex.js.map +1 -0
- package/dist/tooling/agentEvalScoring.d.ts +77 -0
- package/dist/tooling/agentEvalScoring.js +140 -0
- package/dist/tooling/agentEvalScoring.js.map +1 -0
- package/dist/tooling/agentRegression.d.ts +53 -0
- package/dist/tooling/agentRegression.js +99 -0
- package/dist/tooling/agentRegression.js.map +1 -0
- package/dist/tools/agentScan.d.ts +69 -0
- package/dist/tools/agentScan.js +702 -43
- package/dist/tools/agentScan.js.map +1 -1
- package/dist/tools/findingReviewTools.d.ts +22 -0
- package/dist/tools/findingReviewTools.js +121 -0
- package/dist/tools/findingReviewTools.js.map +1 -0
- package/dist/tools/fix.js +1 -1
- package/dist/tools/fix.js.map +1 -1
- package/dist/tools/map.js +191 -1
- package/dist/tools/map.js.map +1 -1
- package/dist/tools/runTests.d.ts +2 -0
- package/dist/tools/runTests.js +29 -0
- package/dist/tools/runTests.js.map +1 -0
- package/dist/utils/effectMock.d.ts +1 -0
- package/dist/utils/effectMock.js +162 -0
- package/dist/utils/effectMock.js.map +1 -0
- package/dist/utils/gitContext.d.ts +26 -0
- package/dist/utils/gitContext.js +317 -0
- package/dist/utils/gitContext.js.map +1 -0
- package/dist/utils/localTestRunner.d.ts +57 -2
- package/dist/utils/localTestRunner.js +122 -115
- package/dist/utils/localTestRunner.js.map +1 -1
- package/dist/utils/securityConfig.d.ts +17 -0
- package/dist/utils/securityConfig.js +192 -0
- package/dist/utils/securityConfig.js.map +1 -0
- package/dist/utils/testCommandPolicy.d.ts +36 -0
- package/dist/utils/testCommandPolicy.js +252 -0
- package/dist/utils/testCommandPolicy.js.map +1 -0
- package/dist/utils/testRunner.d.ts +56 -0
- package/dist/utils/testRunner.js +246 -0
- package/dist/utils/testRunner.js.map +1 -0
- package/dist/utils/testSafety.d.ts +40 -2
- package/dist/utils/testSafety.js +205 -26
- package/dist/utils/testSafety.js.map +1 -1
- package/dist/utils/verificationSandbox.d.ts +113 -0
- package/dist/utils/verificationSandbox.js +656 -0
- package/dist/utils/verificationSandbox.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"investigationState.js","sourceRoot":"","sources":["../../src/attack/investigationState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutation operators — apply security fixes to vulnerable code to create
|
|
3
|
+
* a "secure mutation." The mutation test then checks whether the test
|
|
4
|
+
* script can distinguish between the original (vulnerable) code and the
|
|
5
|
+
* mutated (secure) code.
|
|
6
|
+
*
|
|
7
|
+
* A discriminating test PASSES on the vulnerable code and FAILS on the
|
|
8
|
+
* secure mutation. This proves the test is actually testing the security
|
|
9
|
+
* property, not just exercising the code path.
|
|
10
|
+
*/
|
|
11
|
+
export type VulnerabilityType = 'broken_access_control' | 'missing_auth' | 'missing_ownership' | 'sql_injection' | 'path_traversal' | 'command_injection' | 'xss' | 'ssrf' | 'ssti' | 'missing_input_validation' | 'secrets_in_source' | 'generic';
|
|
12
|
+
export interface MutationResult {
|
|
13
|
+
mutated: boolean;
|
|
14
|
+
mutatedCode: string;
|
|
15
|
+
description: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Apply a mutation operator for the given vulnerability type to the
|
|
19
|
+
* vulnerable code. Returns the mutated (secure) code or `mutated: false`
|
|
20
|
+
* if no operator is available.
|
|
21
|
+
*/
|
|
22
|
+
export declare function applyMutation(code: string, vulnerabilityType: string, line: number): MutationResult;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Mutation operators — apply security fixes to vulnerable code to create
|
|
4
|
+
* a "secure mutation." The mutation test then checks whether the test
|
|
5
|
+
* script can distinguish between the original (vulnerable) code and the
|
|
6
|
+
* mutated (secure) code.
|
|
7
|
+
*
|
|
8
|
+
* A discriminating test PASSES on the vulnerable code and FAILS on the
|
|
9
|
+
* secure mutation. This proves the test is actually testing the security
|
|
10
|
+
* property, not just exercising the code path.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.applyMutation = applyMutation;
|
|
14
|
+
/**
|
|
15
|
+
* Apply a mutation operator for the given vulnerability type to the
|
|
16
|
+
* vulnerable code. Returns the mutated (secure) code or `mutated: false`
|
|
17
|
+
* if no operator is available.
|
|
18
|
+
*/
|
|
19
|
+
function applyMutation(code, vulnerabilityType, line) {
|
|
20
|
+
const lines = code.split('\n');
|
|
21
|
+
const lineIdx = Math.max(0, Math.min(line - 1, lines.length - 1));
|
|
22
|
+
const targetLine = lines[lineIdx];
|
|
23
|
+
switch (vulnerabilityType) {
|
|
24
|
+
case 'broken_access_control':
|
|
25
|
+
case 'missing_auth': {
|
|
26
|
+
// Insert a 401/403 rejection before the target line
|
|
27
|
+
const indent = (targetLine.match(/^\s*/) || [''])[0];
|
|
28
|
+
const guard = `${indent}if (!isAuthenticated || !hasPermission) { return res ? res.status(403).json({ error: 'forbidden' }) : null; }`;
|
|
29
|
+
const mutated = [...lines];
|
|
30
|
+
mutated.splice(lineIdx, 0, guard);
|
|
31
|
+
return {
|
|
32
|
+
mutated: true,
|
|
33
|
+
mutatedCode: mutated.join('\n'),
|
|
34
|
+
description: 'Added authentication/authorization guard before the vulnerable line',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
case 'missing_ownership': {
|
|
38
|
+
// Insert an ownership check before the target line
|
|
39
|
+
const indent = (targetLine.match(/^\s*/) || [''])[0];
|
|
40
|
+
const guard = `${indent}if (resource.ownerId !== requesterId) { throw new Error('not owner'); }`;
|
|
41
|
+
const mutated = [...lines];
|
|
42
|
+
mutated.splice(lineIdx, 0, guard);
|
|
43
|
+
return {
|
|
44
|
+
mutated: true,
|
|
45
|
+
mutatedCode: mutated.join('\n'),
|
|
46
|
+
description: 'Added ownership check before the vulnerable line',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
case 'sql_injection': {
|
|
50
|
+
// Replace string interpolation in SQL queries with parameter placeholders
|
|
51
|
+
const mutatedLine = targetLine
|
|
52
|
+
.replace(/`([^`]*\$\{[^}]+\}[^`]*)`/g, '?')
|
|
53
|
+
.replace(/'([^']*\+[^']*)'/g, '?')
|
|
54
|
+
.replace(/"\s*\+\s*\w+\s*\+"/g, '?');
|
|
55
|
+
if (mutatedLine === targetLine) {
|
|
56
|
+
return { mutated: false, mutatedCode: code, description: 'No SQL interpolation found to mutate' };
|
|
57
|
+
}
|
|
58
|
+
const mutated = [...lines];
|
|
59
|
+
mutated[lineIdx] = mutatedLine;
|
|
60
|
+
return {
|
|
61
|
+
mutated: true,
|
|
62
|
+
mutatedCode: mutated.join('\n'),
|
|
63
|
+
description: 'Replaced SQL string interpolation with parameter placeholders',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
case 'path_traversal': {
|
|
67
|
+
// Add path containment validation
|
|
68
|
+
const indent = (targetLine.match(/^\s*/) || [''])[0];
|
|
69
|
+
const guard = `${indent}const safePath = path.resolve(baseDir, userInput).replace(/\\.\\.\\//g, ''); if (!safePath.startsWith(baseDir)) { throw new Error('path traversal blocked'); }`;
|
|
70
|
+
const mutated = [...lines];
|
|
71
|
+
mutated.splice(lineIdx, 0, guard);
|
|
72
|
+
return {
|
|
73
|
+
mutated: true,
|
|
74
|
+
mutatedCode: mutated.join('\n'),
|
|
75
|
+
description: 'Added path containment validation before file access',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
case 'command_injection': {
|
|
79
|
+
// Replace shell string execution with argument-array execution
|
|
80
|
+
const mutatedLine = targetLine
|
|
81
|
+
.replace(/exec\(\s*`([^`]*)`\s*\)/g, 'execFile($1.split(" "))')
|
|
82
|
+
.replace(/exec\(\s*([^`]+)\s*\+\s*([^)]+)\)/g, 'execFile([$1, $2])');
|
|
83
|
+
if (mutatedLine === targetLine) {
|
|
84
|
+
return { mutated: false, mutatedCode: code, description: 'No command injection pattern found to mutate' };
|
|
85
|
+
}
|
|
86
|
+
const mutated = [...lines];
|
|
87
|
+
mutated[lineIdx] = mutatedLine;
|
|
88
|
+
return {
|
|
89
|
+
mutated: true,
|
|
90
|
+
mutatedCode: mutated.join('\n'),
|
|
91
|
+
description: 'Replaced shell string execution with argument-array execution',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
case 'xss': {
|
|
95
|
+
// Add HTML escaping before output
|
|
96
|
+
const indent = (targetLine.match(/^\s*/) || [''])[0];
|
|
97
|
+
const guard = `${indent}const safeOutput = userInput.replace(/<script>/gi, '<script>').replace(/on\\w+=/gi, '');`;
|
|
98
|
+
const mutated = [...lines];
|
|
99
|
+
mutated.splice(lineIdx, 0, guard);
|
|
100
|
+
return {
|
|
101
|
+
mutated: true,
|
|
102
|
+
mutatedCode: mutated.join('\n'),
|
|
103
|
+
description: 'Added HTML escaping before output',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
case 'ssrf': {
|
|
107
|
+
// Add URL allowlist validation
|
|
108
|
+
const indent = (targetLine.match(/^\s*/) || [''])[0];
|
|
109
|
+
const guard = `${indent}const allowedHosts = ['localhost', '127.0.0.1']; const url = new URL(targetUrl); if (!allowedHosts.includes(url.hostname)) { throw new Error('SSRF blocked'); }`;
|
|
110
|
+
const mutated = [...lines];
|
|
111
|
+
mutated.splice(lineIdx, 0, guard);
|
|
112
|
+
return {
|
|
113
|
+
mutated: true,
|
|
114
|
+
mutatedCode: mutated.join('\n'),
|
|
115
|
+
description: 'Added URL allowlist validation before external request',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
case 'ssti': {
|
|
119
|
+
// Replace template rendering with safe string output
|
|
120
|
+
const mutatedLine = targetLine
|
|
121
|
+
.replace(/render\(/g, 'renderText(')
|
|
122
|
+
.replace(/ejs\.render\(/g, 'String(');
|
|
123
|
+
if (mutatedLine === targetLine) {
|
|
124
|
+
return { mutated: false, mutatedCode: code, description: 'No SSTI pattern found to mutate' };
|
|
125
|
+
}
|
|
126
|
+
const mutated = [...lines];
|
|
127
|
+
mutated[lineIdx] = mutatedLine;
|
|
128
|
+
return {
|
|
129
|
+
mutated: true,
|
|
130
|
+
mutatedCode: mutated.join('\n'),
|
|
131
|
+
description: 'Replaced template rendering with safe string output',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
case 'missing_input_validation': {
|
|
135
|
+
// Add input validation guard
|
|
136
|
+
const indent = (targetLine.match(/^\s*/) || [''])[0];
|
|
137
|
+
const guard = `${indent}if (!input || typeof input !== 'string' || input.length > 1000) { throw new Error('invalid input'); }`;
|
|
138
|
+
const mutated = [...lines];
|
|
139
|
+
mutated.splice(lineIdx, 0, guard);
|
|
140
|
+
return {
|
|
141
|
+
mutated: true,
|
|
142
|
+
mutatedCode: mutated.join('\n'),
|
|
143
|
+
description: 'Added input validation guard',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
case 'secrets_in_source': {
|
|
147
|
+
// Replace hardcoded secret with environment variable reference
|
|
148
|
+
const mutatedLine = targetLine
|
|
149
|
+
.replace(/['"][^'"]*(?:sk-|ghp_|AKIA|password|secret|token|apiKey|api_key)[^'"]*['"]/gi, 'process.env.SECRET_KEY')
|
|
150
|
+
.replace(/=\s*['"][a-f0-9]{32,}['"]/gi, '= process.env.SECRET_KEY');
|
|
151
|
+
if (mutatedLine === targetLine) {
|
|
152
|
+
return { mutated: false, mutatedCode: code, description: 'No hardcoded secret found to mutate' };
|
|
153
|
+
}
|
|
154
|
+
const mutated = [...lines];
|
|
155
|
+
mutated[lineIdx] = mutatedLine;
|
|
156
|
+
return {
|
|
157
|
+
mutated: true,
|
|
158
|
+
mutatedCode: mutated.join('\n'),
|
|
159
|
+
description: 'Replaced hardcoded secret with environment variable reference',
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
return {
|
|
164
|
+
mutated: false,
|
|
165
|
+
mutatedCode: code,
|
|
166
|
+
description: `No mutation operator available for vulnerability type: ${vulnerabilityType}`,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=mutationOperators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationOperators.js","sourceRoot":"","sources":["../../src/attack/mutationOperators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface MutationTestOptions {
|
|
2
|
+
/** The original vulnerable code (the code being tested). */
|
|
3
|
+
vulnerableCode: string;
|
|
4
|
+
/** The test script that should catch the vulnerability. */
|
|
5
|
+
testScript: string;
|
|
6
|
+
/** The runner to use (node, python3, etc.). */
|
|
7
|
+
runner: string;
|
|
8
|
+
/** Workspace root for the sandbox. */
|
|
9
|
+
workspaceRoot: string;
|
|
10
|
+
/** File path of the vulnerable code (for error messages). */
|
|
11
|
+
filePath: string;
|
|
12
|
+
/** Vulnerability type (broken_access_control, sql_injection, etc.). */
|
|
13
|
+
vulnerabilityType: string;
|
|
14
|
+
/** Line number of the vulnerability. */
|
|
15
|
+
line: number;
|
|
16
|
+
}
|
|
17
|
+
export interface MutationTestResult {
|
|
18
|
+
discriminating: boolean;
|
|
19
|
+
mutatedVerdict: 'pass' | 'fail' | 'error' | 'timeout' | 'not-run';
|
|
20
|
+
reason: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run a mutation test:
|
|
24
|
+
*
|
|
25
|
+
* 1. Apply a security mutation to the vulnerable code (e.g., add an auth guard).
|
|
26
|
+
* 2. Run the test script against the mutated (secure) code.
|
|
27
|
+
* 3. If the test PASSES on the original but FAILS on the mutation → discriminating.
|
|
28
|
+
* 4. If the test PASSES on both → non-discriminating (the test doesn't test security).
|
|
29
|
+
* 5. If the test ERRORS on the mutation → INCONCLUSIVE (not discriminating).
|
|
30
|
+
*
|
|
31
|
+
* Never label mutation errors as successful discrimination.
|
|
32
|
+
*/
|
|
33
|
+
export declare function runMutationTest(opts: MutationTestOptions): Promise<MutationTestResult>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runMutationTest = runMutationTest;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const localTestRunner_1 = require("../utils/localTestRunner");
|
|
40
|
+
const mutationOperators_1 = require("./mutationOperators");
|
|
41
|
+
/**
|
|
42
|
+
* Run a mutation test:
|
|
43
|
+
*
|
|
44
|
+
* 1. Apply a security mutation to the vulnerable code (e.g., add an auth guard).
|
|
45
|
+
* 2. Run the test script against the mutated (secure) code.
|
|
46
|
+
* 3. If the test PASSES on the original but FAILS on the mutation → discriminating.
|
|
47
|
+
* 4. If the test PASSES on both → non-discriminating (the test doesn't test security).
|
|
48
|
+
* 5. If the test ERRORS on the mutation → INCONCLUSIVE (not discriminating).
|
|
49
|
+
*
|
|
50
|
+
* Never label mutation errors as successful discrimination.
|
|
51
|
+
*/
|
|
52
|
+
async function runMutationTest(opts) {
|
|
53
|
+
const mutation = (0, mutationOperators_1.applyMutation)(opts.vulnerableCode, opts.vulnerabilityType, opts.line);
|
|
54
|
+
if (!mutation.mutated) {
|
|
55
|
+
return {
|
|
56
|
+
discriminating: false,
|
|
57
|
+
mutatedVerdict: 'not-run',
|
|
58
|
+
reason: `Mutation test skipped: ${mutation.description}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const sandboxDir = path.join(opts.workspaceRoot, '.securecode');
|
|
62
|
+
if (!fs.existsSync(sandboxDir))
|
|
63
|
+
fs.mkdirSync(sandboxDir, { recursive: true });
|
|
64
|
+
const suffix = `${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
65
|
+
const ext = opts.runner === 'python3' ? 'py' : 'js';
|
|
66
|
+
const mutationFile = path.join(sandboxDir, `mutation-${suffix}.${ext}`);
|
|
67
|
+
try {
|
|
68
|
+
// Write the mutated code to the sandbox file
|
|
69
|
+
fs.writeFileSync(mutationFile, mutation.mutatedCode, 'utf8');
|
|
70
|
+
// Run the test script against the mutated code
|
|
71
|
+
const result = await (0, localTestRunner_1.runLocalTest)(mutation.mutatedCode, opts.runner, opts.workspaceRoot, {
|
|
72
|
+
setupScript: null,
|
|
73
|
+
timeoutMs: 30_000,
|
|
74
|
+
});
|
|
75
|
+
if (result.verdict === 'pass') {
|
|
76
|
+
return {
|
|
77
|
+
discriminating: false,
|
|
78
|
+
mutatedVerdict: 'pass',
|
|
79
|
+
reason: `Mutation test PASSED — the test does not discriminate between vulnerable and secure code. ${mutation.description}. ${result.output.slice(0, 200)}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (result.verdict === 'fail') {
|
|
83
|
+
return {
|
|
84
|
+
discriminating: true,
|
|
85
|
+
mutatedVerdict: 'fail',
|
|
86
|
+
reason: `Mutation test FAILED — the test correctly discriminates: ${mutation.description}. ${result.output.slice(0, 200)}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// error or timeout → INCONCLUSIVE, not discriminating
|
|
90
|
+
return {
|
|
91
|
+
discriminating: false,
|
|
92
|
+
mutatedVerdict: result.verdict === 'timeout' ? 'timeout' : 'error',
|
|
93
|
+
reason: `Mutation test ${result.verdict === 'timeout' ? 'timed out' : 'errored'} — INCONCLUSIVE (not discriminating). ${mutation.description}. ${result.output.slice(0, 200)}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
return {
|
|
98
|
+
discriminating: false,
|
|
99
|
+
mutatedVerdict: 'error',
|
|
100
|
+
reason: `Mutation test failed to execute: ${err.message || err}`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
try {
|
|
105
|
+
fs.unlinkSync(mutationFile);
|
|
106
|
+
}
|
|
107
|
+
catch { /* best effort */ }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=mutationTest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationTest.js","sourceRoot":"","sources":["../../src/attack/mutationTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ProofEvidence, ProofGateResult, ParsedProofMarker, ProofSourceMode } from './proofTypes';
|
|
2
|
+
export declare function evaluateProofGate(marker: ParsedProofMarker, context: {
|
|
3
|
+
sandboxBackend: string;
|
|
4
|
+
targetFile: string;
|
|
5
|
+
targetLine: number;
|
|
6
|
+
repeatedRuns: number;
|
|
7
|
+
repeatPasses: number;
|
|
8
|
+
llmVerdict: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE';
|
|
9
|
+
sourceMode?: ProofSourceMode;
|
|
10
|
+
minimumRepeatRuns?: number;
|
|
11
|
+
}): ProofGateResult;
|
|
12
|
+
export declare function buildProofEvidence(marker: ParsedProofMarker, context: {
|
|
13
|
+
sandboxBackend: string;
|
|
14
|
+
targetFile: string;
|
|
15
|
+
targetLine: number;
|
|
16
|
+
targetSymbol?: string;
|
|
17
|
+
repeatedRuns: number;
|
|
18
|
+
repeatPasses: number;
|
|
19
|
+
assumptions?: string[];
|
|
20
|
+
}): ProofEvidence;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evaluateProofGate = evaluateProofGate;
|
|
4
|
+
exports.buildProofEvidence = buildProofEvidence;
|
|
5
|
+
const DEFAULT_MINIMUM_REPEAT_RUNS = 3;
|
|
6
|
+
function evaluateProofGate(marker, context) {
|
|
7
|
+
const failedGates = [];
|
|
8
|
+
const warnings = [];
|
|
9
|
+
if (!marker.found) {
|
|
10
|
+
failedGates.push('proof-marker-missing');
|
|
11
|
+
return {
|
|
12
|
+
eligibleForProven: false,
|
|
13
|
+
failedGates,
|
|
14
|
+
warnings,
|
|
15
|
+
downgradedVerdict: 'INCONCLUSIVE',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (marker.sourceMode === 'synthetic') {
|
|
19
|
+
failedGates.push('synthetic-source');
|
|
20
|
+
warnings.push('Proof uses synthetic reproduction, not real production code');
|
|
21
|
+
}
|
|
22
|
+
if (marker.sourceMode === 'extracted-logic') {
|
|
23
|
+
failedGates.push('extracted-logic-source');
|
|
24
|
+
warnings.push('Proof uses extracted/reconstructed logic, not exact production import');
|
|
25
|
+
}
|
|
26
|
+
if (marker.mockedVulnerablePath === true) {
|
|
27
|
+
failedGates.push('mock-vulnerable-path');
|
|
28
|
+
warnings.push('Test mocks the vulnerable decision path');
|
|
29
|
+
}
|
|
30
|
+
if (marker.targetReached === false) {
|
|
31
|
+
failedGates.push('target-not-reached');
|
|
32
|
+
warnings.push('Test did not reach the reported vulnerability location');
|
|
33
|
+
}
|
|
34
|
+
if (marker.baseline !== 'pass') {
|
|
35
|
+
failedGates.push('baseline-failed');
|
|
36
|
+
warnings.push('Baseline secure case did not pass — cannot distinguish exploit from normal behavior');
|
|
37
|
+
}
|
|
38
|
+
if (marker.exploit !== 'pass') {
|
|
39
|
+
failedGates.push('exploit-failed');
|
|
40
|
+
warnings.push('Exploit case did not pass');
|
|
41
|
+
}
|
|
42
|
+
if (marker.impact !== 'observed') {
|
|
43
|
+
failedGates.push('impact-not-observed');
|
|
44
|
+
warnings.push('No measurable impact observed from the exploit');
|
|
45
|
+
}
|
|
46
|
+
if (marker.assertion !== 'deterministic') {
|
|
47
|
+
failedGates.push('non-deterministic-assertion');
|
|
48
|
+
warnings.push('Test uses LLM-only assertion, not deterministic code');
|
|
49
|
+
}
|
|
50
|
+
if (context.repeatedRuns < (context.minimumRepeatRuns ?? DEFAULT_MINIMUM_REPEAT_RUNS)) {
|
|
51
|
+
failedGates.push('insufficient-repeats');
|
|
52
|
+
warnings.push(`Only ${context.repeatedRuns} run(s), need ${context.minimumRepeatRuns ?? DEFAULT_MINIMUM_REPEAT_RUNS} for PROVEN`);
|
|
53
|
+
}
|
|
54
|
+
if (context.repeatPasses < context.repeatedRuns) {
|
|
55
|
+
failedGates.push('flaky-proof');
|
|
56
|
+
warnings.push(`${context.repeatPasses}/${context.repeatedRuns} runs passed — proof is flaky`);
|
|
57
|
+
}
|
|
58
|
+
if (context.llmVerdict !== 'PROVEN' && failedGates.length === 0) {
|
|
59
|
+
warnings.push('LLM verdict was not PROVEN but proof marker passed — overriding to PROVEN');
|
|
60
|
+
}
|
|
61
|
+
if (context.llmVerdict === 'PROVEN' && failedGates.length > 0) {
|
|
62
|
+
warnings.push('LLM said PROVEN but deterministic gates failed — downgrading');
|
|
63
|
+
}
|
|
64
|
+
const eligibleForProven = failedGates.length === 0;
|
|
65
|
+
let downgradedVerdict;
|
|
66
|
+
if (eligibleForProven) {
|
|
67
|
+
downgradedVerdict = 'PROVEN';
|
|
68
|
+
}
|
|
69
|
+
else if (failedGates.includes('exploit-failed') || failedGates.includes('impact-not-observed')) {
|
|
70
|
+
downgradedVerdict = 'UNPROVEN';
|
|
71
|
+
}
|
|
72
|
+
else if (failedGates.includes('synthetic-source') || failedGates.includes('extracted-logic-source')) {
|
|
73
|
+
downgradedVerdict = 'INCONCLUSIVE';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
downgradedVerdict = 'INCONCLUSIVE';
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
eligibleForProven,
|
|
80
|
+
failedGates,
|
|
81
|
+
warnings,
|
|
82
|
+
downgradedVerdict,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function buildProofEvidence(marker, context) {
|
|
86
|
+
return {
|
|
87
|
+
proofId: `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,
|
|
88
|
+
sourceMode: marker.sourceMode ?? 'synthetic',
|
|
89
|
+
targetFile: context.targetFile,
|
|
90
|
+
targetLine: context.targetLine,
|
|
91
|
+
targetSymbol: context.targetSymbol,
|
|
92
|
+
reachedTarget: marker.targetReached ?? false,
|
|
93
|
+
baselinePassed: marker.baseline === 'pass',
|
|
94
|
+
exploitPassed: marker.exploit === 'pass',
|
|
95
|
+
impactObserved: marker.impact === 'observed',
|
|
96
|
+
deterministicAssertion: marker.assertion === 'deterministic',
|
|
97
|
+
mocksVulnerablePath: marker.mockedVulnerablePath ?? false,
|
|
98
|
+
repeatedRuns: context.repeatedRuns,
|
|
99
|
+
repeatPasses: context.repeatPasses,
|
|
100
|
+
sandboxBackend: context.sandboxBackend,
|
|
101
|
+
assumptions: context.assumptions ?? [],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=proofGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofGate.js","sourceRoot":"","sources":["../../src/attack/proofGate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export type ProofSourceMode = 'real-import' | 'real-server' | 'extracted-logic' | 'synthetic';
|
|
2
|
+
export interface ProofEvidence {
|
|
3
|
+
proofId: string;
|
|
4
|
+
sourceMode: ProofSourceMode;
|
|
5
|
+
targetFile: string;
|
|
6
|
+
targetLine: number;
|
|
7
|
+
targetSymbol?: string;
|
|
8
|
+
reachedTarget: boolean;
|
|
9
|
+
baselinePassed: boolean;
|
|
10
|
+
exploitPassed: boolean;
|
|
11
|
+
impactObserved: boolean;
|
|
12
|
+
deterministicAssertion: boolean;
|
|
13
|
+
mocksVulnerablePath: boolean;
|
|
14
|
+
repeatedRuns: number;
|
|
15
|
+
repeatPasses: number;
|
|
16
|
+
sandboxBackend: string;
|
|
17
|
+
environmentFingerprint?: string;
|
|
18
|
+
assumptions: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ProofGateResult {
|
|
21
|
+
eligibleForProven: boolean;
|
|
22
|
+
failedGates: string[];
|
|
23
|
+
warnings: string[];
|
|
24
|
+
downgradedVerdict: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE' | 'NOT_REPRODUCIBLE';
|
|
25
|
+
}
|
|
26
|
+
export type ProofSubVerdict = 'proof-marker-missing' | 'proof-assertion-failed' | 'flaky-proof' | 'mock-vulnerable-path' | 'target-not-reached' | 'baseline-failed' | 'impact-not-observed' | 'gate-passed' | 'gate-rejected';
|
|
27
|
+
export interface ParsedProofMarker {
|
|
28
|
+
found: boolean;
|
|
29
|
+
baseline?: 'pass' | 'fail';
|
|
30
|
+
exploit?: 'pass' | 'fail';
|
|
31
|
+
impact?: 'observed' | 'not-observed';
|
|
32
|
+
targetReached?: boolean;
|
|
33
|
+
assertion?: 'deterministic' | 'llm-only';
|
|
34
|
+
mockedVulnerablePath?: boolean;
|
|
35
|
+
sourceMode?: ProofSourceMode;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Per-run validation result for a single repeatability run. Each repeat
|
|
39
|
+
* must independently validate all proof properties — a run is only
|
|
40
|
+
* counted as "passed" if ALL of these are true:
|
|
41
|
+
* - verdict === 'pass'
|
|
42
|
+
* - markerValid (proof marker was found and parsed)
|
|
43
|
+
* - targetReached (the proof reached the target file/line)
|
|
44
|
+
* - impactObserved (the exploit produced an observable impact)
|
|
45
|
+
*/
|
|
46
|
+
export interface ProofRunResult {
|
|
47
|
+
runIndex: number;
|
|
48
|
+
verdict: 'pass' | 'fail' | 'error' | 'timeout';
|
|
49
|
+
markerValid: boolean;
|
|
50
|
+
targetReached: boolean;
|
|
51
|
+
impactObserved: boolean;
|
|
52
|
+
baselineResult?: 'pass' | 'fail';
|
|
53
|
+
exploitResult?: 'pass' | 'fail';
|
|
54
|
+
}
|
|
55
|
+
export declare const PROOF_MARKER_START = "SECURECODE_PROOF_RESULT:";
|
|
56
|
+
export declare const PROOF_MARKER_END = ":SECURECODE_PROOF_END";
|
|
57
|
+
export declare function parseProofMarker(output: string): ParsedProofMarker;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROOF_MARKER_END = exports.PROOF_MARKER_START = void 0;
|
|
4
|
+
exports.parseProofMarker = parseProofMarker;
|
|
5
|
+
exports.PROOF_MARKER_START = 'SECURECODE_PROOF_RESULT:';
|
|
6
|
+
exports.PROOF_MARKER_END = ':SECURECODE_PROOF_END';
|
|
7
|
+
function parseProofMarker(output) {
|
|
8
|
+
const startIdx = output.indexOf(exports.PROOF_MARKER_START);
|
|
9
|
+
if (startIdx === -1)
|
|
10
|
+
return { found: false };
|
|
11
|
+
const endIdx = output.indexOf(exports.PROOF_MARKER_END, startIdx);
|
|
12
|
+
if (endIdx === -1)
|
|
13
|
+
return { found: false };
|
|
14
|
+
const jsonStr = output.slice(startIdx + exports.PROOF_MARKER_START.length, endIdx).trim();
|
|
15
|
+
try {
|
|
16
|
+
const parsed = JSON.parse(jsonStr);
|
|
17
|
+
return {
|
|
18
|
+
found: true,
|
|
19
|
+
baseline: parsed.baseline,
|
|
20
|
+
exploit: parsed.exploit,
|
|
21
|
+
impact: parsed.impact,
|
|
22
|
+
targetReached: parsed.targetReached,
|
|
23
|
+
assertion: parsed.assertion,
|
|
24
|
+
mockedVulnerablePath: parsed.mockedVulnerablePath,
|
|
25
|
+
sourceMode: parsed.sourceMode,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { found: false };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=proofTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofTypes.js","sourceRoot":"","sources":["../../src/attack/proofTypes.ts"],"names":[],"mappings":";;;AAwEA,4CAqBC;AAxBY,QAAA,kBAAkB,GAAG,0BAA0B,CAAC;AAChD,QAAA,gBAAgB,GAAG,uBAAuB,CAAC;AAExD,SAAgB,gBAAgB,CAAC,MAAc;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,0BAAkB,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,0BAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAClF,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO;YACH,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;YACjD,UAAU,EAAE,MAAM,CAAC,UAAU;SAChC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACL,CAAC"}
|