@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,430 @@
|
|
|
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 { createLogger } from '../utils/logger.js';
|
|
16
|
+
const logger = createLogger('threat-intel-feeds');
|
|
17
|
+
const DEFAULT_CONFIG = {
|
|
18
|
+
updateIntervalMs: 60 * 60 * 1000, // 1 hour
|
|
19
|
+
maxIoCs: 50000,
|
|
20
|
+
enabledFeeds: ['threatfox', 'urlhaus', 'feodotracker', 'greynoise'],
|
|
21
|
+
requestTimeoutMs: 30000,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Manages real-time threat intelligence feeds
|
|
25
|
+
* 管理即時威脅情報饋送
|
|
26
|
+
*/
|
|
27
|
+
export class ThreatIntelFeedManager {
|
|
28
|
+
config;
|
|
29
|
+
iocs = new Map();
|
|
30
|
+
ipIndex = new Map(); // Fast IP lookup
|
|
31
|
+
updateTimer;
|
|
32
|
+
lastUpdate = new Map();
|
|
33
|
+
constructor(config = {}) {
|
|
34
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
35
|
+
if (config.abuseIPDBKey && !this.config.enabledFeeds.includes('abuseipdb')) {
|
|
36
|
+
this.config.enabledFeeds.push('abuseipdb');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Start periodic feed updates / 開始定期更新情報
|
|
41
|
+
*/
|
|
42
|
+
async start() {
|
|
43
|
+
await this.updateAll();
|
|
44
|
+
this.updateTimer = setInterval(() => {
|
|
45
|
+
void this.updateAll();
|
|
46
|
+
}, this.config.updateIntervalMs);
|
|
47
|
+
if (this.updateTimer.unref)
|
|
48
|
+
this.updateTimer.unref();
|
|
49
|
+
logger.info(`Feed manager started. Update interval: ${Math.round(this.config.updateIntervalMs / 60000)} min`);
|
|
50
|
+
}
|
|
51
|
+
/** Stop periodic updates / 停止定期更新 */
|
|
52
|
+
stop() {
|
|
53
|
+
if (this.updateTimer) {
|
|
54
|
+
clearInterval(this.updateTimer);
|
|
55
|
+
this.updateTimer = undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Update all enabled feeds / 更新所有啟用的情報源
|
|
60
|
+
*/
|
|
61
|
+
async updateAll() {
|
|
62
|
+
const results = [];
|
|
63
|
+
for (const source of this.config.enabledFeeds) {
|
|
64
|
+
const result = await this.updateFeed(source);
|
|
65
|
+
results.push(result);
|
|
66
|
+
}
|
|
67
|
+
// Trim if over max
|
|
68
|
+
if (this.iocs.size > this.config.maxIoCs) {
|
|
69
|
+
this.trimOldest();
|
|
70
|
+
}
|
|
71
|
+
logger.info(`Feed update complete. Total IoCs: ${this.iocs.size}, IPs indexed: ${this.ipIndex.size}`);
|
|
72
|
+
return results;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if an IP is in threat intel / 檢查 IP 是否在威脅情報中
|
|
76
|
+
*/
|
|
77
|
+
checkIP(ip) {
|
|
78
|
+
return this.ipIndex.get(ip);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Search IoCs by value / 以值搜尋 IoC
|
|
82
|
+
*/
|
|
83
|
+
search(value) {
|
|
84
|
+
return this.iocs.get(value);
|
|
85
|
+
}
|
|
86
|
+
/** Get total IoC count / 取得 IoC 總數 */
|
|
87
|
+
getIoCCount() {
|
|
88
|
+
return this.iocs.size;
|
|
89
|
+
}
|
|
90
|
+
/** Get IP index count / 取得 IP 索引數 */
|
|
91
|
+
getIPCount() {
|
|
92
|
+
return this.ipIndex.size;
|
|
93
|
+
}
|
|
94
|
+
/** Get last update times / 取得最後更新時間 */
|
|
95
|
+
getLastUpdateTimes() {
|
|
96
|
+
return new Map(this.lastUpdate);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Convert IoC to ThreatIntelEntry for compatibility with existing system
|
|
100
|
+
* 轉換 IoC 為 ThreatIntelEntry 以相容現有系統
|
|
101
|
+
*/
|
|
102
|
+
toThreatIntelEntry(ioc) {
|
|
103
|
+
if (ioc.type !== 'ip')
|
|
104
|
+
return null;
|
|
105
|
+
const threatType = ioc.threatType.includes('c2')
|
|
106
|
+
? 'c2'
|
|
107
|
+
: ioc.threatType.includes('scan')
|
|
108
|
+
? 'scanner'
|
|
109
|
+
: ioc.threatType.includes('botnet')
|
|
110
|
+
? 'botnet'
|
|
111
|
+
: 'malware';
|
|
112
|
+
return {
|
|
113
|
+
ip: ioc.value,
|
|
114
|
+
type: threatType,
|
|
115
|
+
source: ioc.source,
|
|
116
|
+
lastSeen: ioc.lastSeen,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Add external IPs to the threat intel index (e.g., from Threat Cloud blocklist).
|
|
121
|
+
* 將外部 IP 加入威脅情報索引(例如來自 Threat Cloud 封鎖清單)。
|
|
122
|
+
*
|
|
123
|
+
* @param ips - Array of IPs to add / 要加入的 IP 陣列
|
|
124
|
+
* @param threatType - Threat classification / 威脅分類
|
|
125
|
+
* @param confidence - Confidence score (0-100) / 信心分數
|
|
126
|
+
* @returns Number of IPs added / 新增的 IP 數量
|
|
127
|
+
*/
|
|
128
|
+
addExternalIPs(ips, threatType = 'blocklisted', confidence = 80) {
|
|
129
|
+
let added = 0;
|
|
130
|
+
const now = new Date().toISOString();
|
|
131
|
+
for (const ip of ips) {
|
|
132
|
+
const trimmed = ip.trim();
|
|
133
|
+
if (!trimmed || !/^[\d.]+$/.test(trimmed))
|
|
134
|
+
continue;
|
|
135
|
+
const ioc = {
|
|
136
|
+
type: 'ip',
|
|
137
|
+
value: trimmed,
|
|
138
|
+
threatType,
|
|
139
|
+
source: 'threatfox', // Use existing FeedSource for compatibility
|
|
140
|
+
confidence,
|
|
141
|
+
lastSeen: now,
|
|
142
|
+
tags: ['threat-cloud-blocklist'],
|
|
143
|
+
};
|
|
144
|
+
this.addIoC(ioc);
|
|
145
|
+
added++;
|
|
146
|
+
}
|
|
147
|
+
if (added > 0) {
|
|
148
|
+
logger.info(`Added ${added} external IPs to threat intel / 已加入 ${added} 個外部 IP`);
|
|
149
|
+
}
|
|
150
|
+
return added;
|
|
151
|
+
}
|
|
152
|
+
/** Get all IP-based IoCs as ThreatIntelEntry array / 取得所有 IP IoC 為 ThreatIntelEntry 陣列 */
|
|
153
|
+
getAllIPEntries() {
|
|
154
|
+
const entries = [];
|
|
155
|
+
for (const ioc of this.ipIndex.values()) {
|
|
156
|
+
const entry = this.toThreatIntelEntry(ioc);
|
|
157
|
+
if (entry)
|
|
158
|
+
entries.push(entry);
|
|
159
|
+
}
|
|
160
|
+
return entries;
|
|
161
|
+
}
|
|
162
|
+
// -- Feed-specific updaters --
|
|
163
|
+
async updateFeed(source) {
|
|
164
|
+
const start = Date.now();
|
|
165
|
+
try {
|
|
166
|
+
let count = 0;
|
|
167
|
+
switch (source) {
|
|
168
|
+
case 'threatfox':
|
|
169
|
+
count = await this.fetchThreatFox();
|
|
170
|
+
break;
|
|
171
|
+
case 'urlhaus':
|
|
172
|
+
count = await this.fetchURLhaus();
|
|
173
|
+
break;
|
|
174
|
+
case 'feodotracker':
|
|
175
|
+
count = await this.fetchFeodoTracker();
|
|
176
|
+
break;
|
|
177
|
+
case 'greynoise':
|
|
178
|
+
count = await this.fetchGreyNoise();
|
|
179
|
+
break;
|
|
180
|
+
case 'abuseipdb':
|
|
181
|
+
count = await this.fetchAbuseIPDB();
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
this.lastUpdate.set(source, new Date().toISOString());
|
|
185
|
+
return { source, success: true, iocCount: count, durationMs: Date.now() - start };
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
189
|
+
logger.error(`Feed update failed [${source}]: ${msg}`);
|
|
190
|
+
return { source, success: false, iocCount: 0, durationMs: Date.now() - start, error: msg };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* abuse.ch ThreatFox - Recent IoCs
|
|
195
|
+
* https://threatfox.abuse.ch/api/
|
|
196
|
+
*/
|
|
197
|
+
async fetchThreatFox() {
|
|
198
|
+
const res = await fetchWithTimeout('https://threatfox-api.abuse.ch/api/v1/', {
|
|
199
|
+
method: 'POST',
|
|
200
|
+
headers: { 'Content-Type': 'application/json' },
|
|
201
|
+
body: JSON.stringify({ query: 'get_iocs', days: 1 }),
|
|
202
|
+
}, this.config.requestTimeoutMs);
|
|
203
|
+
const data = (await res.json());
|
|
204
|
+
if (data.query_status !== 'ok' || !data.data)
|
|
205
|
+
return 0;
|
|
206
|
+
let count = 0;
|
|
207
|
+
for (const item of data.data) {
|
|
208
|
+
const type = item.ioc_type === 'ip:port'
|
|
209
|
+
? 'ip'
|
|
210
|
+
: item.ioc_type === 'url'
|
|
211
|
+
? 'url'
|
|
212
|
+
: item.ioc_type === 'domain'
|
|
213
|
+
? 'domain'
|
|
214
|
+
: 'hash';
|
|
215
|
+
const value = type === 'ip' ? (item.ioc.split(':')[0] ?? item.ioc) : item.ioc;
|
|
216
|
+
const ioc = {
|
|
217
|
+
type,
|
|
218
|
+
value,
|
|
219
|
+
threatType: `${item.threat_type}:${item.malware}`,
|
|
220
|
+
source: 'threatfox',
|
|
221
|
+
confidence: item.confidence_level,
|
|
222
|
+
firstSeen: item.first_seen_utc,
|
|
223
|
+
lastSeen: item.last_seen_utc,
|
|
224
|
+
tags: item.tags ?? [],
|
|
225
|
+
reference: item.reference,
|
|
226
|
+
};
|
|
227
|
+
this.addIoC(ioc);
|
|
228
|
+
count++;
|
|
229
|
+
}
|
|
230
|
+
return count;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* abuse.ch URLhaus - Recent malicious URLs (last 24h)
|
|
234
|
+
* https://urlhaus-api.abuse.ch/v1/
|
|
235
|
+
*/
|
|
236
|
+
async fetchURLhaus() {
|
|
237
|
+
const res = await fetchWithTimeout('https://urlhaus-api.abuse.ch/v1/urls/recent/limit/100/', {
|
|
238
|
+
method: 'GET',
|
|
239
|
+
}, this.config.requestTimeoutMs);
|
|
240
|
+
const data = (await res.json());
|
|
241
|
+
if (!data.urls)
|
|
242
|
+
return 0;
|
|
243
|
+
let count = 0;
|
|
244
|
+
for (const item of data.urls) {
|
|
245
|
+
// Extract IP from host if possible
|
|
246
|
+
if (/^[\d.]+$/.test(item.host)) {
|
|
247
|
+
const ioc = {
|
|
248
|
+
type: 'ip',
|
|
249
|
+
value: item.host,
|
|
250
|
+
threatType: `malware_distribution:${item.threat}`,
|
|
251
|
+
source: 'urlhaus',
|
|
252
|
+
confidence: item.url_status === 'online' ? 90 : 50,
|
|
253
|
+
firstSeen: item.date_added,
|
|
254
|
+
tags: item.tags ?? [],
|
|
255
|
+
};
|
|
256
|
+
this.addIoC(ioc);
|
|
257
|
+
}
|
|
258
|
+
const urlIoc = {
|
|
259
|
+
type: 'url',
|
|
260
|
+
value: item.url,
|
|
261
|
+
threatType: `malware_distribution:${item.threat}`,
|
|
262
|
+
source: 'urlhaus',
|
|
263
|
+
confidence: item.url_status === 'online' ? 90 : 50,
|
|
264
|
+
firstSeen: item.date_added,
|
|
265
|
+
tags: item.tags ?? [],
|
|
266
|
+
};
|
|
267
|
+
this.addIoC(urlIoc);
|
|
268
|
+
count++;
|
|
269
|
+
}
|
|
270
|
+
return count;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* abuse.ch Feodo Tracker - Banking trojan C2 servers
|
|
274
|
+
* https://feodotracker.abuse.ch/
|
|
275
|
+
*/
|
|
276
|
+
async fetchFeodoTracker() {
|
|
277
|
+
const res = await fetchWithTimeout('https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.json', {
|
|
278
|
+
method: 'GET',
|
|
279
|
+
}, this.config.requestTimeoutMs);
|
|
280
|
+
const data = (await res.json());
|
|
281
|
+
if (!Array.isArray(data))
|
|
282
|
+
return 0;
|
|
283
|
+
let count = 0;
|
|
284
|
+
for (const item of data) {
|
|
285
|
+
const ioc = {
|
|
286
|
+
type: 'ip',
|
|
287
|
+
value: item.ip_address,
|
|
288
|
+
threatType: `c2:${item.malware}`,
|
|
289
|
+
source: 'feodotracker',
|
|
290
|
+
confidence: item.status === 'online' ? 95 : 70,
|
|
291
|
+
firstSeen: item.first_seen,
|
|
292
|
+
lastSeen: item.last_online,
|
|
293
|
+
tags: [item.malware, item.country, `AS${item.as_number}`].filter(Boolean),
|
|
294
|
+
};
|
|
295
|
+
this.addIoC(ioc);
|
|
296
|
+
count++;
|
|
297
|
+
}
|
|
298
|
+
return count;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* GreyNoise Community API - Internet background noise / scanners
|
|
302
|
+
* Free, no API key required for RIOT endpoint
|
|
303
|
+
*/
|
|
304
|
+
async fetchGreyNoise() {
|
|
305
|
+
// GreyNoise doesn't have a bulk free endpoint, so we use their
|
|
306
|
+
// popular scanner list which is publicly available
|
|
307
|
+
const res = await fetchWithTimeout('https://api.greynoise.io/v3/community/1.1.1.1', {
|
|
308
|
+
method: 'GET',
|
|
309
|
+
headers: { Accept: 'application/json' },
|
|
310
|
+
}, this.config.requestTimeoutMs);
|
|
311
|
+
// For the free tier, we just validate the API is reachable
|
|
312
|
+
// and note that individual IP checks should use checkIPWithGreyNoise()
|
|
313
|
+
if (res.ok) {
|
|
314
|
+
logger.info('GreyNoise API reachable');
|
|
315
|
+
}
|
|
316
|
+
return 0; // GreyNoise is checked per-IP, not bulk
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Check a single IP against GreyNoise (free community API)
|
|
320
|
+
* 使用 GreyNoise 免費 API 檢查單一 IP
|
|
321
|
+
*/
|
|
322
|
+
async checkIPWithGreyNoise(ip) {
|
|
323
|
+
try {
|
|
324
|
+
const res = await fetchWithTimeout(`https://api.greynoise.io/v3/community/${ip}`, {
|
|
325
|
+
method: 'GET',
|
|
326
|
+
headers: { Accept: 'application/json' },
|
|
327
|
+
}, this.config.requestTimeoutMs);
|
|
328
|
+
if (!res.ok)
|
|
329
|
+
return null;
|
|
330
|
+
const data = (await res.json());
|
|
331
|
+
if (data.noise) {
|
|
332
|
+
return {
|
|
333
|
+
type: 'ip',
|
|
334
|
+
value: ip,
|
|
335
|
+
threatType: `scanner:${data.classification}`,
|
|
336
|
+
source: 'greynoise',
|
|
337
|
+
confidence: data.classification === 'malicious' ? 85 : 50,
|
|
338
|
+
lastSeen: data.last_seen,
|
|
339
|
+
tags: [data.classification, data.name].filter(Boolean),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* AbuseIPDB check (requires API key, optional)
|
|
350
|
+
*/
|
|
351
|
+
async fetchAbuseIPDB() {
|
|
352
|
+
if (!this.config.abuseIPDBKey)
|
|
353
|
+
return 0;
|
|
354
|
+
// AbuseIPDB is checked per-IP via checkIPWithAbuseIPDB()
|
|
355
|
+
logger.info('AbuseIPDB configured (per-IP lookup mode)');
|
|
356
|
+
return 0;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Check a single IP against AbuseIPDB
|
|
360
|
+
* 使用 AbuseIPDB 檢查單一 IP
|
|
361
|
+
*/
|
|
362
|
+
async checkIPWithAbuseIPDB(ip) {
|
|
363
|
+
if (!this.config.abuseIPDBKey)
|
|
364
|
+
return null;
|
|
365
|
+
try {
|
|
366
|
+
const res = await fetchWithTimeout(`https://api.abuseipdb.com/api/v2/check?ipAddress=${encodeURIComponent(ip)}&maxAgeInDays=90`, {
|
|
367
|
+
method: 'GET',
|
|
368
|
+
headers: {
|
|
369
|
+
Accept: 'application/json',
|
|
370
|
+
Key: this.config.abuseIPDBKey,
|
|
371
|
+
},
|
|
372
|
+
}, this.config.requestTimeoutMs);
|
|
373
|
+
if (!res.ok)
|
|
374
|
+
return null;
|
|
375
|
+
const data = (await res.json());
|
|
376
|
+
if (data.data.abuseConfidenceScore > 25) {
|
|
377
|
+
return {
|
|
378
|
+
type: 'ip',
|
|
379
|
+
value: ip,
|
|
380
|
+
threatType: 'reported_abuse',
|
|
381
|
+
source: 'abuseipdb',
|
|
382
|
+
confidence: data.data.abuseConfidenceScore,
|
|
383
|
+
lastSeen: data.data.lastReportedAt,
|
|
384
|
+
tags: [data.data.countryCode, `reports:${data.data.totalReports}`],
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// -- Internal helpers --
|
|
394
|
+
addIoC(ioc) {
|
|
395
|
+
const key = `${ioc.source}:${ioc.type}:${ioc.value}`;
|
|
396
|
+
this.iocs.set(key, ioc);
|
|
397
|
+
if (ioc.type === 'ip') {
|
|
398
|
+
this.ipIndex.set(ioc.value, ioc);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
trimOldest() {
|
|
402
|
+
const entries = Array.from(this.iocs.entries());
|
|
403
|
+
const toRemove = entries.length - this.config.maxIoCs;
|
|
404
|
+
if (toRemove <= 0)
|
|
405
|
+
return;
|
|
406
|
+
// Remove oldest entries (first inserted)
|
|
407
|
+
for (let i = 0; i < toRemove; i++) {
|
|
408
|
+
const entry = entries[i];
|
|
409
|
+
if (!entry)
|
|
410
|
+
continue;
|
|
411
|
+
const [key, ioc] = entry;
|
|
412
|
+
this.iocs.delete(key);
|
|
413
|
+
if (ioc.type === 'ip') {
|
|
414
|
+
this.ipIndex.delete(ioc.value);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/** Fetch with timeout / 含逾時的 fetch */
|
|
420
|
+
async function fetchWithTimeout(url, init, timeoutMs) {
|
|
421
|
+
const controller = new AbortController();
|
|
422
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
423
|
+
try {
|
|
424
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
425
|
+
}
|
|
426
|
+
finally {
|
|
427
|
+
clearTimeout(timer);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=threat-intel-feeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threat-intel-feeds.js","sourceRoot":"","sources":["../../src/monitor/threat-intel-feeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threat intelligence matching for known malicious IP addresses
|
|
3
|
+
* 已知惡意 IP 位址的威脅情報比對
|
|
4
|
+
*
|
|
5
|
+
* Provides a built-in threat intelligence database for MVP and supports
|
|
6
|
+
* CIDR range matching for efficient IP lookups.
|
|
7
|
+
* 為 MVP 提供內建威脅情報資料庫,並支援 CIDR 範圍比對以進行高效 IP 查詢。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/core/monitor/threat-intel
|
|
10
|
+
*/
|
|
11
|
+
import type { ThreatIntelEntry } from './types.js';
|
|
12
|
+
import type { ThreatIntelFeedManager } from './threat-intel-feeds.js';
|
|
13
|
+
/**
|
|
14
|
+
* Register a live feed manager for real-time threat intel lookups.
|
|
15
|
+
* When set, `checkThreatIntel()` queries the feed manager first,
|
|
16
|
+
* then falls back to the hardcoded list.
|
|
17
|
+
*/
|
|
18
|
+
export declare function setFeedManager(manager: ThreatIntelFeedManager | null): void;
|
|
19
|
+
/** Get the currently registered feed manager (for tests/status). */
|
|
20
|
+
export declare function getFeedManager(): ThreatIntelFeedManager | null;
|
|
21
|
+
/**
|
|
22
|
+
* Check if an IP address matches any known threat intelligence entry
|
|
23
|
+
* 檢查 IP 位址是否符合任何已知的威脅情報條目
|
|
24
|
+
*
|
|
25
|
+
* @param ip - IPv4 address to check / 要檢查的 IPv4 位址
|
|
26
|
+
* @returns Matching ThreatIntelEntry or null / 符合的 ThreatIntelEntry 或 null
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const threat = checkThreatIntel('185.220.101.42');
|
|
31
|
+
* if (threat) {
|
|
32
|
+
* console.log(`Matched: ${threat.type} from ${threat.source}`);
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function checkThreatIntel(ip: string): ThreatIntelEntry | null;
|
|
37
|
+
/**
|
|
38
|
+
* Check if an IP address is in a private (RFC 1918) range
|
|
39
|
+
* 檢查 IP 位址是否在私有(RFC 1918)範圍內
|
|
40
|
+
*
|
|
41
|
+
* Checks against:
|
|
42
|
+
* 檢查以下範圍:
|
|
43
|
+
* - 10.0.0.0/8
|
|
44
|
+
* - 172.16.0.0/12
|
|
45
|
+
* - 192.168.0.0/16
|
|
46
|
+
* - 127.0.0.0/8 (loopback / 迴路)
|
|
47
|
+
* - 169.254.0.0/16 (link-local / 鏈路本地)
|
|
48
|
+
*
|
|
49
|
+
* @param ip - IPv4 address to check / 要檢查的 IPv4 位址
|
|
50
|
+
* @returns True if the IP is private / 如果 IP 是私有的則為 true
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* isPrivateIP('192.168.1.1'); // true
|
|
55
|
+
* isPrivateIP('8.8.8.8'); // false
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function isPrivateIP(ip: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Add a new threat intelligence entry to the database
|
|
61
|
+
* 將新的威脅情報條目新增到資料庫
|
|
62
|
+
*
|
|
63
|
+
* @param entry - Threat intelligence entry to add / 要新增的威脅情報條目
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* addThreatIntelEntry({
|
|
68
|
+
* ip: '10.99.99.0/24',
|
|
69
|
+
* type: 'c2',
|
|
70
|
+
* source: 'custom-feed',
|
|
71
|
+
* lastSeen: '2025-03-15',
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function addThreatIntelEntry(entry: ThreatIntelEntry): void;
|
|
76
|
+
/**
|
|
77
|
+
* Get all current threat intelligence entries
|
|
78
|
+
* 取得所有目前的威脅情報條目
|
|
79
|
+
*
|
|
80
|
+
* @returns Array of all threat intel entries (copy) / 所有威脅情報條目的陣列(複本)
|
|
81
|
+
*/
|
|
82
|
+
export declare function getThreatIntelEntries(): ThreatIntelEntry[];
|
|
83
|
+
//# sourceMappingURL=threat-intel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threat-intel.d.ts","sourceRoot":"","sources":["../../src/monitor/threat-intel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAKtE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAE3E;AAED,oEAAoE;AACpE,wBAAgB,cAAc,IAAI,sBAAsB,GAAG,IAAI,CAE9D;AA2GD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAiBpE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAgB/C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,EAAE,CAE1D"}
|