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.
- package/LICENSE +44 -1
- package/README.md +213 -105
- package/dist/auditor/miner-detector.d.ts +16 -0
- package/dist/auditor/miner-detector.d.ts.map +1 -1
- package/dist/auditor/miner-detector.js +54 -10
- package/dist/auditor/miner-detector.js.map +1 -1
- package/dist/auditor/remediation.d.ts +9 -0
- package/dist/auditor/remediation.d.ts.map +1 -1
- package/dist/auditor/remediation.js +292 -1
- package/dist/auditor/remediation.js.map +1 -1
- package/dist/cli.js +29 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/monitor.d.ts +13 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +102 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +55 -0
- package/dist/config.js.map +1 -1
- package/dist/mcp-server/index.d.ts.map +1 -1
- package/dist/mcp-server/index.js +4 -0
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/mcp-server/schemas.d.ts +2 -0
- package/dist/mcp-server/schemas.d.ts.map +1 -1
- package/dist/mcp-server/schemas.js +2 -0
- package/dist/mcp-server/schemas.js.map +1 -1
- package/dist/mcp-server/tools/capture-baseline.d.ts +3 -0
- package/dist/mcp-server/tools/capture-baseline.d.ts.map +1 -0
- package/dist/mcp-server/tools/capture-baseline.js +42 -0
- package/dist/mcp-server/tools/capture-baseline.js.map +1 -0
- package/dist/mcp-server/tools/monitor-snapshot.d.ts +3 -0
- package/dist/mcp-server/tools/monitor-snapshot.d.ts.map +1 -0
- package/dist/mcp-server/tools/monitor-snapshot.js +53 -0
- package/dist/mcp-server/tools/monitor-snapshot.js.map +1 -0
- package/dist/monitor/baseline.d.ts +6 -0
- package/dist/monitor/baseline.d.ts.map +1 -0
- package/dist/monitor/baseline.js +64 -0
- package/dist/monitor/baseline.js.map +1 -0
- package/dist/monitor/browser-scanner.d.ts +4 -0
- package/dist/monitor/browser-scanner.d.ts.map +1 -0
- package/dist/monitor/browser-scanner.js +141 -0
- package/dist/monitor/browser-scanner.js.map +1 -0
- package/dist/monitor/clipboard-scanner.d.ts +3 -0
- package/dist/monitor/clipboard-scanner.d.ts.map +1 -0
- package/dist/monitor/clipboard-scanner.js +49 -0
- package/dist/monitor/clipboard-scanner.js.map +1 -0
- package/dist/monitor/correlation.d.ts +9 -0
- package/dist/monitor/correlation.d.ts.map +1 -0
- package/dist/monitor/correlation.js +117 -0
- package/dist/monitor/correlation.js.map +1 -0
- package/dist/monitor/index.d.ts +13 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +11 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/known-good.d.ts +24 -0
- package/dist/monitor/known-good.d.ts.map +1 -0
- package/dist/monitor/known-good.js +82 -0
- package/dist/monitor/known-good.js.map +1 -0
- package/dist/monitor/network-scanner.d.ts +4 -0
- package/dist/monitor/network-scanner.d.ts.map +1 -0
- package/dist/monitor/network-scanner.js +123 -0
- package/dist/monitor/network-scanner.js.map +1 -0
- package/dist/monitor/persistence-scanner.d.ts +4 -0
- package/dist/monitor/persistence-scanner.d.ts.map +1 -0
- package/dist/monitor/persistence-scanner.js +156 -0
- package/dist/monitor/persistence-scanner.js.map +1 -0
- package/dist/monitor/process-scanner.d.ts +6 -0
- package/dist/monitor/process-scanner.d.ts.map +1 -0
- package/dist/monitor/process-scanner.js +101 -0
- package/dist/monitor/process-scanner.js.map +1 -0
- package/dist/monitor/shadow-ai-scanner.d.ts +3 -0
- package/dist/monitor/shadow-ai-scanner.d.ts.map +1 -0
- package/dist/monitor/shadow-ai-scanner.js +70 -0
- package/dist/monitor/shadow-ai-scanner.js.map +1 -0
- package/dist/monitor/types.d.ts +79 -0
- package/dist/monitor/types.d.ts.map +1 -0
- package/dist/monitor/types.js +12 -0
- package/dist/monitor/types.js.map +1 -0
- package/dist/reporter/monitor-report.d.ts +3 -0
- package/dist/reporter/monitor-report.d.ts.map +1 -0
- package/dist/reporter/monitor-report.js +89 -0
- package/dist/reporter/monitor-report.js.map +1 -0
- package/dist/reporter/risk-scorer.d.ts +2 -0
- package/dist/reporter/risk-scorer.d.ts.map +1 -1
- package/dist/reporter/risk-scorer.js +12 -0
- package/dist/reporter/risk-scorer.js.map +1 -1
- package/dist/reporter/shared.d.ts.map +1 -1
- package/dist/reporter/shared.js +5 -3
- package/dist/reporter/shared.js.map +1 -1
- package/dist/rules/exfiltration-rules.d.ts +3 -0
- package/dist/rules/exfiltration-rules.d.ts.map +1 -0
- package/dist/rules/exfiltration-rules.js +181 -0
- package/dist/rules/exfiltration-rules.js.map +1 -0
- package/dist/rules/index.d.ts +2 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +3 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/types.d.ts +9 -1
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/scanner/filesystem-scanner.d.ts.map +1 -1
- package/dist/scanner/filesystem-scanner.js +27 -10
- package/dist/scanner/filesystem-scanner.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +10 -2
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/Footer.d.ts +2 -3
- package/dist/tui/components/Footer.d.ts.map +1 -1
- package/dist/tui/components/Footer.js +11 -5
- package/dist/tui/components/Footer.js.map +1 -1
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
- package/dist/tui/components/WelcomeScreen.js +1 -1
- package/dist/tui/components/WelcomeScreen.js.map +1 -1
- package/dist/tui/educational.d.ts +6 -0
- package/dist/tui/educational.d.ts.map +1 -1
- package/dist/tui/educational.js +37 -0
- package/dist/tui/educational.js.map +1 -1
- package/dist/tui/hooks/useLogs.d.ts +1 -1
- package/dist/tui/hooks/useLogs.d.ts.map +1 -1
- package/dist/tui/hooks/useMonitor.d.ts +28 -0
- package/dist/tui/hooks/useMonitor.d.ts.map +1 -0
- package/dist/tui/hooks/useMonitor.js +127 -0
- package/dist/tui/hooks/useMonitor.js.map +1 -0
- package/dist/tui/screens/AuditPanel.d.ts.map +1 -1
- package/dist/tui/screens/AuditPanel.js +109 -9
- package/dist/tui/screens/AuditPanel.js.map +1 -1
- package/dist/tui/screens/MonitorPanel.d.ts +2 -0
- package/dist/tui/screens/MonitorPanel.d.ts.map +1 -0
- package/dist/tui/screens/MonitorPanel.js +370 -0
- package/dist/tui/screens/MonitorPanel.js.map +1 -0
- package/dist/tui/screens/OverviewPanel.d.ts.map +1 -1
- package/dist/tui/screens/OverviewPanel.js +9 -3
- package/dist/tui/screens/OverviewPanel.js.map +1 -1
- package/dist/tui/screens/ScanPanel.d.ts.map +1 -1
- package/dist/tui/screens/ScanPanel.js +5 -5
- package/dist/tui/screens/ScanPanel.js.map +1 -1
- package/dist/tui/screens/ScanResultsPanel.d.ts.map +1 -1
- package/dist/tui/screens/ScanResultsPanel.js +104 -32
- package/dist/tui/screens/ScanResultsPanel.js.map +1 -1
- package/dist/tui/state.d.ts +7 -3
- package/dist/tui/state.d.ts.map +1 -1
- package/dist/tui/state.js +1 -0
- package/dist/tui/state.js.map +1 -1
- package/dist/tui/utils/open-file.d.ts +4 -0
- package/dist/tui/utils/open-file.d.ts.map +1 -0
- package/dist/tui/utils/open-file.js +29 -0
- package/dist/tui/utils/open-file.js.map +1 -0
- package/install.sh +23 -12
- package/package.json +1 -1
- package/patterns/exfiltration.yaml +160 -0
- 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 @@
|
|
|
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 @@
|
|
|
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,
|
|
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"}
|