@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.
Files changed (114) hide show
  1. package/LICENSE +21 -0
  2. package/dist/analyzers/agent-comm.d.ts +22 -0
  3. package/dist/analyzers/agent-comm.d.ts.map +1 -0
  4. package/dist/analyzers/agent-comm.js +79 -0
  5. package/dist/analyzers/agent-comm.js.map +1 -0
  6. package/dist/analyzers/api-call.d.ts +21 -0
  7. package/dist/analyzers/api-call.d.ts.map +1 -0
  8. package/dist/analyzers/api-call.js +134 -0
  9. package/dist/analyzers/api-call.js.map +1 -0
  10. package/dist/analyzers/auth.d.ts +22 -0
  11. package/dist/analyzers/auth.d.ts.map +1 -0
  12. package/dist/analyzers/auth.js +97 -0
  13. package/dist/analyzers/auth.js.map +1 -0
  14. package/dist/analyzers/code.d.ts +32 -0
  15. package/dist/analyzers/code.d.ts.map +1 -0
  16. package/dist/analyzers/code.js +310 -0
  17. package/dist/analyzers/code.js.map +1 -0
  18. package/dist/analyzers/command.d.ts.map +1 -1
  19. package/dist/analyzers/command.js +91 -39
  20. package/dist/analyzers/command.js.map +1 -1
  21. package/dist/analyzers/data-pipeline.d.ts +23 -0
  22. package/dist/analyzers/data-pipeline.d.ts.map +1 -0
  23. package/dist/analyzers/data-pipeline.js +86 -0
  24. package/dist/analyzers/data-pipeline.js.map +1 -0
  25. package/dist/analyzers/document.d.ts +22 -0
  26. package/dist/analyzers/document.d.ts.map +1 -0
  27. package/dist/analyzers/document.js +77 -0
  28. package/dist/analyzers/document.js.map +1 -0
  29. package/dist/analyzers/file-read.d.ts.map +1 -1
  30. package/dist/analyzers/file-read.js +12 -3
  31. package/dist/analyzers/file-read.js.map +1 -1
  32. package/dist/analyzers/file-write.d.ts.map +1 -1
  33. package/dist/analyzers/file-write.js +12 -3
  34. package/dist/analyzers/file-write.js.map +1 -1
  35. package/dist/analyzers/git.d.ts +25 -0
  36. package/dist/analyzers/git.d.ts.map +1 -0
  37. package/dist/analyzers/git.js +126 -0
  38. package/dist/analyzers/git.js.map +1 -0
  39. package/dist/analyzers/index.d.ts +3 -0
  40. package/dist/analyzers/index.d.ts.map +1 -1
  41. package/dist/analyzers/index.js +3 -0
  42. package/dist/analyzers/index.js.map +1 -1
  43. package/dist/analyzers/infra.d.ts +30 -0
  44. package/dist/analyzers/infra.d.ts.map +1 -0
  45. package/dist/analyzers/infra.js +134 -0
  46. package/dist/analyzers/infra.js.map +1 -0
  47. package/dist/analyzers/iot.d.ts +22 -0
  48. package/dist/analyzers/iot.d.ts.map +1 -0
  49. package/dist/analyzers/iot.js +78 -0
  50. package/dist/analyzers/iot.js.map +1 -0
  51. package/dist/analyzers/message.d.ts +22 -0
  52. package/dist/analyzers/message.d.ts.map +1 -0
  53. package/dist/analyzers/message.js +106 -0
  54. package/dist/analyzers/message.js.map +1 -0
  55. package/dist/analyzers/query.d.ts +23 -0
  56. package/dist/analyzers/query.d.ts.map +1 -0
  57. package/dist/analyzers/query.js +183 -0
  58. package/dist/analyzers/query.js.map +1 -0
  59. package/dist/analyzers/text.d.ts.map +1 -1
  60. package/dist/analyzers/text.js +20 -3
  61. package/dist/analyzers/text.js.map +1 -1
  62. package/dist/analyzers/transaction.d.ts +23 -0
  63. package/dist/analyzers/transaction.d.ts.map +1 -0
  64. package/dist/analyzers/transaction.js +100 -0
  65. package/dist/analyzers/transaction.js.map +1 -0
  66. package/dist/analyzers/ui-action.d.ts +23 -0
  67. package/dist/analyzers/ui-action.d.ts.map +1 -0
  68. package/dist/analyzers/ui-action.js +92 -0
  69. package/dist/analyzers/ui-action.js.map +1 -0
  70. package/dist/analyzers/url.d.ts.map +1 -1
  71. package/dist/analyzers/url.js +6 -2
  72. package/dist/analyzers/url.js.map +1 -1
  73. package/dist/classifier.d.ts.map +1 -1
  74. package/dist/classifier.js +20 -1
  75. package/dist/classifier.js.map +1 -1
  76. package/dist/context.d.ts +6 -4
  77. package/dist/context.d.ts.map +1 -1
  78. package/dist/context.js +34 -5
  79. package/dist/context.js.map +1 -1
  80. package/dist/engine.d.ts +72 -3
  81. package/dist/engine.d.ts.map +1 -1
  82. package/dist/engine.js +313 -9
  83. package/dist/engine.js.map +1 -1
  84. package/dist/index.d.ts +18 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +17 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/patterns.d.ts +15 -1
  89. package/dist/patterns.d.ts.map +1 -1
  90. package/dist/patterns.js +70 -53
  91. package/dist/patterns.js.map +1 -1
  92. package/dist/policy-engine.d.ts +44 -0
  93. package/dist/policy-engine.d.ts.map +1 -0
  94. package/dist/policy-engine.js +225 -0
  95. package/dist/policy-engine.js.map +1 -0
  96. package/dist/session-tracker.d.ts +50 -0
  97. package/dist/session-tracker.d.ts.map +1 -0
  98. package/dist/session-tracker.js +286 -0
  99. package/dist/session-tracker.js.map +1 -0
  100. package/package.json +15 -12
  101. package/patterns/agent-comm.json +97 -0
  102. package/patterns/api-call.json +175 -0
  103. package/patterns/auth.json +116 -0
  104. package/patterns/chains.json +171 -0
  105. package/patterns/code.json +204 -0
  106. package/patterns/data-pipeline.json +116 -0
  107. package/patterns/document.json +110 -0
  108. package/patterns/git.json +118 -0
  109. package/patterns/infra.json +207 -0
  110. package/patterns/iot.json +105 -0
  111. package/patterns/message.json +122 -0
  112. package/patterns/query.json +134 -0
  113. package/patterns/transaction.json +120 -0
  114. 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": "0.1.0",
4
- "description": "Heuristic scoring engine for the Surfinguard AI Security SDK — 5 analyzers, 68 threat patterns",
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": ["dist", "patterns"],
15
- "scripts": {
16
- "build": "tsc",
17
- "test": "vitest run",
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": "workspace:^"
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
+ }