@panguard-ai/panguard-guard 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.
Files changed (130) hide show
  1. package/dist/agent/analyze-agent.d.ts +62 -0
  2. package/dist/agent/analyze-agent.d.ts.map +1 -0
  3. package/dist/agent/analyze-agent.js +327 -0
  4. package/dist/agent/analyze-agent.js.map +1 -0
  5. package/dist/agent/detect-agent.d.ts +59 -0
  6. package/dist/agent/detect-agent.d.ts.map +1 -0
  7. package/dist/agent/detect-agent.js +214 -0
  8. package/dist/agent/detect-agent.js.map +1 -0
  9. package/dist/agent/index.d.ts +15 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +14 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/report-agent.d.ts +122 -0
  14. package/dist/agent/report-agent.d.ts.map +1 -0
  15. package/dist/agent/report-agent.js +468 -0
  16. package/dist/agent/report-agent.js.map +1 -0
  17. package/dist/agent/respond-agent.d.ts +113 -0
  18. package/dist/agent/respond-agent.d.ts.map +1 -0
  19. package/dist/agent/respond-agent.js +749 -0
  20. package/dist/agent/respond-agent.js.map +1 -0
  21. package/dist/agent-client/index.d.ts +81 -0
  22. package/dist/agent-client/index.d.ts.map +1 -0
  23. package/dist/agent-client/index.js +170 -0
  24. package/dist/agent-client/index.js.map +1 -0
  25. package/dist/cli/index.d.ts +17 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +295 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/config.d.ts +23 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +108 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/daemon/index.d.ts +66 -0
  34. package/dist/daemon/index.d.ts.map +1 -0
  35. package/dist/daemon/index.js +284 -0
  36. package/dist/daemon/index.js.map +1 -0
  37. package/dist/dashboard/index.d.ts +78 -0
  38. package/dist/dashboard/index.d.ts.map +1 -0
  39. package/dist/dashboard/index.js +455 -0
  40. package/dist/dashboard/index.js.map +1 -0
  41. package/dist/guard-engine.d.ts +108 -0
  42. package/dist/guard-engine.d.ts.map +1 -0
  43. package/dist/guard-engine.js +740 -0
  44. package/dist/guard-engine.js.map +1 -0
  45. package/dist/index.d.ts +29 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/install/index.d.ts +23 -0
  50. package/dist/install/index.d.ts.map +1 -0
  51. package/dist/install/index.js +216 -0
  52. package/dist/install/index.js.map +1 -0
  53. package/dist/investigation/index.d.ts +80 -0
  54. package/dist/investigation/index.d.ts.map +1 -0
  55. package/dist/investigation/index.js +570 -0
  56. package/dist/investigation/index.js.map +1 -0
  57. package/dist/license/index.d.ts +46 -0
  58. package/dist/license/index.d.ts.map +1 -0
  59. package/dist/license/index.js +145 -0
  60. package/dist/license/index.js.map +1 -0
  61. package/dist/memory/baseline.d.ts +34 -0
  62. package/dist/memory/baseline.d.ts.map +1 -0
  63. package/dist/memory/baseline.js +224 -0
  64. package/dist/memory/baseline.js.map +1 -0
  65. package/dist/memory/index.d.ts +32 -0
  66. package/dist/memory/index.d.ts.map +1 -0
  67. package/dist/memory/index.js +58 -0
  68. package/dist/memory/index.js.map +1 -0
  69. package/dist/memory/learning.d.ts +35 -0
  70. package/dist/memory/learning.d.ts.map +1 -0
  71. package/dist/memory/learning.js +60 -0
  72. package/dist/memory/learning.js.map +1 -0
  73. package/dist/monitors/falco-monitor.d.ts +62 -0
  74. package/dist/monitors/falco-monitor.d.ts.map +1 -0
  75. package/dist/monitors/falco-monitor.js +226 -0
  76. package/dist/monitors/falco-monitor.js.map +1 -0
  77. package/dist/monitors/suricata-monitor.d.ts +80 -0
  78. package/dist/monitors/suricata-monitor.d.ts.map +1 -0
  79. package/dist/monitors/suricata-monitor.js +227 -0
  80. package/dist/monitors/suricata-monitor.js.map +1 -0
  81. package/dist/notify/email.d.ts +23 -0
  82. package/dist/notify/email.d.ts.map +1 -0
  83. package/dist/notify/email.js +124 -0
  84. package/dist/notify/email.js.map +1 -0
  85. package/dist/notify/index.d.ts +31 -0
  86. package/dist/notify/index.d.ts.map +1 -0
  87. package/dist/notify/index.js +70 -0
  88. package/dist/notify/index.js.map +1 -0
  89. package/dist/notify/line-notify.d.ts.map +1 -0
  90. package/dist/notify/slack.d.ts +21 -0
  91. package/dist/notify/slack.d.ts.map +1 -0
  92. package/dist/notify/slack.js +92 -0
  93. package/dist/notify/slack.js.map +1 -0
  94. package/dist/notify/telegram.d.ts +21 -0
  95. package/dist/notify/telegram.d.ts.map +1 -0
  96. package/dist/notify/telegram.js +89 -0
  97. package/dist/notify/telegram.js.map +1 -0
  98. package/dist/response/file-quarantine.d.ts +63 -0
  99. package/dist/response/file-quarantine.d.ts.map +1 -0
  100. package/dist/response/file-quarantine.js +137 -0
  101. package/dist/response/file-quarantine.js.map +1 -0
  102. package/dist/response/index.d.ts +4 -0
  103. package/dist/response/index.d.ts.map +1 -0
  104. package/dist/response/index.js +4 -0
  105. package/dist/response/index.js.map +1 -0
  106. package/dist/response/ip-blocker.d.ts +69 -0
  107. package/dist/response/ip-blocker.d.ts.map +1 -0
  108. package/dist/response/ip-blocker.js +191 -0
  109. package/dist/response/ip-blocker.js.map +1 -0
  110. package/dist/response/process-killer.d.ts +49 -0
  111. package/dist/response/process-killer.d.ts.map +1 -0
  112. package/dist/response/process-killer.js +230 -0
  113. package/dist/response/process-killer.js.map +1 -0
  114. package/dist/rules/builtin-rules.d.ts +12 -0
  115. package/dist/rules/builtin-rules.d.ts.map +1 -0
  116. package/dist/rules/builtin-rules.js +471 -0
  117. package/dist/rules/builtin-rules.js.map +1 -0
  118. package/dist/threat-cloud/client-id.d.ts +13 -0
  119. package/dist/threat-cloud/client-id.d.ts.map +1 -0
  120. package/dist/threat-cloud/client-id.js +38 -0
  121. package/dist/threat-cloud/client-id.js.map +1 -0
  122. package/dist/threat-cloud/index.d.ts +103 -0
  123. package/dist/threat-cloud/index.d.ts.map +1 -0
  124. package/dist/threat-cloud/index.js +386 -0
  125. package/dist/threat-cloud/index.js.map +1 -0
  126. package/dist/types.d.ts +336 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +42 -0
  129. package/dist/types.js.map +1 -0
  130. package/package.json +35 -0
@@ -0,0 +1,137 @@
1
+ /**
2
+ * File Quarantine - Isolate suspicious files with metadata and restore
3
+ * 檔案隔離 - 隔離可疑檔案(含中繼資料與還原功能)
4
+ *
5
+ * Features:
6
+ * - Move files to quarantine directory with restricted permissions
7
+ * - SHA-256 hash recording for evidence
8
+ * - Quarantine manifest (JSON) for tracking
9
+ * - Restore functionality to return files to original location
10
+ *
11
+ * @module @panguard-ai/panguard-guard/response/file-quarantine
12
+ */
13
+ import { createHash } from 'node:crypto';
14
+ import { readFile, rename, mkdir, chmod, writeFile, readdir, stat } from 'node:fs/promises';
15
+ import { join, basename, resolve, normalize } from 'node:path';
16
+ import { homedir, platform } from 'node:os';
17
+ import { createLogger } from '@panguard-ai/core';
18
+ const logger = createLogger('panguard-guard:file-quarantine');
19
+ /**
20
+ * Manages file quarantine with metadata tracking and restore
21
+ * 管理檔案隔離(含中繼資料追蹤與還原功能)
22
+ */
23
+ export class FileQuarantine {
24
+ quarantineDir;
25
+ manifestPath;
26
+ manifest = { version: 1, records: [] };
27
+ constructor(quarantineDir) {
28
+ this.quarantineDir = quarantineDir ?? join(homedir(), '.panguard', 'quarantine');
29
+ this.manifestPath = join(this.quarantineDir, 'manifest.json');
30
+ }
31
+ /** Initialize quarantine directory / 初始化隔離目錄 */
32
+ async initialize() {
33
+ await mkdir(this.quarantineDir, { recursive: true, mode: 0o700 });
34
+ try {
35
+ const data = await readFile(this.manifestPath, 'utf-8');
36
+ this.manifest = JSON.parse(data);
37
+ }
38
+ catch {
39
+ // No existing manifest
40
+ this.manifest = { version: 1, records: [] };
41
+ }
42
+ }
43
+ /**
44
+ * Quarantine a file
45
+ * 隔離檔案
46
+ */
47
+ async quarantine(filePath, reason) {
48
+ await this.initialize();
49
+ const absPath = resolve(normalize(filePath));
50
+ // Prevent quarantining files inside the quarantine directory
51
+ if (absPath.startsWith(this.quarantineDir)) {
52
+ throw new Error('Cannot quarantine a file already in quarantine directory');
53
+ }
54
+ // Read file and compute hash before moving
55
+ const fileBuffer = await readFile(absPath);
56
+ const sha256 = createHash('sha256').update(fileBuffer).digest('hex');
57
+ const fileStat = await stat(absPath);
58
+ // Generate unique quarantine name
59
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
60
+ const quarantineName = `${id}_${basename(absPath)}`;
61
+ const quarantinePath = join(this.quarantineDir, quarantineName);
62
+ // Move file to quarantine
63
+ await rename(absPath, quarantinePath);
64
+ // Restrict permissions (not on Windows)
65
+ if (platform() !== 'win32') {
66
+ await chmod(quarantinePath, 0o000);
67
+ }
68
+ const record = {
69
+ id,
70
+ originalPath: absPath,
71
+ quarantinePath,
72
+ sha256,
73
+ fileSize: fileStat.size,
74
+ reason,
75
+ quarantinedAt: new Date().toISOString(),
76
+ };
77
+ this.manifest.records.push(record);
78
+ await this.saveManifest();
79
+ logger.info(`Quarantined: ${absPath} -> ${quarantinePath} (SHA-256: ${sha256.slice(0, 16)}...)`);
80
+ return record;
81
+ }
82
+ /**
83
+ * Restore a quarantined file to its original location
84
+ * 還原隔離檔案到原始位置
85
+ */
86
+ async restore(id) {
87
+ await this.initialize();
88
+ const record = this.manifest.records.find((r) => r.id === id);
89
+ if (!record) {
90
+ return { success: false, message: `Quarantine record not found: ${id}` };
91
+ }
92
+ if (record.restoredAt) {
93
+ return { success: false, message: `File already restored at ${record.restoredAt}` };
94
+ }
95
+ try {
96
+ // Restore permissions before moving
97
+ if (platform() !== 'win32') {
98
+ await chmod(record.quarantinePath, 0o644);
99
+ }
100
+ await rename(record.quarantinePath, record.originalPath);
101
+ record.restoredAt = new Date().toISOString();
102
+ await this.saveManifest();
103
+ logger.info(`Restored: ${record.quarantinePath} -> ${record.originalPath}`);
104
+ return { success: true, message: `File restored to ${record.originalPath}` };
105
+ }
106
+ catch (err) {
107
+ const msg = err instanceof Error ? err.message : String(err);
108
+ return { success: false, message: `Restore failed: ${msg}` };
109
+ }
110
+ }
111
+ /** Get all quarantine records / 取得所有隔離紀錄 */
112
+ getRecords() {
113
+ return [...this.manifest.records];
114
+ }
115
+ /** Get active (not restored) quarantine records / 取得未還原的隔離紀錄 */
116
+ getActiveRecords() {
117
+ return this.manifest.records.filter((r) => !r.restoredAt);
118
+ }
119
+ /** Find record by ID / 以 ID 搜尋紀錄 */
120
+ findRecord(id) {
121
+ return this.manifest.records.find((r) => r.id === id);
122
+ }
123
+ /** Count files in quarantine / 隔離區檔案數量 */
124
+ async getQuarantineCount() {
125
+ try {
126
+ const files = await readdir(this.quarantineDir);
127
+ return files.filter((f) => f !== 'manifest.json').length;
128
+ }
129
+ catch {
130
+ return 0;
131
+ }
132
+ }
133
+ async saveManifest() {
134
+ await writeFile(this.manifestPath, JSON.stringify(this.manifest, null, 2), 'utf-8');
135
+ }
136
+ }
137
+ //# sourceMappingURL=file-quarantine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-quarantine.js","sourceRoot":"","sources":["../../src/response/file-quarantine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { IPBlocker, type BlockRecord, type IPBlockerConfig } from './ip-blocker.js';
2
+ export { FileQuarantine, type QuarantineRecord, type QuarantineManifest, } from './file-quarantine.js';
3
+ export { ProcessKiller, type KillResult } from './process-killer.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EACL,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { IPBlocker } from './ip-blocker.js';
2
+ export { FileQuarantine, } from './file-quarantine.js';
3
+ export { ProcessKiller } from './process-killer.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0C,MAAM,iBAAiB,CAAC;AACpF,OAAO,EACL,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * IP Blocker - Cross-platform firewall rule management with auto-unblock
3
+ * IP 封鎖器 - 跨平台防火牆規則管理與自動解封
4
+ *
5
+ * Features:
6
+ * - Platform-aware blocking (pfctl / iptables / netsh)
7
+ * - Auto-unblock timer (default 24h)
8
+ * - Persistent whitelist
9
+ * - Block manifest tracking
10
+ *
11
+ * @module @panguard-ai/panguard-guard/response/ip-blocker
12
+ */
13
+ /** Record of a blocked IP / 封鎖 IP 紀錄 */
14
+ export interface BlockRecord {
15
+ ip: string;
16
+ blockedAt: string;
17
+ expiresAt: string;
18
+ reason: string;
19
+ autoUnblock: boolean;
20
+ }
21
+ /** IP Blocker configuration / IP 封鎖器設定 */
22
+ export interface IPBlockerConfig {
23
+ /** Default block duration in ms (default 24h) / 預設封鎖時長 */
24
+ defaultBlockDurationMs: number;
25
+ /** IPs that can never be blocked / 永不封鎖的 IP */
26
+ whitelist: string[];
27
+ /** Enable auto-unblock timer / 啟用自動解封 */
28
+ autoUnblockEnabled: boolean;
29
+ }
30
+ /**
31
+ * Manages IP blocking with auto-unblock timers
32
+ * 管理 IP 封鎖與自動解封計時器
33
+ */
34
+ export declare class IPBlocker {
35
+ private readonly config;
36
+ private readonly blocked;
37
+ private readonly whitelist;
38
+ private unblockTimers;
39
+ constructor(config?: Partial<IPBlockerConfig>);
40
+ /** Check if IP is whitelisted / 檢查 IP 是否在白名單 */
41
+ isWhitelisted(ip: string): boolean;
42
+ /** Check if IP is currently blocked / 檢查 IP 是否已封鎖 */
43
+ isBlocked(ip: string): boolean;
44
+ /** Get all currently blocked IPs / 取得所有已封鎖的 IP */
45
+ getBlockedIPs(): BlockRecord[];
46
+ /**
47
+ * Block an IP address
48
+ * 封鎖 IP 位址
49
+ */
50
+ block(ip: string, reason: string, durationMs?: number): Promise<{
51
+ success: boolean;
52
+ message: string;
53
+ }>;
54
+ /**
55
+ * Unblock an IP address
56
+ * 解封 IP 位址
57
+ */
58
+ unblock(ip: string, reason: string): Promise<{
59
+ success: boolean;
60
+ message: string;
61
+ }>;
62
+ /** Add whitelist entry / 新增白名單條目 */
63
+ addToWhitelist(ip: string): void;
64
+ /** Clean up all timers / 清理所有計時器 */
65
+ destroy(): void;
66
+ private addFirewallRule;
67
+ private removeFirewallRule;
68
+ }
69
+ //# sourceMappingURL=ip-blocker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-blocker.d.ts","sourceRoot":"","sources":["../../src/response/ip-blocker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,yCAAyC;IACzC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAQD;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,aAAa,CAAyD;gBAElE,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAKjD,gDAAgD;IAChD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC,qDAAqD;IACrD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI9B,kDAAkD;IAClD,aAAa,IAAI,WAAW,EAAE;IAI9B;;;OAGG;IACG,KAAK,CACT,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAsDjD;;;OAGG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BzF,oCAAoC;IACpC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIhC,oCAAoC;IACpC,OAAO,IAAI,IAAI;YASD,eAAe;YAoBf,kBAAkB;CAgBjC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * IP Blocker - Cross-platform firewall rule management with auto-unblock
3
+ * IP 封鎖器 - 跨平台防火牆規則管理與自動解封
4
+ *
5
+ * Features:
6
+ * - Platform-aware blocking (pfctl / iptables / netsh)
7
+ * - Auto-unblock timer (default 24h)
8
+ * - Persistent whitelist
9
+ * - Block manifest tracking
10
+ *
11
+ * @module @panguard-ai/panguard-guard/response/ip-blocker
12
+ */
13
+ import { execFile } from 'node:child_process';
14
+ import { platform } from 'node:os';
15
+ import { createLogger } from '@panguard-ai/core';
16
+ const logger = createLogger('panguard-guard:ip-blocker');
17
+ const DEFAULT_CONFIG = {
18
+ defaultBlockDurationMs: 24 * 60 * 60 * 1000, // 24h
19
+ whitelist: ['127.0.0.1', '::1', '0.0.0.0', 'localhost'],
20
+ autoUnblockEnabled: true,
21
+ };
22
+ /**
23
+ * Manages IP blocking with auto-unblock timers
24
+ * 管理 IP 封鎖與自動解封計時器
25
+ */
26
+ export class IPBlocker {
27
+ config;
28
+ blocked = new Map();
29
+ whitelist;
30
+ unblockTimers = new Map();
31
+ constructor(config = {}) {
32
+ this.config = { ...DEFAULT_CONFIG, ...config };
33
+ this.whitelist = new Set([...DEFAULT_CONFIG.whitelist, ...(config.whitelist ?? [])]);
34
+ }
35
+ /** Check if IP is whitelisted / 檢查 IP 是否在白名單 */
36
+ isWhitelisted(ip) {
37
+ return this.whitelist.has(ip);
38
+ }
39
+ /** Check if IP is currently blocked / 檢查 IP 是否已封鎖 */
40
+ isBlocked(ip) {
41
+ return this.blocked.has(ip);
42
+ }
43
+ /** Get all currently blocked IPs / 取得所有已封鎖的 IP */
44
+ getBlockedIPs() {
45
+ return Array.from(this.blocked.values());
46
+ }
47
+ /**
48
+ * Block an IP address
49
+ * 封鎖 IP 位址
50
+ */
51
+ async block(ip, reason, durationMs) {
52
+ // Whitelist check
53
+ if (this.whitelist.has(ip)) {
54
+ logger.warn(`Refusing to block whitelisted IP: ${ip}`);
55
+ return { success: false, message: `IP ${ip} is whitelisted` };
56
+ }
57
+ // Already blocked check
58
+ if (this.blocked.has(ip)) {
59
+ return { success: true, message: `IP ${ip} is already blocked` };
60
+ }
61
+ // Validate IP format
62
+ if (!isValidIP(ip)) {
63
+ return { success: false, message: `Invalid IP format: ${ip}` };
64
+ }
65
+ const duration = durationMs ?? this.config.defaultBlockDurationMs;
66
+ const now = new Date();
67
+ const expiresAt = new Date(now.getTime() + duration);
68
+ // Execute platform firewall command
69
+ try {
70
+ await this.addFirewallRule(ip);
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof Error ? err.message : String(err);
74
+ logger.error(`Failed to block IP ${ip}: ${msg}`);
75
+ return { success: false, message: `Firewall error: ${msg}` };
76
+ }
77
+ // Record block
78
+ const record = {
79
+ ip,
80
+ blockedAt: now.toISOString(),
81
+ expiresAt: expiresAt.toISOString(),
82
+ reason,
83
+ autoUnblock: this.config.autoUnblockEnabled,
84
+ };
85
+ this.blocked.set(ip, record);
86
+ // Set auto-unblock timer
87
+ if (this.config.autoUnblockEnabled) {
88
+ const timer = setTimeout(() => {
89
+ void this.unblock(ip, 'auto-unblock: duration expired');
90
+ }, duration);
91
+ // Don't prevent process exit
92
+ if (timer.unref)
93
+ timer.unref();
94
+ this.unblockTimers.set(ip, timer);
95
+ }
96
+ logger.info(`Blocked IP ${ip} for ${Math.round(duration / 60000)} minutes. Reason: ${reason}`);
97
+ return { success: true, message: `IP ${ip} blocked until ${expiresAt.toISOString()}` };
98
+ }
99
+ /**
100
+ * Unblock an IP address
101
+ * 解封 IP 位址
102
+ */
103
+ async unblock(ip, reason) {
104
+ if (!this.blocked.has(ip)) {
105
+ return { success: true, message: `IP ${ip} is not blocked` };
106
+ }
107
+ try {
108
+ await this.removeFirewallRule(ip);
109
+ }
110
+ catch (err) {
111
+ const msg = err instanceof Error ? err.message : String(err);
112
+ logger.error(`Failed to unblock IP ${ip}: ${msg}`);
113
+ return { success: false, message: `Firewall error: ${msg}` };
114
+ }
115
+ this.blocked.delete(ip);
116
+ // Clear timer
117
+ const timer = this.unblockTimers.get(ip);
118
+ if (timer) {
119
+ clearTimeout(timer);
120
+ this.unblockTimers.delete(ip);
121
+ }
122
+ logger.info(`Unblocked IP ${ip}. Reason: ${reason}`);
123
+ return { success: true, message: `IP ${ip} unblocked` };
124
+ }
125
+ /** Add whitelist entry / 新增白名單條目 */
126
+ addToWhitelist(ip) {
127
+ this.whitelist.add(ip);
128
+ }
129
+ /** Clean up all timers / 清理所有計時器 */
130
+ destroy() {
131
+ for (const timer of this.unblockTimers.values()) {
132
+ clearTimeout(timer);
133
+ }
134
+ this.unblockTimers.clear();
135
+ }
136
+ // -- Platform firewall commands --
137
+ async addFirewallRule(ip) {
138
+ const os = platform();
139
+ if (os === 'darwin') {
140
+ await execFilePromise('/sbin/pfctl', ['-t', 'panguard_blocked', '-T', 'add', ip]);
141
+ }
142
+ else if (os === 'linux') {
143
+ await execFilePromise('/sbin/iptables', ['-A', 'INPUT', '-s', ip, '-j', 'DROP']);
144
+ }
145
+ else if (os === 'win32') {
146
+ await execFilePromise('netsh', [
147
+ 'advfirewall',
148
+ 'firewall',
149
+ 'add',
150
+ 'rule',
151
+ `name=Panguard_Block_${ip}`,
152
+ 'dir=in',
153
+ 'action=block',
154
+ `remoteip=${ip}`,
155
+ ]);
156
+ }
157
+ }
158
+ async removeFirewallRule(ip) {
159
+ const os = platform();
160
+ if (os === 'darwin') {
161
+ await execFilePromise('/sbin/pfctl', ['-t', 'panguard_blocked', '-T', 'delete', ip]);
162
+ }
163
+ else if (os === 'linux') {
164
+ await execFilePromise('/sbin/iptables', ['-D', 'INPUT', '-s', ip, '-j', 'DROP']);
165
+ }
166
+ else if (os === 'win32') {
167
+ await execFilePromise('netsh', [
168
+ 'advfirewall',
169
+ 'firewall',
170
+ 'delete',
171
+ 'rule',
172
+ `name=Panguard_Block_${ip}`,
173
+ ]);
174
+ }
175
+ }
176
+ }
177
+ /** Validate IPv4 or IPv6 format / 驗證 IPv4 或 IPv6 格式 */
178
+ function isValidIP(ip) {
179
+ return /^[\d.]+$/.test(ip) || /^[a-fA-F\d:]+$/.test(ip);
180
+ }
181
+ function execFilePromise(command, args) {
182
+ return new Promise((resolve, reject) => {
183
+ execFile(command, args, { timeout: 10000 }, (error, stdout) => {
184
+ if (error)
185
+ reject(error);
186
+ else
187
+ resolve(stdout);
188
+ });
189
+ });
190
+ }
191
+ //# sourceMappingURL=ip-blocker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-blocker.js","sourceRoot":"","sources":["../../src/response/ip-blocker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Process Killer - Terminate processes with child cleanup and safety checks
3
+ * 程序終止器 - 終止程序(含子程序清理與安全檢查)
4
+ *
5
+ * Features:
6
+ * - Kill process and all child processes (process tree)
7
+ * - Protected process list (never kill system-critical processes)
8
+ * - SIGTERM first, SIGKILL after timeout
9
+ * - Cross-platform support
10
+ *
11
+ * @module @panguard-ai/panguard-guard/response/process-killer
12
+ */
13
+ /** Process kill result / 程序終止結果 */
14
+ export interface KillResult {
15
+ pid: number;
16
+ processName?: string;
17
+ success: boolean;
18
+ message: string;
19
+ childrenKilled: number;
20
+ }
21
+ /**
22
+ * Process Killer with safety checks and tree killing
23
+ * 程序終止器(含安全檢查與程序樹終止)
24
+ */
25
+ export declare class ProcessKiller {
26
+ private readonly additionalProtected;
27
+ constructor(additionalProtectedProcesses?: string[]);
28
+ /** Check if process name is protected / 檢查程序名稱是否受保護 */
29
+ isProtected(nameOrPid: string | number): boolean;
30
+ /**
31
+ * Kill a process and optionally its children
32
+ * 終止程序(可選終止子程序)
33
+ */
34
+ kill(pid: number, options?: {
35
+ processName?: string;
36
+ killChildren?: boolean;
37
+ gracePeriodMs?: number;
38
+ }): Promise<KillResult>;
39
+ /**
40
+ * Get child PIDs of a process / 取得程序的子 PID
41
+ */
42
+ private getChildPIDs;
43
+ /**
44
+ * Wait for process to exit, return true if still alive
45
+ * 等待程序退出,如果仍存活則回傳 true
46
+ */
47
+ private waitForExit;
48
+ }
49
+ //# sourceMappingURL=process-killer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-killer.d.ts","sourceRoot":"","sources":["../../src/response/process-killer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AA6CD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAc;gBAEtC,4BAA4B,GAAE,MAAM,EAAO;IAIvD,uDAAuD;IACvD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAOhD;;;OAGG;IACG,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO,GACrF,OAAO,CAAC,UAAU,CAAC;IA6FtB;;OAEG;YACW,YAAY;IA4B1B;;;OAGG;IACH,OAAO,CAAC,WAAW;CAkBpB"}