@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.
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -5
- package/dist/config.js.map +1 -1
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +121 -0
- package/dist/config.test.js.map +1 -0
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +12 -1
- package/dist/http-client.js.map +1 -1
- package/dist/http-client.test.js +3 -0
- package/dist/http-client.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/action-logger.d.ts +0 -40
- package/dist/action-logger.d.ts.map +0 -1
- package/dist/action-logger.js +0 -252
- package/dist/action-logger.js.map +0 -1
- package/dist/agent-registry.d.ts +0 -24
- package/dist/agent-registry.d.ts.map +0 -1
- package/dist/agent-registry.js +0 -176
- package/dist/agent-registry.js.map +0 -1
- package/dist/anomaly-detector.d.ts +0 -26
- package/dist/anomaly-detector.d.ts.map +0 -1
- package/dist/anomaly-detector.js +0 -299
- package/dist/anomaly-detector.js.map +0 -1
package/dist/anomaly-detector.js
DELETED
|
@@ -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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"}
|