vaspera 2.12.0 → 2.14.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/CHANGELOG.md +79 -0
- package/dist/__tests__/antagonist-integration.test.d.ts +6 -0
- package/dist/__tests__/antagonist-integration.test.d.ts.map +1 -0
- package/dist/__tests__/antagonist-integration.test.js +239 -0
- package/dist/__tests__/antagonist-integration.test.js.map +1 -0
- package/dist/__tests__/siem-integration.test.d.ts +7 -0
- package/dist/__tests__/siem-integration.test.d.ts.map +1 -0
- package/dist/__tests__/siem-integration.test.js +285 -0
- package/dist/__tests__/siem-integration.test.js.map +1 -0
- package/dist/agents/antagonist/challenger.d.ts +46 -0
- package/dist/agents/antagonist/challenger.d.ts.map +1 -0
- package/dist/agents/antagonist/challenger.js +257 -0
- package/dist/agents/antagonist/challenger.js.map +1 -0
- package/dist/agents/antagonist/index.d.ts +31 -0
- package/dist/agents/antagonist/index.d.ts.map +1 -0
- package/dist/agents/antagonist/index.js +175 -0
- package/dist/agents/antagonist/index.js.map +1 -0
- package/dist/agents/antagonist/prioritizer.d.ts +27 -0
- package/dist/agents/antagonist/prioritizer.d.ts.map +1 -0
- package/dist/agents/antagonist/prioritizer.js +181 -0
- package/dist/agents/antagonist/prioritizer.js.map +1 -0
- package/dist/agents/antagonist/prompts.d.ts +12 -0
- package/dist/agents/antagonist/prompts.d.ts.map +1 -0
- package/dist/agents/antagonist/prompts.js +155 -0
- package/dist/agents/antagonist/prompts.js.map +1 -0
- package/dist/agents/antagonist/synthesizer.d.ts +34 -0
- package/dist/agents/antagonist/synthesizer.d.ts.map +1 -0
- package/dist/agents/antagonist/synthesizer.js +451 -0
- package/dist/agents/antagonist/synthesizer.js.map +1 -0
- package/dist/agents/antagonist/types.d.ts +145 -0
- package/dist/agents/antagonist/types.d.ts.map +1 -0
- package/dist/agents/antagonist/types.js +63 -0
- package/dist/agents/antagonist/types.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/certification/consensus.test.js +2 -0
- package/dist/certification/consensus.test.js.map +1 -1
- package/dist/certification/store.d.ts.map +1 -1
- package/dist/certification/store.js +6 -1
- package/dist/certification/store.js.map +1 -1
- package/dist/certification/types.d.ts +1 -1
- package/dist/certification/types.d.ts.map +1 -1
- package/dist/certification/types.js +2 -0
- package/dist/certification/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +460 -16
- package/dist/index.js.map +1 -1
- package/dist/persistence/__tests__/json-fallback.test.d.ts +5 -0
- package/dist/persistence/__tests__/json-fallback.test.d.ts.map +1 -0
- package/dist/persistence/__tests__/json-fallback.test.js +249 -0
- package/dist/persistence/__tests__/json-fallback.test.js.map +1 -0
- package/dist/persistence/__tests__/persistence.test.js.map +1 -1
- package/dist/persistence/db.d.ts +15 -0
- package/dist/persistence/db.d.ts.map +1 -1
- package/dist/persistence/db.js +59 -10
- package/dist/persistence/db.js.map +1 -1
- package/dist/persistence/index.d.ts +13 -4
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +139 -14
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/json-fallback.d.ts +52 -0
- package/dist/persistence/json-fallback.d.ts.map +1 -0
- package/dist/persistence/json-fallback.js +283 -0
- package/dist/persistence/json-fallback.js.map +1 -0
- package/dist/sbom/provenance.test.js +2 -2
- package/dist/sbom/provenance.test.js.map +1 -1
- package/dist/sbom/signing.d.ts.map +1 -1
- package/dist/sbom/signing.js +5 -3
- package/dist/sbom/signing.js.map +1 -1
- package/dist/scanners/ai-code/index.d.ts.map +1 -1
- package/dist/scanners/ai-code/index.js +90 -2
- package/dist/scanners/ai-code/index.js.map +1 -1
- package/dist/scanners/ai-code/types.d.ts +12 -0
- package/dist/scanners/ai-code/types.d.ts.map +1 -1
- package/dist/scanners/eslint.d.ts.map +1 -1
- package/dist/scanners/eslint.js +45 -3
- package/dist/scanners/eslint.js.map +1 -1
- package/dist/scanners/scale/bottleneck-detector.d.ts +13 -2
- package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -1
- package/dist/scanners/scale/bottleneck-detector.js +199 -72
- package/dist/scanners/scale/bottleneck-detector.js.map +1 -1
- package/dist/scanners/types.d.ts +18 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js.map +1 -1
- package/dist/scanners/typescript.d.ts.map +1 -1
- package/dist/scanners/typescript.js +36 -4
- package/dist/scanners/typescript.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Antagonist Attack Narrative Synthesizer
|
|
3
|
+
*
|
|
4
|
+
* Synthesizes individual findings into attack narratives by:
|
|
5
|
+
* 1. Building attack graphs from findings and chains
|
|
6
|
+
* 2. Finding complete attack paths
|
|
7
|
+
* 3. Mapping to MITRE ATT&CK kill chain
|
|
8
|
+
* 4. Generating human-readable narratives
|
|
9
|
+
*
|
|
10
|
+
* @module agents/antagonist/synthesizer
|
|
11
|
+
*/
|
|
12
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
13
|
+
import { SYNTHESIS_SYSTEM_PROMPT, buildSynthesisPrompt, } from "./prompts.js";
|
|
14
|
+
import { logger } from "../../logger.js";
|
|
15
|
+
/**
|
|
16
|
+
* Maps finding categories to kill chain phases
|
|
17
|
+
*/
|
|
18
|
+
const CATEGORY_TO_PHASE = {
|
|
19
|
+
"sensitive-disclosure": "reconnaissance",
|
|
20
|
+
"path-traversal": "discovery",
|
|
21
|
+
"sql-injection": "initial-access",
|
|
22
|
+
"command-injection": "execution",
|
|
23
|
+
"code-injection": "execution",
|
|
24
|
+
xss: "initial-access",
|
|
25
|
+
"auth-bypass": "initial-access",
|
|
26
|
+
"broken-access-control": "privilege-escalation",
|
|
27
|
+
"session-management": "credential-access",
|
|
28
|
+
"hardcoded-secret": "credential-access",
|
|
29
|
+
ssrf: "lateral-movement",
|
|
30
|
+
"exfil-path": "exfiltration",
|
|
31
|
+
"prompt-injection": "initial-access",
|
|
32
|
+
"excessive-agency": "execution",
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Maps severity to difficulty estimation
|
|
36
|
+
*/
|
|
37
|
+
const SEVERITY_TO_DIFFICULTY = {
|
|
38
|
+
critical: "trivial",
|
|
39
|
+
high: "easy",
|
|
40
|
+
medium: "moderate",
|
|
41
|
+
low: "hard",
|
|
42
|
+
info: "expert",
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Build attack graph from findings and exploit chains
|
|
46
|
+
*/
|
|
47
|
+
function buildAttackGraph(findings, chains, paths) {
|
|
48
|
+
const graph = new Map();
|
|
49
|
+
for (const finding of findings) {
|
|
50
|
+
const phase = CATEGORY_TO_PHASE[finding.category] || "execution";
|
|
51
|
+
graph.set(finding.id, {
|
|
52
|
+
findingId: finding.id,
|
|
53
|
+
finding,
|
|
54
|
+
phase,
|
|
55
|
+
inEdges: [],
|
|
56
|
+
outEdges: [],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
for (const chain of chains) {
|
|
60
|
+
for (let i = 0; i < chain.steps.length - 1; i++) {
|
|
61
|
+
const source = chain.steps[i].findingId;
|
|
62
|
+
const target = chain.steps[i + 1].findingId;
|
|
63
|
+
const sourceNode = graph.get(source);
|
|
64
|
+
const targetNode = graph.get(target);
|
|
65
|
+
if (sourceNode && targetNode) {
|
|
66
|
+
if (!sourceNode.outEdges.includes(target)) {
|
|
67
|
+
sourceNode.outEdges.push(target);
|
|
68
|
+
}
|
|
69
|
+
if (!targetNode.inEdges.includes(source)) {
|
|
70
|
+
targetNode.inEdges.push(source);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return graph;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Find entry points (nodes with no incoming edges and high severity)
|
|
79
|
+
*/
|
|
80
|
+
function findEntryPoints(graph) {
|
|
81
|
+
const entries = [];
|
|
82
|
+
for (const node of graph.values()) {
|
|
83
|
+
if (node.inEdges.length === 0 &&
|
|
84
|
+
["critical", "high"].includes(node.finding.severity)) {
|
|
85
|
+
entries.push(node);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (entries.length === 0) {
|
|
89
|
+
for (const node of graph.values()) {
|
|
90
|
+
if (node.inEdges.length === 0) {
|
|
91
|
+
entries.push(node);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return entries.slice(0, 5);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Find paths from entry point to high-value targets
|
|
99
|
+
*/
|
|
100
|
+
function findAttackPaths(graph, entryId, maxDepth = 5) {
|
|
101
|
+
const paths = [];
|
|
102
|
+
const visited = new Set();
|
|
103
|
+
function dfs(currentId, currentPath, depth) {
|
|
104
|
+
if (depth > maxDepth)
|
|
105
|
+
return;
|
|
106
|
+
if (visited.has(currentId))
|
|
107
|
+
return;
|
|
108
|
+
visited.add(currentId);
|
|
109
|
+
currentPath.push(currentId);
|
|
110
|
+
const node = graph.get(currentId);
|
|
111
|
+
if (!node) {
|
|
112
|
+
visited.delete(currentId);
|
|
113
|
+
currentPath.pop();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (node.outEdges.length === 0 && currentPath.length > 1) {
|
|
117
|
+
paths.push([...currentPath]);
|
|
118
|
+
}
|
|
119
|
+
for (const nextId of node.outEdges) {
|
|
120
|
+
dfs(nextId, currentPath, depth + 1);
|
|
121
|
+
}
|
|
122
|
+
visited.delete(currentId);
|
|
123
|
+
currentPath.pop();
|
|
124
|
+
}
|
|
125
|
+
dfs(entryId, [], 0);
|
|
126
|
+
return paths;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Calculate overall difficulty from a path
|
|
130
|
+
*/
|
|
131
|
+
function calculatePathDifficulty(findings, path) {
|
|
132
|
+
const difficulties = path.map((id) => {
|
|
133
|
+
const finding = findings.find((f) => f.id === id);
|
|
134
|
+
return finding ? SEVERITY_TO_DIFFICULTY[finding.severity] : "moderate";
|
|
135
|
+
});
|
|
136
|
+
const order = ["trivial", "easy", "moderate", "hard", "expert"];
|
|
137
|
+
const maxIndex = Math.max(...difficulties.map((d) => order.indexOf(d)));
|
|
138
|
+
return order[Math.min(maxIndex + 1, order.length - 1)];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Calculate likelihood based on severity and path length
|
|
142
|
+
*/
|
|
143
|
+
function calculateLikelihood(findings, path) {
|
|
144
|
+
const severities = path.map((id) => {
|
|
145
|
+
const finding = findings.find((f) => f.id === id);
|
|
146
|
+
return finding?.severity || "low";
|
|
147
|
+
});
|
|
148
|
+
const hasCritical = severities.includes("critical");
|
|
149
|
+
const hasHigh = severities.includes("high");
|
|
150
|
+
const shortPath = path.length <= 2;
|
|
151
|
+
if (hasCritical && shortPath)
|
|
152
|
+
return "high";
|
|
153
|
+
if (hasHigh || (hasCritical && !shortPath))
|
|
154
|
+
return "medium";
|
|
155
|
+
return "low";
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Generate attack steps from path
|
|
159
|
+
*/
|
|
160
|
+
function generateAttackSteps(graph, path) {
|
|
161
|
+
return path.map((id) => {
|
|
162
|
+
const node = graph.get(id);
|
|
163
|
+
if (!node) {
|
|
164
|
+
return {
|
|
165
|
+
phase: "execution",
|
|
166
|
+
findingId: id,
|
|
167
|
+
description: "Unknown step",
|
|
168
|
+
confidence: 50,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
phase: node.phase,
|
|
173
|
+
findingId: id,
|
|
174
|
+
description: node.finding.description,
|
|
175
|
+
technique: getMitreTechnique(node.finding.category),
|
|
176
|
+
confidence: node.finding.confidence,
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get MITRE technique ID from category
|
|
182
|
+
*/
|
|
183
|
+
function getMitreTechnique(category) {
|
|
184
|
+
const mapping = {
|
|
185
|
+
"sql-injection": "T1190",
|
|
186
|
+
"command-injection": "T1059",
|
|
187
|
+
xss: "T1059.007",
|
|
188
|
+
"auth-bypass": "T1078",
|
|
189
|
+
ssrf: "T1090",
|
|
190
|
+
"path-traversal": "T1083",
|
|
191
|
+
"hardcoded-secret": "T1552",
|
|
192
|
+
"prompt-injection": "T1059",
|
|
193
|
+
};
|
|
194
|
+
return mapping[category];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Generate narrative text from path
|
|
198
|
+
*/
|
|
199
|
+
function generateNarrativeText(graph, path, targetAsset) {
|
|
200
|
+
const steps = [];
|
|
201
|
+
for (let i = 0; i < path.length; i++) {
|
|
202
|
+
const node = graph.get(path[i]);
|
|
203
|
+
if (!node)
|
|
204
|
+
continue;
|
|
205
|
+
const prefix = i === 0 ? "First, an attacker" : i === path.length - 1 ? "Finally, the attacker" : "Then, the attacker";
|
|
206
|
+
const action = describeAction(node.finding.category);
|
|
207
|
+
steps.push(`${prefix} ${action} (${node.finding.file || "unknown location"}:${node.finding.line || "?"}).`);
|
|
208
|
+
}
|
|
209
|
+
steps.push(`This chain allows the attacker to compromise ${targetAsset}.`);
|
|
210
|
+
return steps.join(" ");
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Describe action for category
|
|
214
|
+
*/
|
|
215
|
+
function describeAction(category) {
|
|
216
|
+
const actions = {
|
|
217
|
+
"sql-injection": "exploits a SQL injection vulnerability to access the database",
|
|
218
|
+
"command-injection": "injects commands to execute arbitrary code",
|
|
219
|
+
xss: "injects malicious scripts via cross-site scripting",
|
|
220
|
+
"auth-bypass": "bypasses authentication controls",
|
|
221
|
+
"broken-access-control": "escalates privileges via broken access control",
|
|
222
|
+
ssrf: "exploits SSRF to access internal services",
|
|
223
|
+
"path-traversal": "reads arbitrary files via path traversal",
|
|
224
|
+
"hardcoded-secret": "extracts hardcoded credentials",
|
|
225
|
+
"prompt-injection": "manipulates LLM behavior via prompt injection",
|
|
226
|
+
"exfil-path": "exfiltrates data through the agent tool chain",
|
|
227
|
+
};
|
|
228
|
+
return actions[category] || `exploits ${category} vulnerability`;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Synthesize attack narratives without LLM
|
|
232
|
+
*/
|
|
233
|
+
export function synthesizeNarrativesDeterministic(findings, chains, paths, config) {
|
|
234
|
+
const graph = buildAttackGraph(findings, chains, paths);
|
|
235
|
+
const entryPoints = findEntryPoints(graph);
|
|
236
|
+
const narratives = [];
|
|
237
|
+
for (const entry of entryPoints) {
|
|
238
|
+
const attackPaths = findAttackPaths(graph, entry.findingId);
|
|
239
|
+
for (const path of attackPaths.slice(0, 2)) {
|
|
240
|
+
if (path.length < 1)
|
|
241
|
+
continue;
|
|
242
|
+
const findingIds = path;
|
|
243
|
+
const difficulty = calculatePathDifficulty(findings, path);
|
|
244
|
+
const likelihood = calculateLikelihood(findings, path);
|
|
245
|
+
const steps = generateAttackSteps(graph, path);
|
|
246
|
+
const targetAsset = determineTargetAsset(graph, path);
|
|
247
|
+
const narrative = generateNarrativeText(graph, path, targetAsset);
|
|
248
|
+
const techniques = steps
|
|
249
|
+
.map((s) => s.technique)
|
|
250
|
+
.filter((t) => !!t);
|
|
251
|
+
const confidence = Math.round(steps.reduce((sum, s) => sum + s.confidence, 0) / steps.length);
|
|
252
|
+
if (confidence < config.minConfidence)
|
|
253
|
+
continue;
|
|
254
|
+
narratives.push({
|
|
255
|
+
id: `nar-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`,
|
|
256
|
+
name: generateNarrativeName(graph, path),
|
|
257
|
+
phases: steps,
|
|
258
|
+
entryPoint: entry.findingId,
|
|
259
|
+
targetAsset,
|
|
260
|
+
impact: determineImpact(graph, path),
|
|
261
|
+
difficulty,
|
|
262
|
+
likelihood,
|
|
263
|
+
findingIds,
|
|
264
|
+
mitreTechniques: [...new Set(techniques)],
|
|
265
|
+
narrative,
|
|
266
|
+
recommendations: [],
|
|
267
|
+
confidence,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
for (const chain of chains) {
|
|
272
|
+
const findingIds = chain.steps.map((s) => s.findingId);
|
|
273
|
+
const steps = chain.steps.map((s) => ({
|
|
274
|
+
phase: CATEGORY_TO_PHASE[s.finding.category] || "execution",
|
|
275
|
+
findingId: s.findingId,
|
|
276
|
+
description: s.finding.description,
|
|
277
|
+
technique: getMitreTechnique(s.finding.category),
|
|
278
|
+
confidence: s.finding.confidence,
|
|
279
|
+
}));
|
|
280
|
+
const confidence = Math.round(steps.reduce((sum, s) => sum + s.confidence, 0) / steps.length);
|
|
281
|
+
if (confidence < config.minConfidence)
|
|
282
|
+
continue;
|
|
283
|
+
narratives.push({
|
|
284
|
+
id: `nar-chain-${chain.id}`,
|
|
285
|
+
name: chain.name,
|
|
286
|
+
phases: steps,
|
|
287
|
+
entryPoint: chain.steps[0]?.findingId || "",
|
|
288
|
+
targetAsset: chain.impact,
|
|
289
|
+
impact: chain.impact,
|
|
290
|
+
difficulty: chain.difficulty,
|
|
291
|
+
likelihood: chain.totalSeverity === "critical" ? "high" : "medium",
|
|
292
|
+
findingIds,
|
|
293
|
+
mitreTechniques: chain.mitreAttackIds,
|
|
294
|
+
narrative: chain.attackScenario,
|
|
295
|
+
recommendations: [],
|
|
296
|
+
confidence,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
const uniqueNarratives = deduplicateNarratives(narratives);
|
|
300
|
+
return uniqueNarratives
|
|
301
|
+
.sort((a, b) => {
|
|
302
|
+
const likelihoodOrder = { high: 0, medium: 1, low: 2 };
|
|
303
|
+
return likelihoodOrder[a.likelihood] - likelihoodOrder[b.likelihood];
|
|
304
|
+
})
|
|
305
|
+
.slice(0, config.maxNarratives);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Determine target asset from path
|
|
309
|
+
*/
|
|
310
|
+
function determineTargetAsset(graph, path) {
|
|
311
|
+
const lastNode = graph.get(path[path.length - 1]);
|
|
312
|
+
if (!lastNode)
|
|
313
|
+
return "system";
|
|
314
|
+
const category = lastNode.finding.category;
|
|
315
|
+
const targets = {
|
|
316
|
+
"sql-injection": "database",
|
|
317
|
+
"command-injection": "server",
|
|
318
|
+
"auth-bypass": "user accounts",
|
|
319
|
+
"hardcoded-secret": "credentials",
|
|
320
|
+
"exfil-path": "sensitive data",
|
|
321
|
+
"prompt-injection": "AI system",
|
|
322
|
+
};
|
|
323
|
+
return targets[category] || "application";
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Determine impact from path
|
|
327
|
+
*/
|
|
328
|
+
function determineImpact(graph, path) {
|
|
329
|
+
const severities = path.map((id) => graph.get(id)?.finding.severity);
|
|
330
|
+
if (severities.includes("critical"))
|
|
331
|
+
return "Complete system compromise";
|
|
332
|
+
if (severities.includes("high"))
|
|
333
|
+
return "Significant data breach";
|
|
334
|
+
if (severities.includes("medium"))
|
|
335
|
+
return "Partial data exposure";
|
|
336
|
+
return "Limited impact";
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Generate narrative name from path
|
|
340
|
+
*/
|
|
341
|
+
function generateNarrativeName(graph, path) {
|
|
342
|
+
const firstNode = graph.get(path[0]);
|
|
343
|
+
const lastNode = graph.get(path[path.length - 1]);
|
|
344
|
+
const entryType = firstNode?.finding.category || "vulnerability";
|
|
345
|
+
const targetType = lastNode?.finding.category || "compromise";
|
|
346
|
+
const names = {
|
|
347
|
+
"sql-injection": "SQL Injection",
|
|
348
|
+
xss: "XSS",
|
|
349
|
+
"auth-bypass": "Auth Bypass",
|
|
350
|
+
"command-injection": "RCE",
|
|
351
|
+
ssrf: "SSRF",
|
|
352
|
+
"prompt-injection": "Prompt Injection",
|
|
353
|
+
"exfil-path": "Data Exfil",
|
|
354
|
+
"hardcoded-secret": "Credential Theft",
|
|
355
|
+
};
|
|
356
|
+
const entry = names[entryType] || entryType;
|
|
357
|
+
const target = names[targetType] || targetType;
|
|
358
|
+
return `${entry} to ${target} Chain`;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Deduplicate narratives by finding overlap
|
|
362
|
+
*/
|
|
363
|
+
function deduplicateNarratives(narratives) {
|
|
364
|
+
const unique = [];
|
|
365
|
+
for (const narrative of narratives) {
|
|
366
|
+
const isDuplicate = unique.some((existing) => {
|
|
367
|
+
const overlap = narrative.findingIds.filter((id) => existing.findingIds.includes(id));
|
|
368
|
+
return overlap.length > narrative.findingIds.length * 0.7;
|
|
369
|
+
});
|
|
370
|
+
if (!isDuplicate) {
|
|
371
|
+
unique.push(narrative);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return unique;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Synthesize attack narratives using LLM
|
|
378
|
+
*/
|
|
379
|
+
export async function synthesizeNarrativesLlm(findings, chains, paths, config) {
|
|
380
|
+
const client = new Anthropic();
|
|
381
|
+
const findingsStr = findings
|
|
382
|
+
.map((f) => `- ${f.id}: [${f.severity}] ${f.category} at ${f.file}:${f.line} - ${f.description}`)
|
|
383
|
+
.join("\n");
|
|
384
|
+
const chainsStr = chains
|
|
385
|
+
.map((c) => `- ${c.name}: ${c.steps.map((s) => s.findingId).join(" → ")} (${c.totalSeverity})`)
|
|
386
|
+
.join("\n");
|
|
387
|
+
const pathsStr = paths
|
|
388
|
+
.map((p) => `- ${p.source} → ${p.sink}: ${p.description}`)
|
|
389
|
+
.join("\n");
|
|
390
|
+
const prompt = buildSynthesisPrompt(findingsStr, chainsStr, pathsStr);
|
|
391
|
+
try {
|
|
392
|
+
const response = await client.messages.create({
|
|
393
|
+
model: config.llmModel || "claude-sonnet-4-20250514",
|
|
394
|
+
max_tokens: 4096,
|
|
395
|
+
system: SYNTHESIS_SYSTEM_PROMPT,
|
|
396
|
+
messages: [{ role: "user", content: prompt }],
|
|
397
|
+
});
|
|
398
|
+
const content = response.content[0];
|
|
399
|
+
if (content.type !== "text") {
|
|
400
|
+
throw new Error("Unexpected response type");
|
|
401
|
+
}
|
|
402
|
+
const jsonMatch = content.text.match(/\{[\s\S]*\}/);
|
|
403
|
+
if (!jsonMatch) {
|
|
404
|
+
throw new Error("No JSON in response");
|
|
405
|
+
}
|
|
406
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
407
|
+
const narratives = parsed.narratives.map((n, i) => ({
|
|
408
|
+
id: `nar-llm-${Date.now().toString(36)}-${i}`,
|
|
409
|
+
name: n.name,
|
|
410
|
+
phases: n.phases.map((p) => ({ ...p, confidence: n.confidence })),
|
|
411
|
+
entryPoint: n.entryPoint,
|
|
412
|
+
targetAsset: n.targetAsset,
|
|
413
|
+
impact: n.impact,
|
|
414
|
+
difficulty: n.difficulty,
|
|
415
|
+
likelihood: n.likelihood,
|
|
416
|
+
findingIds: n.findingIds,
|
|
417
|
+
mitreTechniques: n.mitreTechniques,
|
|
418
|
+
narrative: n.narrative,
|
|
419
|
+
recommendations: [],
|
|
420
|
+
confidence: n.confidence,
|
|
421
|
+
}));
|
|
422
|
+
const tokensUsed = (response.usage?.input_tokens || 0) +
|
|
423
|
+
(response.usage?.output_tokens || 0);
|
|
424
|
+
return { narratives, tokensUsed };
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
logger.warn("antagonist.llm_synthesis_failed", {
|
|
428
|
+
error: error instanceof Error ? error.message : String(error),
|
|
429
|
+
});
|
|
430
|
+
return { narratives: [], tokensUsed: 0 };
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Main synthesis function - combines deterministic and LLM approaches
|
|
435
|
+
*/
|
|
436
|
+
export async function synthesizeNarratives(findings, chains, paths, config) {
|
|
437
|
+
const deterministicNarratives = synthesizeNarrativesDeterministic(findings, chains, paths, config);
|
|
438
|
+
if (!config.useLlm || findings.length < 3) {
|
|
439
|
+
return { narratives: deterministicNarratives, tokensUsed: 0 };
|
|
440
|
+
}
|
|
441
|
+
const { narratives: llmNarratives, tokensUsed } = await synthesizeNarrativesLlm(findings, chains, paths, config);
|
|
442
|
+
const combined = deduplicateNarratives([
|
|
443
|
+
...llmNarratives,
|
|
444
|
+
...deterministicNarratives,
|
|
445
|
+
]);
|
|
446
|
+
return {
|
|
447
|
+
narratives: combined.slice(0, config.maxNarratives),
|
|
448
|
+
tokensUsed,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=synthesizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesizer.js","sourceRoot":"","sources":["../../../src/agents/antagonist/synthesizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Antagonist Agent Types
|
|
3
|
+
*
|
|
4
|
+
* The antagonist agent synthesizes findings into attack narratives
|
|
5
|
+
* and challenges assumptions from other agents.
|
|
6
|
+
*
|
|
7
|
+
* @module agents/antagonist/types
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentType, Severity, Finding } from "../../certification/types.js";
|
|
10
|
+
import type { ExploitChain } from "../exploit-chain.js";
|
|
11
|
+
import type { ExfilPath } from "../../scanners/agent/types.js";
|
|
12
|
+
/**
|
|
13
|
+
* MITRE ATT&CK Kill Chain phases
|
|
14
|
+
*/
|
|
15
|
+
export type KillChainPhase = "reconnaissance" | "resource-development" | "initial-access" | "execution" | "persistence" | "privilege-escalation" | "defense-evasion" | "credential-access" | "discovery" | "lateral-movement" | "collection" | "command-and-control" | "exfiltration" | "impact";
|
|
16
|
+
/**
|
|
17
|
+
* Difficulty rating for attack paths
|
|
18
|
+
*/
|
|
19
|
+
export type Difficulty = "trivial" | "easy" | "moderate" | "hard" | "expert";
|
|
20
|
+
/**
|
|
21
|
+
* Likelihood of attack being attempted
|
|
22
|
+
*/
|
|
23
|
+
export type Likelihood = "high" | "medium" | "low";
|
|
24
|
+
/**
|
|
25
|
+
* Challenge types for the internal critic
|
|
26
|
+
*/
|
|
27
|
+
export type ChallengeType = "missed_check" | "wrong_assumption" | "false_positive_likely" | "insufficient_evidence" | "wrong_severity" | "missing_context";
|
|
28
|
+
/**
|
|
29
|
+
* A step in the attack narrative mapped to kill chain
|
|
30
|
+
*/
|
|
31
|
+
export interface AttackStep {
|
|
32
|
+
phase: KillChainPhase;
|
|
33
|
+
findingId?: string;
|
|
34
|
+
description: string;
|
|
35
|
+
technique?: string;
|
|
36
|
+
confidence: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Prioritized remediation recommendation
|
|
40
|
+
*/
|
|
41
|
+
export interface PrioritizedRemediation {
|
|
42
|
+
order: number;
|
|
43
|
+
findingId: string;
|
|
44
|
+
reason: string;
|
|
45
|
+
blocksNarratives: string[];
|
|
46
|
+
effort: "low" | "medium" | "high";
|
|
47
|
+
impact: "low" | "medium" | "high";
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A complete attack narrative synthesized from findings
|
|
51
|
+
*/
|
|
52
|
+
export interface AttackNarrative {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
phases: AttackStep[];
|
|
56
|
+
entryPoint: string;
|
|
57
|
+
targetAsset: string;
|
|
58
|
+
impact: string;
|
|
59
|
+
difficulty: Difficulty;
|
|
60
|
+
likelihood: Likelihood;
|
|
61
|
+
findingIds: string[];
|
|
62
|
+
mitreTechniques: string[];
|
|
63
|
+
narrative: string;
|
|
64
|
+
recommendations: PrioritizedRemediation[];
|
|
65
|
+
confidence: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A challenge from the internal critic
|
|
69
|
+
*/
|
|
70
|
+
export interface ChallengerAssessment {
|
|
71
|
+
id: string;
|
|
72
|
+
type: ChallengeType;
|
|
73
|
+
targetAgent: AgentType;
|
|
74
|
+
targetFindingId?: string;
|
|
75
|
+
challenge: string;
|
|
76
|
+
evidence: string;
|
|
77
|
+
suggestedAction: string;
|
|
78
|
+
severity: Severity;
|
|
79
|
+
confidence: number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Gap analysis results
|
|
83
|
+
*/
|
|
84
|
+
export interface GapAnalysis {
|
|
85
|
+
untestedAttackVectors: string[];
|
|
86
|
+
missingControls: string[];
|
|
87
|
+
blindSpots: string[];
|
|
88
|
+
recommendations: string[];
|
|
89
|
+
coverageScore: number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Input to the antagonist agent
|
|
93
|
+
*/
|
|
94
|
+
export interface AntagonistInput {
|
|
95
|
+
projectPath: string;
|
|
96
|
+
certificationId: string;
|
|
97
|
+
findings: Finding[];
|
|
98
|
+
exploitChains: ExploitChain[];
|
|
99
|
+
exfilPaths: ExfilPath[];
|
|
100
|
+
agentSummaries: Record<AgentType, {
|
|
101
|
+
completed: boolean;
|
|
102
|
+
findingCount: number;
|
|
103
|
+
}>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Configuration for antagonist analysis
|
|
107
|
+
*/
|
|
108
|
+
export interface AntagonistConfig {
|
|
109
|
+
mode: "synthesis" | "challenger" | "both";
|
|
110
|
+
includePrioritization: boolean;
|
|
111
|
+
maxNarratives: number;
|
|
112
|
+
minConfidence: number;
|
|
113
|
+
challengeThreshold: number;
|
|
114
|
+
useLlm: boolean;
|
|
115
|
+
llmModel?: string;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Default antagonist configuration
|
|
119
|
+
*/
|
|
120
|
+
export declare const DEFAULT_ANTAGONIST_CONFIG: AntagonistConfig;
|
|
121
|
+
/**
|
|
122
|
+
* Result from antagonist analysis
|
|
123
|
+
*/
|
|
124
|
+
export interface AntagonistResult {
|
|
125
|
+
success: boolean;
|
|
126
|
+
analysisId: string;
|
|
127
|
+
attackNarratives: AttackNarrative[];
|
|
128
|
+
challengerAssessments: ChallengerAssessment[];
|
|
129
|
+
prioritization: PrioritizedRemediation[];
|
|
130
|
+
gapAnalysis: GapAnalysis;
|
|
131
|
+
summary: string;
|
|
132
|
+
duration: number;
|
|
133
|
+
tokensUsed?: number;
|
|
134
|
+
error?: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Attack vector categories for gap analysis
|
|
138
|
+
*/
|
|
139
|
+
export declare const ATTACK_VECTORS: readonly ["web-application", "api-security", "authentication", "authorization", "injection", "cryptography", "session-management", "input-validation", "output-encoding", "error-handling", "logging-monitoring", "data-protection", "network-security", "supply-chain", "infrastructure", "llm-security", "agent-security"];
|
|
140
|
+
export type AttackVector = (typeof ATTACK_VECTORS)[number];
|
|
141
|
+
/**
|
|
142
|
+
* Maps finding categories to attack vectors
|
|
143
|
+
*/
|
|
144
|
+
export declare const CATEGORY_TO_VECTOR: Record<string, AttackVector>;
|
|
145
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agents/antagonist/types.ts"],"names":[],"mappings":"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"}
|