@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Surfinguard
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,22 @@
1
+ import type { AgentCommPatternDatabase } from '@surfinguard/types';
2
+ import type { Analyzer, AnalyzerResult } from './base.js';
3
+ /**
4
+ * Agent Communication Analyzer — detects dangerous inter-agent operations.
5
+ *
6
+ * Detects 4 threat patterns (MA01-MA04) mapped to ESCALATION and MANIPULATION primitives.
7
+ * Input: value = agent communication action description, metadata = { agent_id?, target_agent?, tool? }
8
+ */
9
+ export declare class AgentCommAnalyzer implements Analyzer {
10
+ readonly actionType: "agent_comm";
11
+ private readonly taskDelegationPatterns;
12
+ private readonly contextPoisoningPatterns;
13
+ private readonly toolSharingPatterns;
14
+ private readonly mcpAbusePatterns;
15
+ private readonly sensitiveTools;
16
+ private readonly safePatterns;
17
+ constructor(patterns: AgentCommPatternDatabase);
18
+ analyze(value: string, metadata?: Record<string, unknown>): AnalyzerResult;
19
+ private hasDangerousPattern;
20
+ private detectSensitiveTool;
21
+ }
22
+ //# sourceMappingURL=agent-comm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-comm.d.ts","sourceRoot":"","sources":["../../src/analyzers/agent-comm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3E;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,QAAQ;IAChD,QAAQ,CAAC,UAAU,EAAG,YAAY,CAAU;IAE5C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;gBAE5B,QAAQ,EAAE,wBAAwB;IAW9C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;IA6E1E,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,mBAAmB;CAO5B"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Agent Communication Analyzer — detects dangerous inter-agent operations.
3
+ *
4
+ * Detects 4 threat patterns (MA01-MA04) mapped to ESCALATION and MANIPULATION primitives.
5
+ * Input: value = agent communication action description, metadata = { agent_id?, target_agent?, tool? }
6
+ */
7
+ export class AgentCommAnalyzer {
8
+ actionType = 'agent_comm';
9
+ taskDelegationPatterns;
10
+ contextPoisoningPatterns;
11
+ toolSharingPatterns;
12
+ mcpAbusePatterns;
13
+ sensitiveTools;
14
+ safePatterns;
15
+ constructor(patterns) {
16
+ this.taskDelegationPatterns = patterns.taskDelegationPatterns.map((p) => new RegExp(p, 'i'));
17
+ this.contextPoisoningPatterns = patterns.contextPoisoningPatterns.map((p) => new RegExp(p, 'i'));
18
+ this.toolSharingPatterns = patterns.toolSharingPatterns.map((p) => new RegExp(p, 'i'));
19
+ this.mcpAbusePatterns = patterns.mcpAbusePatterns.map((p) => new RegExp(p, 'i'));
20
+ this.sensitiveTools = patterns.sensitiveTools.map((t) => t.toLowerCase());
21
+ this.safePatterns = patterns.safePatterns.map((p) => new RegExp(p, 'i'));
22
+ }
23
+ analyze(value, metadata) {
24
+ const action = value.trim();
25
+ if (!action) {
26
+ return {
27
+ actionType: 'agent_comm',
28
+ findings: [],
29
+ shortCircuit: { safe: true, reason: 'Empty action' },
30
+ };
31
+ }
32
+ const lower = action.toLowerCase();
33
+ // Safe short-circuit
34
+ if (this.safePatterns.some((p) => p.test(lower)) && !this.hasDangerousPattern(lower)) {
35
+ return {
36
+ actionType: 'agent_comm',
37
+ findings: [],
38
+ shortCircuit: { safe: true, reason: 'Safe agent communication pattern' },
39
+ };
40
+ }
41
+ const findings = [];
42
+ const add = (primitive, score, reason, threatId) => {
43
+ findings.push({ primitive, score, reason, threatId });
44
+ };
45
+ const hasSensitiveTool = this.detectSensitiveTool(lower, metadata);
46
+ const toolBoost = hasSensitiveTool ? 2 : 0;
47
+ // MA01: Malicious task delegation
48
+ if (this.taskDelegationPatterns.some((p) => p.test(lower))) {
49
+ add('ESCALATION', Math.min(10, 8 + toolBoost), 'Malicious task delegation — spawning or delegating tasks to agents', 'MA01');
50
+ }
51
+ // MA02: Context poisoning across agents
52
+ if (this.contextPoisoningPatterns.some((p) => p.test(lower))) {
53
+ add('MANIPULATION', Math.min(10, 8 + toolBoost), 'Context poisoning — injecting or modifying agent context/memory', 'MA02');
54
+ }
55
+ // MA03: Tool sharing escalation
56
+ if (this.toolSharingPatterns.some((p) => p.test(lower))) {
57
+ add('ESCALATION', Math.min(10, 8 + toolBoost), 'Tool sharing escalation — sharing sensitive tools with agents', 'MA03');
58
+ }
59
+ // MA04: MCP tool abuse
60
+ if (this.mcpAbusePatterns.some((p) => p.test(lower))) {
61
+ add('ESCALATION', Math.min(10, 8 + toolBoost), 'MCP tool abuse — connecting to untrusted MCP servers or invoking arbitrary tools', 'MA04');
62
+ }
63
+ return { actionType: 'agent_comm', findings };
64
+ }
65
+ hasDangerousPattern(text) {
66
+ return (this.taskDelegationPatterns.some((p) => p.test(text)) ||
67
+ this.contextPoisoningPatterns.some((p) => p.test(text)) ||
68
+ this.toolSharingPatterns.some((p) => p.test(text)) ||
69
+ this.mcpAbusePatterns.some((p) => p.test(text)));
70
+ }
71
+ detectSensitiveTool(text, metadata) {
72
+ const tool = (metadata?.tool ?? '').toLowerCase();
73
+ if (tool && this.sensitiveTools.some((t) => tool.includes(t))) {
74
+ return true;
75
+ }
76
+ return this.sensitiveTools.some((t) => text.includes(t));
77
+ }
78
+ }
79
+ //# sourceMappingURL=agent-comm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-comm.js","sourceRoot":"","sources":["../../src/analyzers/agent-comm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ApiCallPatternDatabase } from '@surfinguard/types';
2
+ import type { Analyzer, AnalyzerResult } from './base.js';
3
+ /**
4
+ * API Call Analyzer — detects dangerous API call patterns.
5
+ *
6
+ * Detects 10 threat patterns (A01-A10) mapped to 4 risk primitives.
7
+ * Input: value = URL, metadata = { method, headers?, body? }
8
+ */
9
+ export declare class ApiCallAnalyzer implements Analyzer {
10
+ readonly actionType: "api_call";
11
+ private readonly safeEndpoints;
12
+ private readonly destructiveEndpoints;
13
+ private readonly ssrfTargets;
14
+ private readonly sensitiveHeaders;
15
+ private readonly exfiltrationPatterns;
16
+ private readonly webhookPatterns;
17
+ private readonly transactionEndpoints;
18
+ constructor(patterns: ApiCallPatternDatabase);
19
+ analyze(value: string, metadata?: Record<string, unknown>): AnalyzerResult;
20
+ }
21
+ //# sourceMappingURL=api-call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-call.d.ts","sourceRoot":"","sources":["../../src/analyzers/api-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3E;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,UAAU,EAAG,UAAU,CAAU;IAE1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAW;gBAEpC,QAAQ,EAAE,sBAAsB;IAU5C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;CAwK3E"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * API Call Analyzer — detects dangerous API call patterns.
3
+ *
4
+ * Detects 10 threat patterns (A01-A10) mapped to 4 risk primitives.
5
+ * Input: value = URL, metadata = { method, headers?, body? }
6
+ */
7
+ export class ApiCallAnalyzer {
8
+ actionType = 'api_call';
9
+ safeEndpoints;
10
+ destructiveEndpoints;
11
+ ssrfTargets;
12
+ sensitiveHeaders;
13
+ exfiltrationPatterns;
14
+ webhookPatterns;
15
+ transactionEndpoints;
16
+ constructor(patterns) {
17
+ this.safeEndpoints = patterns.safeEndpoints.map((p) => p.toLowerCase());
18
+ this.destructiveEndpoints = patterns.destructiveEndpoints.map((p) => p.toLowerCase());
19
+ this.ssrfTargets = patterns.ssrfTargets;
20
+ this.sensitiveHeaders = patterns.sensitiveHeaders.map((h) => h.toLowerCase());
21
+ this.exfiltrationPatterns = patterns.exfiltrationPatterns.map((p) => p.toLowerCase());
22
+ this.webhookPatterns = patterns.webhookPatterns.map((p) => p.toLowerCase());
23
+ this.transactionEndpoints = patterns.transactionEndpoints.map((p) => p.toLowerCase());
24
+ }
25
+ analyze(value, metadata) {
26
+ const urlStr = value.trim();
27
+ if (!urlStr) {
28
+ return {
29
+ actionType: 'api_call',
30
+ findings: [],
31
+ shortCircuit: { safe: true, reason: 'Empty URL' },
32
+ };
33
+ }
34
+ const method = (metadata?.method ?? 'GET').toUpperCase();
35
+ const headers = metadata?.headers ?? {};
36
+ const body = metadata?.body ?? '';
37
+ // Parse URL
38
+ let parsedUrl = null;
39
+ try {
40
+ parsedUrl = new URL(urlStr);
41
+ }
42
+ catch {
43
+ // not a valid URL, analyze raw string
44
+ }
45
+ const hostname = parsedUrl?.hostname?.toLowerCase() ?? '';
46
+ const pathname = parsedUrl?.pathname?.toLowerCase() ?? urlStr.toLowerCase();
47
+ const findings = [];
48
+ const add = (primitive, score, reason, threatId) => {
49
+ findings.push({ primitive, score, reason, threatId });
50
+ };
51
+ // ── Safe short-circuit: GET to known safe endpoints ──
52
+ if (method === 'GET' &&
53
+ this.safeEndpoints.some((ep) => pathname === ep || pathname.endsWith(ep))) {
54
+ return {
55
+ actionType: 'api_call',
56
+ findings: [],
57
+ shortCircuit: { safe: true, reason: 'Safe endpoint' },
58
+ };
59
+ }
60
+ // ── A03: SSRF detection — cloud metadata, internal IPs ──
61
+ if (this.ssrfTargets.some((target) => hostname.includes(target) || urlStr.includes(target))) {
62
+ add('ESCALATION', 9, 'SSRF — request targets cloud metadata or internal service', 'A03');
63
+ }
64
+ // ── A04: Internal service access ──
65
+ const internalPaths = ['/admin', '/internal', '/management', '/actuator', '/_debug', '/debug'];
66
+ if (internalPaths.some((p) => pathname.startsWith(p))) {
67
+ add('ESCALATION', 6, 'Internal service access — targeting admin or management endpoint', 'A04');
68
+ }
69
+ // ── A01: Destructive API calls ──
70
+ if (method === 'DELETE') {
71
+ add('DESTRUCTION', 8, `Destructive API call — DELETE ${pathname}`, 'A01');
72
+ }
73
+ else if (this.destructiveEndpoints.some((ep) => pathname.includes(ep))) {
74
+ if (method === 'POST' || method === 'PUT') {
75
+ add('DESTRUCTION', 7, `Destructive API call — ${method} to destructive endpoint ${pathname}`, 'A01');
76
+ }
77
+ }
78
+ // ── A05: Sensitive header forwarding ──
79
+ const lowerHeaders = Object.fromEntries(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v]));
80
+ const forwardedSensitive = this.sensitiveHeaders.filter((h) => h in lowerHeaders);
81
+ if (forwardedSensitive.length > 0) {
82
+ add('EXFILTRATION', 9, `Token/credential forwarding — sensitive headers: ${forwardedSensitive.join(', ')}`, 'A05');
83
+ }
84
+ // ── A02: Body contains sensitive data ──
85
+ if (body) {
86
+ const lowerBody = body.toLowerCase();
87
+ const bodyExfil = this.exfiltrationPatterns.filter((p) => lowerBody.includes(p));
88
+ if (bodyExfil.length > 0) {
89
+ add('EXFILTRATION', 7, `Unauthorized data send — body contains sensitive data: ${bodyExfil.join(', ')}`, 'A02');
90
+ }
91
+ }
92
+ // ── A06: Webhook manipulation ──
93
+ if (this.webhookPatterns.some((p) => pathname.includes(p))) {
94
+ if (method === 'POST' || method === 'PUT' || method === 'PATCH') {
95
+ add('EXFILTRATION', 6, 'Webhook manipulation — registering or modifying webhook/callback URL', 'A06');
96
+ }
97
+ }
98
+ // ── A07: DNS exfiltration ──
99
+ if (hostname) {
100
+ const subdomains = hostname.split('.');
101
+ // Check for encoded data in subdomains (long hex strings or very long labels)
102
+ const hasEncodedData = subdomains.some((sub) => sub.length > 20 || /^[a-f0-9]{16,}$/i.test(sub));
103
+ if (hasEncodedData) {
104
+ add('EXFILTRATION', 8, 'DNS exfiltration — long or encoded subdomain patterns detected', 'A07');
105
+ }
106
+ }
107
+ // ── A08: Rate limit abuse ──
108
+ const abuseKeywords = ['/batch', '/bulk', '/mass', '/flood'];
109
+ if (abuseKeywords.some((kw) => pathname.includes(kw)) && method === 'POST') {
110
+ add('DESTRUCTION', 4, 'Rate limit abuse pattern — batch/bulk endpoint access', 'A08');
111
+ }
112
+ // ── A09: Transaction endpoints ──
113
+ if (this.transactionEndpoints.some((ep) => pathname.includes(ep))) {
114
+ if (method === 'POST' || method === 'PUT') {
115
+ add('DESTRUCTION', 8, `Unauthorized transaction — ${method} to financial endpoint`, 'A09');
116
+ }
117
+ }
118
+ // ── A10: Email/message sending ──
119
+ const messagePaths = [
120
+ '/send-email',
121
+ '/send-message',
122
+ '/email/send',
123
+ '/mail/send',
124
+ '/notify',
125
+ '/sms/send',
126
+ '/messages',
127
+ ];
128
+ if (messagePaths.some((p) => pathname.includes(p)) && method === 'POST') {
129
+ add('EXFILTRATION', 6, 'Email/message sending — could exfiltrate data via email or messaging', 'A10');
130
+ }
131
+ return { actionType: 'api_call', findings };
132
+ }
133
+ }
134
+ //# sourceMappingURL=api-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-call.js","sourceRoot":"","sources":["../../src/analyzers/api-call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AuthPatternDatabase } from '@surfinguard/types';
2
+ import type { Analyzer, AnalyzerResult } from './base.js';
3
+ /**
4
+ * Auth Analyzer — detects dangerous authentication and identity patterns.
5
+ *
6
+ * Detects 6 threat patterns (ID01-ID06) mapped to 3 risk primitives.
7
+ * Input: value = auth action description/API call, metadata = { scope?, role?, target? }
8
+ */
9
+ export declare class AuthAnalyzer implements Analyzer {
10
+ readonly actionType: "auth";
11
+ private readonly accountCreationPatterns;
12
+ private readonly permissionPatterns;
13
+ private readonly credentialPatterns;
14
+ private readonly oauthPatterns;
15
+ private readonly mfaPatterns;
16
+ private readonly legalPatterns;
17
+ private readonly safePatterns;
18
+ constructor(patterns: AuthPatternDatabase);
19
+ analyze(value: string, metadata?: Record<string, unknown>): AnalyzerResult;
20
+ private hasDangerousPattern;
21
+ }
22
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/analyzers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3E;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,UAAU,EAAG,MAAM,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAW;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAC9C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;gBAE5B,QAAQ,EAAE,mBAAmB;IAUzC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;IA8F1E,OAAO,CAAC,mBAAmB;CAU5B"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Auth Analyzer — detects dangerous authentication and identity patterns.
3
+ *
4
+ * Detects 6 threat patterns (ID01-ID06) mapped to 3 risk primitives.
5
+ * Input: value = auth action description/API call, metadata = { scope?, role?, target? }
6
+ */
7
+ export class AuthAnalyzer {
8
+ actionType = 'auth';
9
+ accountCreationPatterns;
10
+ permissionPatterns;
11
+ credentialPatterns;
12
+ oauthPatterns;
13
+ mfaPatterns;
14
+ legalPatterns;
15
+ safePatterns;
16
+ constructor(patterns) {
17
+ this.accountCreationPatterns = patterns.accountCreationPatterns.map((p) => new RegExp(p, 'i'));
18
+ this.permissionPatterns = patterns.permissionPatterns.map((p) => new RegExp(p, 'i'));
19
+ this.credentialPatterns = patterns.credentialPatterns.map((p) => new RegExp(p, 'i'));
20
+ this.oauthPatterns = patterns.oauthPatterns.map((p) => new RegExp(p, 'i'));
21
+ this.mfaPatterns = patterns.mfaPatterns.map((p) => new RegExp(p, 'i'));
22
+ this.legalPatterns = patterns.legalPatterns.map((p) => new RegExp(p, 'i'));
23
+ this.safePatterns = patterns.safePatterns.map((p) => new RegExp(p, 'i'));
24
+ }
25
+ analyze(value, metadata) {
26
+ const action = value.trim();
27
+ if (!action) {
28
+ return {
29
+ actionType: 'auth',
30
+ findings: [],
31
+ shortCircuit: { safe: true, reason: 'Empty action' },
32
+ };
33
+ }
34
+ const scope = (metadata?.scope ?? '').toLowerCase();
35
+ const role = (metadata?.role ?? '').toLowerCase();
36
+ const lower = action.toLowerCase();
37
+ // Safe short-circuit
38
+ if (this.safePatterns.some((p) => p.test(lower)) && !this.hasDangerousPattern(lower)) {
39
+ return {
40
+ actionType: 'auth',
41
+ findings: [],
42
+ shortCircuit: { safe: true, reason: 'Safe auth pattern' },
43
+ };
44
+ }
45
+ const findings = [];
46
+ const add = (primitive, score, reason, threatId) => {
47
+ findings.push({ primitive, score, reason, threatId });
48
+ };
49
+ // ── ID01: Rogue account creation ──
50
+ if (this.accountCreationPatterns.some((p) => p.test(lower))) {
51
+ add('MANIPULATION', 6, 'Rogue account creation — agent creating user accounts', 'ID01');
52
+ }
53
+ // ── ID02: Permission granting ──
54
+ if (this.permissionPatterns.some((p) => p.test(lower))) {
55
+ let score = 8;
56
+ let reason = 'Permission granting — agent modifying permissions or roles';
57
+ if (role.includes('admin') || role.includes('owner') || /admin|owner/i.test(lower)) {
58
+ score = 10;
59
+ reason = 'Permission granting — agent assigning admin/owner role';
60
+ }
61
+ add('ESCALATION', score, reason, 'ID02');
62
+ }
63
+ // ── ID03: Credential sharing/rotation ──
64
+ if (this.credentialPatterns.some((p) => p.test(lower))) {
65
+ add('EXFILTRATION', 8, 'Credential sharing/rotation — agent exporting or sharing credentials', 'ID03');
66
+ }
67
+ // ── ID04: OAuth over-permissioning ──
68
+ if (this.oauthPatterns.some((p) => p.test(lower))) {
69
+ let score = 7;
70
+ let reason = 'OAuth over-permissioning — agent authorizing OAuth scopes';
71
+ const sensitiveScopes = ['write', 'admin', 'delete', 'manage', 'full_access'];
72
+ if (sensitiveScopes.some((s) => scope.includes(s) || lower.includes(s))) {
73
+ score = 9;
74
+ reason = 'OAuth over-permissioning — agent granting broad/sensitive scopes';
75
+ }
76
+ add('ESCALATION', score, reason, 'ID04');
77
+ }
78
+ // ── ID05: MFA disabling ──
79
+ if (this.mfaPatterns.some((p) => p.test(lower))) {
80
+ add('ESCALATION', 9, 'MFA disabling — agent attempting to disable multi-factor authentication', 'ID05');
81
+ }
82
+ // ── ID06: Terms of service acceptance ──
83
+ if (this.legalPatterns.some((p) => p.test(lower))) {
84
+ add('MANIPULATION', 5, 'Terms of service acceptance — agent accepting legal agreements', 'ID06');
85
+ }
86
+ return { actionType: 'auth', findings };
87
+ }
88
+ hasDangerousPattern(text) {
89
+ return (this.accountCreationPatterns.some((p) => p.test(text)) ||
90
+ this.permissionPatterns.some((p) => p.test(text)) ||
91
+ this.credentialPatterns.some((p) => p.test(text)) ||
92
+ this.oauthPatterns.some((p) => p.test(text)) ||
93
+ this.mfaPatterns.some((p) => p.test(text)) ||
94
+ this.legalPatterns.some((p) => p.test(text)));
95
+ }
96
+ }
97
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/analyzers/auth.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACd,UAAU,GAAG,MAAe,CAAC;IAErB,uBAAuB,CAAW;IAClC,kBAAkB,CAAW;IAC7B,kBAAkB,CAAW;IAC7B,aAAa,CAAW;IACxB,WAAW,CAAW;IACtB,aAAa,CAAW;IACxB,YAAY,CAAW;IAExC,YAAY,QAA6B;QACvC,IAAI,CAAC,uBAAuB,GAAG,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,QAAkC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE;aACrD,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAE,QAAQ,EAAE,KAAgB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,CAAE,QAAQ,EAAE,IAAe,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAEnC,qBAAqB;QACrB,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrF,OAAO;gBACL,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE;aAC1D,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAsB,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,CACV,SAAuC,EACvC,KAAa,EACb,MAAc,EACd,QAAgB,EAChB,EAAE;YACF,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC;QAEF,qCAAqC;QACrC,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,uDAAuD,EAAE,MAAM,CAAC,CAAC;QAC1F,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,MAAM,GAAG,4DAA4D,CAAC;YAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnF,KAAK,GAAG,EAAE,CAAC;gBACX,MAAM,GAAG,wDAAwD,CAAC;YACpE,CAAC;YACD,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,0CAA0C;QAC1C,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CACD,cAAc,EACd,CAAC,EACD,sEAAsE,EACtE,MAAM,CACP,CAAC;QACJ,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,MAAM,GAAG,2DAA2D,CAAC;YACzE,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC9E,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,KAAK,GAAG,CAAC,CAAC;gBACV,MAAM,GAAG,kEAAkE,CAAC;YAC9E,CAAC;YACD,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,4BAA4B;QAC5B,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CACD,YAAY,EACZ,CAAC,EACD,yEAAyE,EACzE,MAAM,CACP,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CACD,cAAc,EACd,CAAC,EACD,gEAAgE,EAChE,MAAM,CACP,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAEO,mBAAmB,CAAC,IAAY;QACtC,OAAO,CACL,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC7C,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ import type { CodePatternDatabase } from '@surfinguard/types';
2
+ import type { Analyzer, AnalyzerResult } from './base.js';
3
+ /**
4
+ * Code Analyzer — detects malicious code generation patterns.
5
+ *
6
+ * Detects 8 threat patterns (G01-G08) mapped to 5 risk primitives.
7
+ * Input: value = code string, metadata.language optional.
8
+ */
9
+ export declare class CodeAnalyzer implements Analyzer {
10
+ readonly actionType: "code_eval";
11
+ private readonly safePatterns;
12
+ private readonly backdoorPatterns;
13
+ private readonly backdoorRegexes;
14
+ private readonly vulnerabilityPatterns;
15
+ private readonly vulnerabilityRegexes;
16
+ private readonly dependencyConfusion;
17
+ private readonly obfuscationPatterns;
18
+ private readonly obfuscationRegexes;
19
+ private readonly phoneHomeRegexes;
20
+ private readonly insecureDefaults;
21
+ private readonly insecureRegexes;
22
+ private readonly logicBombRegexes;
23
+ private readonly cryptoRegexes;
24
+ constructor(patterns: CodePatternDatabase);
25
+ analyze(value: string, metadata?: Record<string, unknown>): AnalyzerResult;
26
+ private isRegexPattern;
27
+ private detectLanguage;
28
+ private isTestCode;
29
+ private isCommentOrDefinition;
30
+ private extractPackageNames;
31
+ }
32
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/analyzers/code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3E;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,UAAU,EAAG,WAAW,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;gBAE7B,QAAQ,EAAE,mBAAmB;IA0FzC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;IA8K1E,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,mBAAmB;CAqB5B"}