@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.
Files changed (233) hide show
  1. package/dist/adapters/adapter-registry.d.ts +150 -0
  2. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  3. package/dist/adapters/adapter-registry.js +271 -0
  4. package/dist/adapters/adapter-registry.js.map +1 -0
  5. package/dist/adapters/base-adapter.d.ts +101 -0
  6. package/dist/adapters/base-adapter.d.ts.map +1 -0
  7. package/dist/adapters/base-adapter.js +160 -0
  8. package/dist/adapters/base-adapter.js.map +1 -0
  9. package/dist/adapters/defender-adapter.d.ts +90 -0
  10. package/dist/adapters/defender-adapter.d.ts.map +1 -0
  11. package/dist/adapters/defender-adapter.js +227 -0
  12. package/dist/adapters/defender-adapter.js.map +1 -0
  13. package/dist/adapters/index.d.ts +22 -0
  14. package/dist/adapters/index.d.ts.map +1 -0
  15. package/dist/adapters/index.js +23 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/syslog-adapter.d.ts +207 -0
  18. package/dist/adapters/syslog-adapter.d.ts.map +1 -0
  19. package/dist/adapters/syslog-adapter.js +432 -0
  20. package/dist/adapters/syslog-adapter.js.map +1 -0
  21. package/dist/adapters/types.d.ts +135 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +13 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/adapters/wazuh-adapter.d.ts +120 -0
  26. package/dist/adapters/wazuh-adapter.d.ts.map +1 -0
  27. package/dist/adapters/wazuh-adapter.js +266 -0
  28. package/dist/adapters/wazuh-adapter.js.map +1 -0
  29. package/dist/ai/claude-provider.d.ts +66 -0
  30. package/dist/ai/claude-provider.d.ts.map +1 -0
  31. package/dist/ai/claude-provider.js +166 -0
  32. package/dist/ai/claude-provider.js.map +1 -0
  33. package/dist/ai/funnel-router.d.ts +75 -0
  34. package/dist/ai/funnel-router.d.ts.map +1 -0
  35. package/dist/ai/funnel-router.js +173 -0
  36. package/dist/ai/funnel-router.js.map +1 -0
  37. package/dist/ai/index.d.ts +77 -0
  38. package/dist/ai/index.d.ts.map +1 -0
  39. package/dist/ai/index.js +95 -0
  40. package/dist/ai/index.js.map +1 -0
  41. package/dist/ai/ollama-provider.d.ts +73 -0
  42. package/dist/ai/ollama-provider.d.ts.map +1 -0
  43. package/dist/ai/ollama-provider.js +200 -0
  44. package/dist/ai/ollama-provider.js.map +1 -0
  45. package/dist/ai/openai-provider.d.ts +70 -0
  46. package/dist/ai/openai-provider.d.ts.map +1 -0
  47. package/dist/ai/openai-provider.js +175 -0
  48. package/dist/ai/openai-provider.js.map +1 -0
  49. package/dist/ai/prompts/event-classifier.d.ts +25 -0
  50. package/dist/ai/prompts/event-classifier.d.ts.map +1 -0
  51. package/dist/ai/prompts/event-classifier.js +94 -0
  52. package/dist/ai/prompts/event-classifier.js.map +1 -0
  53. package/dist/ai/prompts/index.d.ts +13 -0
  54. package/dist/ai/prompts/index.d.ts.map +1 -0
  55. package/dist/ai/prompts/index.js +13 -0
  56. package/dist/ai/prompts/index.js.map +1 -0
  57. package/dist/ai/prompts/report-generator.d.ts +25 -0
  58. package/dist/ai/prompts/report-generator.d.ts.map +1 -0
  59. package/dist/ai/prompts/report-generator.js +131 -0
  60. package/dist/ai/prompts/report-generator.js.map +1 -0
  61. package/dist/ai/prompts/threat-analyzer.d.ts +26 -0
  62. package/dist/ai/prompts/threat-analyzer.d.ts.map +1 -0
  63. package/dist/ai/prompts/threat-analyzer.js +75 -0
  64. package/dist/ai/prompts/threat-analyzer.js.map +1 -0
  65. package/dist/ai/provider-base.d.ts +100 -0
  66. package/dist/ai/provider-base.d.ts.map +1 -0
  67. package/dist/ai/provider-base.js +166 -0
  68. package/dist/ai/provider-base.js.map +1 -0
  69. package/dist/ai/response-parser.d.ts +36 -0
  70. package/dist/ai/response-parser.d.ts.map +1 -0
  71. package/dist/ai/response-parser.js +195 -0
  72. package/dist/ai/response-parser.js.map +1 -0
  73. package/dist/ai/token-tracker.d.ts +72 -0
  74. package/dist/ai/token-tracker.d.ts.map +1 -0
  75. package/dist/ai/token-tracker.js +145 -0
  76. package/dist/ai/token-tracker.js.map +1 -0
  77. package/dist/ai/types.d.ts +138 -0
  78. package/dist/ai/types.d.ts.map +1 -0
  79. package/dist/ai/types.js +12 -0
  80. package/dist/ai/types.js.map +1 -0
  81. package/dist/cli/index.d.ts +146 -0
  82. package/dist/cli/index.d.ts.map +1 -0
  83. package/dist/cli/index.js +515 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli/prompts.d.ts +58 -0
  86. package/dist/cli/prompts.d.ts.map +1 -0
  87. package/dist/cli/prompts.js +327 -0
  88. package/dist/cli/prompts.js.map +1 -0
  89. package/dist/cli/wizard.d.ts +58 -0
  90. package/dist/cli/wizard.d.ts.map +1 -0
  91. package/dist/cli/wizard.js +200 -0
  92. package/dist/cli/wizard.js.map +1 -0
  93. package/dist/discovery/firewall-checker.d.ts +28 -0
  94. package/dist/discovery/firewall-checker.d.ts.map +1 -0
  95. package/dist/discovery/firewall-checker.js +379 -0
  96. package/dist/discovery/firewall-checker.js.map +1 -0
  97. package/dist/discovery/index.d.ts +23 -0
  98. package/dist/discovery/index.d.ts.map +1 -0
  99. package/dist/discovery/index.js +29 -0
  100. package/dist/discovery/index.js.map +1 -0
  101. package/dist/discovery/network-scanner.d.ts +60 -0
  102. package/dist/discovery/network-scanner.d.ts.map +1 -0
  103. package/dist/discovery/network-scanner.js +640 -0
  104. package/dist/discovery/network-scanner.js.map +1 -0
  105. package/dist/discovery/os-detector.d.ts +24 -0
  106. package/dist/discovery/os-detector.d.ts.map +1 -0
  107. package/dist/discovery/os-detector.js +253 -0
  108. package/dist/discovery/os-detector.js.map +1 -0
  109. package/dist/discovery/osquery-provider.d.ts +127 -0
  110. package/dist/discovery/osquery-provider.d.ts.map +1 -0
  111. package/dist/discovery/osquery-provider.js +214 -0
  112. package/dist/discovery/osquery-provider.js.map +1 -0
  113. package/dist/discovery/risk-scorer.d.ts +66 -0
  114. package/dist/discovery/risk-scorer.d.ts.map +1 -0
  115. package/dist/discovery/risk-scorer.js +294 -0
  116. package/dist/discovery/risk-scorer.js.map +1 -0
  117. package/dist/discovery/security-tools.d.ts +31 -0
  118. package/dist/discovery/security-tools.d.ts.map +1 -0
  119. package/dist/discovery/security-tools.js +346 -0
  120. package/dist/discovery/security-tools.js.map +1 -0
  121. package/dist/discovery/service-detector.d.ts +28 -0
  122. package/dist/discovery/service-detector.d.ts.map +1 -0
  123. package/dist/discovery/service-detector.js +300 -0
  124. package/dist/discovery/service-detector.js.map +1 -0
  125. package/dist/discovery/types.d.ts +502 -0
  126. package/dist/discovery/types.d.ts.map +1 -0
  127. package/dist/discovery/types.js +12 -0
  128. package/dist/discovery/types.js.map +1 -0
  129. package/dist/discovery/user-auditor.d.ts +28 -0
  130. package/dist/discovery/user-auditor.d.ts.map +1 -0
  131. package/dist/discovery/user-auditor.js +385 -0
  132. package/dist/discovery/user-auditor.js.map +1 -0
  133. package/dist/i18n/config.d.ts +45 -0
  134. package/dist/i18n/config.d.ts.map +1 -0
  135. package/dist/i18n/config.js +135 -0
  136. package/dist/i18n/config.js.map +1 -0
  137. package/dist/i18n/index.d.ts +8 -0
  138. package/dist/i18n/index.d.ts.map +1 -0
  139. package/dist/i18n/index.js +8 -0
  140. package/dist/i18n/index.js.map +1 -0
  141. package/dist/index.d.ts +31 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +31 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/monitor/event-normalizer.d.ts +102 -0
  146. package/dist/monitor/event-normalizer.d.ts.map +1 -0
  147. package/dist/monitor/event-normalizer.js +195 -0
  148. package/dist/monitor/event-normalizer.js.map +1 -0
  149. package/dist/monitor/file-monitor.d.ts +90 -0
  150. package/dist/monitor/file-monitor.d.ts.map +1 -0
  151. package/dist/monitor/file-monitor.js +222 -0
  152. package/dist/monitor/file-monitor.js.map +1 -0
  153. package/dist/monitor/index.d.ts +147 -0
  154. package/dist/monitor/index.d.ts.map +1 -0
  155. package/dist/monitor/index.js +293 -0
  156. package/dist/monitor/index.js.map +1 -0
  157. package/dist/monitor/log-monitor.d.ts +102 -0
  158. package/dist/monitor/log-monitor.d.ts.map +1 -0
  159. package/dist/monitor/log-monitor.js +245 -0
  160. package/dist/monitor/log-monitor.js.map +1 -0
  161. package/dist/monitor/network-monitor.d.ts +103 -0
  162. package/dist/monitor/network-monitor.d.ts.map +1 -0
  163. package/dist/monitor/network-monitor.js +336 -0
  164. package/dist/monitor/network-monitor.js.map +1 -0
  165. package/dist/monitor/process-monitor.d.ts +108 -0
  166. package/dist/monitor/process-monitor.d.ts.map +1 -0
  167. package/dist/monitor/process-monitor.js +245 -0
  168. package/dist/monitor/process-monitor.js.map +1 -0
  169. package/dist/monitor/threat-intel-feeds.d.ts +141 -0
  170. package/dist/monitor/threat-intel-feeds.d.ts.map +1 -0
  171. package/dist/monitor/threat-intel-feeds.js +430 -0
  172. package/dist/monitor/threat-intel-feeds.js.map +1 -0
  173. package/dist/monitor/threat-intel.d.ts +83 -0
  174. package/dist/monitor/threat-intel.d.ts.map +1 -0
  175. package/dist/monitor/threat-intel.js +215 -0
  176. package/dist/monitor/threat-intel.js.map +1 -0
  177. package/dist/monitor/types.d.ts +65 -0
  178. package/dist/monitor/types.d.ts.map +1 -0
  179. package/dist/monitor/types.js +20 -0
  180. package/dist/monitor/types.js.map +1 -0
  181. package/dist/rules/index.d.ts +115 -0
  182. package/dist/rules/index.d.ts.map +1 -0
  183. package/dist/rules/index.js +244 -0
  184. package/dist/rules/index.js.map +1 -0
  185. package/dist/rules/rule-loader.d.ts +54 -0
  186. package/dist/rules/rule-loader.d.ts.map +1 -0
  187. package/dist/rules/rule-loader.js +167 -0
  188. package/dist/rules/rule-loader.js.map +1 -0
  189. package/dist/rules/sigma-matcher.d.ts +40 -0
  190. package/dist/rules/sigma-matcher.d.ts.map +1 -0
  191. package/dist/rules/sigma-matcher.js +447 -0
  192. package/dist/rules/sigma-matcher.js.map +1 -0
  193. package/dist/rules/sigma-parser.d.ts +36 -0
  194. package/dist/rules/sigma-parser.d.ts.map +1 -0
  195. package/dist/rules/sigma-parser.js +180 -0
  196. package/dist/rules/sigma-parser.js.map +1 -0
  197. package/dist/rules/types.d.ts +112 -0
  198. package/dist/rules/types.d.ts.map +1 -0
  199. package/dist/rules/types.js +11 -0
  200. package/dist/rules/types.js.map +1 -0
  201. package/dist/rules/yara-scanner.d.ts +103 -0
  202. package/dist/rules/yara-scanner.d.ts.map +1 -0
  203. package/dist/rules/yara-scanner.js +421 -0
  204. package/dist/rules/yara-scanner.js.map +1 -0
  205. package/dist/scoring/achievements.d.ts +76 -0
  206. package/dist/scoring/achievements.d.ts.map +1 -0
  207. package/dist/scoring/achievements.js +211 -0
  208. package/dist/scoring/achievements.js.map +1 -0
  209. package/dist/scoring/index.d.ts +3 -0
  210. package/dist/scoring/index.d.ts.map +1 -0
  211. package/dist/scoring/index.js +3 -0
  212. package/dist/scoring/index.js.map +1 -0
  213. package/dist/scoring/security-score.d.ts +60 -0
  214. package/dist/scoring/security-score.d.ts.map +1 -0
  215. package/dist/scoring/security-score.js +211 -0
  216. package/dist/scoring/security-score.js.map +1 -0
  217. package/dist/types.d.ts +71 -0
  218. package/dist/types.d.ts.map +1 -0
  219. package/dist/types.js +8 -0
  220. package/dist/types.js.map +1 -0
  221. package/dist/utils/index.d.ts +10 -0
  222. package/dist/utils/index.d.ts.map +1 -0
  223. package/dist/utils/index.js +9 -0
  224. package/dist/utils/index.js.map +1 -0
  225. package/dist/utils/logger.d.ts +38 -0
  226. package/dist/utils/logger.d.ts.map +1 -0
  227. package/dist/utils/logger.js +71 -0
  228. package/dist/utils/logger.js.map +1 -0
  229. package/dist/utils/validation.d.ts +35 -0
  230. package/dist/utils/validation.d.ts.map +1 -0
  231. package/dist/utils/validation.js +56 -0
  232. package/dist/utils/validation.js.map +1 -0
  233. package/package.json +60 -0
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Risk scoring algorithm
3
+ * 風險評分演算法
4
+ *
5
+ * Calculates an overall risk score (0-100) based on discovered environment
6
+ * factors including firewall status, admin accounts, open ports, update status,
7
+ * security tools presence, and service count.
8
+ * 根據已發現的環境因素計算總體風險評分(0-100),包括防火牆狀態、管理員帳號、
9
+ * 開放埠、更新狀態、安全工具存在狀況和服務數量。
10
+ *
11
+ * @module @panguard-ai/core/discovery/risk-scorer
12
+ */
13
+ import type { DiscoveryResult, RiskFactor } from './types.js';
14
+ import type { Severity } from '../types.js';
15
+ /**
16
+ * Calculate the overall risk score and identify risk factors
17
+ * 計算總體風險評分並識別風險因素
18
+ *
19
+ * Evaluates multiple security dimensions:
20
+ * - Firewall status (max 25 points)
21
+ * - Admin account count (max 15 points)
22
+ * - Dangerous open ports (max 20 points)
23
+ * - Update status (max 15 points)
24
+ * - Security tool presence (max 25 points)
25
+ * - Password hygiene (max 10 points)
26
+ * - Service count (max 5 points)
27
+ *
28
+ * 評估多個安全面向:
29
+ * - 防火牆狀態(最高 25 分)
30
+ * - 管理員帳號數量(最高 15 分)
31
+ * - 危險開放埠(最高 20 分)
32
+ * - 更新狀態(最高 15 分)
33
+ * - 安全工具存在狀況(最高 25 分)
34
+ * - 密碼衛生(最高 10 分)
35
+ * - 服務數量(最高 5 分)
36
+ *
37
+ * @param result - Partial discovery result to evaluate / 要評估的部分偵察結果
38
+ * @returns Risk score (0-100) and identified risk factors / 風險評分(0-100)和已識別的風險因素
39
+ */
40
+ export declare function calculateRiskScore(result: Partial<DiscoveryResult>): {
41
+ riskScore: number;
42
+ factors: RiskFactor[];
43
+ };
44
+ /**
45
+ * Map a numeric risk score to a severity level
46
+ * 將數值風險評分映射到嚴重性等級
47
+ *
48
+ * Score ranges:
49
+ * - 0-20: info (minimal risk / 最小風險)
50
+ * - 21-40: low (some concerns / 有一些問題)
51
+ * - 41-60: medium (moderate risk / 中等風險)
52
+ * - 61-80: high (significant risk / 重大風險)
53
+ * - 81-100: critical (severe risk / 嚴重風險)
54
+ *
55
+ * 評分範圍:
56
+ * - 0-20:info(最小風險)
57
+ * - 21-40:low(有一些問題)
58
+ * - 41-60:medium(中等風險)
59
+ * - 61-80:high(重大風險)
60
+ * - 81-100:critical(嚴重風險)
61
+ *
62
+ * @param score - Numeric risk score (0-100) / 數值風險評分(0-100)
63
+ * @returns Corresponding severity level / 對應的嚴重性等級
64
+ */
65
+ export declare function getRiskLevel(score: number): Severity;
66
+ //# sourceMappingURL=risk-scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-scorer.d.ts","sourceRoot":"","sources":["../../src/discovery/risk-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAuO5C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB,CAiCA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAQpD"}
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Risk scoring algorithm
3
+ * 風險評分演算法
4
+ *
5
+ * Calculates an overall risk score (0-100) based on discovered environment
6
+ * factors including firewall status, admin accounts, open ports, update status,
7
+ * security tools presence, and service count.
8
+ * 根據已發現的環境因素計算總體風險評分(0-100),包括防火牆狀態、管理員帳號、
9
+ * 開放埠、更新狀態、安全工具存在狀況和服務數量。
10
+ *
11
+ * @module @panguard-ai/core/discovery/risk-scorer
12
+ */
13
+ import { createLogger } from '../utils/logger.js';
14
+ const logger = createLogger('discovery:risk-scorer');
15
+ /**
16
+ * Dangerous ports that indicate potential security risks when open
17
+ * 開放時表示潛在安全風險的危險埠
18
+ */
19
+ const DANGEROUS_PORTS = new Set([
20
+ 22, // SSH - can be brute-forced / SSH - 可能被暴力破解
21
+ 23, // Telnet - unencrypted / Telnet - 未加密
22
+ 445, // SMB - common attack vector / SMB - 常見攻擊向量
23
+ 3389, // RDP - remote desktop / RDP - 遠端桌面
24
+ 135, // MSRPC - Windows RPC / MSRPC - Windows RPC
25
+ 139, // NetBIOS - legacy protocol / NetBIOS - 舊版協定
26
+ 1433, // MSSQL - database / MSSQL - 資料庫
27
+ 3306, // MySQL - database / MySQL - 資料庫
28
+ 5432, // PostgreSQL - database / PostgreSQL - 資料庫
29
+ 6379, // Redis - often unprotected / Redis - 通常無保護
30
+ 27017, // MongoDB - often unprotected / MongoDB - 通常無保護
31
+ 5900, // VNC - remote access / VNC - 遠端存取
32
+ ]);
33
+ /**
34
+ * Check for missing firewall and return a risk factor if applicable
35
+ * 檢查防火牆是否缺失,如適用則回傳風險因素
36
+ *
37
+ * @param result - Partial discovery result / 部分偵察結果
38
+ * @returns Risk factor if firewall is disabled, or null / 如果防火牆停用則回傳風險因素,否則為 null
39
+ */
40
+ function checkFirewallRisk(result) {
41
+ if (!result.security?.firewall)
42
+ return null;
43
+ if (!result.security.firewall.enabled) {
44
+ return {
45
+ category: 'noFirewall',
46
+ description: 'Firewall is disabled - system is exposed to network attacks / 防火牆已停用 - 系統暴露於網路攻擊',
47
+ score: 25,
48
+ severity: 'high',
49
+ details: `Firewall product: ${result.security.firewall.product || 'unknown'}`,
50
+ };
51
+ }
52
+ return null;
53
+ }
54
+ /**
55
+ * Check for excessive administrator accounts
56
+ * 檢查過多的管理員帳號
57
+ *
58
+ * @param result - Partial discovery result / 部分偵察結果
59
+ * @returns Risk factor if too many admins, or null / 如果管理員過多則回傳風險因素,否則為 null
60
+ */
61
+ function checkAdminRisk(result) {
62
+ if (!result.security?.users)
63
+ return null;
64
+ const adminCount = result.security.users.filter((u) => u.isAdmin).length;
65
+ if (adminCount > 2) {
66
+ return {
67
+ category: 'tooManyAdmins',
68
+ description: 'Too many administrator accounts increase attack surface / 過多的管理員帳號增加攻擊面',
69
+ score: 15,
70
+ severity: 'medium',
71
+ details: `Found ${adminCount} admin accounts (recommended: 2 or fewer). Admin users: ${result.security.users
72
+ .filter((u) => u.isAdmin)
73
+ .map((u) => u.username)
74
+ .join(', ')}`,
75
+ };
76
+ }
77
+ return null;
78
+ }
79
+ /**
80
+ * Check for dangerous open ports
81
+ * 檢查危險的開放埠
82
+ *
83
+ * @param result - Partial discovery result / 部分偵察結果
84
+ * @returns Risk factor if dangerous ports are open, or null / 如果危險埠開放則回傳風險因素,否則為 null
85
+ */
86
+ function checkDangerousPortsRisk(result) {
87
+ const ports = result.openPorts || result.network?.openPorts;
88
+ if (!ports || ports.length === 0)
89
+ return null;
90
+ const dangerousOpen = ports.filter((p) => DANGEROUS_PORTS.has(p.port));
91
+ if (dangerousOpen.length > 0) {
92
+ return {
93
+ category: 'dangerousPorts',
94
+ description: 'Dangerous ports are open and may be exploitable / 危險埠已開放,可能被利用',
95
+ score: 20,
96
+ severity: 'high',
97
+ details: `Open dangerous ports: ${dangerousOpen
98
+ .map((p) => `${p.port}/${p.protocol} (${p.service || 'unknown'})`)
99
+ .join(', ')}`,
100
+ };
101
+ }
102
+ return null;
103
+ }
104
+ /**
105
+ * Check for missing or outdated system updates
106
+ * 檢查缺失或過時的系統更新
107
+ *
108
+ * @param result - Partial discovery result / 部分偵察結果
109
+ * @returns Risk factor if updates are needed, or null / 如果需要更新則回傳風險因素,否則為 null
110
+ */
111
+ function checkUpdateRisk(result) {
112
+ if (!result.security?.updates)
113
+ return null;
114
+ const updates = result.security.updates;
115
+ const issues = [];
116
+ if (updates.pendingUpdates > 0) {
117
+ issues.push(`${updates.pendingUpdates} pending updates`);
118
+ }
119
+ if (updates.lastCheck) {
120
+ const lastCheckDate = new Date(updates.lastCheck);
121
+ const daysSinceCheck = Math.floor((Date.now() - lastCheckDate.getTime()) / (1000 * 60 * 60 * 24));
122
+ if (daysSinceCheck > 30) {
123
+ issues.push(`last update check was ${daysSinceCheck} days ago`);
124
+ }
125
+ }
126
+ if (!updates.autoUpdateEnabled) {
127
+ issues.push('automatic updates are disabled');
128
+ }
129
+ if (issues.length > 0) {
130
+ return {
131
+ category: 'noUpdates',
132
+ description: 'System updates are missing or not configured properly / 系統更新缺失或配置不當',
133
+ score: 15,
134
+ severity: 'medium',
135
+ details: issues.join('; '),
136
+ };
137
+ }
138
+ return null;
139
+ }
140
+ /**
141
+ * Check for absence of security tools
142
+ * 檢查安全工具是否缺失
143
+ *
144
+ * @param result - Partial discovery result / 部分偵察結果
145
+ * @returns Risk factor if no security tools detected, or null / 如果未偵測到安全工具則回傳風險因素,否則為 null
146
+ */
147
+ function checkSecurityToolsRisk(result) {
148
+ if (!result.security?.existingTools)
149
+ return null;
150
+ const runningTools = result.security.existingTools.filter((t) => t.running);
151
+ if (runningTools.length === 0) {
152
+ return {
153
+ category: 'noSecurityTools',
154
+ description: 'No active security tools detected - system lacks protection / 未偵測到啟用中的安全工具 - 系統缺乏保護',
155
+ score: 25,
156
+ severity: 'high',
157
+ details: result.security.existingTools.length > 0
158
+ ? `Found ${result.security.existingTools.length} tool(s) installed but none are running`
159
+ : 'No security tools (antivirus, EDR, IDS) were found on this system',
160
+ };
161
+ }
162
+ return null;
163
+ }
164
+ /**
165
+ * Check for default or weak password indicators
166
+ * 檢查預設或弱密碼指標
167
+ *
168
+ * @param result - Partial discovery result / 部分偵察結果
169
+ * @returns Risk factor if default passwords suspected, or null / 如果懷疑使用預設密碼則回傳風險因素,否則為 null
170
+ */
171
+ function checkDefaultPasswordRisk(result) {
172
+ if (!result.security?.users)
173
+ return null;
174
+ const usersWithOldPasswords = result.security.users.filter((u) => u.passwordAge !== undefined && u.passwordAge > 365);
175
+ if (usersWithOldPasswords.length > 0) {
176
+ return {
177
+ category: 'defaultPasswords',
178
+ description: 'User accounts have very old passwords that may be weak or default / 使用者帳號的密碼非常舊,可能很弱或為預設值',
179
+ score: 10,
180
+ severity: 'medium',
181
+ details: `${usersWithOldPasswords.length} user(s) have passwords older than 365 days: ${usersWithOldPasswords.map((u) => u.username).join(', ')}`,
182
+ };
183
+ }
184
+ return null;
185
+ }
186
+ /**
187
+ * Check for excessive running services
188
+ * 檢查過多的執行中服務
189
+ *
190
+ * @param result - Partial discovery result / 部分偵察結果
191
+ * @returns Risk factor if too many services, or null / 如果服務過多則回傳風險因素,否則為 null
192
+ */
193
+ function checkExcessiveServicesRisk(result) {
194
+ if (!result.services)
195
+ return null;
196
+ const runningServices = result.services.filter((s) => s.status === 'running');
197
+ if (runningServices.length > 50) {
198
+ return {
199
+ category: 'excessiveServices',
200
+ description: 'Excessive number of running services increases attack surface / 過多的執行中服務增加攻擊面',
201
+ score: 5,
202
+ severity: 'low',
203
+ details: `${runningServices.length} services are running (recommended: review and disable unnecessary services)`,
204
+ };
205
+ }
206
+ return null;
207
+ }
208
+ /**
209
+ * Calculate the overall risk score and identify risk factors
210
+ * 計算總體風險評分並識別風險因素
211
+ *
212
+ * Evaluates multiple security dimensions:
213
+ * - Firewall status (max 25 points)
214
+ * - Admin account count (max 15 points)
215
+ * - Dangerous open ports (max 20 points)
216
+ * - Update status (max 15 points)
217
+ * - Security tool presence (max 25 points)
218
+ * - Password hygiene (max 10 points)
219
+ * - Service count (max 5 points)
220
+ *
221
+ * 評估多個安全面向:
222
+ * - 防火牆狀態(最高 25 分)
223
+ * - 管理員帳號數量(最高 15 分)
224
+ * - 危險開放埠(最高 20 分)
225
+ * - 更新狀態(最高 15 分)
226
+ * - 安全工具存在狀況(最高 25 分)
227
+ * - 密碼衛生(最高 10 分)
228
+ * - 服務數量(最高 5 分)
229
+ *
230
+ * @param result - Partial discovery result to evaluate / 要評估的部分偵察結果
231
+ * @returns Risk score (0-100) and identified risk factors / 風險評分(0-100)和已識別的風險因素
232
+ */
233
+ export function calculateRiskScore(result) {
234
+ const factors = [];
235
+ logger.info('Calculating risk score');
236
+ // Run all risk checks
237
+ // 執行所有風險檢查
238
+ const checks = [
239
+ checkFirewallRisk(result),
240
+ checkAdminRisk(result),
241
+ checkDangerousPortsRisk(result),
242
+ checkUpdateRisk(result),
243
+ checkSecurityToolsRisk(result),
244
+ checkDefaultPasswordRisk(result),
245
+ checkExcessiveServicesRisk(result),
246
+ ];
247
+ for (const check of checks) {
248
+ if (check !== null) {
249
+ factors.push(check);
250
+ }
251
+ }
252
+ // Sum up all factor scores, capped at 100
253
+ // 加總所有因素分數,上限為 100
254
+ const rawScore = factors.reduce((sum, f) => sum + f.score, 0);
255
+ const riskScore = Math.min(100, Math.max(0, rawScore));
256
+ logger.info(`Risk score calculated: ${riskScore}/100 with ${factors.length} risk factors`, {
257
+ factors: factors.map((f) => ({ category: f.category, score: f.score, severity: f.severity })),
258
+ });
259
+ return { riskScore, factors };
260
+ }
261
+ /**
262
+ * Map a numeric risk score to a severity level
263
+ * 將數值風險評分映射到嚴重性等級
264
+ *
265
+ * Score ranges:
266
+ * - 0-20: info (minimal risk / 最小風險)
267
+ * - 21-40: low (some concerns / 有一些問題)
268
+ * - 41-60: medium (moderate risk / 中等風險)
269
+ * - 61-80: high (significant risk / 重大風險)
270
+ * - 81-100: critical (severe risk / 嚴重風險)
271
+ *
272
+ * 評分範圍:
273
+ * - 0-20:info(最小風險)
274
+ * - 21-40:low(有一些問題)
275
+ * - 41-60:medium(中等風險)
276
+ * - 61-80:high(重大風險)
277
+ * - 81-100:critical(嚴重風險)
278
+ *
279
+ * @param score - Numeric risk score (0-100) / 數值風險評分(0-100)
280
+ * @returns Corresponding severity level / 對應的嚴重性等級
281
+ */
282
+ export function getRiskLevel(score) {
283
+ const clampedScore = Math.min(100, Math.max(0, score));
284
+ if (clampedScore <= 20)
285
+ return 'info';
286
+ if (clampedScore <= 40)
287
+ return 'low';
288
+ if (clampedScore <= 60)
289
+ return 'medium';
290
+ if (clampedScore <= 80)
291
+ return 'high';
292
+ return 'critical';
293
+ }
294
+ //# sourceMappingURL=risk-scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-scorer.js","sourceRoot":"","sources":["../../src/discovery/risk-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;AAErD;;;GAGG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,EAAE,EAAE,4CAA4C;IAChD,EAAE,EAAE,sCAAsC;IAC1C,GAAG,EAAE,4CAA4C;IACjD,IAAI,EAAE,oCAAoC;IAC1C,GAAG,EAAE,4CAA4C;IACjD,GAAG,EAAE,6CAA6C;IAClD,IAAI,EAAE,iCAAiC;IACvC,IAAI,EAAE,iCAAiC;IACvC,IAAI,EAAE,2CAA2C;IACjD,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,gDAAgD;IACvD,IAAI,EAAE,mCAAmC;CAC1C,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,MAAgC;IACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE,YAAY;YACtB,WAAW,EACT,kFAAkF;YACpF,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,qBAAqB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,SAAS,EAAE;SAC9E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,MAAgC;IACtD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAEzE,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,WAAW,EACT,yEAAyE;YAC3E,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,SAAS,UAAU,2DAA2D,MAAM,CAAC,QAAQ,CAAC,KAAK;iBACzG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;iBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;iBACtB,IAAI,CAAC,IAAI,CAAC,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,MAAgC;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,gEAAgE;YAC7E,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,yBAAyB,aAAa;iBAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,IAAI,SAAS,GAAG,CAAC;iBACjE,IAAI,CAAC,IAAI,CAAC,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,MAAgC;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;IACxC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC/D,CAAC;QACF,IAAI,cAAc,GAAG,EAAE,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,yBAAyB,cAAc,WAAW,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,qEAAqE;YAClF,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAAC,MAAgC;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE5E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EACT,qFAAqF;YACvF,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,MAAM;YAChB,OAAO,EACL,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;gBACtC,CAAC,CAAC,SAAS,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,yCAAyC;gBACxF,CAAC,CAAC,mEAAmE;SAC1E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wBAAwB,CAAC,MAAgC;IAChE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,GAAG,GAAG,CAC1D,CAAC;IAEF,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EACT,2FAA2F;YAC7F,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,GAAG,qBAAqB,CAAC,MAAM,gDAAgD,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAClJ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,0BAA0B,CAAC,MAAgC;IAClE,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAE9E,IAAI,eAAe,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAChC,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,WAAW,EACT,+EAA+E;YACjF,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,GAAG,eAAe,CAAC,MAAM,8EAA8E;SACjH,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgC;IAIjE,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAEtC,sBAAsB;IACtB,WAAW;IACX,MAAM,MAAM,GAAG;QACb,iBAAiB,CAAC,MAAM,CAAC;QACzB,cAAc,CAAC,MAAM,CAAC;QACtB,uBAAuB,CAAC,MAAM,CAAC;QAC/B,eAAe,CAAC,MAAM,CAAC;QACvB,sBAAsB,CAAC,MAAM,CAAC;QAC9B,wBAAwB,CAAC,MAAM,CAAC;QAChC,0BAA0B,CAAC,MAAM,CAAC;KACnC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,mBAAmB;IACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvD,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,aAAa,OAAO,CAAC,MAAM,eAAe,EAAE;QACzF,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;KAC9F,CAAC,CAAC;IAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAEvD,IAAI,YAAY,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,YAAY,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,YAAY,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,YAAY,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Security tool detection
3
+ * 安全工具偵測
4
+ *
5
+ * Detects installed and running security tools (antivirus, EDR, firewall,
6
+ * IDS, SIEM) by checking running processes, known service names, and
7
+ * common installation paths.
8
+ * 透過檢查執行中的行程、已知服務名稱和常見安裝路徑,偵測已安裝和執行中的安全工具
9
+ * (防毒、EDR、防火牆、IDS、SIEM)。
10
+ *
11
+ * @module @panguard-ai/core/discovery/security-tools
12
+ */
13
+ import type { SecurityTool, ServiceInfo } from './types.js';
14
+ /**
15
+ * Detect installed and running security tools on the system
16
+ * 偵測系統上已安裝和執行中的安全工具
17
+ *
18
+ * Detection methods:
19
+ * 1. Check running processes against known process names
20
+ * 2. Check service list against known service names
21
+ * 3. Check common installation paths
22
+ * 偵測方法:
23
+ * 1. 比對執行中行程與已知行程名稱
24
+ * 2. 比對服務列表與已知服務名稱
25
+ * 3. 檢查常見安裝路徑
26
+ *
27
+ * @param services - Previously detected services list / 先前偵測到的服務列表
28
+ * @returns Array of detected security tools / 偵測到的安全工具陣列
29
+ */
30
+ export declare function detectSecurityTools(services: ServiceInfo[]): Promise<SecurityTool[]>;
31
+ //# sourceMappingURL=security-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-tools.d.ts","sourceRoot":"","sources":["../../src/discovery/security-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAqR9E;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAgF1F"}