chainwall 2.1.0 → 2.2.2

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 (151) hide show
  1. package/LICENSE +44 -1
  2. package/README.md +213 -105
  3. package/dist/auditor/miner-detector.d.ts +16 -0
  4. package/dist/auditor/miner-detector.d.ts.map +1 -1
  5. package/dist/auditor/miner-detector.js +54 -10
  6. package/dist/auditor/miner-detector.js.map +1 -1
  7. package/dist/auditor/remediation.d.ts +9 -0
  8. package/dist/auditor/remediation.d.ts.map +1 -1
  9. package/dist/auditor/remediation.js +292 -1
  10. package/dist/auditor/remediation.js.map +1 -1
  11. package/dist/cli.js +29 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/monitor.d.ts +13 -0
  14. package/dist/commands/monitor.d.ts.map +1 -0
  15. package/dist/commands/monitor.js +102 -0
  16. package/dist/commands/monitor.js.map +1 -0
  17. package/dist/config.d.ts +4 -0
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +55 -0
  20. package/dist/config.js.map +1 -1
  21. package/dist/mcp-server/index.d.ts.map +1 -1
  22. package/dist/mcp-server/index.js +4 -0
  23. package/dist/mcp-server/index.js.map +1 -1
  24. package/dist/mcp-server/schemas.d.ts +2 -0
  25. package/dist/mcp-server/schemas.d.ts.map +1 -1
  26. package/dist/mcp-server/schemas.js +2 -0
  27. package/dist/mcp-server/schemas.js.map +1 -1
  28. package/dist/mcp-server/tools/capture-baseline.d.ts +3 -0
  29. package/dist/mcp-server/tools/capture-baseline.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/capture-baseline.js +42 -0
  31. package/dist/mcp-server/tools/capture-baseline.js.map +1 -0
  32. package/dist/mcp-server/tools/monitor-snapshot.d.ts +3 -0
  33. package/dist/mcp-server/tools/monitor-snapshot.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/monitor-snapshot.js +53 -0
  35. package/dist/mcp-server/tools/monitor-snapshot.js.map +1 -0
  36. package/dist/monitor/baseline.d.ts +6 -0
  37. package/dist/monitor/baseline.d.ts.map +1 -0
  38. package/dist/monitor/baseline.js +64 -0
  39. package/dist/monitor/baseline.js.map +1 -0
  40. package/dist/monitor/browser-scanner.d.ts +4 -0
  41. package/dist/monitor/browser-scanner.d.ts.map +1 -0
  42. package/dist/monitor/browser-scanner.js +141 -0
  43. package/dist/monitor/browser-scanner.js.map +1 -0
  44. package/dist/monitor/clipboard-scanner.d.ts +3 -0
  45. package/dist/monitor/clipboard-scanner.d.ts.map +1 -0
  46. package/dist/monitor/clipboard-scanner.js +49 -0
  47. package/dist/monitor/clipboard-scanner.js.map +1 -0
  48. package/dist/monitor/correlation.d.ts +9 -0
  49. package/dist/monitor/correlation.d.ts.map +1 -0
  50. package/dist/monitor/correlation.js +117 -0
  51. package/dist/monitor/correlation.js.map +1 -0
  52. package/dist/monitor/index.d.ts +13 -0
  53. package/dist/monitor/index.d.ts.map +1 -0
  54. package/dist/monitor/index.js +11 -0
  55. package/dist/monitor/index.js.map +1 -0
  56. package/dist/monitor/known-good.d.ts +24 -0
  57. package/dist/monitor/known-good.d.ts.map +1 -0
  58. package/dist/monitor/known-good.js +82 -0
  59. package/dist/monitor/known-good.js.map +1 -0
  60. package/dist/monitor/network-scanner.d.ts +4 -0
  61. package/dist/monitor/network-scanner.d.ts.map +1 -0
  62. package/dist/monitor/network-scanner.js +123 -0
  63. package/dist/monitor/network-scanner.js.map +1 -0
  64. package/dist/monitor/persistence-scanner.d.ts +4 -0
  65. package/dist/monitor/persistence-scanner.d.ts.map +1 -0
  66. package/dist/monitor/persistence-scanner.js +156 -0
  67. package/dist/monitor/persistence-scanner.js.map +1 -0
  68. package/dist/monitor/process-scanner.d.ts +6 -0
  69. package/dist/monitor/process-scanner.d.ts.map +1 -0
  70. package/dist/monitor/process-scanner.js +101 -0
  71. package/dist/monitor/process-scanner.js.map +1 -0
  72. package/dist/monitor/shadow-ai-scanner.d.ts +3 -0
  73. package/dist/monitor/shadow-ai-scanner.d.ts.map +1 -0
  74. package/dist/monitor/shadow-ai-scanner.js +70 -0
  75. package/dist/monitor/shadow-ai-scanner.js.map +1 -0
  76. package/dist/monitor/types.d.ts +79 -0
  77. package/dist/monitor/types.d.ts.map +1 -0
  78. package/dist/monitor/types.js +12 -0
  79. package/dist/monitor/types.js.map +1 -0
  80. package/dist/reporter/monitor-report.d.ts +3 -0
  81. package/dist/reporter/monitor-report.d.ts.map +1 -0
  82. package/dist/reporter/monitor-report.js +89 -0
  83. package/dist/reporter/monitor-report.js.map +1 -0
  84. package/dist/reporter/risk-scorer.d.ts +2 -0
  85. package/dist/reporter/risk-scorer.d.ts.map +1 -1
  86. package/dist/reporter/risk-scorer.js +12 -0
  87. package/dist/reporter/risk-scorer.js.map +1 -1
  88. package/dist/reporter/shared.d.ts.map +1 -1
  89. package/dist/reporter/shared.js +5 -3
  90. package/dist/reporter/shared.js.map +1 -1
  91. package/dist/rules/exfiltration-rules.d.ts +3 -0
  92. package/dist/rules/exfiltration-rules.d.ts.map +1 -0
  93. package/dist/rules/exfiltration-rules.js +181 -0
  94. package/dist/rules/exfiltration-rules.js.map +1 -0
  95. package/dist/rules/index.d.ts +2 -1
  96. package/dist/rules/index.d.ts.map +1 -1
  97. package/dist/rules/index.js +3 -1
  98. package/dist/rules/index.js.map +1 -1
  99. package/dist/rules/types.d.ts +9 -1
  100. package/dist/rules/types.d.ts.map +1 -1
  101. package/dist/scanner/filesystem-scanner.d.ts.map +1 -1
  102. package/dist/scanner/filesystem-scanner.js +27 -10
  103. package/dist/scanner/filesystem-scanner.js.map +1 -1
  104. package/dist/tui/App.d.ts.map +1 -1
  105. package/dist/tui/App.js +10 -2
  106. package/dist/tui/App.js.map +1 -1
  107. package/dist/tui/components/Footer.d.ts +2 -3
  108. package/dist/tui/components/Footer.d.ts.map +1 -1
  109. package/dist/tui/components/Footer.js +11 -5
  110. package/dist/tui/components/Footer.js.map +1 -1
  111. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
  112. package/dist/tui/components/WelcomeScreen.js +1 -1
  113. package/dist/tui/components/WelcomeScreen.js.map +1 -1
  114. package/dist/tui/educational.d.ts +6 -0
  115. package/dist/tui/educational.d.ts.map +1 -1
  116. package/dist/tui/educational.js +37 -0
  117. package/dist/tui/educational.js.map +1 -1
  118. package/dist/tui/hooks/useLogs.d.ts +1 -1
  119. package/dist/tui/hooks/useLogs.d.ts.map +1 -1
  120. package/dist/tui/hooks/useMonitor.d.ts +28 -0
  121. package/dist/tui/hooks/useMonitor.d.ts.map +1 -0
  122. package/dist/tui/hooks/useMonitor.js +127 -0
  123. package/dist/tui/hooks/useMonitor.js.map +1 -0
  124. package/dist/tui/screens/AuditPanel.d.ts.map +1 -1
  125. package/dist/tui/screens/AuditPanel.js +109 -9
  126. package/dist/tui/screens/AuditPanel.js.map +1 -1
  127. package/dist/tui/screens/MonitorPanel.d.ts +2 -0
  128. package/dist/tui/screens/MonitorPanel.d.ts.map +1 -0
  129. package/dist/tui/screens/MonitorPanel.js +370 -0
  130. package/dist/tui/screens/MonitorPanel.js.map +1 -0
  131. package/dist/tui/screens/OverviewPanel.d.ts.map +1 -1
  132. package/dist/tui/screens/OverviewPanel.js +9 -3
  133. package/dist/tui/screens/OverviewPanel.js.map +1 -1
  134. package/dist/tui/screens/ScanPanel.d.ts.map +1 -1
  135. package/dist/tui/screens/ScanPanel.js +5 -5
  136. package/dist/tui/screens/ScanPanel.js.map +1 -1
  137. package/dist/tui/screens/ScanResultsPanel.d.ts.map +1 -1
  138. package/dist/tui/screens/ScanResultsPanel.js +104 -32
  139. package/dist/tui/screens/ScanResultsPanel.js.map +1 -1
  140. package/dist/tui/state.d.ts +7 -3
  141. package/dist/tui/state.d.ts.map +1 -1
  142. package/dist/tui/state.js +1 -0
  143. package/dist/tui/state.js.map +1 -1
  144. package/dist/tui/utils/open-file.d.ts +4 -0
  145. package/dist/tui/utils/open-file.d.ts.map +1 -0
  146. package/dist/tui/utils/open-file.js +29 -0
  147. package/dist/tui/utils/open-file.js.map +1 -0
  148. package/install.sh +23 -12
  149. package/package.json +1 -1
  150. package/patterns/exfiltration.yaml +160 -0
  151. package/uninstall.sh +14 -10
@@ -0,0 +1,156 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir, platform } from 'node:os';
4
+ import { execFileSync } from 'node:child_process';
5
+ import { parseCrontabOutput, MINER_PATTERN, CURL_BASH_PATTERN, STRATUM_PATTERN, POOL_PATTERN } from '../auditor/miner-detector.js';
6
+ import { SIGNAL_WEIGHTS } from './types.js';
7
+ const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;
8
+ const SUSPICIOUS_RC_PATTERNS = [CURL_BASH_PATTERN, /base64\s+-d/i, /\beval\b.*\$\(/i, /python.*-c.*import/i, /\bexec\b.*\$\(/i];
9
+ const RC_FILES = ['.bashrc', '.zshrc', '.bash_profile', '.profile', '.zshenv', '.zprofile'];
10
+ function isRecentlyModified(filePath) {
11
+ try {
12
+ return (Date.now() - statSync(filePath).mtimeMs) < SEVEN_DAYS_MS;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ export function scanPersistence(config, knownGood) {
19
+ const start = Date.now();
20
+ const findings = [];
21
+ const home = homedir();
22
+ const isMac = platform() === 'darwin';
23
+ // 1. Crontab entries
24
+ try {
25
+ const output = execFileSync('crontab', ['-l'], { timeout: 5000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
26
+ const lines = parseCrontabOutput(output);
27
+ for (const line of lines) {
28
+ const signals = [{ type: 'persistence-mechanism', weight: SIGNAL_WEIGHTS['persistence-mechanism'], detail: 'Crontab entry' }];
29
+ if (MINER_PATTERN.test(line)) {
30
+ signals.push({ type: 'known-miner', weight: SIGNAL_WEIGHTS['known-miner'], detail: 'Mining binary in crontab' });
31
+ findings.push({ id: `persist-cron-miner-${line.slice(0, 20)}`, category: 'persistence', severity: 'critical', title: 'Mining crontab entry', description: line.slice(0, 100), signals, target: line });
32
+ }
33
+ else if (CURL_BASH_PATTERN.test(line)) {
34
+ findings.push({ id: `persist-cron-curl-${line.slice(0, 20)}`, category: 'persistence', severity: 'high', title: 'Remote script execution in crontab', description: line.slice(0, 100), signals, target: line });
35
+ }
36
+ else if (STRATUM_PATTERN.test(line) || POOL_PATTERN.test(line)) {
37
+ signals.push({ type: 'known-miner', weight: SIGNAL_WEIGHTS['known-miner'], detail: 'Mining pool in crontab' });
38
+ findings.push({ id: `persist-cron-pool-${line.slice(0, 20)}`, category: 'persistence', severity: 'high', title: 'Mining pool reference in crontab', description: line.slice(0, 100), signals, target: line });
39
+ }
40
+ }
41
+ }
42
+ catch { /* no crontab */ }
43
+ // 2. macOS Launch Agents
44
+ if (isMac) {
45
+ const launchAgentDir = join(home, 'Library/LaunchAgents');
46
+ if (existsSync(launchAgentDir)) {
47
+ try {
48
+ const plistFiles = readdirSync(launchAgentDir).filter(f => f.endsWith('.plist'));
49
+ for (const plistFile of plistFiles) {
50
+ if (knownGood.persistenceEntries.some(e => plistFile.startsWith(e)))
51
+ continue;
52
+ const fullPath = join(launchAgentDir, plistFile);
53
+ const recent = isRecentlyModified(fullPath);
54
+ let content = '';
55
+ try {
56
+ content = readFileSync(fullPath, 'utf-8');
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ const signals = [{ type: 'persistence-mechanism', weight: SIGNAL_WEIGHTS['persistence-mechanism'], detail: `Launch Agent: ${plistFile}` }];
62
+ if (CURL_BASH_PATTERN.test(content) || MINER_PATTERN.test(content)) {
63
+ signals.push({ type: 'known-miner', weight: SIGNAL_WEIGHTS['known-miner'], detail: 'Suspicious content in plist' });
64
+ findings.push({ id: `persist-launchagent-${plistFile}`, category: 'persistence', severity: 'high', title: `Suspicious Launch Agent: ${plistFile}`, description: 'Contains suspicious commands', signals, target: fullPath });
65
+ }
66
+ else if (recent) {
67
+ findings.push({ id: `persist-launchagent-recent-${plistFile}`, category: 'persistence', severity: 'low', title: `Recently modified Launch Agent: ${plistFile}`, description: `Modified within last 7 days`, signals, target: fullPath });
68
+ }
69
+ }
70
+ }
71
+ catch { /* dir read failed */ }
72
+ }
73
+ }
74
+ // 3. Linux systemd user services + autostart
75
+ if (!isMac) {
76
+ const systemdDir = join(home, '.config/systemd/user');
77
+ if (existsSync(systemdDir)) {
78
+ try {
79
+ for (const svc of readdirSync(systemdDir).filter(f => f.endsWith('.service'))) {
80
+ const fullPath = join(systemdDir, svc);
81
+ let content = '';
82
+ try {
83
+ content = readFileSync(fullPath, 'utf-8');
84
+ }
85
+ catch {
86
+ continue;
87
+ }
88
+ const signals = [{ type: 'persistence-mechanism', weight: SIGNAL_WEIGHTS['persistence-mechanism'], detail: `Systemd service: ${svc}` }];
89
+ if (CURL_BASH_PATTERN.test(content) || MINER_PATTERN.test(content)) {
90
+ findings.push({ id: `persist-systemd-${svc}`, category: 'persistence', severity: 'high', title: `Suspicious systemd service: ${svc}`, description: 'Contains suspicious commands', signals, target: fullPath });
91
+ }
92
+ }
93
+ }
94
+ catch { /* */ }
95
+ }
96
+ const autostartDir = join(home, '.config/autostart');
97
+ if (existsSync(autostartDir)) {
98
+ try {
99
+ for (const desktop of readdirSync(autostartDir).filter(f => f.endsWith('.desktop'))) {
100
+ const fullPath = join(autostartDir, desktop);
101
+ let content = '';
102
+ try {
103
+ content = readFileSync(fullPath, 'utf-8');
104
+ }
105
+ catch {
106
+ continue;
107
+ }
108
+ const signals = [{ type: 'persistence-mechanism', weight: SIGNAL_WEIGHTS['persistence-mechanism'], detail: `Autostart: ${desktop}` }];
109
+ if (CURL_BASH_PATTERN.test(content) || MINER_PATTERN.test(content)) {
110
+ findings.push({ id: `persist-autostart-${desktop}`, category: 'persistence', severity: 'high', title: `Suspicious autostart entry: ${desktop}`, description: 'Contains suspicious commands', signals, target: fullPath });
111
+ }
112
+ }
113
+ }
114
+ catch { /* */ }
115
+ }
116
+ }
117
+ // 4. Shell RC files — check for suspicious appended lines
118
+ for (const rcFile of RC_FILES) {
119
+ const rcPath = join(home, rcFile);
120
+ if (!existsSync(rcPath))
121
+ continue;
122
+ let content;
123
+ try {
124
+ content = readFileSync(rcPath, 'utf-8');
125
+ }
126
+ catch {
127
+ continue;
128
+ }
129
+ const lines = content.split('\n');
130
+ for (let i = 0; i < lines.length; i++) {
131
+ const line = lines[i].trim();
132
+ if (!line || line.startsWith('#'))
133
+ continue;
134
+ for (const pattern of SUSPICIOUS_RC_PATTERNS) {
135
+ if (pattern.test(line)) {
136
+ const signals = [{ type: 'persistence-mechanism', weight: SIGNAL_WEIGHTS['persistence-mechanism'], detail: `In ${rcFile} line ${i + 1}` }];
137
+ const recent = isRecentlyModified(rcPath);
138
+ if (recent)
139
+ signals.push({ type: 'new-since-baseline', weight: SIGNAL_WEIGHTS['new-since-baseline'], detail: 'Recently modified' });
140
+ findings.push({
141
+ id: `persist-rc-${rcFile}-${i}`,
142
+ category: 'persistence',
143
+ severity: recent ? 'high' : 'medium',
144
+ title: `Suspicious line in ${rcFile}`,
145
+ description: line.slice(0, 100),
146
+ signals,
147
+ target: rcPath,
148
+ });
149
+ break;
150
+ }
151
+ }
152
+ }
153
+ }
154
+ return { category: 'persistence', findings, durationMs: Date.now() - start };
155
+ }
156
+ //# sourceMappingURL=persistence-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence-scanner.js","sourceRoot":"","sources":["../../src/monitor/persistence-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type KnownGoodList } from './known-good.js';
2
+ import type { ScannerResult, ProcessInfo, MonitorConfig } from './types.js';
3
+ export declare function scanProcesses(config: MonitorConfig, knownGood: KnownGoodList): ScannerResult;
4
+ /** Exported for use by other scanners needing the process map */
5
+ export declare function getProcessMap(config: MonitorConfig, knownGood: KnownGoodList): Map<number, ProcessInfo>;
6
+ //# sourceMappingURL=process-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-scanner.d.ts","sourceRoot":"","sources":["../../src/monitor/process-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3F,OAAO,KAAK,EAAkB,aAAa,EAAE,WAAW,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAS/G,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,GAAG,aAAa,CAiF5F;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAYvG"}
@@ -0,0 +1,101 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { parseProcessList, MINER_PATTERN, STRATUM_PATTERN } from '../auditor/miner-detector.js';
3
+ import { isKnownGoodProcess, isKnownGoodChain } from './known-good.js';
4
+ import { TOOL_DEFINITIONS } from '../auditor/tool-detector.js';
5
+ import { SIGNAL_WEIGHTS } from './types.js';
6
+ const AI_PROCESS_NAMES = TOOL_DEFINITIONS.map(t => t.name.toLowerCase().replace(/\s+/g, '-'));
7
+ const KEYLOGGER_PATTERNS = [/keylog/i, /keystroke/i, /inputcapture/i];
8
+ const SCREEN_CAPTURE_PATTERNS = [/screencapture.*-x/i, /screenshot.*loop/i, /scrot.*-d/i];
9
+ const MALWARE_NAMES = ['cryptonight', 'coinhive', 'minergate', 'webmine'];
10
+ export function scanProcesses(config, knownGood) {
11
+ const start = Date.now();
12
+ const findings = [];
13
+ let processes = [];
14
+ try {
15
+ const output = execFileSync('ps', ['-eo', 'pid,ppid,user,%cpu,%mem,lstart,command'], {
16
+ timeout: 5000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
17
+ });
18
+ processes = parseProcessList(output);
19
+ }
20
+ catch {
21
+ return { category: 'process', findings: [], durationMs: Date.now() - start };
22
+ }
23
+ // Build parent map
24
+ const pidMap = new Map();
25
+ for (const p of processes)
26
+ pidMap.set(p.pid, p);
27
+ // User allowlist
28
+ const userAllowed = new Set((config.processAllowlist ?? []).map(s => s.toLowerCase()));
29
+ for (const proc of processes) {
30
+ if (proc.command.includes('chainwall') || proc.command.includes('vitest'))
31
+ continue;
32
+ if (isKnownGoodProcess(proc.name, knownGood))
33
+ continue;
34
+ if (userAllowed.has(proc.name.toLowerCase()))
35
+ continue;
36
+ const parent = pidMap.get(proc.ppid);
37
+ if (parent && isKnownGoodChain(parent.name, proc.name, knownGood))
38
+ continue;
39
+ const signals = [];
40
+ // Check keylogger
41
+ if (KEYLOGGER_PATTERNS.some(p => p.test(proc.command))) {
42
+ signals.push({ type: 'sensitive-file-access', weight: SIGNAL_WEIGHTS['sensitive-file-access'], detail: 'Keylogger-like process' });
43
+ findings.push({ id: `proc-keylogger-${proc.pid}`, category: 'process', severity: 'critical', title: `Possible keylogger: ${proc.name}`, description: `Process ${proc.pid} (${proc.command.slice(0, 80)}) matches keylogger patterns`, signals, pid: proc.pid, processName: proc.name });
44
+ continue;
45
+ }
46
+ // Check screen capture
47
+ if (SCREEN_CAPTURE_PATTERNS.some(p => p.test(proc.command))) {
48
+ signals.push({ type: 'sensitive-file-access', weight: SIGNAL_WEIGHTS['sensitive-file-access'], detail: 'Screen capture process' });
49
+ findings.push({ id: `proc-screencap-${proc.pid}`, category: 'process', severity: 'high', title: `Screen capture: ${proc.name}`, description: `Process ${proc.pid} appears to be capturing screen`, signals, pid: proc.pid, processName: proc.name });
50
+ continue;
51
+ }
52
+ // Check known malware
53
+ if (MALWARE_NAMES.some(m => proc.command.toLowerCase().includes(m))) {
54
+ signals.push({ type: 'known-miner', weight: SIGNAL_WEIGHTS['known-miner'], detail: 'Known malware process' });
55
+ findings.push({ id: `proc-malware-${proc.pid}`, category: 'process', severity: 'critical', title: `Known malware: ${proc.name}`, description: `Process matches known malware pattern`, signals, pid: proc.pid, processName: proc.name });
56
+ continue;
57
+ }
58
+ // Check known miners
59
+ if (MINER_PATTERN.test(proc.command) || STRATUM_PATTERN.test(proc.command)) {
60
+ signals.push({ type: 'known-miner', weight: SIGNAL_WEIGHTS['known-miner'], detail: 'Mining process detected' });
61
+ findings.push({ id: `proc-miner-${proc.pid}`, category: 'process', severity: 'critical', title: `Cryptocurrency miner: ${proc.name}`, description: `Process ${proc.pid} matches mining patterns`, signals, pid: proc.pid, processName: proc.name });
62
+ continue;
63
+ }
64
+ // Check suspicious AI child processes
65
+ if (parent) {
66
+ const parentIsAI = AI_PROCESS_NAMES.some(n => parent.name.toLowerCase().includes(n));
67
+ if (parentIsAI && !isKnownGoodProcess(proc.name, knownGood)) {
68
+ signals.push({ type: 'ai-child-process', weight: SIGNAL_WEIGHTS['ai-child-process'], detail: `Child of AI tool: ${parent.name}` });
69
+ if (proc.command.includes('curl') || proc.command.includes('wget') || proc.command.includes('nc ')) {
70
+ signals.push({ type: 'data-transfer-args', weight: SIGNAL_WEIGHTS['data-transfer-args'], detail: 'Data transfer command from AI tool' });
71
+ }
72
+ if (signals.length > 0) {
73
+ findings.push({ id: `proc-ai-child-${proc.pid}`, category: 'process', severity: 'medium', title: `Suspicious AI child process: ${proc.name}`, description: `${proc.name} (PID ${proc.pid}) spawned by ${parent.name}`, signals: [...signals], pid: proc.pid, processName: proc.name });
74
+ }
75
+ }
76
+ }
77
+ // Check high CPU unknown processes
78
+ if (proc.cpu > 80 && !isKnownGoodProcess(proc.name, knownGood)) {
79
+ const highCpuSignals = [{ type: 'high-cpu', weight: SIGNAL_WEIGHTS['high-cpu'], detail: `CPU: ${proc.cpu}%` }];
80
+ findings.push({ id: `proc-highcpu-${proc.pid}`, category: 'process', severity: 'low', title: `High CPU process: ${proc.name} (${proc.cpu}%)`, description: `Unknown process consuming high CPU`, signals: highCpuSignals, pid: proc.pid, processName: proc.name });
81
+ }
82
+ }
83
+ return { category: 'process', findings, durationMs: Date.now() - start };
84
+ }
85
+ /** Exported for use by other scanners needing the process map */
86
+ export function getProcessMap(config, knownGood) {
87
+ try {
88
+ const output = execFileSync('ps', ['-eo', 'pid,ppid,user,%cpu,%mem,lstart,command'], {
89
+ timeout: 5000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
90
+ });
91
+ const procs = parseProcessList(output);
92
+ const map = new Map();
93
+ for (const p of procs)
94
+ map.set(p.pid, p);
95
+ return map;
96
+ }
97
+ catch {
98
+ return new Map();
99
+ }
100
+ }
101
+ //# sourceMappingURL=process-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-scanner.js","sourceRoot":"","sources":["../../src/monitor/process-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ScannerResult, ProcessInfo, MonitorConfig } from './types.js';
2
+ export declare function scanShadowAI(processMap: Map<number, ProcessInfo>, knownToolNames: string[], config: MonitorConfig): ScannerResult;
3
+ //# sourceMappingURL=shadow-ai-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-ai-scanner.d.ts","sourceRoot":"","sources":["../../src/monitor/shadow-ai-scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,aAAa,EAAE,WAAW,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAgB/G,wBAAgB,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CAoDjI"}
@@ -0,0 +1,70 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { TOOL_DEFINITIONS } from '../auditor/tool-detector.js';
5
+ import { SIGNAL_WEIGHTS } from './types.js';
6
+ const SHADOW_AI_PATTERNS = [
7
+ { name: 'Ollama', process: /\bollama\b/i, configDir: '.ollama' },
8
+ { name: 'LM Studio', process: /\blm[-_]?studio\b/i, configDir: '.lmstudio' },
9
+ { name: 'Tabnine', process: /\btabnine\b/i, configDir: '.tabnine' },
10
+ { name: 'Cody', process: /\bcody\b/i, configDir: '.sourcegraph' },
11
+ { name: 'Supermaven', process: /\bsupermaven\b/i, configDir: '.supermaven' },
12
+ { name: 'Codeium', process: /\bcodeium\b/i, configDir: '.codeium' },
13
+ { name: 'Amazon Q', process: /\bamazon[_-]?q\b/i, configDir: '.aws/amazonq' },
14
+ { name: 'Replit AI', process: /\breplit\b/i, configDir: '.replit' },
15
+ { name: 'JetBrains AI', process: /\bjetbrains[-_]ai\b/i, configDir: '.jetbrains' },
16
+ { name: 'Pieces', process: /\bpieces[-_]?os\b/i, configDir: '.pieces' },
17
+ ];
18
+ export function scanShadowAI(processMap, knownToolNames, config) {
19
+ const start = Date.now();
20
+ const findings = [];
21
+ const knownLower = new Set(knownToolNames.map(n => n.toLowerCase()));
22
+ // Also consider TOOL_DEFINITIONS names as "known"
23
+ for (const td of TOOL_DEFINITIONS)
24
+ knownLower.add(td.name.toLowerCase());
25
+ // Check running processes for shadow AI tools
26
+ for (const [pid, proc] of processMap) {
27
+ for (const pattern of SHADOW_AI_PATTERNS) {
28
+ if (knownLower.has(pattern.name.toLowerCase()))
29
+ continue;
30
+ if (!pattern.process.test(proc.command))
31
+ continue;
32
+ const signals = [
33
+ { type: 'ai-child-process', weight: SIGNAL_WEIGHTS['ai-child-process'], detail: `Unregistered AI tool: ${pattern.name}` },
34
+ ];
35
+ findings.push({
36
+ id: `shadow-ai-proc-${pattern.name.toLowerCase().replace(/\s+/g, '-')}-${pid}`,
37
+ category: 'shadow_ai',
38
+ severity: 'medium',
39
+ title: `Shadow AI tool running: ${pattern.name}`,
40
+ description: `${pattern.name} (PID ${pid}) is running but not in your registered AI tools`,
41
+ signals,
42
+ pid,
43
+ processName: proc.name,
44
+ });
45
+ }
46
+ }
47
+ // Check for shadow AI config directories
48
+ const home = homedir();
49
+ for (const pattern of SHADOW_AI_PATTERNS) {
50
+ if (knownLower.has(pattern.name.toLowerCase()))
51
+ continue;
52
+ const configPath = join(home, pattern.configDir);
53
+ if (existsSync(configPath)) {
54
+ // Only flag if no process finding already exists for this tool
55
+ const alreadyFound = findings.some(f => f.id.startsWith(`shadow-ai-proc-${pattern.name.toLowerCase().replace(/\s+/g, '-')}`));
56
+ if (!alreadyFound) {
57
+ findings.push({
58
+ id: `shadow-ai-dir-${pattern.name.toLowerCase().replace(/\s+/g, '-')}`,
59
+ category: 'shadow_ai',
60
+ severity: 'low',
61
+ title: `Shadow AI config found: ${pattern.name}`,
62
+ description: `Config directory ${configPath} exists but tool is not in registered AI tools`,
63
+ signals: [{ type: 'ai-child-process', weight: SIGNAL_WEIGHTS['ai-child-process'] * 0.5, detail: `Config dir: ${pattern.configDir}` }],
64
+ });
65
+ }
66
+ }
67
+ }
68
+ return { category: 'shadow_ai', findings, durationMs: Date.now() - start };
69
+ }
70
+ //# sourceMappingURL=shadow-ai-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-ai-scanner.js","sourceRoot":"","sources":["../../src/monitor/shadow-ai-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { Severity } from '../rules/types.js';
2
+ export type MonitorCategory = 'process' | 'network' | 'browser' | 'shadow_ai' | 'clipboard' | 'persistence';
3
+ export type SignalType = 'ai-child-process' | 'sensitive-file-access' | 'unknown-destination' | 'suspicious-destination' | 'data-transfer-args' | 'high-cpu' | 'new-since-baseline' | 'persistence-mechanism' | 'known-miner';
4
+ export interface CorrelationSignal {
5
+ type: SignalType;
6
+ weight: number;
7
+ detail: string;
8
+ }
9
+ export declare const SIGNAL_WEIGHTS: Record<SignalType, number>;
10
+ export interface ProcessInfo {
11
+ pid: number;
12
+ ppid: number;
13
+ user: string;
14
+ cpu: number;
15
+ mem: number;
16
+ startTime: string;
17
+ command: string;
18
+ name: string;
19
+ }
20
+ export interface NetworkConnection {
21
+ pid: number;
22
+ protocol: string;
23
+ localAddress: string;
24
+ remoteAddress: string;
25
+ state: string;
26
+ processName: string;
27
+ }
28
+ export interface MonitorFinding {
29
+ id: string;
30
+ category: MonitorCategory;
31
+ severity: Severity;
32
+ title: string;
33
+ description: string;
34
+ signals: CorrelationSignal[];
35
+ pid?: number;
36
+ processName?: string;
37
+ detail?: string;
38
+ target?: string;
39
+ }
40
+ export interface ScannerResult {
41
+ category: MonitorCategory;
42
+ findings: MonitorFinding[];
43
+ durationMs: number;
44
+ }
45
+ export interface MonitorResult {
46
+ findings: MonitorFinding[];
47
+ scannerResults: ScannerResult[];
48
+ riskScore: number;
49
+ riskLabel: string;
50
+ durationMs: number;
51
+ baselineDelta?: BaselineDelta;
52
+ }
53
+ export interface MonitorConfig {
54
+ processAllowlist?: string[];
55
+ networkAllowlist?: string[];
56
+ browserAllowlist?: string[];
57
+ clipboardScanEnabled?: boolean;
58
+ baselinePath?: string;
59
+ }
60
+ export interface BaselineState {
61
+ capturedAt: string;
62
+ processes: Array<{
63
+ name: string;
64
+ command: string;
65
+ }>;
66
+ connections: Array<{
67
+ remoteAddress: string;
68
+ processName: string;
69
+ }>;
70
+ extensions: string[];
71
+ persistence: string[];
72
+ }
73
+ export interface BaselineDelta {
74
+ newProcesses: string[];
75
+ newConnections: string[];
76
+ newExtensions: string[];
77
+ newPersistence: string[];
78
+ }
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/monitor/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export const SIGNAL_WEIGHTS = {
2
+ 'ai-child-process': 0.6,
3
+ 'sensitive-file-access': 0.8,
4
+ 'unknown-destination': 0.4,
5
+ 'suspicious-destination': 0.9,
6
+ 'data-transfer-args': 0.7,
7
+ 'high-cpu': 0.3,
8
+ 'new-since-baseline': 0.5,
9
+ 'persistence-mechanism': 0.6,
10
+ 'known-miner': 1.0,
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/monitor/types.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,MAAM,cAAc,GAA+B;IACxD,kBAAkB,EAAE,GAAG;IACvB,uBAAuB,EAAE,GAAG;IAC5B,qBAAqB,EAAE,GAAG;IAC1B,wBAAwB,EAAE,GAAG;IAC7B,oBAAoB,EAAE,GAAG;IACzB,UAAU,EAAE,GAAG;IACf,oBAAoB,EAAE,GAAG;IACzB,uBAAuB,EAAE,GAAG;IAC5B,aAAa,EAAE,GAAG;CACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MonitorResult } from '../monitor/types.js';
2
+ export declare function printMonitorReport(result: MonitorResult, verbose: boolean): void;
3
+ //# sourceMappingURL=monitor-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-report.d.ts","sourceRoot":"","sources":["../../src/reporter/monitor-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAkD,MAAM,qBAAqB,CAAC;AAmBzG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAwEhF"}
@@ -0,0 +1,89 @@
1
+ import chalk from 'chalk';
2
+ import { SEVERITY_COLOR } from './shared.js';
3
+ const CATEGORY_LABELS = {
4
+ process: 'Process Monitor',
5
+ network: 'Network Monitor',
6
+ browser: 'Browser Extensions',
7
+ shadow_ai: 'Shadow AI Tools',
8
+ clipboard: 'Clipboard',
9
+ persistence: 'Persistence Mechanisms',
10
+ };
11
+ const SEVERITY_ICON = {
12
+ critical: '[!]',
13
+ high: '[H]',
14
+ medium: '[M]',
15
+ low: '[-]',
16
+ };
17
+ export function printMonitorReport(result, verbose) {
18
+ console.log('');
19
+ console.log(chalk.bold('ChainWall Monitor Report'));
20
+ console.log(chalk.dim('─'.repeat(50)));
21
+ console.log('');
22
+ // Risk summary
23
+ const riskColor = result.riskScore > 8 ? chalk.red.bold :
24
+ result.riskScore > 5 ? chalk.red :
25
+ result.riskScore > 2 ? chalk.yellow : chalk.green;
26
+ console.log(` Risk Score: ${riskColor(`${result.riskScore}/10 (${result.riskLabel})`)}`);
27
+ console.log(` Duration: ${result.durationMs}ms`);
28
+ console.log(` Findings: ${result.findings.length}`);
29
+ console.log('');
30
+ // Baseline delta
31
+ if (result.baselineDelta) {
32
+ const delta = result.baselineDelta;
33
+ const hasNew = delta.newProcesses.length + delta.newConnections.length +
34
+ delta.newExtensions.length + delta.newPersistence.length > 0;
35
+ if (hasNew) {
36
+ console.log(chalk.yellow.bold(' Baseline Changes:'));
37
+ if (delta.newProcesses.length > 0)
38
+ console.log(` [NEW] ${delta.newProcesses.length} new process(es)`);
39
+ if (delta.newConnections.length > 0)
40
+ console.log(` [NEW] ${delta.newConnections.length} new connection(s)`);
41
+ if (delta.newExtensions.length > 0)
42
+ console.log(` [NEW] ${delta.newExtensions.length} new extension(s)`);
43
+ if (delta.newPersistence.length > 0)
44
+ console.log(` [NEW] ${delta.newPersistence.length} new persistence item(s)`);
45
+ console.log('');
46
+ }
47
+ }
48
+ // Group findings by scanner category
49
+ const categories = ['process', 'network', 'browser', 'shadow_ai', 'clipboard', 'persistence'];
50
+ for (const cat of categories) {
51
+ const scannerResult = result.scannerResults.find(sr => sr.category === cat);
52
+ const catFindings = result.findings.filter(f => f.category === cat);
53
+ // Skip categories with no findings unless verbose
54
+ const visibleFindings = verbose ? catFindings : catFindings.filter(f => f.severity !== 'low');
55
+ if (visibleFindings.length === 0 && !verbose)
56
+ continue;
57
+ console.log(chalk.bold(` ${CATEGORY_LABELS[cat]}`));
58
+ if (scannerResult) {
59
+ console.log(chalk.dim(` (${scannerResult.durationMs}ms)`));
60
+ }
61
+ if (visibleFindings.length === 0) {
62
+ console.log(chalk.green(' No findings.'));
63
+ }
64
+ else {
65
+ for (const f of visibleFindings) {
66
+ const color = SEVERITY_COLOR[f.severity];
67
+ const icon = SEVERITY_ICON[f.severity] ?? '[-]';
68
+ const signalCount = f.signals.length;
69
+ const signalBadge = signalCount > 1 ? chalk.dim(` (${signalCount} signals)`) : '';
70
+ console.log(` ${color(icon)} ${color(f.title)}${signalBadge}`);
71
+ if (verbose) {
72
+ console.log(chalk.dim(` ${f.description}`));
73
+ if (f.pid)
74
+ console.log(chalk.dim(` PID: ${f.pid}`));
75
+ }
76
+ }
77
+ }
78
+ console.log('');
79
+ }
80
+ // Hidden info-level count
81
+ if (!verbose) {
82
+ const hiddenCount = result.findings.filter(f => f.severity === 'low').length;
83
+ if (hiddenCount > 0) {
84
+ console.log(chalk.dim(` ${hiddenCount} low-severity finding(s) hidden. Use --verbose to show.`));
85
+ console.log('');
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=monitor-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-report.js","sourceRoot":"","sources":["../../src/reporter/monitor-report.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import type { ScanFinding } from '../rules/types.js';
2
+ import type { MonitorFinding } from '../monitor/types.js';
2
3
  export interface RiskScoreResult {
3
4
  score: number;
4
5
  label: string;
5
6
  rawPoints: number;
6
7
  }
7
8
  export declare function calculateRiskScore(findings: ScanFinding[]): RiskScoreResult;
9
+ export declare function calculateMonitorRiskScore(findings: MonitorFinding[]): RiskScoreResult;
8
10
  //# sourceMappingURL=risk-scorer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"risk-scorer.d.ts","sourceRoot":"","sources":["../../src/reporter/risk-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAerD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,eAAe,CAwB3E"}
1
+ {"version":3,"file":"risk-scorer.d.ts","sourceRoot":"","sources":["../../src/reporter/risk-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAe1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,eAAe,CAwB3E;AAYD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,eAAe,CAWrF"}