typescript-virtual-container 1.1.4 → 1.1.5

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.
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Honeypot tracking and auditing module for virtual shell events.
3
+ *
4
+ * Attaches listeners to VirtualShell, VirtualFileSystem, VirtualUserManager,
5
+ * SshMimic, and SftpMimic instances to log all activity for security auditing,
6
+ * anomaly detection, and forensic analysis.
7
+ *
8
+ * @module honeypot
9
+ */
10
+ /**
11
+ * HoneyPot audit and event tracking utility.
12
+ *
13
+ * Singleton-like helper that attaches listeners to virtual shell components
14
+ * and maintains an audit log of all activity.
15
+ */
16
+ export class HoneyPot {
17
+ auditLog = [];
18
+ stats = {
19
+ authAttempts: 0,
20
+ authSuccesses: 0,
21
+ authFailures: 0,
22
+ commands: 0,
23
+ fileWrites: 0,
24
+ fileReads: 0,
25
+ sessionStarts: 0,
26
+ sessionEnds: 0,
27
+ userCreated: 0,
28
+ userDeleted: 0,
29
+ clientConnects: 0,
30
+ clientDisconnects: 0,
31
+ };
32
+ maxLogSize;
33
+ /**
34
+ * Creates a new HoneyPot instance.
35
+ *
36
+ * @param maxLogSize Maximum audit log entries to retain (default: 10000).
37
+ */
38
+ constructor(maxLogSize = 10000) {
39
+ this.maxLogSize = maxLogSize;
40
+ }
41
+ /**
42
+ * Attaches honeypot listeners to all provided event emitters.
43
+ *
44
+ * @param shell VirtualShell instance.
45
+ * @param vfs VirtualFileSystem instance.
46
+ * @param users VirtualUserManager instance.
47
+ * @param ssh SshMimic instance (optional).
48
+ * @param sftp SftpMimic instance (optional).
49
+ */
50
+ attach(shell, vfs, users, ssh, sftp) {
51
+ this.attachVirtualShell(shell);
52
+ this.attachVirtualFileSystem(vfs);
53
+ this.attachVirtualUserManager(users);
54
+ if (ssh) {
55
+ this.attachSshMimic(ssh);
56
+ }
57
+ if (sftp) {
58
+ this.attachSftpMimic(sftp);
59
+ }
60
+ }
61
+ /**
62
+ * Attaches to VirtualShell events.
63
+ */
64
+ attachVirtualShell(shell) {
65
+ shell.on("initialized", () => {
66
+ this.log("VirtualShell", "initialized", {});
67
+ });
68
+ shell.on("command", (data) => {
69
+ this.stats.commands++;
70
+ this.log("VirtualShell", "command", data);
71
+ });
72
+ shell.on("session:start", (data) => {
73
+ this.stats.sessionStarts++;
74
+ this.log("VirtualShell", "session:start", data);
75
+ });
76
+ }
77
+ /**
78
+ * Attaches to VirtualFileSystem events.
79
+ */
80
+ attachVirtualFileSystem(vfs) {
81
+ vfs.on("file:read", (data) => {
82
+ this.stats.fileReads++;
83
+ this.log("VirtualFileSystem", "file:read", data);
84
+ });
85
+ vfs.on("file:write", (data) => {
86
+ this.stats.fileWrites++;
87
+ this.log("VirtualFileSystem", "file:write", data);
88
+ });
89
+ vfs.on("dir:create", (data) => {
90
+ this.log("VirtualFileSystem", "dir:create", data);
91
+ });
92
+ vfs.on("mirror:flush", () => {
93
+ this.log("VirtualFileSystem", "mirror:flush", {});
94
+ });
95
+ }
96
+ /**
97
+ * Attaches to VirtualUserManager events.
98
+ */
99
+ attachVirtualUserManager(users) {
100
+ users.on("initialized", () => {
101
+ this.log("VirtualUserManager", "initialized", {});
102
+ });
103
+ users.on("user:add", (data) => {
104
+ this.stats.userCreated++;
105
+ this.log("VirtualUserManager", "user:add", data);
106
+ });
107
+ users.on("user:delete", (data) => {
108
+ this.stats.userDeleted++;
109
+ this.log("VirtualUserManager", "user:delete", data);
110
+ });
111
+ users.on("session:register", (data) => {
112
+ this.log("VirtualUserManager", "session:register", data);
113
+ });
114
+ users.on("session:unregister", (data) => {
115
+ this.stats.sessionEnds++;
116
+ this.log("VirtualUserManager", "session:unregister", data);
117
+ });
118
+ }
119
+ /**
120
+ * Attaches to SshMimic events.
121
+ */
122
+ attachSshMimic(ssh) {
123
+ ssh.on("start", (data) => {
124
+ this.log("SshMimic", "start", data);
125
+ });
126
+ ssh.on("stop", () => {
127
+ this.log("SshMimic", "stop", {});
128
+ });
129
+ ssh.on("auth:success", (data) => {
130
+ this.stats.authAttempts++;
131
+ this.stats.authSuccesses++;
132
+ this.log("SshMimic", "auth:success", data);
133
+ });
134
+ ssh.on("auth:failure", (data) => {
135
+ this.stats.authAttempts++;
136
+ this.stats.authFailures++;
137
+ this.log("SshMimic", "auth:failure", data);
138
+ });
139
+ ssh.on("client:connect", () => {
140
+ this.stats.clientConnects++;
141
+ this.log("SshMimic", "client:connect", {});
142
+ });
143
+ ssh.on("client:disconnect", (data) => {
144
+ this.stats.clientDisconnects++;
145
+ this.log("SshMimic", "client:disconnect", data);
146
+ });
147
+ }
148
+ /**
149
+ * Attaches to SftpMimic events.
150
+ */
151
+ attachSftpMimic(sftp) {
152
+ sftp.on("start", (data) => {
153
+ this.log("SftpMimic", "start", data);
154
+ });
155
+ sftp.on("stop", () => {
156
+ this.log("SftpMimic", "stop", {});
157
+ });
158
+ sftp.on("auth:success", (data) => {
159
+ this.stats.authAttempts++;
160
+ this.stats.authSuccesses++;
161
+ this.log("SftpMimic", "auth:success", data);
162
+ });
163
+ sftp.on("auth:failure", (data) => {
164
+ this.stats.authAttempts++;
165
+ this.stats.authFailures++;
166
+ this.log("SftpMimic", "auth:failure", data);
167
+ });
168
+ sftp.on("client:connect", () => {
169
+ this.stats.clientConnects++;
170
+ this.log("SftpMimic", "client:connect", {});
171
+ });
172
+ sftp.on("client:disconnect", (data) => {
173
+ this.stats.clientDisconnects++;
174
+ this.log("SftpMimic", "client:disconnect", data);
175
+ });
176
+ }
177
+ /**
178
+ * Records an audit log entry.
179
+ *
180
+ * @param source Event source (e.g., "SshMimic", "VirtualFileSystem").
181
+ * @param type Event type.
182
+ * @param details Event-specific data.
183
+ */
184
+ log(source, type, details) {
185
+ const entry = {
186
+ timestamp: new Date().toISOString(),
187
+ type,
188
+ source,
189
+ details,
190
+ };
191
+ this.auditLog.push(entry);
192
+ // Trim log if exceeds max size
193
+ if (this.auditLog.length > this.maxLogSize) {
194
+ this.auditLog = this.auditLog.slice(-this.maxLogSize);
195
+ }
196
+ // Console output for real-time monitoring
197
+ console.log(`[AUDIT] ${entry.timestamp} | ${source} | ${type}`, details);
198
+ }
199
+ /**
200
+ * Returns audit log entries matching optional filters.
201
+ *
202
+ * @param type Optional event type filter.
203
+ * @param source Optional source filter.
204
+ * @returns Filtered audit log entries.
205
+ */
206
+ getAuditLog(type, source) {
207
+ return this.auditLog.filter((entry) => (!type || entry.type === type) && (!source || entry.source === source));
208
+ }
209
+ /**
210
+ * Returns current activity statistics.
211
+ *
212
+ * @returns Snapshot of honeypot stats.
213
+ */
214
+ getStats() {
215
+ return Object.freeze({ ...this.stats });
216
+ }
217
+ /**
218
+ * Clears audit log and resets statistics.
219
+ */
220
+ reset() {
221
+ this.auditLog = [];
222
+ this.stats = {
223
+ authAttempts: 0,
224
+ authSuccesses: 0,
225
+ authFailures: 0,
226
+ commands: 0,
227
+ fileWrites: 0,
228
+ fileReads: 0,
229
+ sessionStarts: 0,
230
+ sessionEnds: 0,
231
+ userCreated: 0,
232
+ userDeleted: 0,
233
+ clientConnects: 0,
234
+ clientDisconnects: 0,
235
+ };
236
+ }
237
+ /**
238
+ * Returns recent log entries in reverse chronological order.
239
+ *
240
+ * @param limit Number of recent entries to return (default: 100).
241
+ * @returns Recent audit log entries.
242
+ */
243
+ getRecent(limit = 100) {
244
+ return this.auditLog.slice(Math.max(0, this.auditLog.length - limit));
245
+ }
246
+ /**
247
+ * Detects potential security issues based on activity patterns.
248
+ *
249
+ * @returns Array of anomalies detected.
250
+ */
251
+ detectAnomalies() {
252
+ const anomalies = [];
253
+ // High auth failure rate
254
+ if (this.stats.authAttempts > 0 &&
255
+ this.stats.authFailures / this.stats.authAttempts > 0.5) {
256
+ anomalies.push({
257
+ type: "high_auth_failure_rate",
258
+ severity: "medium",
259
+ message: `Auth failure rate: ${((this.stats.authFailures / this.stats.authAttempts) * 100).toFixed(1)}%`,
260
+ });
261
+ }
262
+ // Excessive auth failures in short time
263
+ if (this.stats.authFailures > 10) {
264
+ anomalies.push({
265
+ type: "excessive_auth_failures",
266
+ severity: "high",
267
+ message: `${this.stats.authFailures} authentication failures detected`,
268
+ });
269
+ }
270
+ // Unusual command execution volume
271
+ if (this.stats.commands > 1000) {
272
+ anomalies.push({
273
+ type: "high_command_volume",
274
+ severity: "low",
275
+ message: `${this.stats.commands} commands executed`,
276
+ });
277
+ }
278
+ // Unusual file write volume
279
+ if (this.stats.fileWrites > 500) {
280
+ anomalies.push({
281
+ type: "high_write_volume",
282
+ severity: "medium",
283
+ message: `${this.stats.fileWrites} file write operations`,
284
+ });
285
+ }
286
+ return anomalies;
287
+ }
288
+ }
289
+ export default HoneyPot;
package/dist/index.d.ts CHANGED
@@ -3,9 +3,11 @@ import { SftpMimic, SshMimic } from "./SSHMimic/index";
3
3
  import VirtualFileSystem from "./VirtualFileSystem";
4
4
  import { VirtualShell } from "./VirtualShell";
5
5
  import { VirtualUserManager } from "./VirtualUserManager";
6
+ import { HoneyPot } from "./honeypot";
6
7
  export type { CommandContext, CommandMode, CommandOutcome, CommandResult, NanoEditorSession, ShellModule, SudoChallenge, } from "./types/commands";
7
8
  export type { ExecStream, ShellStream } from "./types/streams";
8
9
  export type { RemoveOptions, VfsBaseNode, VfsDirectoryNode, VfsFileNode, VfsNodeStats, VfsNodeType, VfsSnapshot, VfsSnapshotBaseNode, VfsSnapshotDirectoryNode, VfsSnapshotFileNode, VfsSnapshotNode, WriteFileOptions, } from "./types/vfs";
9
- export { SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, };
10
+ export type { AuditLogEntry, HoneyPotStats, } from "./honeypot";
11
+ export { SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, HoneyPot, };
10
12
  export { getArg, getFlag, ifFlag, } from "./commands/command-helpers";
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,aAAa,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EACX,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,IAAI,iBAAiB,EAC9B,YAAY,EACZ,QAAQ,IAAI,gBAAgB,EAC5B,kBAAkB,GAClB,CAAC;AAEF,OAAO,EACN,MAAM,EACN,OAAO,EACP,MAAM,GACN,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,YAAY,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,aAAa,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EACX,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,IAAI,iBAAiB,EAC9B,YAAY,EACZ,QAAQ,IAAI,gBAAgB,EAC5B,kBAAkB,EAClB,QAAQ,GACR,CAAC;AAEF,OAAO,EACN,MAAM,EACN,OAAO,EACP,MAAM,GACN,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -3,5 +3,6 @@ import { SftpMimic, SshMimic } from "./SSHMimic/index";
3
3
  import VirtualFileSystem from "./VirtualFileSystem";
4
4
  import { VirtualShell } from "./VirtualShell";
5
5
  import { VirtualUserManager } from "./VirtualUserManager";
6
- export { SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, };
6
+ import { HoneyPot } from "./honeypot";
7
+ export { SshClient, VirtualFileSystem, SftpMimic as VirtualSftpServer, VirtualShell, SshMimic as VirtualSshServer, VirtualUserManager, HoneyPot, };
7
8
  export { getArg, getFlag, ifFlag, } from "./commands/command-helpers";
@@ -0,0 +1,210 @@
1
+ # HoneyPot Examples
2
+
3
+ This directory contains practical examples demonstrating how to use the `HoneyPot` auditing and event tracking utility.
4
+
5
+ ## Quick Start with HoneyPot
6
+
7
+ ### 1. Basic Introduction (Recommended First)
8
+
9
+ **File:** `honeypot-quickstart.ts`
10
+
11
+ A beginner-friendly, step-by-step introduction to HoneyPot:
12
+
13
+ ```bash
14
+ bun run examples/honeypot-quickstart.ts
15
+ ```
16
+
17
+ **What it covers:**
18
+ - Creating a virtual environment
19
+ - Initializing HoneyPot
20
+ - Attaching HoneyPot to components
21
+ - Collecting statistics
22
+ - Viewing recent events
23
+ - Querying filtered logs
24
+ - Detecting anomalies
25
+
26
+ **Output:** Console display with colored examples and activity statistics
27
+
28
+ ---
29
+
30
+ ### 2. Comprehensive Auditing
31
+
32
+ **File:** `honeypot-audit.ts`
33
+
34
+ A complete auditing scenario with multiple users and suspicious activities:
35
+
36
+ ```bash
37
+ bun run examples/honeypot-audit.ts
38
+ ```
39
+
40
+ **What it covers:**
41
+ - Normal user activity tracking
42
+ - Suspicious operation attempts
43
+ - Detailed activity summaries
44
+ - Event filtering by type and source
45
+ - File system activity tracking
46
+ - Anomaly detection with severity levels
47
+ - Audit log export preparation
48
+
49
+ **Output:** Detailed audit report with sections for each component
50
+
51
+ ---
52
+
53
+ ### 3. Advanced: Export & Analysis
54
+
55
+ **File:** `honeypot-export.ts`
56
+
57
+ Professional audit report generation with file exports:
58
+
59
+ ```bash
60
+ bun run examples/honeypot-export.ts
61
+ ```
62
+
63
+ **What it covers:**
64
+ - Generating structured audit reports
65
+ - Exporting to JSON format
66
+ - Exporting to CSV format (for spreadsheet analysis)
67
+ - Exporting statistics
68
+ - Integration patterns with external systems
69
+ - Query examples for custom analysis
70
+
71
+ **Output:**
72
+ - `audit_report.json` - Complete audit report
73
+ - `audit_events.csv` - Timeline in spreadsheet format
74
+ - `audit_stats.json` - Summary statistics
75
+
76
+ ---
77
+
78
+ ## HoneyPot API Quick Reference
79
+
80
+ ```typescript
81
+ // Create instance
82
+ const honeypot = new HoneyPot(maxLogSize);
83
+
84
+ // Attach to components
85
+ honeypot.attach(shell, vfs, users, ssh, sftp);
86
+
87
+ // Get statistics
88
+ const stats = honeypot.getStats();
89
+
90
+ // Get audit log
91
+ const allLogs = honeypot.getAuditLog();
92
+ const typeFiltered = honeypot.getAuditLog("auth:failure");
93
+ const sourceFiltered = honeypot.getAuditLog(undefined, "SshMimic");
94
+
95
+ // Get recent entries
96
+ const recent = honeypot.getRecent(50);
97
+
98
+ // Detect anomalies
99
+ const anomalies = honeypot.detectAnomalies();
100
+
101
+ // Reset tracking
102
+ honeypot.reset();
103
+ ```
104
+
105
+ ## Common Use Cases
106
+
107
+ ### Use Case 1: Real-Time Monitoring
108
+
109
+ ```typescript
110
+ honeypot.on("auth:failure", (count) => {
111
+ if (count > 3) {
112
+ console.log("⚠️ Potential brute-force attack detected!");
113
+ }
114
+ });
115
+ ```
116
+
117
+ ### Use Case 2: Post-Execution Audit Report
118
+
119
+ ```typescript
120
+ // After operations complete
121
+ const report = {
122
+ timestamp: new Date(),
123
+ stats: honeypot.getStats(),
124
+ anomalies: honeypot.detectAnomalies(),
125
+ auditLog: honeypot.getAuditLog(),
126
+ };
127
+ ```
128
+
129
+ ### Use Case 3: Security Analysis
130
+
131
+ ```typescript
132
+ // Find all failed auth attempts by user
133
+ const failures = honeypot
134
+ .getAuditLog("auth:failure")
135
+ .reduce((map, entry) => {
136
+ const user = entry.details.username;
137
+ map[user] = (map[user] || 0) + 1;
138
+ return map;
139
+ }, {});
140
+ ```
141
+
142
+ ### Use Case 4: Compliance & Audit Trail
143
+
144
+ ```typescript
145
+ // Export complete trail for compliance
146
+ const auditData = {
147
+ exportDate: new Date().toISOString(),
148
+ entries: honeypot.getAuditLog(),
149
+ stats: honeypot.getStats(),
150
+ };
151
+
152
+ // Store in database, send to SIEM, or archive
153
+ ```
154
+
155
+ ## Integration Examples
156
+
157
+ ### With Database
158
+
159
+ ```typescript
160
+ const entries = honeypot.getAuditLog();
161
+ await database.insertMany("audit_logs", entries);
162
+ ```
163
+
164
+ ### With Monitoring System
165
+
166
+ ```typescript
167
+ const anomalies = honeypot.detectAnomalies();
168
+ if (anomalies.length > 0) {
169
+ await monitoring.alert({
170
+ type: "security",
171
+ level: "high",
172
+ anomalies,
173
+ });
174
+ }
175
+ ```
176
+
177
+ ### With Message Queue
178
+
179
+ ```typescript
180
+ const report = honeypot.getRecent(1000);
181
+ await queue.publish("audit-topic", report);
182
+ ```
183
+
184
+ ## Performance Notes
185
+
186
+ - HoneyPot maintains an in-memory log with configurable size limit
187
+ - Older entries are automatically trimmed when max size is exceeded
188
+ - Statistics are computed efficiently and cached
189
+ - Anomaly detection runs in O(1) time
190
+
191
+ ## Troubleshooting
192
+
193
+ **No events logged?**
194
+ - Ensure `honeypot.attach()` is called after all components are created
195
+ - Check that operations are actually performed (file writes, auth attempts, etc.)
196
+
197
+ **Memory growth?**
198
+ - Adjust `maxLogSize` in the constructor to limit retention
199
+ - Call `honeypot.reset()` to clear logs between test phases
200
+
201
+ **Missing events?**
202
+ - Use `honeypot.getAuditLog(type, source)` to filter and verify
203
+ - Check the exact event names in the [API Reference](../README.md#honeypot-auditing--event-tracking)
204
+
205
+ ## More Information
206
+
207
+ See the main [README.md](../README.md) for:
208
+ - [HoneyPot API Reference](../README.md#honeypot-auditing--event-tracking)
209
+ - [Example 8: Security Auditing with HoneyPot](../README.md#example-8-security-auditing-with-honeypot)
210
+ - Complete [Event Types Documentation](../README.md#events)