@neurosec/sentry 1.1.0 → 1.1.1

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.
@@ -1,299 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AnomalyDetector = void 0;
4
- const crypto_1 = require("crypto");
5
- const logger_1 = require("./logger");
6
- class AnomalyDetector {
7
- constructor(auditLogger, hostId) {
8
- this.baselines = new Map();
9
- this.actionBuffer = new Map();
10
- this.alerts = [];
11
- this.checkTimer = null;
12
- this.auditLogger = auditLogger;
13
- this.config = {
14
- hostId,
15
- minSamplesForBaseline: 10,
16
- deviationThreshold: 2.0,
17
- checkIntervalMs: 60000,
18
- };
19
- }
20
- start() {
21
- this.checkTimer = setInterval(() => this.runCheck(), this.config.checkIntervalMs);
22
- logger_1.logger.info('Anomaly detector started', {
23
- minSamples: this.config.minSamplesForBaseline,
24
- threshold: this.config.deviationThreshold,
25
- });
26
- }
27
- stop() {
28
- if (this.checkTimer) {
29
- clearInterval(this.checkTimer);
30
- this.checkTimer = null;
31
- }
32
- }
33
- // ── Feed actions into the detector ───────────────────────────────────────
34
- ingestAction(action) {
35
- const key = `${action.frameworkId}:${action.pid}`;
36
- if (!this.actionBuffer.has(key)) {
37
- this.actionBuffer.set(key, []);
38
- }
39
- this.actionBuffer.get(key).push(action);
40
- // Keep buffer bounded
41
- const buf = this.actionBuffer.get(key);
42
- if (buf.length > 1000) {
43
- buf.splice(0, buf.length - 500);
44
- }
45
- }
46
- // ── Behavioral baseline establishment ────────────────────────────────────
47
- establishBaseline(frameworkId, pid) {
48
- const key = `${frameworkId}:${pid}`;
49
- const actions = this.actionBuffer.get(key);
50
- if (!actions || actions.length < this.config.minSamplesForBaseline)
51
- return null;
52
- const now = Date.now();
53
- const windowMs = 300000; // 5 minute window for baseline
54
- const recent = actions.filter(a => (now - a.timestamp) < windowMs);
55
- if (recent.length < this.config.minSamplesForBaseline)
56
- return null;
57
- const minutesElapsed = Math.max(1, (now - recent[0].timestamp) / 60000);
58
- const fileReads = recent.filter(a => a.type === 'file_read').length;
59
- const fileWrites = recent.filter(a => a.type === 'file_write').length;
60
- const networkEgress = recent.filter(a => a.type === 'network_egress').length;
61
- const networkIngress = recent.filter(a => a.type === 'network_ingress').length;
62
- const toolCalls = recent.filter(a => a.type === 'tool_call').length;
63
- const childSpawns = recent.filter(a => a.type === 'child_spawn').length;
64
- return {
65
- frameworkId,
66
- pid,
67
- hostId: this.config.hostId,
68
- establishedAt: now,
69
- sampleCount: recent.length,
70
- avgActionsPerMinute: recent.length / minutesElapsed,
71
- avgFileReadsPerMinute: fileReads / minutesElapsed,
72
- avgFileWritesPerMinute: fileWrites / minutesElapsed,
73
- avgNetworkEgressPerMinute: networkEgress / minutesElapsed,
74
- avgNetworkIngressPerMinute: networkIngress / minutesElapsed,
75
- avgToolCallsPerMinute: toolCalls / minutesElapsed,
76
- avgChildSpawnsPerMinute: childSpawns / minutesElapsed,
77
- knownDomains: new Set(recent
78
- .filter(a => a.type === 'network_egress')
79
- .map(a => a.input)
80
- .filter(Boolean)),
81
- knownPorts: new Set(recent
82
- .filter(a => a.type === 'network_egress')
83
- .map(a => parseInt(a.input.split(':')[1], 10))
84
- .filter(n => !isNaN(n))),
85
- knownEndpoints: new Set(recent
86
- .filter(a => a.type === 'api_call' || a.type === 'tool_call')
87
- .map(a => a.input.split('?')[0])
88
- .filter(Boolean)),
89
- knownFilePaths: new Set(recent
90
- .filter(a => a.type === 'file_read' || a.type === 'file_write')
91
- .map(a => a.input)),
92
- knownDirectories: new Set(recent
93
- .filter(a => a.type === 'file_read' || a.type === 'file_write')
94
- .map(a => a.input.replace(/\/[^/]*$/, ''))
95
- .filter(Boolean)),
96
- activeHours: [...new Set(recent.map(a => new Date(a.timestamp).getHours()))],
97
- typicalSessionDurationMs: windowMs,
98
- maxDeviationScore: this.config.deviationThreshold,
99
- };
100
- }
101
- // ── Deviation detection ──────────────────────────────────────────────────
102
- detectDeviations(frameworkId, pid) {
103
- const key = `${frameworkId}:${pid}`;
104
- const existing = this.baselines.get(key);
105
- if (!existing) {
106
- const newBase = this.establishBaseline(frameworkId, pid);
107
- if (newBase) {
108
- this.baselines.set(key, newBase);
109
- logger_1.logger.debug('Baseline established', { framework: frameworkId, pid });
110
- }
111
- return [];
112
- }
113
- const baseline = existing;
114
- const actions = this.actionBuffer.get(key);
115
- if (!actions || actions.length === 0)
116
- return [];
117
- const now = Date.now();
118
- const windowMs = 60000;
119
- const recent = actions.filter(a => (now - a.timestamp) < windowMs);
120
- if (recent.length === 0)
121
- return [];
122
- const alerts = [];
123
- const minutesElapsed = Math.max(0.1, windowMs / 60000);
124
- // Check frequency deviations
125
- this.checkFrequencyDeviation(recent, baseline, 'file_reads', baseline.avgFileReadsPerMinute, recent.filter(a => a.type === 'file_read').length / minutesElapsed, alerts, frameworkId, pid);
126
- this.checkFrequencyDeviation(recent, baseline, 'file_writes', baseline.avgFileWritesPerMinute, recent.filter(a => a.type === 'file_write').length / minutesElapsed, alerts, frameworkId, pid);
127
- this.checkFrequencyDeviation(recent, baseline, 'network_egress', baseline.avgNetworkEgressPerMinute, recent.filter(a => a.type === 'network_egress').length / minutesElapsed, alerts, frameworkId, pid);
128
- this.checkFrequencyDeviation(recent, baseline, 'tool_calls', baseline.avgToolCallsPerMinute, recent.filter(a => a.type === 'tool_call').length / minutesElapsed, alerts, frameworkId, pid);
129
- // Check for unknown destinations
130
- for (const action of recent) {
131
- if (action.type === 'network_egress') {
132
- const host = action.input;
133
- if (host && ![...baseline.knownDomains].some(d => host.includes(d))) {
134
- alerts.push(this.createAlert(frameworkId, pid, 'network', host, 0, 1, action));
135
- }
136
- }
137
- if (action.type === 'file_read' || action.type === 'file_write') {
138
- const filePath = action.input;
139
- if (filePath && ![...baseline.knownFilePaths].some(p => filePath.startsWith(p))) {
140
- alerts.push(this.createAlert(frameworkId, pid, 'file_access', filePath, 0, 1, action));
141
- }
142
- }
143
- }
144
- // Check time pattern: active during unusual hours
145
- const currentHour = new Date().getHours();
146
- if (baseline.activeHours.length > 0 && !baseline.activeHours.includes(currentHour)) {
147
- const unusualActions = recent.filter(a => !baseline.activeHours.includes(new Date(a.timestamp).getHours()));
148
- if (unusualActions.length >= 3) {
149
- alerts.push(this.createAlert(frameworkId, pid, 'time_pattern', 'active_hours', baseline.activeHours.length, currentHour, unusualActions[0]));
150
- }
151
- }
152
- // Check for sensitive data exposure
153
- const sensitiveActions = recent.filter(a => a.sensitiveDataDetected);
154
- if (sensitiveActions.length > 0) {
155
- alerts.push(this.createAlert(frameworkId, pid, 'data_class', 'sensitive_data_exposure', 0, sensitiveActions.length, sensitiveActions[0]));
156
- }
157
- return alerts;
158
- }
159
- checkFrequencyDeviation(recent, baseline, metric, expectedRate, actualRate, alerts, frameworkId, pid) {
160
- // Only flag if baseline has samples
161
- if (expectedRate <= 0 && actualRate <= 0)
162
- return;
163
- if (expectedRate <= 0) {
164
- // No historical activity, any activity is deviation
165
- alerts.push(this.createAlert(frameworkId, pid, 'frequency', metric, 0, actualRate, recent[0]));
166
- return;
167
- }
168
- const deviation = actualRate / expectedRate;
169
- if (deviation > this.config.deviationThreshold && actualRate > expectedRate + 0.5) {
170
- alerts.push(this.createAlert(frameworkId, pid, 'frequency', metric, expectedRate, actualRate, recent[0]));
171
- }
172
- }
173
- createAlert(frameworkId, pid, deviationType, metric, expectedValue, actualValue, triggerAction) {
174
- const deviationScore = deviationType === 'frequency'
175
- ? Math.min(10, expectedValue > 0 ? actualValue / expectedValue : actualValue)
176
- : Math.min(10, actualValue);
177
- const severity = deviationScore >= 8 ? 'critical' :
178
- deviationScore >= 5 ? 'high' :
179
- deviationScore >= 3 ? 'medium' : 'low';
180
- return {
181
- id: (0, crypto_1.randomUUID)(),
182
- pid,
183
- frameworkId,
184
- hostId: this.config.hostId,
185
- timestamp: Date.now(),
186
- severity,
187
- deviationType,
188
- metric,
189
- expectedValue,
190
- actualValue,
191
- deviationScore,
192
- agentActionId: triggerAction.id,
193
- description: `AEGIS anomaly: ${deviationType} deviation in ${metric} for ${frameworkId} (pid ${pid})`,
194
- recommendation: this.getRecommendation(deviationType, metric),
195
- status: 'open',
196
- resolvedAt: null,
197
- resolvedBy: null,
198
- };
199
- }
200
- getRecommendation(deviationType, metric) {
201
- switch (deviationType) {
202
- case 'frequency':
203
- return `Investigate unusual ${metric} rate. Consider updating agent baseline or reviewing agent intent.`;
204
- case 'network':
205
- return `Unknown destination detected. Verify if agent has legitimate reason to access this endpoint. Add to allowlist if approved.`;
206
- case 'file_access':
207
- return `Unknown file path accessed. Verify data access rationale. Review if this aligns with agent's approved purpose.`;
208
- case 'time_pattern':
209
- return `Agent active outside normal hours. Verify if this is expected behavior or potential compromise.`;
210
- case 'data_class':
211
- return `Sensitive data detected in agent actions. Review for potential data leakage. Escalate if PII/credentials exposed.`;
212
- default:
213
- return 'Investigate anomalous agent behavior';
214
- }
215
- }
216
- // ── Run periodic check ──────────────────────────────────────────────────
217
- runCheck() {
218
- const keys = [...this.actionBuffer.keys()];
219
- for (const key of keys) {
220
- const [frameworkId, pidStr] = key.split(':');
221
- const pid = parseInt(pidStr, 10);
222
- if (!isNaN(pid)) {
223
- try {
224
- const newAlerts = this.detectDeviations(frameworkId, pid);
225
- for (const alert of newAlerts) {
226
- this.alerts.push(alert);
227
- this.auditLogger.log({
228
- id: alert.id,
229
- timestamp: alert.timestamp,
230
- type: 'process',
231
- action: alert.severity === 'critical' || alert.severity === 'high' ? 'deny' : 'allow',
232
- frameworkId: alert.frameworkId,
233
- frameworkName: null,
234
- pid: alert.pid,
235
- reason: `AEGIS anomaly: ${alert.description}`,
236
- detail: {
237
- deviationType: alert.deviationType,
238
- metric: alert.metric,
239
- expectedValue: alert.expectedValue,
240
- actualValue: alert.actualValue,
241
- deviationScore: alert.deviationScore,
242
- severity: alert.severity,
243
- },
244
- hostname: this.config.hostId,
245
- });
246
- logger_1.logger.warn('AEGIS anomaly detected', {
247
- framework: alert.frameworkId,
248
- pid: alert.pid,
249
- type: alert.deviationType,
250
- metric: alert.metric,
251
- score: alert.deviationScore,
252
- severity: alert.severity,
253
- });
254
- }
255
- }
256
- catch (err) {
257
- logger_1.logger.debug('Anomaly check failed for process', { key, err: err.message });
258
- }
259
- }
260
- }
261
- }
262
- // ── State queries ────────────────────────────────────────────────────────
263
- getOpenAlerts() {
264
- return this.alerts.filter(a => a.status === 'open');
265
- }
266
- getAllAlerts() {
267
- return [...this.alerts];
268
- }
269
- resolveAlert(alertId, resolvedBy) {
270
- const alert = this.alerts.find(a => a.id === alertId);
271
- if (alert) {
272
- alert.status = 'resolved';
273
- alert.resolvedAt = Date.now();
274
- alert.resolvedBy = resolvedBy;
275
- return true;
276
- }
277
- return false;
278
- }
279
- acknowledgeAlert(alertId) {
280
- const alert = this.alerts.find(a => a.id === alertId);
281
- if (alert && alert.status === 'open') {
282
- alert.status = 'acknowledged';
283
- return true;
284
- }
285
- return false;
286
- }
287
- ingestProcesses(processes) {
288
- // Remove baselines for departed processes
289
- const currentKeys = new Set(processes.map(p => `${p.frameworkId}:${p.pid}`));
290
- for (const key of this.baselines.keys()) {
291
- if (!currentKeys.has(key)) {
292
- this.baselines.delete(key);
293
- this.actionBuffer.delete(key);
294
- }
295
- }
296
- }
297
- }
298
- exports.AnomalyDetector = AnomalyDetector;
299
- //# sourceMappingURL=anomaly-detector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anomaly-detector.js","sourceRoot":"","sources":["../src/anomaly-detector.ts"],"names":[],"mappings":"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"}