@surfinguard/core-engine 0.1.0 → 1.0.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/LICENSE +21 -0
- package/dist/analyzers/agent-comm.d.ts +22 -0
- package/dist/analyzers/agent-comm.d.ts.map +1 -0
- package/dist/analyzers/agent-comm.js +79 -0
- package/dist/analyzers/agent-comm.js.map +1 -0
- package/dist/analyzers/api-call.d.ts +21 -0
- package/dist/analyzers/api-call.d.ts.map +1 -0
- package/dist/analyzers/api-call.js +134 -0
- package/dist/analyzers/api-call.js.map +1 -0
- package/dist/analyzers/auth.d.ts +22 -0
- package/dist/analyzers/auth.d.ts.map +1 -0
- package/dist/analyzers/auth.js +97 -0
- package/dist/analyzers/auth.js.map +1 -0
- package/dist/analyzers/code.d.ts +32 -0
- package/dist/analyzers/code.d.ts.map +1 -0
- package/dist/analyzers/code.js +310 -0
- package/dist/analyzers/code.js.map +1 -0
- package/dist/analyzers/command.d.ts.map +1 -1
- package/dist/analyzers/command.js +91 -39
- package/dist/analyzers/command.js.map +1 -1
- package/dist/analyzers/data-pipeline.d.ts +23 -0
- package/dist/analyzers/data-pipeline.d.ts.map +1 -0
- package/dist/analyzers/data-pipeline.js +86 -0
- package/dist/analyzers/data-pipeline.js.map +1 -0
- package/dist/analyzers/document.d.ts +22 -0
- package/dist/analyzers/document.d.ts.map +1 -0
- package/dist/analyzers/document.js +77 -0
- package/dist/analyzers/document.js.map +1 -0
- package/dist/analyzers/file-read.d.ts.map +1 -1
- package/dist/analyzers/file-read.js +12 -3
- package/dist/analyzers/file-read.js.map +1 -1
- package/dist/analyzers/file-write.d.ts.map +1 -1
- package/dist/analyzers/file-write.js +12 -3
- package/dist/analyzers/file-write.js.map +1 -1
- package/dist/analyzers/git.d.ts +25 -0
- package/dist/analyzers/git.d.ts.map +1 -0
- package/dist/analyzers/git.js +126 -0
- package/dist/analyzers/git.js.map +1 -0
- package/dist/analyzers/index.d.ts +3 -0
- package/dist/analyzers/index.d.ts.map +1 -1
- package/dist/analyzers/index.js +3 -0
- package/dist/analyzers/index.js.map +1 -1
- package/dist/analyzers/infra.d.ts +30 -0
- package/dist/analyzers/infra.d.ts.map +1 -0
- package/dist/analyzers/infra.js +134 -0
- package/dist/analyzers/infra.js.map +1 -0
- package/dist/analyzers/iot.d.ts +22 -0
- package/dist/analyzers/iot.d.ts.map +1 -0
- package/dist/analyzers/iot.js +78 -0
- package/dist/analyzers/iot.js.map +1 -0
- package/dist/analyzers/message.d.ts +22 -0
- package/dist/analyzers/message.d.ts.map +1 -0
- package/dist/analyzers/message.js +106 -0
- package/dist/analyzers/message.js.map +1 -0
- package/dist/analyzers/query.d.ts +23 -0
- package/dist/analyzers/query.d.ts.map +1 -0
- package/dist/analyzers/query.js +183 -0
- package/dist/analyzers/query.js.map +1 -0
- package/dist/analyzers/text.d.ts.map +1 -1
- package/dist/analyzers/text.js +20 -3
- package/dist/analyzers/text.js.map +1 -1
- package/dist/analyzers/transaction.d.ts +23 -0
- package/dist/analyzers/transaction.d.ts.map +1 -0
- package/dist/analyzers/transaction.js +100 -0
- package/dist/analyzers/transaction.js.map +1 -0
- package/dist/analyzers/ui-action.d.ts +23 -0
- package/dist/analyzers/ui-action.d.ts.map +1 -0
- package/dist/analyzers/ui-action.js +92 -0
- package/dist/analyzers/ui-action.js.map +1 -0
- package/dist/analyzers/url.d.ts.map +1 -1
- package/dist/analyzers/url.js +6 -2
- package/dist/analyzers/url.js.map +1 -1
- package/dist/classifier.d.ts.map +1 -1
- package/dist/classifier.js +20 -1
- package/dist/classifier.js.map +1 -1
- package/dist/context.d.ts +6 -4
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +34 -5
- package/dist/context.js.map +1 -1
- package/dist/engine.d.ts +72 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +313 -9
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/patterns.d.ts +15 -1
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +70 -53
- package/dist/patterns.js.map +1 -1
- package/dist/policy-engine.d.ts +44 -0
- package/dist/policy-engine.d.ts.map +1 -0
- package/dist/policy-engine.js +225 -0
- package/dist/policy-engine.js.map +1 -0
- package/dist/session-tracker.d.ts +50 -0
- package/dist/session-tracker.d.ts.map +1 -0
- package/dist/session-tracker.js +286 -0
- package/dist/session-tracker.js.map +1 -0
- package/package.json +15 -12
- package/patterns/agent-comm.json +97 -0
- package/patterns/api-call.json +175 -0
- package/patterns/auth.json +116 -0
- package/patterns/chains.json +171 -0
- package/patterns/code.json +204 -0
- package/patterns/data-pipeline.json +116 -0
- package/patterns/document.json +110 -0
- package/patterns/git.json +118 -0
- package/patterns/infra.json +207 -0
- package/patterns/iot.json +105 -0
- package/patterns/message.json +122 -0
- package/patterns/query.json +134 -0
- package/patterns/transaction.json +120 -0
- package/patterns/ui-action.json +137 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { loadChainPatterns } from './patterns.js';
|
|
2
|
+
const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
3
|
+
const MAX_ACTIONS_PER_SESSION = 50;
|
|
4
|
+
const TREND_WINDOW = 5; // Number of recent actions to compute trend
|
|
5
|
+
/**
|
|
6
|
+
* In-memory session tracker for multi-step attack chain detection.
|
|
7
|
+
*/
|
|
8
|
+
export class SessionTracker {
|
|
9
|
+
sessions = new Map();
|
|
10
|
+
chainDefinitions;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.chainDefinitions = loadChainPatterns().chains;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Record an action result in a session and detect chains.
|
|
16
|
+
*/
|
|
17
|
+
recordAction(sessionId, input, result, agentId) {
|
|
18
|
+
const session = this.getOrCreateSession(sessionId, agentId);
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
const summary = {
|
|
21
|
+
type: input.type,
|
|
22
|
+
value: input.value,
|
|
23
|
+
score: result.score,
|
|
24
|
+
level: result.level,
|
|
25
|
+
primitive: result.primitive,
|
|
26
|
+
timestamp: now,
|
|
27
|
+
};
|
|
28
|
+
// Append action (cap at MAX_ACTIONS)
|
|
29
|
+
if (session.actions.length >= MAX_ACTIONS_PER_SESSION) {
|
|
30
|
+
session.actions.shift();
|
|
31
|
+
}
|
|
32
|
+
session.actions.push(summary);
|
|
33
|
+
session.actionCount++;
|
|
34
|
+
session.lastActivityAt = now;
|
|
35
|
+
// Update peak score
|
|
36
|
+
if (result.score > session.peakScore) {
|
|
37
|
+
session.peakScore = result.score;
|
|
38
|
+
}
|
|
39
|
+
// Update cumulative primitive scores
|
|
40
|
+
if (result.primitive) {
|
|
41
|
+
session.cumulativePrimitiveScores[result.primitive] =
|
|
42
|
+
(session.cumulativePrimitiveScores[result.primitive] || 0) + result.score;
|
|
43
|
+
}
|
|
44
|
+
// Detect chains
|
|
45
|
+
const chainDetections = this.detectChains(session);
|
|
46
|
+
session.activeChains = chainDetections.map((c) => c.chainId);
|
|
47
|
+
// Compute risk trend
|
|
48
|
+
session.riskTrend = this.computeTrend(session);
|
|
49
|
+
// Calculate context boost from chains
|
|
50
|
+
const contextBoost = chainDetections.reduce((sum, c) => sum + c.scoreBoost, 0);
|
|
51
|
+
return {
|
|
52
|
+
contextBoost,
|
|
53
|
+
chainDetections,
|
|
54
|
+
riskTrend: session.riskTrend,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get a session by ID.
|
|
59
|
+
*/
|
|
60
|
+
getSession(sessionId) {
|
|
61
|
+
const session = this.sessions.get(sessionId);
|
|
62
|
+
if (session && this.isExpired(session)) {
|
|
63
|
+
this.sessions.delete(sessionId);
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return session;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get session summary info (for API responses).
|
|
70
|
+
*/
|
|
71
|
+
getSessionInfo(sessionId) {
|
|
72
|
+
const session = this.getSession(sessionId);
|
|
73
|
+
if (!session)
|
|
74
|
+
return undefined;
|
|
75
|
+
return {
|
|
76
|
+
sessionId: session.sessionId,
|
|
77
|
+
agentId: session.agentId,
|
|
78
|
+
startedAt: session.startedAt,
|
|
79
|
+
lastActivityAt: session.lastActivityAt,
|
|
80
|
+
actionCount: session.actionCount,
|
|
81
|
+
peakScore: session.peakScore,
|
|
82
|
+
riskTrend: session.riskTrend,
|
|
83
|
+
activeChains: session.activeChains,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build an ActionContext from session state (for passing to engine).
|
|
88
|
+
*/
|
|
89
|
+
buildContext(sessionId) {
|
|
90
|
+
const session = this.getSession(sessionId);
|
|
91
|
+
if (!session)
|
|
92
|
+
return undefined;
|
|
93
|
+
// Compute trust level from session behavior (lower with more danger)
|
|
94
|
+
const dangerCount = session.actions.filter((a) => a.level === 'DANGER').length;
|
|
95
|
+
const trustLevel = Math.max(0, 1.0 - dangerCount * 0.2);
|
|
96
|
+
return {
|
|
97
|
+
sessionId: session.sessionId,
|
|
98
|
+
agentId: session.agentId,
|
|
99
|
+
priorActions: session.actions.slice(),
|
|
100
|
+
trustLevel,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Clear a specific session.
|
|
105
|
+
*/
|
|
106
|
+
clearSession(sessionId) {
|
|
107
|
+
this.sessions.delete(sessionId);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Remove all expired sessions.
|
|
111
|
+
*/
|
|
112
|
+
pruneExpiredSessions() {
|
|
113
|
+
let pruned = 0;
|
|
114
|
+
for (const [id, session] of this.sessions) {
|
|
115
|
+
if (this.isExpired(session)) {
|
|
116
|
+
this.sessions.delete(id);
|
|
117
|
+
pruned++;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return pruned;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get all active session IDs.
|
|
124
|
+
*/
|
|
125
|
+
getActiveSessionIds() {
|
|
126
|
+
this.pruneExpiredSessions();
|
|
127
|
+
return Array.from(this.sessions.keys());
|
|
128
|
+
}
|
|
129
|
+
getOrCreateSession(sessionId, agentId) {
|
|
130
|
+
let session = this.sessions.get(sessionId);
|
|
131
|
+
if (session && this.isExpired(session)) {
|
|
132
|
+
this.sessions.delete(sessionId);
|
|
133
|
+
session = undefined;
|
|
134
|
+
}
|
|
135
|
+
if (!session) {
|
|
136
|
+
const now = Date.now();
|
|
137
|
+
session = {
|
|
138
|
+
sessionId,
|
|
139
|
+
agentId,
|
|
140
|
+
startedAt: now,
|
|
141
|
+
lastActivityAt: now,
|
|
142
|
+
actionCount: 0,
|
|
143
|
+
cumulativePrimitiveScores: {
|
|
144
|
+
DESTRUCTION: 0,
|
|
145
|
+
EXFILTRATION: 0,
|
|
146
|
+
ESCALATION: 0,
|
|
147
|
+
PERSISTENCE: 0,
|
|
148
|
+
MANIPULATION: 0,
|
|
149
|
+
},
|
|
150
|
+
peakScore: 0,
|
|
151
|
+
actions: [],
|
|
152
|
+
activeChains: [],
|
|
153
|
+
riskTrend: 'stable',
|
|
154
|
+
};
|
|
155
|
+
this.sessions.set(sessionId, session);
|
|
156
|
+
}
|
|
157
|
+
return session;
|
|
158
|
+
}
|
|
159
|
+
isExpired(session) {
|
|
160
|
+
return Date.now() - session.lastActivityAt > SESSION_TIMEOUT_MS;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Detect active chains in a session by walking chain definitions.
|
|
164
|
+
*/
|
|
165
|
+
detectChains(session) {
|
|
166
|
+
const detections = [];
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
for (const chain of this.chainDefinitions) {
|
|
169
|
+
const windowStart = now - chain.windowMs;
|
|
170
|
+
const windowActions = session.actions.filter((a) => a.timestamp >= windowStart);
|
|
171
|
+
if (windowActions.length === 0)
|
|
172
|
+
continue;
|
|
173
|
+
// Handle repeat-only chains (like CH08)
|
|
174
|
+
if (chain.minOccurrences && chain.steps.length === 1 && chain.steps[0].repeat) {
|
|
175
|
+
const step = chain.steps[0];
|
|
176
|
+
const matches = windowActions.filter((a) => this.actionMatchesStep(a, step));
|
|
177
|
+
if (matches.length >= chain.minOccurrences) {
|
|
178
|
+
detections.push({
|
|
179
|
+
chainId: chain.id,
|
|
180
|
+
name: chain.name,
|
|
181
|
+
matchedSteps: matches.slice(0, chain.minOccurrences).map(() => step.label),
|
|
182
|
+
scoreBoost: chain.scoreBoost,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
// Walk steps in order through the actions
|
|
188
|
+
const matchedSteps = [];
|
|
189
|
+
let stepIndex = 0;
|
|
190
|
+
let currentStepMatched = false;
|
|
191
|
+
for (const action of windowActions) {
|
|
192
|
+
if (stepIndex >= chain.steps.length)
|
|
193
|
+
break;
|
|
194
|
+
const currentStep = chain.steps[stepIndex];
|
|
195
|
+
if (this.actionMatchesStep(action, currentStep)) {
|
|
196
|
+
matchedSteps.push(currentStep.label);
|
|
197
|
+
currentStepMatched = true;
|
|
198
|
+
// If step repeats and there's a next step, check if we should advance
|
|
199
|
+
if (currentStep.repeat && stepIndex + 1 < chain.steps.length) {
|
|
200
|
+
const nextStep = chain.steps[stepIndex + 1];
|
|
201
|
+
if (this.actionMatchesStep(action, nextStep)) {
|
|
202
|
+
// This action matches both — prefer progression
|
|
203
|
+
stepIndex++;
|
|
204
|
+
currentStepMatched = false;
|
|
205
|
+
matchedSteps[matchedSteps.length - 1] = nextStep.label;
|
|
206
|
+
}
|
|
207
|
+
// else stay on current repeating step
|
|
208
|
+
}
|
|
209
|
+
else if (!currentStep.repeat) {
|
|
210
|
+
stepIndex++;
|
|
211
|
+
currentStepMatched = false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else if (currentStep.repeat && currentStepMatched && stepIndex + 1 < chain.steps.length) {
|
|
215
|
+
// Current repeating step was matched before but this action doesn't match it
|
|
216
|
+
// Try advancing to the next step
|
|
217
|
+
const nextStep = chain.steps[stepIndex + 1];
|
|
218
|
+
if (this.actionMatchesStep(action, nextStep)) {
|
|
219
|
+
matchedSteps.push(nextStep.label);
|
|
220
|
+
stepIndex += 2;
|
|
221
|
+
currentStepMatched = false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (stepIndex >= chain.steps.length || matchedSteps.length >= chain.steps.length) {
|
|
226
|
+
detections.push({
|
|
227
|
+
chainId: chain.id,
|
|
228
|
+
name: chain.name,
|
|
229
|
+
matchedSteps,
|
|
230
|
+
scoreBoost: chain.scoreBoost,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return detections;
|
|
235
|
+
}
|
|
236
|
+
actionMatchesStep(action, step) {
|
|
237
|
+
// Action type must match
|
|
238
|
+
if (!step.actionTypes.includes(action.type))
|
|
239
|
+
return false;
|
|
240
|
+
// Min score check
|
|
241
|
+
if (step.minScore !== undefined && action.score < step.minScore)
|
|
242
|
+
return false;
|
|
243
|
+
// Primitive check
|
|
244
|
+
if (step.primitives && step.primitives.length > 0) {
|
|
245
|
+
if (!action.primitive || !step.primitives.includes(action.primitive))
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
// Value pattern check (case-insensitive substring)
|
|
249
|
+
if (step.valuePatterns && step.valuePatterns.length > 0) {
|
|
250
|
+
const lowerValue = action.value.toLowerCase();
|
|
251
|
+
const matches = step.valuePatterns.some((p) => lowerValue.includes(p.toLowerCase()));
|
|
252
|
+
if (!matches)
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
computeTrend(session) {
|
|
258
|
+
const actions = session.actions;
|
|
259
|
+
if (actions.length < 3)
|
|
260
|
+
return 'stable';
|
|
261
|
+
const recentCount = Math.min(TREND_WINDOW, actions.length);
|
|
262
|
+
const recent = actions.slice(-recentCount);
|
|
263
|
+
const olderCount = Math.min(TREND_WINDOW, actions.length - recentCount);
|
|
264
|
+
if (olderCount === 0) {
|
|
265
|
+
// Only recent actions available — check if scores are ascending
|
|
266
|
+
const firstHalf = recent.slice(0, Math.floor(recent.length / 2));
|
|
267
|
+
const secondHalf = recent.slice(Math.floor(recent.length / 2));
|
|
268
|
+
const avgFirst = firstHalf.reduce((s, a) => s + a.score, 0) / firstHalf.length;
|
|
269
|
+
const avgSecond = secondHalf.reduce((s, a) => s + a.score, 0) / secondHalf.length;
|
|
270
|
+
if (avgSecond > avgFirst + 1)
|
|
271
|
+
return 'rising';
|
|
272
|
+
if (avgSecond < avgFirst - 1)
|
|
273
|
+
return 'declining';
|
|
274
|
+
return 'stable';
|
|
275
|
+
}
|
|
276
|
+
const older = actions.slice(-(recentCount + olderCount), -recentCount);
|
|
277
|
+
const avgRecent = recent.reduce((s, a) => s + a.score, 0) / recent.length;
|
|
278
|
+
const avgOlder = older.reduce((s, a) => s + a.score, 0) / older.length;
|
|
279
|
+
if (avgRecent > avgOlder + 1)
|
|
280
|
+
return 'rising';
|
|
281
|
+
if (avgRecent < avgOlder - 1)
|
|
282
|
+
return 'declining';
|
|
283
|
+
return 'stable';
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=session-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tracker.js","sourceRoot":"","sources":["../src/session-tracker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@surfinguard/core-engine",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Heuristic scoring engine for the Surfinguard AI Security SDK —
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Heuristic scoring engine for the Surfinguard AI Security SDK — 18 analyzers, 152 threat patterns",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -11,16 +11,12 @@
|
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"files": [
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
"test:watch": "vitest",
|
|
19
|
-
"clean": "rm -rf dist",
|
|
20
|
-
"lint": "eslint src/"
|
|
21
|
-
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"patterns"
|
|
17
|
+
],
|
|
22
18
|
"dependencies": {
|
|
23
|
-
"@surfinguard/types": "
|
|
19
|
+
"@surfinguard/types": "^1.0.0"
|
|
24
20
|
},
|
|
25
21
|
"license": "MIT",
|
|
26
22
|
"repository": {
|
|
@@ -40,5 +36,12 @@
|
|
|
40
36
|
],
|
|
41
37
|
"engines": {
|
|
42
38
|
"node": ">=20.0.0"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsc",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:watch": "vitest",
|
|
44
|
+
"clean": "rm -rf dist",
|
|
45
|
+
"lint": "tsc --noEmit"
|
|
43
46
|
}
|
|
44
|
-
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"threats": [
|
|
4
|
+
{
|
|
5
|
+
"id": "MA01",
|
|
6
|
+
"name": "Malicious task delegation",
|
|
7
|
+
"primitive": "ESCALATION",
|
|
8
|
+
"severity": 8,
|
|
9
|
+
"description": "Agent spawns or delegates tasks to other agents to bypass permissions or escalate capabilities"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "MA02",
|
|
13
|
+
"name": "Context poisoning across agents",
|
|
14
|
+
"primitive": "MANIPULATION",
|
|
15
|
+
"severity": 8,
|
|
16
|
+
"description": "Agent injects or modifies shared context, memory, or system prompts of other agents"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "MA03",
|
|
20
|
+
"name": "Tool sharing escalation",
|
|
21
|
+
"primitive": "ESCALATION",
|
|
22
|
+
"severity": 8,
|
|
23
|
+
"description": "Agent shares sensitive tools or capabilities with untrusted or unauthorized agents"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "MA04",
|
|
27
|
+
"name": "MCP tool abuse",
|
|
28
|
+
"primitive": "ESCALATION",
|
|
29
|
+
"severity": 8,
|
|
30
|
+
"description": "Agent connects to untrusted MCP servers or invokes arbitrary MCP tools"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"taskDelegationPatterns": [
|
|
34
|
+
"spawn.*agent",
|
|
35
|
+
"delegate.*task",
|
|
36
|
+
"create.*sub-?agent",
|
|
37
|
+
"fork.*agent",
|
|
38
|
+
"launch.*worker.*agent",
|
|
39
|
+
"assign.*agent.*task",
|
|
40
|
+
"new.*agent.*execute",
|
|
41
|
+
"dispatch.*to.*agent",
|
|
42
|
+
"instruct.*agent"
|
|
43
|
+
],
|
|
44
|
+
"contextPoisoningPatterns": [
|
|
45
|
+
"inject.*context",
|
|
46
|
+
"override.*system.*prompt",
|
|
47
|
+
"modify.*agent.*memory",
|
|
48
|
+
"alter.*shared.*context",
|
|
49
|
+
"poison.*context",
|
|
50
|
+
"corrupt.*agent.*state",
|
|
51
|
+
"rewrite.*agent.*instructions",
|
|
52
|
+
"overwrite.*memory",
|
|
53
|
+
"manipulate.*context.*window"
|
|
54
|
+
],
|
|
55
|
+
"toolSharingPatterns": [
|
|
56
|
+
"share.*tool.*with",
|
|
57
|
+
"grant.*tool.*access",
|
|
58
|
+
"expose.*tool.*to",
|
|
59
|
+
"delegate.*tool",
|
|
60
|
+
"forward.*capability",
|
|
61
|
+
"pass.*permission.*agent",
|
|
62
|
+
"allow.*agent.*use.*tool",
|
|
63
|
+
"transfer.*tool.*access"
|
|
64
|
+
],
|
|
65
|
+
"mcpAbusePatterns": [
|
|
66
|
+
"mcp.*call.*unknown",
|
|
67
|
+
"mcp.*server.*untrust",
|
|
68
|
+
"connect.*mcp.*server",
|
|
69
|
+
"invoke.*mcp.*tool",
|
|
70
|
+
"mcp.*execute.*arbitrary",
|
|
71
|
+
"add.*mcp.*server",
|
|
72
|
+
"install.*mcp.*plugin",
|
|
73
|
+
"mcp.*run.*command",
|
|
74
|
+
"use_mcp_tool"
|
|
75
|
+
],
|
|
76
|
+
"sensitiveTools": [
|
|
77
|
+
"file_write",
|
|
78
|
+
"command",
|
|
79
|
+
"api_call",
|
|
80
|
+
"database",
|
|
81
|
+
"payment",
|
|
82
|
+
"email",
|
|
83
|
+
"admin",
|
|
84
|
+
"deploy",
|
|
85
|
+
"delete"
|
|
86
|
+
],
|
|
87
|
+
"safePatterns": [
|
|
88
|
+
"list.*agents",
|
|
89
|
+
"get.*agent.*status",
|
|
90
|
+
"query.*agent",
|
|
91
|
+
"describe.*agent",
|
|
92
|
+
"check.*agent.*health",
|
|
93
|
+
"read.*agent.*config",
|
|
94
|
+
"monitor.*agent",
|
|
95
|
+
"log.*agent"
|
|
96
|
+
]
|
|
97
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"threats": [
|
|
4
|
+
{
|
|
5
|
+
"id": "A01",
|
|
6
|
+
"name": "Destructive API calls",
|
|
7
|
+
"primitive": "DESTRUCTION",
|
|
8
|
+
"severity": 8,
|
|
9
|
+
"description": "DELETE, bulk delete, or destructive HTTP methods targeting critical resources"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "A02",
|
|
13
|
+
"name": "Unauthorized external data send",
|
|
14
|
+
"primitive": "EXFILTRATION",
|
|
15
|
+
"severity": 7,
|
|
16
|
+
"description": "POST/PUT to external endpoints with sensitive data in body"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "A03",
|
|
20
|
+
"name": "Cloud metadata access (SSRF)",
|
|
21
|
+
"primitive": "ESCALATION",
|
|
22
|
+
"severity": 9,
|
|
23
|
+
"description": "Access to cloud metadata endpoints (169.254.169.254, etc.)"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "A04",
|
|
27
|
+
"name": "Internal service access",
|
|
28
|
+
"primitive": "ESCALATION",
|
|
29
|
+
"severity": 6,
|
|
30
|
+
"description": "Access to admin, internal, or management endpoints"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "A05",
|
|
34
|
+
"name": "Token/credential forwarding",
|
|
35
|
+
"primitive": "EXFILTRATION",
|
|
36
|
+
"severity": 9,
|
|
37
|
+
"description": "Forwarding Authorization, API key, or session tokens to external services"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "A06",
|
|
41
|
+
"name": "Webhook manipulation",
|
|
42
|
+
"primitive": "EXFILTRATION",
|
|
43
|
+
"severity": 6,
|
|
44
|
+
"description": "Registering or modifying webhook/callback URLs"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "A07",
|
|
48
|
+
"name": "DNS exfiltration via API",
|
|
49
|
+
"primitive": "EXFILTRATION",
|
|
50
|
+
"severity": 8,
|
|
51
|
+
"description": "Using DNS or subdomain patterns to exfiltrate data via API calls"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "A08",
|
|
55
|
+
"name": "Rate limit abuse patterns",
|
|
56
|
+
"primitive": "DESTRUCTION",
|
|
57
|
+
"severity": 4,
|
|
58
|
+
"description": "Patterns suggesting automated or high-frequency API abuse"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "A09",
|
|
62
|
+
"name": "Unauthorized transaction endpoints",
|
|
63
|
+
"primitive": "DESTRUCTION",
|
|
64
|
+
"severity": 8,
|
|
65
|
+
"description": "Access to payment, transfer, or purchase endpoints"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": "A10",
|
|
69
|
+
"name": "Email/message sending endpoints",
|
|
70
|
+
"primitive": "EXFILTRATION",
|
|
71
|
+
"severity": 6,
|
|
72
|
+
"description": "Triggering email or message sends that could exfiltrate data"
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"destructiveEndpoints": [
|
|
76
|
+
"/users",
|
|
77
|
+
"/accounts",
|
|
78
|
+
"/admin/delete",
|
|
79
|
+
"/admin/reset",
|
|
80
|
+
"/admin/purge",
|
|
81
|
+
"/api/destroy",
|
|
82
|
+
"/bulk/delete",
|
|
83
|
+
"/database/drop",
|
|
84
|
+
"/data/wipe",
|
|
85
|
+
"/reset",
|
|
86
|
+
"/clear",
|
|
87
|
+
"/remove-all",
|
|
88
|
+
"/nuke"
|
|
89
|
+
],
|
|
90
|
+
"exfiltrationPatterns": [
|
|
91
|
+
"password",
|
|
92
|
+
"secret",
|
|
93
|
+
"api_key",
|
|
94
|
+
"apikey",
|
|
95
|
+
"api-key",
|
|
96
|
+
"access_token",
|
|
97
|
+
"private_key",
|
|
98
|
+
"credit_card",
|
|
99
|
+
"ssn",
|
|
100
|
+
"social_security",
|
|
101
|
+
"credentials"
|
|
102
|
+
],
|
|
103
|
+
"ssrfTargets": [
|
|
104
|
+
"169.254.169.254",
|
|
105
|
+
"metadata.google.internal",
|
|
106
|
+
"metadata.internal",
|
|
107
|
+
"127.0.0.1",
|
|
108
|
+
"localhost",
|
|
109
|
+
"0.0.0.0",
|
|
110
|
+
"[::1]",
|
|
111
|
+
"10.",
|
|
112
|
+
"172.16.",
|
|
113
|
+
"172.17.",
|
|
114
|
+
"172.18.",
|
|
115
|
+
"172.19.",
|
|
116
|
+
"172.20.",
|
|
117
|
+
"172.21.",
|
|
118
|
+
"172.22.",
|
|
119
|
+
"172.23.",
|
|
120
|
+
"172.24.",
|
|
121
|
+
"172.25.",
|
|
122
|
+
"172.26.",
|
|
123
|
+
"172.27.",
|
|
124
|
+
"172.28.",
|
|
125
|
+
"172.29.",
|
|
126
|
+
"172.30.",
|
|
127
|
+
"172.31.",
|
|
128
|
+
"192.168."
|
|
129
|
+
],
|
|
130
|
+
"sensitiveHeaders": [
|
|
131
|
+
"authorization",
|
|
132
|
+
"x-api-key",
|
|
133
|
+
"x-auth-token",
|
|
134
|
+
"cookie",
|
|
135
|
+
"set-cookie",
|
|
136
|
+
"x-csrf-token",
|
|
137
|
+
"x-session-id",
|
|
138
|
+
"proxy-authorization"
|
|
139
|
+
],
|
|
140
|
+
"webhookPatterns": [
|
|
141
|
+
"/webhook",
|
|
142
|
+
"/callback",
|
|
143
|
+
"/hook",
|
|
144
|
+
"/notify",
|
|
145
|
+
"/webhooks/create",
|
|
146
|
+
"/integrations/webhook",
|
|
147
|
+
"/api/hooks"
|
|
148
|
+
],
|
|
149
|
+
"transactionEndpoints": [
|
|
150
|
+
"/payment",
|
|
151
|
+
"/pay",
|
|
152
|
+
"/transfer",
|
|
153
|
+
"/purchase",
|
|
154
|
+
"/checkout",
|
|
155
|
+
"/billing",
|
|
156
|
+
"/charge",
|
|
157
|
+
"/transaction",
|
|
158
|
+
"/withdraw",
|
|
159
|
+
"/send-money",
|
|
160
|
+
"/wire"
|
|
161
|
+
],
|
|
162
|
+
"safeEndpoints": [
|
|
163
|
+
"/health",
|
|
164
|
+
"/healthz",
|
|
165
|
+
"/status",
|
|
166
|
+
"/version",
|
|
167
|
+
"/ping",
|
|
168
|
+
"/ready",
|
|
169
|
+
"/readiness",
|
|
170
|
+
"/liveness",
|
|
171
|
+
"/metrics",
|
|
172
|
+
"/favicon.ico",
|
|
173
|
+
"/robots.txt"
|
|
174
|
+
]
|
|
175
|
+
}
|