@panguard-ai/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/adapter-registry.d.ts +150 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +271 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +101 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +160 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/defender-adapter.d.ts +90 -0
- package/dist/adapters/defender-adapter.d.ts.map +1 -0
- package/dist/adapters/defender-adapter.js +227 -0
- package/dist/adapters/defender-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +22 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +23 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/syslog-adapter.d.ts +207 -0
- package/dist/adapters/syslog-adapter.d.ts.map +1 -0
- package/dist/adapters/syslog-adapter.js +432 -0
- package/dist/adapters/syslog-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +135 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +13 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/wazuh-adapter.d.ts +120 -0
- package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
- package/dist/adapters/wazuh-adapter.js +266 -0
- package/dist/adapters/wazuh-adapter.js.map +1 -0
- package/dist/ai/claude-provider.d.ts +66 -0
- package/dist/ai/claude-provider.d.ts.map +1 -0
- package/dist/ai/claude-provider.js +166 -0
- package/dist/ai/claude-provider.js.map +1 -0
- package/dist/ai/funnel-router.d.ts +75 -0
- package/dist/ai/funnel-router.d.ts.map +1 -0
- package/dist/ai/funnel-router.js +173 -0
- package/dist/ai/funnel-router.js.map +1 -0
- package/dist/ai/index.d.ts +77 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +95 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/ollama-provider.d.ts +73 -0
- package/dist/ai/ollama-provider.d.ts.map +1 -0
- package/dist/ai/ollama-provider.js +200 -0
- package/dist/ai/ollama-provider.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +70 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +175 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/prompts/event-classifier.d.ts +25 -0
- package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
- package/dist/ai/prompts/event-classifier.js +94 -0
- package/dist/ai/prompts/event-classifier.js.map +1 -0
- package/dist/ai/prompts/index.d.ts +13 -0
- package/dist/ai/prompts/index.d.ts.map +1 -0
- package/dist/ai/prompts/index.js +13 -0
- package/dist/ai/prompts/index.js.map +1 -0
- package/dist/ai/prompts/report-generator.d.ts +25 -0
- package/dist/ai/prompts/report-generator.d.ts.map +1 -0
- package/dist/ai/prompts/report-generator.js +131 -0
- package/dist/ai/prompts/report-generator.js.map +1 -0
- package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
- package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
- package/dist/ai/prompts/threat-analyzer.js +75 -0
- package/dist/ai/prompts/threat-analyzer.js.map +1 -0
- package/dist/ai/provider-base.d.ts +100 -0
- package/dist/ai/provider-base.d.ts.map +1 -0
- package/dist/ai/provider-base.js +166 -0
- package/dist/ai/provider-base.js.map +1 -0
- package/dist/ai/response-parser.d.ts +36 -0
- package/dist/ai/response-parser.d.ts.map +1 -0
- package/dist/ai/response-parser.js +195 -0
- package/dist/ai/response-parser.js.map +1 -0
- package/dist/ai/token-tracker.d.ts +72 -0
- package/dist/ai/token-tracker.d.ts.map +1 -0
- package/dist/ai/token-tracker.js +145 -0
- package/dist/ai/token-tracker.js.map +1 -0
- package/dist/ai/types.d.ts +138 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +12 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/index.d.ts +146 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +515 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +58 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +327 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/wizard.d.ts +58 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +200 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/discovery/firewall-checker.d.ts +28 -0
- package/dist/discovery/firewall-checker.d.ts.map +1 -0
- package/dist/discovery/firewall-checker.js +379 -0
- package/dist/discovery/firewall-checker.js.map +1 -0
- package/dist/discovery/index.d.ts +23 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +29 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/network-scanner.d.ts +60 -0
- package/dist/discovery/network-scanner.d.ts.map +1 -0
- package/dist/discovery/network-scanner.js +640 -0
- package/dist/discovery/network-scanner.js.map +1 -0
- package/dist/discovery/os-detector.d.ts +24 -0
- package/dist/discovery/os-detector.d.ts.map +1 -0
- package/dist/discovery/os-detector.js +253 -0
- package/dist/discovery/os-detector.js.map +1 -0
- package/dist/discovery/osquery-provider.d.ts +127 -0
- package/dist/discovery/osquery-provider.d.ts.map +1 -0
- package/dist/discovery/osquery-provider.js +214 -0
- package/dist/discovery/osquery-provider.js.map +1 -0
- package/dist/discovery/risk-scorer.d.ts +66 -0
- package/dist/discovery/risk-scorer.d.ts.map +1 -0
- package/dist/discovery/risk-scorer.js +294 -0
- package/dist/discovery/risk-scorer.js.map +1 -0
- package/dist/discovery/security-tools.d.ts +31 -0
- package/dist/discovery/security-tools.d.ts.map +1 -0
- package/dist/discovery/security-tools.js +346 -0
- package/dist/discovery/security-tools.js.map +1 -0
- package/dist/discovery/service-detector.d.ts +28 -0
- package/dist/discovery/service-detector.d.ts.map +1 -0
- package/dist/discovery/service-detector.js +300 -0
- package/dist/discovery/service-detector.js.map +1 -0
- package/dist/discovery/types.d.ts +502 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +12 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/discovery/user-auditor.d.ts +28 -0
- package/dist/discovery/user-auditor.d.ts.map +1 -0
- package/dist/discovery/user-auditor.js +385 -0
- package/dist/discovery/user-auditor.js.map +1 -0
- package/dist/i18n/config.d.ts +45 -0
- package/dist/i18n/config.d.ts.map +1 -0
- package/dist/i18n/config.js +135 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/index.d.ts +8 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +8 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/monitor/event-normalizer.d.ts +102 -0
- package/dist/monitor/event-normalizer.d.ts.map +1 -0
- package/dist/monitor/event-normalizer.js +195 -0
- package/dist/monitor/event-normalizer.js.map +1 -0
- package/dist/monitor/file-monitor.d.ts +90 -0
- package/dist/monitor/file-monitor.d.ts.map +1 -0
- package/dist/monitor/file-monitor.js +222 -0
- package/dist/monitor/file-monitor.js.map +1 -0
- package/dist/monitor/index.d.ts +147 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +293 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/log-monitor.d.ts +102 -0
- package/dist/monitor/log-monitor.d.ts.map +1 -0
- package/dist/monitor/log-monitor.js +245 -0
- package/dist/monitor/log-monitor.js.map +1 -0
- package/dist/monitor/network-monitor.d.ts +103 -0
- package/dist/monitor/network-monitor.d.ts.map +1 -0
- package/dist/monitor/network-monitor.js +336 -0
- package/dist/monitor/network-monitor.js.map +1 -0
- package/dist/monitor/process-monitor.d.ts +108 -0
- package/dist/monitor/process-monitor.d.ts.map +1 -0
- package/dist/monitor/process-monitor.js +245 -0
- package/dist/monitor/process-monitor.js.map +1 -0
- package/dist/monitor/threat-intel-feeds.d.ts +141 -0
- package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
- package/dist/monitor/threat-intel-feeds.js +430 -0
- package/dist/monitor/threat-intel-feeds.js.map +1 -0
- package/dist/monitor/threat-intel.d.ts +83 -0
- package/dist/monitor/threat-intel.d.ts.map +1 -0
- package/dist/monitor/threat-intel.js +215 -0
- package/dist/monitor/threat-intel.js.map +1 -0
- package/dist/monitor/types.d.ts +65 -0
- package/dist/monitor/types.d.ts.map +1 -0
- package/dist/monitor/types.js +20 -0
- package/dist/monitor/types.js.map +1 -0
- package/dist/rules/index.d.ts +115 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +244 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/rule-loader.d.ts +54 -0
- package/dist/rules/rule-loader.d.ts.map +1 -0
- package/dist/rules/rule-loader.js +167 -0
- package/dist/rules/rule-loader.js.map +1 -0
- package/dist/rules/sigma-matcher.d.ts +40 -0
- package/dist/rules/sigma-matcher.d.ts.map +1 -0
- package/dist/rules/sigma-matcher.js +447 -0
- package/dist/rules/sigma-matcher.js.map +1 -0
- package/dist/rules/sigma-parser.d.ts +36 -0
- package/dist/rules/sigma-parser.d.ts.map +1 -0
- package/dist/rules/sigma-parser.js +180 -0
- package/dist/rules/sigma-parser.js.map +1 -0
- package/dist/rules/types.d.ts +112 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +11 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/yara-scanner.d.ts +103 -0
- package/dist/rules/yara-scanner.d.ts.map +1 -0
- package/dist/rules/yara-scanner.js +421 -0
- package/dist/rules/yara-scanner.js.map +1 -0
- package/dist/scoring/achievements.d.ts +76 -0
- package/dist/scoring/achievements.d.ts.map +1 -0
- package/dist/scoring/achievements.js +211 -0
- package/dist/scoring/achievements.js.map +1 -0
- package/dist/scoring/index.d.ts +3 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +3 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/security-score.d.ts +60 -0
- package/dist/scoring/security-score.d.ts.map +1 -0
- package/dist/scoring/security-score.js +211 -0
- package/dist/scoring/security-score.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +71 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +35 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process monitoring via polling
|
|
3
|
+
* 透過輪詢進行程序監控
|
|
4
|
+
*
|
|
5
|
+
* Periodically polls the system process list and emits events
|
|
6
|
+
* for newly started or stopped processes.
|
|
7
|
+
* 定期輪詢系統程序列表,並為新啟動或停止的程序發出事件。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/monitor/process-monitor
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
import { execFile } from 'node:child_process';
|
|
13
|
+
import { platform } from 'node:os';
|
|
14
|
+
import { promisify } from 'node:util';
|
|
15
|
+
import { createLogger } from '../utils/index.js';
|
|
16
|
+
import { normalizeProcessEvent } from './event-normalizer.js';
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
|
+
const logger = createLogger('process-monitor');
|
|
19
|
+
/**
|
|
20
|
+
* ProcessMonitor - monitors system processes by polling the process list
|
|
21
|
+
* ProcessMonitor - 透過輪詢程序列表監控系統程序
|
|
22
|
+
*
|
|
23
|
+
* Events emitted:
|
|
24
|
+
* - 'process_started': SecurityEvent - when a new process is detected / 當偵測到新程序時
|
|
25
|
+
* - 'process_stopped': SecurityEvent - when a process disappears / 當程序消失時
|
|
26
|
+
* - 'error': Error - when polling encounters an error / 當輪詢遇到錯誤時
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const monitor = new ProcessMonitor(15000);
|
|
31
|
+
* monitor.on('process_started', (event) => console.log('Started:', event));
|
|
32
|
+
* monitor.on('process_stopped', (event) => console.log('Stopped:', event));
|
|
33
|
+
* monitor.start();
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export class ProcessMonitor extends EventEmitter {
|
|
37
|
+
/** Whether the monitor is currently running / 監控器是否正在執行 */
|
|
38
|
+
running = false;
|
|
39
|
+
/** Polling timer / 輪詢計時器 */
|
|
40
|
+
timer;
|
|
41
|
+
/** Previous process snapshot for diff detection / 用於差異偵測的先前程序快照 */
|
|
42
|
+
previousProcesses = new Map();
|
|
43
|
+
/** Polling interval in milliseconds / 輪詢間隔(毫秒) */
|
|
44
|
+
pollInterval;
|
|
45
|
+
/**
|
|
46
|
+
* Create a new ProcessMonitor instance
|
|
47
|
+
* 建立新的 ProcessMonitor 實例
|
|
48
|
+
*
|
|
49
|
+
* @param pollInterval - Polling interval in ms (default 15000) / 輪詢間隔毫秒數(預設 15000)
|
|
50
|
+
*/
|
|
51
|
+
constructor(pollInterval = 15000) {
|
|
52
|
+
super();
|
|
53
|
+
this.pollInterval = pollInterval;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Start polling for process changes
|
|
57
|
+
* 開始輪詢程序變更
|
|
58
|
+
*/
|
|
59
|
+
start() {
|
|
60
|
+
if (this.running) {
|
|
61
|
+
logger.warn('ProcessMonitor is already running');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.running = true;
|
|
65
|
+
logger.info(`ProcessMonitor started (poll interval: ${this.pollInterval}ms)`);
|
|
66
|
+
// Run an initial poll immediately / 立即執行首次輪詢
|
|
67
|
+
void this.pollProcesses();
|
|
68
|
+
this.timer = setInterval(() => {
|
|
69
|
+
void this.pollProcesses();
|
|
70
|
+
}, this.pollInterval);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Stop polling and clean up
|
|
74
|
+
* 停止輪詢並清理
|
|
75
|
+
*/
|
|
76
|
+
stop() {
|
|
77
|
+
if (!this.running) {
|
|
78
|
+
logger.warn('ProcessMonitor is not running');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (this.timer) {
|
|
82
|
+
clearInterval(this.timer);
|
|
83
|
+
this.timer = undefined;
|
|
84
|
+
}
|
|
85
|
+
this.running = false;
|
|
86
|
+
this.previousProcesses.clear();
|
|
87
|
+
logger.info('ProcessMonitor stopped');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if the monitor is currently running
|
|
91
|
+
* 檢查監控器是否正在執行
|
|
92
|
+
*
|
|
93
|
+
* @returns True if running / 如果正在執行則為 true
|
|
94
|
+
*/
|
|
95
|
+
isRunning() {
|
|
96
|
+
return this.running;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Poll the process list and emit events for changes
|
|
100
|
+
* 輪詢程序列表並為變更發出事件
|
|
101
|
+
*/
|
|
102
|
+
async pollProcesses() {
|
|
103
|
+
try {
|
|
104
|
+
const currentList = await this.getProcessList();
|
|
105
|
+
const currentMap = new Map();
|
|
106
|
+
for (const proc of currentList) {
|
|
107
|
+
currentMap.set(proc.pid, {
|
|
108
|
+
pid: proc.pid,
|
|
109
|
+
name: proc.name,
|
|
110
|
+
command: proc.command,
|
|
111
|
+
});
|
|
112
|
+
// Emit event for new processes not in previous snapshot
|
|
113
|
+
// 為不在先前快照中的新程序發出事件
|
|
114
|
+
if (!this.previousProcesses.has(proc.pid)) {
|
|
115
|
+
const event = normalizeProcessEvent({
|
|
116
|
+
pid: proc.pid,
|
|
117
|
+
name: proc.name,
|
|
118
|
+
user: proc.user,
|
|
119
|
+
command: proc.command,
|
|
120
|
+
}, 'started');
|
|
121
|
+
this.emit('process_started', event);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Emit event for processes that no longer exist
|
|
125
|
+
// 為不再存在的程序發出事件
|
|
126
|
+
for (const [pid, proc] of this.previousProcesses) {
|
|
127
|
+
if (!currentMap.has(pid)) {
|
|
128
|
+
const event = normalizeProcessEvent({
|
|
129
|
+
pid,
|
|
130
|
+
name: proc.name,
|
|
131
|
+
command: proc.command,
|
|
132
|
+
}, 'stopped');
|
|
133
|
+
this.emit('process_stopped', event);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
this.previousProcesses = currentMap;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
logger.error('Failed to poll processes', { error: String(err) });
|
|
140
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get the current system process list
|
|
145
|
+
* 取得目前系統程序列表
|
|
146
|
+
*
|
|
147
|
+
* Uses platform-specific tools:
|
|
148
|
+
* 使用平台特定工具:
|
|
149
|
+
* - macOS/Linux: `ps -eo pid,user,comm,args`
|
|
150
|
+
* - Windows: `tasklist /FO CSV`
|
|
151
|
+
*
|
|
152
|
+
* @returns Array of process entries / 程序條目陣列
|
|
153
|
+
*/
|
|
154
|
+
async getProcessList() {
|
|
155
|
+
const os = platform();
|
|
156
|
+
try {
|
|
157
|
+
if (os === 'darwin' || os === 'linux') {
|
|
158
|
+
return await this.parsePs();
|
|
159
|
+
}
|
|
160
|
+
else if (os === 'win32') {
|
|
161
|
+
return await this.parseTasklist();
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
logger.warn(`Unsupported platform for process monitoring: ${os}`);
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
logger.error('Failed to get process list', { error: String(err) });
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Parse Unix ps output into ProcessListEntry array
|
|
175
|
+
* 將 Unix ps 輸出解析為 ProcessListEntry 陣列
|
|
176
|
+
*
|
|
177
|
+
* @returns Parsed process entries / 解析後的程序條目
|
|
178
|
+
*/
|
|
179
|
+
async parsePs() {
|
|
180
|
+
const { stdout } = await execFileAsync('ps', ['-eo', 'pid,user,comm,args'], {
|
|
181
|
+
timeout: 10000,
|
|
182
|
+
});
|
|
183
|
+
const processes = [];
|
|
184
|
+
const lines = stdout.split('\n');
|
|
185
|
+
// Skip header line / 跳過標頭行
|
|
186
|
+
for (let i = 1; i < lines.length; i++) {
|
|
187
|
+
const line = lines[i];
|
|
188
|
+
if (!line || line.trim().length === 0)
|
|
189
|
+
continue;
|
|
190
|
+
const trimmed = line.trimStart();
|
|
191
|
+
// Format: PID USER COMM ARGS (ARGS may contain spaces)
|
|
192
|
+
// 格式:PID USER COMM ARGS(ARGS 可能包含空格)
|
|
193
|
+
const match = trimmed.match(/^(\d+)\s+(\S+)\s+(\S+)\s+(.*)$/);
|
|
194
|
+
if (!match)
|
|
195
|
+
continue;
|
|
196
|
+
const pid = parseInt(match[1] ?? '0', 10);
|
|
197
|
+
const user = match[2];
|
|
198
|
+
const name = match[3] ?? '';
|
|
199
|
+
const command = match[4] ?? '';
|
|
200
|
+
if (isNaN(pid) || pid === 0)
|
|
201
|
+
continue;
|
|
202
|
+
processes.push({
|
|
203
|
+
pid,
|
|
204
|
+
name,
|
|
205
|
+
user,
|
|
206
|
+
command: command.trim() || undefined,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return processes;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Parse Windows tasklist CSV output into ProcessListEntry array
|
|
213
|
+
* 將 Windows tasklist CSV 輸出解析為 ProcessListEntry 陣列
|
|
214
|
+
*
|
|
215
|
+
* @returns Parsed process entries / 解析後的程序條目
|
|
216
|
+
*/
|
|
217
|
+
async parseTasklist() {
|
|
218
|
+
const { stdout } = await execFileAsync('tasklist', ['/FO', 'CSV'], {
|
|
219
|
+
timeout: 10000,
|
|
220
|
+
});
|
|
221
|
+
const processes = [];
|
|
222
|
+
const lines = stdout.split('\n');
|
|
223
|
+
// Skip header line / 跳過標頭行
|
|
224
|
+
for (let i = 1; i < lines.length; i++) {
|
|
225
|
+
const line = lines[i];
|
|
226
|
+
if (!line || line.trim().length === 0)
|
|
227
|
+
continue;
|
|
228
|
+
// CSV format: "Image Name","PID","Session Name","Session#","Mem Usage"
|
|
229
|
+
// CSV 格式:"Image Name","PID","Session Name","Session#","Mem Usage"
|
|
230
|
+
const csvMatch = line.match(/"([^"]+)","(\d+)"/);
|
|
231
|
+
if (!csvMatch)
|
|
232
|
+
continue;
|
|
233
|
+
const name = csvMatch[1] ?? '';
|
|
234
|
+
const pid = parseInt(csvMatch[2] ?? '0', 10);
|
|
235
|
+
if (isNaN(pid) || pid === 0)
|
|
236
|
+
continue;
|
|
237
|
+
processes.push({
|
|
238
|
+
pid,
|
|
239
|
+
name,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
return processes;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=process-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-monitor.js","sourceRoot":"","sources":["../../src/monitor/process-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threat Intelligence Feed Manager - Real-time threat feeds integration
|
|
3
|
+
* 威脅情報饋送管理器 - 即時威脅情報整合
|
|
4
|
+
*
|
|
5
|
+
* Integrates with free, open-source threat intelligence feeds:
|
|
6
|
+
* - abuse.ch ThreatFox (malware IoCs)
|
|
7
|
+
* - abuse.ch URLhaus (malicious URLs)
|
|
8
|
+
* - abuse.ch Feodo Tracker (banking trojan C2)
|
|
9
|
+
* - GreyNoise Community API (internet scanners)
|
|
10
|
+
*
|
|
11
|
+
* All feeds are free and require no registration (except AbuseIPDB which is optional).
|
|
12
|
+
*
|
|
13
|
+
* @module @panguard-ai/core/monitor/threat-intel-feeds
|
|
14
|
+
*/
|
|
15
|
+
import type { ThreatIntelEntry } from './types.js';
|
|
16
|
+
/** Feed source identifier / 情報源識別 */
|
|
17
|
+
export type FeedSource = 'threatfox' | 'urlhaus' | 'feodotracker' | 'greynoise' | 'abuseipdb';
|
|
18
|
+
/** Individual IoC (Indicator of Compromise) / 入侵指標 */
|
|
19
|
+
export interface IoC {
|
|
20
|
+
type: 'ip' | 'url' | 'domain' | 'hash';
|
|
21
|
+
value: string;
|
|
22
|
+
threatType: string;
|
|
23
|
+
source: FeedSource;
|
|
24
|
+
confidence: number;
|
|
25
|
+
firstSeen?: string;
|
|
26
|
+
lastSeen?: string;
|
|
27
|
+
tags: string[];
|
|
28
|
+
reference?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Feed update result / 情報更新結果 */
|
|
31
|
+
export interface FeedUpdateResult {
|
|
32
|
+
source: FeedSource;
|
|
33
|
+
success: boolean;
|
|
34
|
+
iocCount: number;
|
|
35
|
+
durationMs: number;
|
|
36
|
+
error?: string;
|
|
37
|
+
}
|
|
38
|
+
/** Feed manager configuration / 情報管理器設定 */
|
|
39
|
+
export interface FeedManagerConfig {
|
|
40
|
+
/** Update interval in ms (default 1 hour) / 更新間隔 */
|
|
41
|
+
updateIntervalMs: number;
|
|
42
|
+
/** Maximum IoCs to keep in memory / 記憶體中最大 IoC 數量 */
|
|
43
|
+
maxIoCs: number;
|
|
44
|
+
/** Optional AbuseIPDB API key / 可選的 AbuseIPDB API key */
|
|
45
|
+
abuseIPDBKey?: string;
|
|
46
|
+
/** Enable/disable specific feeds / 啟用/停用特定情報源 */
|
|
47
|
+
enabledFeeds: FeedSource[];
|
|
48
|
+
/** Request timeout in ms / 請求逾時 */
|
|
49
|
+
requestTimeoutMs: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Manages real-time threat intelligence feeds
|
|
53
|
+
* 管理即時威脅情報饋送
|
|
54
|
+
*/
|
|
55
|
+
export declare class ThreatIntelFeedManager {
|
|
56
|
+
private readonly config;
|
|
57
|
+
private iocs;
|
|
58
|
+
private ipIndex;
|
|
59
|
+
private updateTimer?;
|
|
60
|
+
private lastUpdate;
|
|
61
|
+
constructor(config?: Partial<FeedManagerConfig>);
|
|
62
|
+
/**
|
|
63
|
+
* Start periodic feed updates / 開始定期更新情報
|
|
64
|
+
*/
|
|
65
|
+
start(): Promise<void>;
|
|
66
|
+
/** Stop periodic updates / 停止定期更新 */
|
|
67
|
+
stop(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Update all enabled feeds / 更新所有啟用的情報源
|
|
70
|
+
*/
|
|
71
|
+
updateAll(): Promise<FeedUpdateResult[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Check if an IP is in threat intel / 檢查 IP 是否在威脅情報中
|
|
74
|
+
*/
|
|
75
|
+
checkIP(ip: string): IoC | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Search IoCs by value / 以值搜尋 IoC
|
|
78
|
+
*/
|
|
79
|
+
search(value: string): IoC | undefined;
|
|
80
|
+
/** Get total IoC count / 取得 IoC 總數 */
|
|
81
|
+
getIoCCount(): number;
|
|
82
|
+
/** Get IP index count / 取得 IP 索引數 */
|
|
83
|
+
getIPCount(): number;
|
|
84
|
+
/** Get last update times / 取得最後更新時間 */
|
|
85
|
+
getLastUpdateTimes(): Map<FeedSource, string>;
|
|
86
|
+
/**
|
|
87
|
+
* Convert IoC to ThreatIntelEntry for compatibility with existing system
|
|
88
|
+
* 轉換 IoC 為 ThreatIntelEntry 以相容現有系統
|
|
89
|
+
*/
|
|
90
|
+
toThreatIntelEntry(ioc: IoC): ThreatIntelEntry | null;
|
|
91
|
+
/**
|
|
92
|
+
* Add external IPs to the threat intel index (e.g., from Threat Cloud blocklist).
|
|
93
|
+
* 將外部 IP 加入威脅情報索引(例如來自 Threat Cloud 封鎖清單)。
|
|
94
|
+
*
|
|
95
|
+
* @param ips - Array of IPs to add / 要加入的 IP 陣列
|
|
96
|
+
* @param threatType - Threat classification / 威脅分類
|
|
97
|
+
* @param confidence - Confidence score (0-100) / 信心分數
|
|
98
|
+
* @returns Number of IPs added / 新增的 IP 數量
|
|
99
|
+
*/
|
|
100
|
+
addExternalIPs(ips: string[], threatType?: string, confidence?: number): number;
|
|
101
|
+
/** Get all IP-based IoCs as ThreatIntelEntry array / 取得所有 IP IoC 為 ThreatIntelEntry 陣列 */
|
|
102
|
+
getAllIPEntries(): ThreatIntelEntry[];
|
|
103
|
+
private updateFeed;
|
|
104
|
+
/**
|
|
105
|
+
* abuse.ch ThreatFox - Recent IoCs
|
|
106
|
+
* https://threatfox.abuse.ch/api/
|
|
107
|
+
*/
|
|
108
|
+
private fetchThreatFox;
|
|
109
|
+
/**
|
|
110
|
+
* abuse.ch URLhaus - Recent malicious URLs (last 24h)
|
|
111
|
+
* https://urlhaus-api.abuse.ch/v1/
|
|
112
|
+
*/
|
|
113
|
+
private fetchURLhaus;
|
|
114
|
+
/**
|
|
115
|
+
* abuse.ch Feodo Tracker - Banking trojan C2 servers
|
|
116
|
+
* https://feodotracker.abuse.ch/
|
|
117
|
+
*/
|
|
118
|
+
private fetchFeodoTracker;
|
|
119
|
+
/**
|
|
120
|
+
* GreyNoise Community API - Internet background noise / scanners
|
|
121
|
+
* Free, no API key required for RIOT endpoint
|
|
122
|
+
*/
|
|
123
|
+
private fetchGreyNoise;
|
|
124
|
+
/**
|
|
125
|
+
* Check a single IP against GreyNoise (free community API)
|
|
126
|
+
* 使用 GreyNoise 免費 API 檢查單一 IP
|
|
127
|
+
*/
|
|
128
|
+
checkIPWithGreyNoise(ip: string): Promise<IoC | null>;
|
|
129
|
+
/**
|
|
130
|
+
* AbuseIPDB check (requires API key, optional)
|
|
131
|
+
*/
|
|
132
|
+
private fetchAbuseIPDB;
|
|
133
|
+
/**
|
|
134
|
+
* Check a single IP against AbuseIPDB
|
|
135
|
+
* 使用 AbuseIPDB 檢查單一 IP
|
|
136
|
+
*/
|
|
137
|
+
checkIPWithAbuseIPDB(ip: string): Promise<IoC | null>;
|
|
138
|
+
private addIoC;
|
|
139
|
+
private trimOldest;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=threat-intel-feeds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threat-intel-feeds.d.ts","sourceRoot":"","sources":["../../src/monitor/threat-intel-feeds.ts"],"names":[],"mappings":"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"}
|