@nahisaho/musubix-security 1.8.0 → 1.8.1

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 (186) hide show
  1. package/README.md +27 -0
  2. package/dist/analyzers/ai/index.d.ts +6 -0
  3. package/dist/analyzers/ai/index.d.ts.map +1 -0
  4. package/dist/analyzers/ai/index.js +6 -0
  5. package/dist/analyzers/ai/index.js.map +1 -0
  6. package/dist/analyzers/ai/prompt-injection-detector.d.ts +152 -0
  7. package/dist/analyzers/ai/prompt-injection-detector.d.ts.map +1 -0
  8. package/dist/analyzers/ai/prompt-injection-detector.js +468 -0
  9. package/dist/analyzers/ai/prompt-injection-detector.js.map +1 -0
  10. package/dist/analyzers/api/api-security-analyzer.d.ts +263 -0
  11. package/dist/analyzers/api/api-security-analyzer.d.ts.map +1 -0
  12. package/dist/analyzers/api/api-security-analyzer.js +581 -0
  13. package/dist/analyzers/api/api-security-analyzer.js.map +1 -0
  14. package/dist/analyzers/compliance/compliance-checker.d.ts +201 -0
  15. package/dist/analyzers/compliance/compliance-checker.d.ts.map +1 -0
  16. package/dist/analyzers/compliance/compliance-checker.js +772 -0
  17. package/dist/analyzers/compliance/compliance-checker.js.map +1 -0
  18. package/dist/analyzers/container/image-scanner.d.ts +163 -0
  19. package/dist/analyzers/container/image-scanner.d.ts.map +1 -0
  20. package/dist/analyzers/container/image-scanner.js +459 -0
  21. package/dist/analyzers/container/image-scanner.js.map +1 -0
  22. package/dist/analyzers/container/index.d.ts +6 -0
  23. package/dist/analyzers/container/index.d.ts.map +1 -0
  24. package/dist/analyzers/container/index.js +6 -0
  25. package/dist/analyzers/container/index.js.map +1 -0
  26. package/dist/analyzers/dashboard/security-dashboard.d.ts +286 -0
  27. package/dist/analyzers/dashboard/security-dashboard.d.ts.map +1 -0
  28. package/dist/analyzers/dashboard/security-dashboard.js +796 -0
  29. package/dist/analyzers/dashboard/security-dashboard.js.map +1 -0
  30. package/dist/analyzers/iac/iac-checker.d.ts +124 -0
  31. package/dist/analyzers/iac/iac-checker.d.ts.map +1 -0
  32. package/dist/analyzers/iac/iac-checker.js +755 -0
  33. package/dist/analyzers/iac/iac-checker.js.map +1 -0
  34. package/dist/analyzers/iac/index.d.ts +6 -0
  35. package/dist/analyzers/iac/index.d.ts.map +1 -0
  36. package/dist/analyzers/iac/index.js +6 -0
  37. package/dist/analyzers/iac/index.js.map +1 -0
  38. package/dist/analyzers/index.d.ts +9 -0
  39. package/dist/analyzers/index.d.ts.map +1 -0
  40. package/dist/analyzers/index.js +13 -0
  41. package/dist/analyzers/index.js.map +1 -0
  42. package/dist/analyzers/monitor/realtime-monitor.d.ts +216 -0
  43. package/dist/analyzers/monitor/realtime-monitor.d.ts.map +1 -0
  44. package/dist/analyzers/monitor/realtime-monitor.js +601 -0
  45. package/dist/analyzers/monitor/realtime-monitor.js.map +1 -0
  46. package/dist/analyzers/sast/index.d.ts +7 -0
  47. package/dist/analyzers/sast/index.d.ts.map +1 -0
  48. package/dist/analyzers/sast/index.js +7 -0
  49. package/dist/analyzers/sast/index.js.map +1 -0
  50. package/dist/analyzers/sast/interprocedural-analyzer.d.ts +276 -0
  51. package/dist/analyzers/sast/interprocedural-analyzer.d.ts.map +1 -0
  52. package/dist/analyzers/sast/interprocedural-analyzer.js +635 -0
  53. package/dist/analyzers/sast/interprocedural-analyzer.js.map +1 -0
  54. package/dist/analyzers/sast/zero-day-detector.d.ts +183 -0
  55. package/dist/analyzers/sast/zero-day-detector.d.ts.map +1 -0
  56. package/dist/analyzers/sast/zero-day-detector.js +593 -0
  57. package/dist/analyzers/sast/zero-day-detector.js.map +1 -0
  58. package/dist/analyzers/sca/dependency-scanner.d.ts +275 -0
  59. package/dist/analyzers/sca/dependency-scanner.d.ts.map +1 -0
  60. package/dist/analyzers/sca/dependency-scanner.js +642 -0
  61. package/dist/analyzers/sca/dependency-scanner.js.map +1 -0
  62. package/dist/core/index.d.ts +8 -0
  63. package/dist/core/index.d.ts.map +1 -0
  64. package/dist/core/index.js +10 -0
  65. package/dist/core/index.js.map +1 -0
  66. package/dist/core/pipeline-manager.d.ts +105 -0
  67. package/dist/core/pipeline-manager.d.ts.map +1 -0
  68. package/dist/core/pipeline-manager.js +449 -0
  69. package/dist/core/pipeline-manager.js.map +1 -0
  70. package/dist/core/result-aggregator.d.ts +96 -0
  71. package/dist/core/result-aggregator.d.ts.map +1 -0
  72. package/dist/core/result-aggregator.js +462 -0
  73. package/dist/core/result-aggregator.js.map +1 -0
  74. package/dist/index.d.ts +15 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +68 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/integrations/ci-integration.d.ts +227 -0
  79. package/dist/integrations/ci-integration.d.ts.map +1 -0
  80. package/dist/integrations/ci-integration.js +472 -0
  81. package/dist/integrations/ci-integration.js.map +1 -0
  82. package/dist/integrations/git-hooks.d.ts +155 -0
  83. package/dist/integrations/git-hooks.d.ts.map +1 -0
  84. package/dist/integrations/git-hooks.js +425 -0
  85. package/dist/integrations/git-hooks.js.map +1 -0
  86. package/dist/integrations/index.d.ts +9 -0
  87. package/dist/integrations/index.d.ts.map +1 -0
  88. package/dist/integrations/index.js +9 -0
  89. package/dist/integrations/index.js.map +1 -0
  90. package/dist/integrations/report-aggregator.d.ts +250 -0
  91. package/dist/integrations/report-aggregator.d.ts.map +1 -0
  92. package/dist/integrations/report-aggregator.js +488 -0
  93. package/dist/integrations/report-aggregator.js.map +1 -0
  94. package/dist/integrations/vscode-integration.d.ts +245 -0
  95. package/dist/integrations/vscode-integration.d.ts.map +1 -0
  96. package/dist/integrations/vscode-integration.js +449 -0
  97. package/dist/integrations/vscode-integration.js.map +1 -0
  98. package/dist/intelligence/attack-pattern-matcher.d.ts +217 -0
  99. package/dist/intelligence/attack-pattern-matcher.d.ts.map +1 -0
  100. package/dist/intelligence/attack-pattern-matcher.js +887 -0
  101. package/dist/intelligence/attack-pattern-matcher.js.map +1 -0
  102. package/dist/intelligence/index.d.ts +12 -0
  103. package/dist/intelligence/index.d.ts.map +1 -0
  104. package/dist/intelligence/index.js +18 -0
  105. package/dist/intelligence/index.js.map +1 -0
  106. package/dist/intelligence/neuro-symbolic-core.d.ts +88 -0
  107. package/dist/intelligence/neuro-symbolic-core.d.ts.map +1 -0
  108. package/dist/intelligence/neuro-symbolic-core.js +403 -0
  109. package/dist/intelligence/neuro-symbolic-core.js.map +1 -0
  110. package/dist/intelligence/predictive-analyzer.d.ts +317 -0
  111. package/dist/intelligence/predictive-analyzer.d.ts.map +1 -0
  112. package/dist/intelligence/predictive-analyzer.js +714 -0
  113. package/dist/intelligence/predictive-analyzer.js.map +1 -0
  114. package/dist/intelligence/risk-scorer.d.ts +333 -0
  115. package/dist/intelligence/risk-scorer.d.ts.map +1 -0
  116. package/dist/intelligence/risk-scorer.js +824 -0
  117. package/dist/intelligence/risk-scorer.js.map +1 -0
  118. package/dist/intelligence/security-analytics.d.ts +349 -0
  119. package/dist/intelligence/security-analytics.d.ts.map +1 -0
  120. package/dist/intelligence/security-analytics.js +813 -0
  121. package/dist/intelligence/security-analytics.js.map +1 -0
  122. package/dist/intelligence/threat-intelligence.d.ts +288 -0
  123. package/dist/intelligence/threat-intelligence.d.ts.map +1 -0
  124. package/dist/intelligence/threat-intelligence.js +639 -0
  125. package/dist/intelligence/threat-intelligence.js.map +1 -0
  126. package/dist/policy/index.d.ts +6 -0
  127. package/dist/policy/index.d.ts.map +1 -0
  128. package/dist/policy/index.js +6 -0
  129. package/dist/policy/index.js.map +1 -0
  130. package/dist/policy/policy-engine.d.ts +254 -0
  131. package/dist/policy/policy-engine.d.ts.map +1 -0
  132. package/dist/policy/policy-engine.js +651 -0
  133. package/dist/policy/policy-engine.js.map +1 -0
  134. package/dist/remediation/auto-fixer.d.ts +179 -0
  135. package/dist/remediation/auto-fixer.d.ts.map +1 -0
  136. package/dist/remediation/auto-fixer.js +540 -0
  137. package/dist/remediation/auto-fixer.js.map +1 -0
  138. package/dist/remediation/fix-validator.d.ts +195 -0
  139. package/dist/remediation/fix-validator.d.ts.map +1 -0
  140. package/dist/remediation/fix-validator.js +462 -0
  141. package/dist/remediation/fix-validator.js.map +1 -0
  142. package/dist/remediation/index.d.ts +10 -0
  143. package/dist/remediation/index.d.ts.map +1 -0
  144. package/dist/remediation/index.js +15 -0
  145. package/dist/remediation/index.js.map +1 -0
  146. package/dist/remediation/patch-generator.d.ts +203 -0
  147. package/dist/remediation/patch-generator.d.ts.map +1 -0
  148. package/dist/remediation/patch-generator.js +533 -0
  149. package/dist/remediation/patch-generator.js.map +1 -0
  150. package/dist/remediation/remediation-planner.d.ts +262 -0
  151. package/dist/remediation/remediation-planner.d.ts.map +1 -0
  152. package/dist/remediation/remediation-planner.js +531 -0
  153. package/dist/remediation/remediation-planner.js.map +1 -0
  154. package/dist/remediation/secure-code-transformer.d.ts +222 -0
  155. package/dist/remediation/secure-code-transformer.d.ts.map +1 -0
  156. package/dist/remediation/secure-code-transformer.js +625 -0
  157. package/dist/remediation/secure-code-transformer.js.map +1 -0
  158. package/dist/types/fix.d.ts +3 -1
  159. package/dist/types/fix.d.ts.map +1 -1
  160. package/dist/types/index.d.ts +6 -0
  161. package/dist/types/index.d.ts.map +1 -1
  162. package/dist/types/index.js +1 -0
  163. package/dist/types/index.js.map +1 -1
  164. package/dist/types/interprocedural.d.ts +203 -0
  165. package/dist/types/interprocedural.d.ts.map +1 -0
  166. package/dist/types/interprocedural.js +7 -0
  167. package/dist/types/interprocedural.js.map +1 -0
  168. package/dist/types/neuro-symbolic.d.ts +179 -0
  169. package/dist/types/neuro-symbolic.d.ts.map +1 -0
  170. package/dist/types/neuro-symbolic.js +7 -0
  171. package/dist/types/neuro-symbolic.js.map +1 -0
  172. package/dist/types/pipeline.d.ts +173 -0
  173. package/dist/types/pipeline.d.ts.map +1 -0
  174. package/dist/types/pipeline.js +7 -0
  175. package/dist/types/pipeline.js.map +1 -0
  176. package/dist/types/result.d.ts +134 -0
  177. package/dist/types/result.d.ts.map +1 -0
  178. package/dist/types/result.js +25 -0
  179. package/dist/types/result.js.map +1 -0
  180. package/dist/types/vulnerability.d.ts +2 -2
  181. package/dist/types/vulnerability.d.ts.map +1 -1
  182. package/dist/types/zero-day.d.ts +146 -0
  183. package/dist/types/zero-day.d.ts.map +1 -0
  184. package/dist/types/zero-day.js +7 -0
  185. package/dist/types/zero-day.js.map +1 -0
  186. package/package.json +2 -2
@@ -0,0 +1,593 @@
1
+ /**
2
+ * @fileoverview Zero-Day Vulnerability Detector using Knowledge Graph Pattern Deviation
3
+ * @module @nahisaho/musubix-security/analyzers/sast/zero-day-detector
4
+ * @trace DES-SEC2-SAST-003, REQ-SEC2-SAST-003
5
+ */
6
+ /**
7
+ * Built-in suspicious patterns to detect
8
+ */
9
+ const SUSPICIOUS_PATTERNS = [
10
+ {
11
+ id: 'ZD-001',
12
+ name: 'Unusual Prototype Access',
13
+ regex: /\[['"`]__proto__['"`]\]|\[['"`]constructor['"`]\]\.prototype/,
14
+ severity: 'high',
15
+ description: 'Unusual prototype chain manipulation detected',
16
+ },
17
+ {
18
+ id: 'ZD-002',
19
+ name: 'Dynamic Function Construction',
20
+ regex: /new\s+Function\s*\([^)]*\+|Function\s*\(\s*[^)]*\+/,
21
+ severity: 'critical',
22
+ description: 'Dynamic function construction with concatenation',
23
+ },
24
+ {
25
+ id: 'ZD-003',
26
+ name: 'Unusual Serialization',
27
+ regex: /serialize.*deserialize|pickle\.loads|yaml\.load\s*\(/,
28
+ severity: 'high',
29
+ description: 'Potentially unsafe serialization/deserialization',
30
+ },
31
+ {
32
+ id: 'ZD-004',
33
+ name: 'Reflection Abuse',
34
+ regex: /getattr\s*\([^)]*,\s*[^'"]|__getattribute__|__class__\.__bases__/,
35
+ severity: 'medium',
36
+ description: 'Dynamic attribute access with variable input',
37
+ },
38
+ {
39
+ id: 'ZD-005',
40
+ name: 'Memory Manipulation',
41
+ regex: /ctypes\.memmove|struct\.pack.*\*|buffer\.write\s*\([^)]*\+/,
42
+ severity: 'critical',
43
+ description: 'Direct memory manipulation detected',
44
+ },
45
+ {
46
+ id: 'ZD-006',
47
+ name: 'Unusual Process Creation',
48
+ regex: /subprocess\.Popen\s*\([^)]*shell\s*=\s*True|os\.system\s*\([^)]*\+/,
49
+ severity: 'high',
50
+ description: 'Dynamic command execution detected',
51
+ },
52
+ {
53
+ id: 'ZD-007',
54
+ name: 'Type Confusion Pattern',
55
+ regex: /type\s*\([^)]+\)\s*!=|isinstance.*not|__class__\s*=\s*/,
56
+ severity: 'medium',
57
+ description: 'Potential type confusion vulnerability',
58
+ },
59
+ {
60
+ id: 'ZD-008',
61
+ name: 'Race Condition Pattern',
62
+ regex: /if\s+os\.path\.exists.*open\(|check.*then.*use|toctou/i,
63
+ severity: 'medium',
64
+ description: 'Time-of-check to time-of-use (TOCTOU) pattern',
65
+ },
66
+ {
67
+ id: 'ZD-009',
68
+ name: 'Integer Overflow Pattern',
69
+ regex: /<<\s*\d{2,}|\*\s*\d{10,}|parseInt.*\*.*parseInt/,
70
+ severity: 'medium',
71
+ description: 'Potential integer overflow vulnerability',
72
+ },
73
+ {
74
+ id: 'ZD-010',
75
+ name: 'Cryptographic Weakness',
76
+ regex: /MD5|SHA1\s*\(|DES|RC4|ECB|random\.random\s*\(\)|Math\.random\s*\(\).*key/i,
77
+ severity: 'high',
78
+ description: 'Weak cryptographic primitive detected',
79
+ },
80
+ ];
81
+ /**
82
+ * Zero-Day Detector implementation
83
+ * @trace DES-SEC2-SAST-003
84
+ */
85
+ export class ZeroDayDetector {
86
+ options;
87
+ knowledgeGraph;
88
+ // Reserved for future use with custom baseline patterns
89
+ // private baselinePatterns: CodePattern[];
90
+ constructor(options = {}) {
91
+ this.options = {
92
+ minDeviationScore: options.minDeviationScore ?? 0.6,
93
+ enableKGAnalysis: options.enableKGAnalysis ?? true,
94
+ enableHeuristics: options.enableHeuristics ?? true,
95
+ enableLLMAnalysis: options.enableLLMAnalysis ?? false,
96
+ };
97
+ this.knowledgeGraph = new Map();
98
+ // Reserved for custom baseline patterns
99
+ // this.baselinePatterns = options.customBaseline ?? [];
100
+ }
101
+ /**
102
+ * Detect potential zero-day vulnerabilities
103
+ * @trace REQ-SEC2-SAST-003
104
+ */
105
+ async detect(code, filePath) {
106
+ const results = [];
107
+ const lines = code.split('\n');
108
+ // Build local knowledge graph
109
+ this.buildLocalKnowledgeGraph(code, filePath);
110
+ // Pattern-based detection
111
+ if (this.options.enableHeuristics) {
112
+ const heuristicResults = this.detectSuspiciousPatterns(code, lines, filePath);
113
+ results.push(...heuristicResults);
114
+ }
115
+ // Knowledge graph deviation analysis
116
+ if (this.options.enableKGAnalysis) {
117
+ const deviationResults = this.analyzePatternDeviation(code, lines, filePath);
118
+ results.push(...deviationResults);
119
+ }
120
+ // LLM-assisted analysis (if enabled)
121
+ if (this.options.enableLLMAnalysis) {
122
+ const llmResults = await this.analyzeWithLLM(code, filePath);
123
+ results.push(...llmResults);
124
+ }
125
+ // Filter by minimum deviation score
126
+ return results.filter(r => r.deviation.deviationScore >= (this.options.minDeviationScore ?? 0.6));
127
+ }
128
+ /**
129
+ * Build local knowledge graph from code
130
+ */
131
+ buildLocalKnowledgeGraph(code, filePath) {
132
+ // Extract functions
133
+ const functionPattern = /(?:function\s+(\w+)|const\s+(\w+)\s*=\s*(?:async\s*)?\(|(\w+)\s*\([^)]*\)\s*{)/g;
134
+ let match;
135
+ while ((match = functionPattern.exec(code)) !== null) {
136
+ const name = match[1] ?? match[2] ?? match[3];
137
+ const lineNum = code.substring(0, match.index).split('\n').length;
138
+ const node = {
139
+ id: `${filePath}:${name}`,
140
+ type: 'function',
141
+ name,
142
+ properties: { line: lineNum, file: filePath },
143
+ edges: [],
144
+ };
145
+ // Find function calls within this function
146
+ const functionBody = this.extractFunctionBody(code, match.index);
147
+ const callPattern = /(\w+)\s*\(/g;
148
+ let callMatch;
149
+ while ((callMatch = callPattern.exec(functionBody)) !== null) {
150
+ if (!['if', 'while', 'for', 'switch', 'function', 'catch'].includes(callMatch[1])) {
151
+ node.edges.push({
152
+ target: callMatch[1],
153
+ relation: 'calls',
154
+ weight: 1,
155
+ });
156
+ }
157
+ }
158
+ this.knowledgeGraph.set(node.id, node);
159
+ }
160
+ // Extract classes
161
+ const classPattern = /class\s+(\w+)(?:\s+extends\s+(\w+))?/g;
162
+ while ((match = classPattern.exec(code)) !== null) {
163
+ const className = match[1];
164
+ const parentClass = match[2];
165
+ const node = {
166
+ id: `${filePath}:${className}`,
167
+ type: 'class',
168
+ name: className,
169
+ properties: { file: filePath },
170
+ edges: [],
171
+ };
172
+ if (parentClass) {
173
+ node.edges.push({
174
+ target: parentClass,
175
+ relation: 'inherits',
176
+ weight: 1,
177
+ });
178
+ }
179
+ this.knowledgeGraph.set(node.id, node);
180
+ }
181
+ }
182
+ /**
183
+ * Extract function body from code
184
+ */
185
+ extractFunctionBody(code, startIndex) {
186
+ let depth = 0;
187
+ let inString = false;
188
+ let stringChar = '';
189
+ let bodyStart = -1;
190
+ for (let i = startIndex; i < code.length; i++) {
191
+ const char = code[i];
192
+ const prevChar = code[i - 1];
193
+ if (!inString) {
194
+ if (char === '"' || char === "'" || char === '`') {
195
+ inString = true;
196
+ stringChar = char;
197
+ }
198
+ else if (char === '{') {
199
+ if (depth === 0)
200
+ bodyStart = i;
201
+ depth++;
202
+ }
203
+ else if (char === '}') {
204
+ depth--;
205
+ if (depth === 0) {
206
+ return code.substring(bodyStart, i + 1);
207
+ }
208
+ }
209
+ }
210
+ else {
211
+ if (char === stringChar && prevChar !== '\\') {
212
+ inString = false;
213
+ }
214
+ }
215
+ }
216
+ return code.substring(startIndex, Math.min(startIndex + 500, code.length));
217
+ }
218
+ /**
219
+ * Detect suspicious patterns using heuristics
220
+ */
221
+ detectSuspiciousPatterns(code, lines, filePath) {
222
+ const results = [];
223
+ for (const pattern of SUSPICIOUS_PATTERNS) {
224
+ const globalPattern = new RegExp(pattern.regex.source, 'gm');
225
+ let match;
226
+ while ((match = globalPattern.exec(code)) !== null) {
227
+ const lineNum = code.substring(0, match.index).split('\n').length;
228
+ const lineContent = lines[lineNum - 1] ?? '';
229
+ // Calculate deviation score based on context
230
+ const deviationScore = this.calculateDeviationScore(code, match.index, pattern);
231
+ const result = {
232
+ vulnerability: {
233
+ id: `${pattern.id}-${lineNum}`,
234
+ type: 'suspicious-construct',
235
+ severity: pattern.severity,
236
+ location: {
237
+ file: filePath,
238
+ startLine: lineNum,
239
+ endLine: lineNum,
240
+ startColumn: 0,
241
+ endColumn: lineContent.length,
242
+ },
243
+ description: pattern.description,
244
+ recommendation: this.generateRecommendation(pattern),
245
+ codeSnippet: this.extractCodeSnippet(lines, lineNum),
246
+ },
247
+ deviation: {
248
+ patternId: pattern.id,
249
+ expectedPattern: 'standard/safe implementation',
250
+ observedPattern: match[0],
251
+ deviationScore,
252
+ deviationType: 'structural',
253
+ context: {
254
+ surroundingCode: this.extractCodeSnippet(lines, lineNum),
255
+ callStack: this.extractCallStack(code, match.index),
256
+ dataFlowPath: this.extractDataFlowPath(code, match.index),
257
+ relatedPatterns: [],
258
+ },
259
+ },
260
+ riskAssessment: this.assessRisk(pattern, deviationScore),
261
+ confidence: deviationScore,
262
+ };
263
+ results.push(result);
264
+ }
265
+ }
266
+ return results;
267
+ }
268
+ /**
269
+ * Analyze pattern deviation using knowledge graph
270
+ */
271
+ analyzePatternDeviation(code, lines, filePath) {
272
+ const results = [];
273
+ // Analyze API usage patterns
274
+ const apiUsageDeviations = this.detectAPIUsageDeviations(code, lines, filePath);
275
+ results.push(...apiUsageDeviations);
276
+ // Analyze data flow anomalies
277
+ const dataFlowDeviations = this.detectDataFlowAnomalies(code, lines, filePath);
278
+ results.push(...dataFlowDeviations);
279
+ return results;
280
+ }
281
+ /**
282
+ * Detect unusual API usage patterns
283
+ */
284
+ detectAPIUsageDeviations(code, lines, filePath) {
285
+ const results = [];
286
+ // Check for unusual API combinations
287
+ const dangerousAPICombinations = [
288
+ { apis: ['eval', 'JSON.parse'], description: 'eval with JSON parsing' },
289
+ { apis: ['innerHTML', 'fetch'], description: 'fetch result to innerHTML' },
290
+ { apis: ['exec', 'req.body'], description: 'user input to command execution' },
291
+ { apis: ['query', 'req.params'], description: 'user params to database query' },
292
+ ];
293
+ for (const combo of dangerousAPICombinations) {
294
+ const hasAllAPIs = combo.apis.every(api => code.includes(api));
295
+ if (hasAllAPIs) {
296
+ // Find the location of the first API
297
+ const firstApiIndex = code.indexOf(combo.apis[0]);
298
+ const lineNum = code.substring(0, firstApiIndex).split('\n').length;
299
+ results.push({
300
+ vulnerability: {
301
+ id: `ZD-API-${lineNum}`,
302
+ type: 'unusual-api-usage',
303
+ severity: 'high',
304
+ location: {
305
+ file: filePath,
306
+ startLine: lineNum,
307
+ endLine: lineNum,
308
+ startColumn: 0,
309
+ endColumn: lines[lineNum - 1]?.length ?? 0,
310
+ },
311
+ description: `Dangerous API combination detected: ${combo.description}`,
312
+ recommendation: 'Review the data flow between these APIs and add appropriate validation',
313
+ codeSnippet: this.extractCodeSnippet(lines, lineNum),
314
+ },
315
+ deviation: {
316
+ patternId: 'ZD-API-COMBO',
317
+ expectedPattern: 'Validated data flow between APIs',
318
+ observedPattern: combo.apis.join(' -> '),
319
+ deviationScore: 0.8,
320
+ deviationType: 'behavioral',
321
+ context: {
322
+ surroundingCode: this.extractCodeSnippet(lines, lineNum),
323
+ callStack: [],
324
+ dataFlowPath: combo.apis,
325
+ relatedPatterns: [],
326
+ },
327
+ },
328
+ riskAssessment: {
329
+ overallRisk: 'high',
330
+ exploitability: 0.7,
331
+ impact: 0.8,
332
+ attackVector: 'Network',
333
+ mitigationComplexity: 'medium',
334
+ businessImpact: 'Data compromise or code execution',
335
+ },
336
+ confidence: 0.75,
337
+ });
338
+ }
339
+ }
340
+ return results;
341
+ }
342
+ /**
343
+ * Detect data flow anomalies
344
+ */
345
+ detectDataFlowAnomalies(code, lines, filePath) {
346
+ const results = [];
347
+ // Detect unusual data flow patterns
348
+ const anomalousPatterns = [
349
+ {
350
+ pattern: /(\w+)\s*=\s*req\.(body|query|params)\s*[^;]*;\s*[^]*?\1\s*\+/,
351
+ type: 'anomalous-flow',
352
+ description: 'User input used in string concatenation',
353
+ },
354
+ {
355
+ pattern: /return\s+\{[^}]*password[^}]*\}/i,
356
+ type: 'anomalous-flow',
357
+ description: 'Potential credential leakage in return value',
358
+ },
359
+ {
360
+ pattern: /catch\s*\([^)]*\)\s*{\s*}/,
361
+ type: 'suspicious-construct',
362
+ description: 'Empty catch block suppressing errors',
363
+ },
364
+ ];
365
+ for (const anomaly of anomalousPatterns) {
366
+ const match = code.match(anomaly.pattern);
367
+ if (match) {
368
+ const lineNum = code.substring(0, match.index ?? 0).split('\n').length;
369
+ results.push({
370
+ vulnerability: {
371
+ id: `ZD-FLOW-${lineNum}`,
372
+ type: anomaly.type,
373
+ severity: 'medium',
374
+ location: {
375
+ file: filePath,
376
+ startLine: lineNum,
377
+ endLine: lineNum,
378
+ startColumn: 0,
379
+ endColumn: lines[lineNum - 1]?.length ?? 0,
380
+ },
381
+ description: anomaly.description,
382
+ recommendation: 'Review data flow and add appropriate validation',
383
+ codeSnippet: this.extractCodeSnippet(lines, lineNum),
384
+ },
385
+ deviation: {
386
+ patternId: 'ZD-FLOW',
387
+ expectedPattern: 'Validated data transformation',
388
+ observedPattern: match[0].substring(0, 100),
389
+ deviationScore: 0.65,
390
+ deviationType: 'behavioral',
391
+ context: {
392
+ surroundingCode: this.extractCodeSnippet(lines, lineNum),
393
+ callStack: [],
394
+ dataFlowPath: [],
395
+ relatedPatterns: [],
396
+ },
397
+ },
398
+ riskAssessment: {
399
+ overallRisk: 'medium',
400
+ exploitability: 0.5,
401
+ impact: 0.6,
402
+ attackVector: 'Network',
403
+ mitigationComplexity: 'low',
404
+ businessImpact: 'Potential data exposure',
405
+ },
406
+ confidence: 0.6,
407
+ });
408
+ }
409
+ }
410
+ return results;
411
+ }
412
+ /**
413
+ * LLM-assisted analysis (placeholder for future implementation)
414
+ */
415
+ async analyzeWithLLM(_code, _filePath) {
416
+ // This would integrate with LLM APIs for advanced analysis
417
+ // Currently returns empty array as placeholder
418
+ return [];
419
+ }
420
+ /**
421
+ * Assess risk for a detected pattern
422
+ */
423
+ assessRisk(pattern, deviationScore) {
424
+ const severityToExploitability = {
425
+ critical: 0.9,
426
+ high: 0.7,
427
+ medium: 0.5,
428
+ low: 0.3,
429
+ info: 0.1,
430
+ };
431
+ const severityToImpact = {
432
+ critical: 0.95,
433
+ high: 0.8,
434
+ medium: 0.6,
435
+ low: 0.4,
436
+ info: 0.2,
437
+ };
438
+ return {
439
+ overallRisk: pattern.severity,
440
+ exploitability: severityToExploitability[pattern.severity] * deviationScore,
441
+ impact: severityToImpact[pattern.severity],
442
+ attackVector: this.determineAttackVector(pattern.description),
443
+ mitigationComplexity: this.determineMitigationComplexity(pattern.severity),
444
+ businessImpact: this.determineBusinessImpact(pattern.severity),
445
+ };
446
+ }
447
+ /**
448
+ * Calculate deviation score based on context
449
+ */
450
+ calculateDeviationScore(code, matchIndex, pattern) {
451
+ let score = 0.5;
452
+ // Increase score based on severity
453
+ const severityBonus = {
454
+ critical: 0.3,
455
+ high: 0.2,
456
+ medium: 0.1,
457
+ low: 0.05,
458
+ info: 0,
459
+ };
460
+ score += severityBonus[pattern.severity];
461
+ // Check if in sensitive context
462
+ const beforeContext = code.substring(Math.max(0, matchIndex - 200), matchIndex).toLowerCase();
463
+ if (beforeContext.includes('user') || beforeContext.includes('input') || beforeContext.includes('req.')) {
464
+ score += 0.15;
465
+ }
466
+ // Check if near network operations
467
+ if (beforeContext.includes('fetch') || beforeContext.includes('http') || beforeContext.includes('request')) {
468
+ score += 0.1;
469
+ }
470
+ return Math.min(score, 1);
471
+ }
472
+ /**
473
+ * Generate recommendation for pattern
474
+ */
475
+ generateRecommendation(pattern) {
476
+ const recommendations = {
477
+ 'ZD-001': 'Avoid direct prototype manipulation. Use Object.create() or class inheritance.',
478
+ 'ZD-002': 'Use static function definitions instead of dynamic construction.',
479
+ 'ZD-003': 'Use safe serialization methods with type validation.',
480
+ 'ZD-004': 'Use explicit attribute access with whitelist validation.',
481
+ 'ZD-005': 'Avoid direct memory manipulation. Use safe buffer APIs.',
482
+ 'ZD-006': 'Use parameterized commands and avoid shell=True.',
483
+ 'ZD-007': 'Use strict type checking with TypeScript or runtime validation.',
484
+ 'ZD-008': 'Use atomic file operations or implement proper locking.',
485
+ 'ZD-009': 'Use BigInt for large numbers and validate numeric inputs.',
486
+ 'ZD-010': 'Use strong cryptographic primitives (SHA-256+, AES-256-GCM).',
487
+ };
488
+ return recommendations[pattern.id] ?? 'Review and refactor this code pattern.';
489
+ }
490
+ /**
491
+ * Extract code snippet around line
492
+ */
493
+ extractCodeSnippet(lines, lineNum) {
494
+ const start = Math.max(0, lineNum - 3);
495
+ const end = Math.min(lines.length, lineNum + 3);
496
+ return lines.slice(start, end).join('\n');
497
+ }
498
+ /**
499
+ * Extract call stack from context
500
+ */
501
+ extractCallStack(code, index) {
502
+ const stack = [];
503
+ const beforeCode = code.substring(0, index);
504
+ // Find enclosing function
505
+ const functionMatch = beforeCode.match(/function\s+(\w+)|const\s+(\w+)\s*=\s*(?:async\s*)?\(/g);
506
+ if (functionMatch) {
507
+ const lastMatch = functionMatch[functionMatch.length - 1];
508
+ const nameMatch = lastMatch.match(/function\s+(\w+)|const\s+(\w+)/);
509
+ if (nameMatch) {
510
+ stack.push(nameMatch[1] ?? nameMatch[2]);
511
+ }
512
+ }
513
+ return stack;
514
+ }
515
+ /**
516
+ * Extract data flow path
517
+ */
518
+ extractDataFlowPath(code, index) {
519
+ const path = [];
520
+ const context = code.substring(Math.max(0, index - 300), Math.min(code.length, index + 100));
521
+ // Look for variable assignments leading to this point
522
+ const assignments = context.match(/(\w+)\s*=\s*[^;]+/g) ?? [];
523
+ for (const assignment of assignments) {
524
+ const varName = assignment.split('=')[0].trim();
525
+ if (varName && varName.length < 30) {
526
+ path.push(varName);
527
+ }
528
+ }
529
+ return path.slice(-5); // Last 5 assignments
530
+ }
531
+ /**
532
+ * Determine attack vector
533
+ */
534
+ determineAttackVector(description) {
535
+ const desc = description.toLowerCase();
536
+ if (desc.includes('network') || desc.includes('request'))
537
+ return 'Network';
538
+ if (desc.includes('file') || desc.includes('path'))
539
+ return 'Local';
540
+ if (desc.includes('user') || desc.includes('input'))
541
+ return 'Adjacent';
542
+ return 'Network';
543
+ }
544
+ /**
545
+ * Determine mitigation complexity
546
+ */
547
+ determineMitigationComplexity(severity) {
548
+ if (severity === 'critical')
549
+ return 'high';
550
+ if (severity === 'high')
551
+ return 'medium';
552
+ return 'low';
553
+ }
554
+ /**
555
+ * Determine business impact
556
+ */
557
+ determineBusinessImpact(severity) {
558
+ const impacts = {
559
+ critical: 'Complete system compromise, data breach, or service disruption',
560
+ high: 'Significant data exposure or system access',
561
+ medium: 'Limited data exposure or service degradation',
562
+ low: 'Minor security weakness',
563
+ info: 'Informational finding',
564
+ };
565
+ return impacts[severity];
566
+ }
567
+ /**
568
+ * Convert results to standard vulnerability format
569
+ */
570
+ toVulnerabilities(results) {
571
+ return results.map(result => ({
572
+ id: result.vulnerability.id,
573
+ type: 'zero-day',
574
+ severity: result.vulnerability.severity,
575
+ cwes: ['CWE-Unknown'],
576
+ owasp: ['A00:Unknown'],
577
+ location: result.vulnerability.location,
578
+ description: result.vulnerability.description,
579
+ recommendation: result.vulnerability.recommendation,
580
+ confidence: result.confidence,
581
+ ruleId: result.deviation.patternId,
582
+ codeSnippet: result.vulnerability.codeSnippet,
583
+ detectedAt: new Date(),
584
+ }));
585
+ }
586
+ }
587
+ /**
588
+ * Create zero-day detector instance
589
+ */
590
+ export function createZeroDayDetector(options) {
591
+ return new ZeroDayDetector(options);
592
+ }
593
+ //# sourceMappingURL=zero-day-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero-day-detector.js","sourceRoot":"","sources":["../../../src/analyzers/sast/zero-day-detector.ts"],"names":[],"mappings":"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"}