@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,625 @@
1
+ /**
2
+ * @fileoverview Secure Code Transformer
3
+ * @module @nahisaho/musubix-security/remediation/secure-code-transformer
4
+ *
5
+ * Transforms insecure code patterns into secure alternatives using
6
+ * AST-based transformations and secure coding patterns.
7
+ */
8
+ // ============================================================================
9
+ // Built-in Transformations
10
+ // ============================================================================
11
+ const BUILT_IN_TRANSFORMATIONS = [
12
+ // Input Validation
13
+ {
14
+ id: 'transform-escape-html',
15
+ name: 'Escape HTML Output',
16
+ category: 'output-encoding',
17
+ pattern: {
18
+ type: 'regex',
19
+ value: 'innerHTML\\s*=\\s*([^;]+)',
20
+ flags: 'g',
21
+ },
22
+ replacement: {
23
+ type: 'template',
24
+ value: 'textContent = $1',
25
+ captures: { '1': 'content' },
26
+ },
27
+ description: 'Replace innerHTML with textContent to prevent XSS',
28
+ riskLevel: 'safe',
29
+ languages: ['javascript', 'typescript'],
30
+ },
31
+ {
32
+ id: 'transform-encode-uri',
33
+ name: 'Encode URI Components',
34
+ category: 'output-encoding',
35
+ pattern: {
36
+ type: 'regex',
37
+ value: '(["\'])\\s*\\+\\s*(\\w+)\\s*\\+\\s*(["\'])',
38
+ flags: 'g',
39
+ },
40
+ replacement: {
41
+ type: 'template',
42
+ value: '$1 + encodeURIComponent($2) + $3',
43
+ },
44
+ description: 'Encode user input in URL contexts',
45
+ riskLevel: 'caution',
46
+ languages: ['javascript', 'typescript'],
47
+ },
48
+ // SQL Injection
49
+ {
50
+ id: 'transform-parameterized-query',
51
+ name: 'Use Parameterized Queries',
52
+ category: 'input-validation',
53
+ pattern: {
54
+ type: 'regex',
55
+ value: 'query\\(\\s*[`"\']SELECT\\s+.+\\$\\{([^}]+)\\}',
56
+ flags: 'gi',
57
+ },
58
+ replacement: {
59
+ type: 'template',
60
+ value: 'query("SELECT ... WHERE column = $1", [$1])',
61
+ wrapExisting: true,
62
+ },
63
+ description: 'Convert string interpolation to parameterized queries',
64
+ riskLevel: 'review-required',
65
+ languages: ['javascript', 'typescript'],
66
+ },
67
+ // Cryptography
68
+ {
69
+ id: 'transform-md5-to-sha256',
70
+ name: 'Replace MD5 with SHA-256',
71
+ category: 'cryptography',
72
+ pattern: {
73
+ type: 'function-call',
74
+ value: "createHash('md5')",
75
+ },
76
+ replacement: {
77
+ type: 'template',
78
+ value: "createHash('sha256')",
79
+ },
80
+ description: 'Replace weak MD5 hash with SHA-256',
81
+ riskLevel: 'safe',
82
+ languages: ['javascript', 'typescript'],
83
+ },
84
+ {
85
+ id: 'transform-sha1-to-sha256',
86
+ name: 'Replace SHA-1 with SHA-256',
87
+ category: 'cryptography',
88
+ pattern: {
89
+ type: 'function-call',
90
+ value: "createHash('sha1')",
91
+ },
92
+ replacement: {
93
+ type: 'template',
94
+ value: "createHash('sha256')",
95
+ },
96
+ description: 'Replace weak SHA-1 hash with SHA-256',
97
+ riskLevel: 'safe',
98
+ languages: ['javascript', 'typescript'],
99
+ },
100
+ {
101
+ id: 'transform-math-random',
102
+ name: 'Replace Math.random with crypto',
103
+ category: 'cryptography',
104
+ pattern: {
105
+ type: 'function-call',
106
+ value: 'Math.random()',
107
+ },
108
+ replacement: {
109
+ type: 'snippet',
110
+ value: 'crypto.randomBytes(16).toString("hex")',
111
+ },
112
+ description: 'Replace insecure Math.random() with cryptographic random',
113
+ riskLevel: 'caution',
114
+ languages: ['javascript', 'typescript'],
115
+ imports: [{ module: 'crypto', named: ['randomBytes'] }],
116
+ },
117
+ // Path Traversal
118
+ {
119
+ id: 'transform-path-normalize',
120
+ name: 'Normalize File Paths',
121
+ category: 'input-validation',
122
+ pattern: {
123
+ type: 'regex',
124
+ value: 'readFile(?:Sync)?\\(\\s*([^,)]+)',
125
+ flags: 'g',
126
+ },
127
+ replacement: {
128
+ type: 'template',
129
+ value: 'readFile(path.normalize(path.join(baseDir, path.basename($1)))',
130
+ },
131
+ description: 'Normalize paths to prevent traversal',
132
+ riskLevel: 'review-required',
133
+ languages: ['javascript', 'typescript'],
134
+ imports: [{ module: 'path', default: 'path' }],
135
+ },
136
+ // Error Handling
137
+ {
138
+ id: 'transform-generic-error',
139
+ name: 'Use Generic Error Messages',
140
+ category: 'error-handling',
141
+ pattern: {
142
+ type: 'regex',
143
+ value: 'res\\.send\\(err\\.message\\)',
144
+ flags: 'g',
145
+ },
146
+ replacement: {
147
+ type: 'template',
148
+ value: 'res.send("An error occurred")',
149
+ },
150
+ description: 'Prevent error message information disclosure',
151
+ riskLevel: 'safe',
152
+ languages: ['javascript', 'typescript'],
153
+ },
154
+ {
155
+ id: 'transform-error-stack',
156
+ name: 'Remove Stack Traces from Responses',
157
+ category: 'error-handling',
158
+ pattern: {
159
+ type: 'regex',
160
+ value: 'res\\.(json|send)\\(.*err\\.stack.*\\)',
161
+ flags: 'g',
162
+ },
163
+ replacement: {
164
+ type: 'template',
165
+ value: 'res.$1({ error: "Internal server error" })',
166
+ },
167
+ description: 'Prevent stack trace information disclosure',
168
+ riskLevel: 'safe',
169
+ languages: ['javascript', 'typescript'],
170
+ },
171
+ // Data Protection
172
+ {
173
+ id: 'transform-hardcoded-secret',
174
+ name: 'Move Secrets to Environment Variables',
175
+ category: 'data-protection',
176
+ pattern: {
177
+ type: 'regex',
178
+ value: '(const|let|var)\\s+(\\w*(?:secret|key|password|token|api_key)\\w*)\\s*=\\s*["\']([^"\']+)["\']',
179
+ flags: 'gi',
180
+ },
181
+ replacement: {
182
+ type: 'template',
183
+ value: '$1 $2 = process.env.$2 || ""',
184
+ captures: { '2': 'varName' },
185
+ },
186
+ description: 'Move hardcoded secrets to environment variables',
187
+ riskLevel: 'review-required',
188
+ languages: ['javascript', 'typescript'],
189
+ },
190
+ // Session Management
191
+ {
192
+ id: 'transform-cookie-httponly',
193
+ name: 'Add HttpOnly to Cookies',
194
+ category: 'session-management',
195
+ pattern: {
196
+ type: 'regex',
197
+ value: 'cookie\\(["\']([^"\']+)["\'],\\s*([^,)]+)\\)',
198
+ flags: 'g',
199
+ },
200
+ replacement: {
201
+ type: 'template',
202
+ value: 'cookie("$1", $2, { httpOnly: true, secure: true })',
203
+ },
204
+ description: 'Add HttpOnly and Secure flags to cookies',
205
+ riskLevel: 'safe',
206
+ languages: ['javascript', 'typescript'],
207
+ },
208
+ // Logging
209
+ {
210
+ id: 'transform-sanitize-logs',
211
+ name: 'Sanitize Sensitive Data in Logs',
212
+ category: 'logging',
213
+ pattern: {
214
+ type: 'regex',
215
+ value: 'console\\.log\\(.*(?:password|secret|token|key).*\\)',
216
+ flags: 'gi',
217
+ },
218
+ replacement: {
219
+ type: 'template',
220
+ value: 'console.log("[REDACTED]")',
221
+ },
222
+ description: 'Remove sensitive data from log statements',
223
+ riskLevel: 'review-required',
224
+ languages: ['javascript', 'typescript'],
225
+ },
226
+ ];
227
+ // ============================================================================
228
+ // SecureCodeTransformer Class
229
+ // ============================================================================
230
+ /**
231
+ * Transforms insecure code patterns to secure alternatives
232
+ *
233
+ * @example
234
+ * ```typescript
235
+ * const transformer = createSecureCodeTransformer();
236
+ * const result = transformer.transform(code, { targetVulnerabilities: [...] });
237
+ * console.log(result.transformedCode);
238
+ * ```
239
+ */
240
+ export class SecureCodeTransformer {
241
+ transformations;
242
+ options;
243
+ constructor(options = {}) {
244
+ this.transformations = new Map();
245
+ this.options = {
246
+ language: options.language ?? 'typescript',
247
+ preserveFormatting: options.preserveFormatting ?? true,
248
+ dryRun: options.dryRun ?? false,
249
+ enabledCategories: new Set(options.enabledCategories ?? [
250
+ 'input-validation',
251
+ 'output-encoding',
252
+ 'cryptography',
253
+ 'data-protection',
254
+ 'error-handling',
255
+ 'session-management',
256
+ ]),
257
+ };
258
+ // Load built-in transformations
259
+ for (const t of BUILT_IN_TRANSFORMATIONS) {
260
+ this.transformations.set(t.id, t);
261
+ }
262
+ // Add custom transformations
263
+ if (options.customTransformations) {
264
+ for (const t of options.customTransformations) {
265
+ this.transformations.set(t.id, t);
266
+ }
267
+ }
268
+ }
269
+ /**
270
+ * Transform code using security patterns
271
+ */
272
+ transform(code, options = {}) {
273
+ const result = {
274
+ success: false,
275
+ originalCode: code,
276
+ transformedCode: code,
277
+ transformationsApplied: [],
278
+ warnings: [],
279
+ errors: [],
280
+ requiredImports: [],
281
+ };
282
+ let transformedCode = code;
283
+ const appliedTransformations = [];
284
+ const requiredImports = [];
285
+ // Get applicable transformations
286
+ const transformations = this.getApplicableTransformations(options);
287
+ // Apply transformations
288
+ for (const transformation of transformations) {
289
+ if (options.maxTransformations &&
290
+ appliedTransformations.length >= options.maxTransformations) {
291
+ break;
292
+ }
293
+ try {
294
+ const transformResult = this.applyTransformation(transformedCode, transformation);
295
+ if (transformResult.applied) {
296
+ transformedCode = transformResult.code;
297
+ appliedTransformations.push(...transformResult.applications);
298
+ if (transformation.imports) {
299
+ requiredImports.push(...transformation.imports);
300
+ }
301
+ }
302
+ }
303
+ catch (error) {
304
+ result.errors.push(`Failed to apply ${transformation.name}: ${error instanceof Error ? error.message : String(error)}`);
305
+ }
306
+ }
307
+ // Add required imports
308
+ if (requiredImports.length > 0 && !this.options.dryRun) {
309
+ transformedCode = this.addImports(transformedCode, requiredImports);
310
+ }
311
+ result.success = appliedTransformations.length > 0;
312
+ result.transformedCode = transformedCode;
313
+ result.transformationsApplied = appliedTransformations;
314
+ result.requiredImports = requiredImports;
315
+ return result;
316
+ }
317
+ /**
318
+ * Transform code for specific vulnerability
319
+ */
320
+ transformForVulnerability(code, vulnerability) {
321
+ const category = this.mapVulnerabilityToCategory(vulnerability.type);
322
+ const relevantTransformations = [...this.transformations.values()]
323
+ .filter(t => t.category === category);
324
+ return this.transform(code, {
325
+ onlyTransformations: relevantTransformations.map(t => t.id),
326
+ targetVulnerabilities: [vulnerability],
327
+ });
328
+ }
329
+ /**
330
+ * Get available transformations
331
+ */
332
+ getAvailableTransformations() {
333
+ return [...this.transformations.values()];
334
+ }
335
+ /**
336
+ * Get transformations by category
337
+ */
338
+ getTransformationsByCategory(category) {
339
+ return [...this.transformations.values()]
340
+ .filter(t => t.category === category);
341
+ }
342
+ /**
343
+ * Add custom transformation
344
+ */
345
+ addTransformation(transformation) {
346
+ this.transformations.set(transformation.id, transformation);
347
+ }
348
+ /**
349
+ * Remove transformation
350
+ */
351
+ removeTransformation(id) {
352
+ return this.transformations.delete(id);
353
+ }
354
+ /**
355
+ * Preview transformation without applying
356
+ */
357
+ preview(code, transformationId) {
358
+ const transformation = this.transformations.get(transformationId);
359
+ if (!transformation) {
360
+ return { matches: [], wouldApply: false };
361
+ }
362
+ const matches = [];
363
+ // const lines = code.split('\n'); // Available if needed for line-based processing
364
+ if (transformation.pattern.type === 'regex') {
365
+ const regex = new RegExp(transformation.pattern.value, transformation.pattern.flags || 'g');
366
+ let match;
367
+ while ((match = regex.exec(code)) !== null) {
368
+ const lineNumber = code.substring(0, match.index).split('\n').length;
369
+ const column = match.index - code.lastIndexOf('\n', match.index - 1);
370
+ const preview = this.generateReplacement(match[0], match, transformation.replacement);
371
+ matches.push({
372
+ location: {
373
+ file: 'preview',
374
+ startLine: lineNumber,
375
+ endLine: lineNumber,
376
+ startColumn: column,
377
+ endColumn: column + match[0].length,
378
+ },
379
+ original: match[0],
380
+ preview,
381
+ });
382
+ }
383
+ }
384
+ else if (transformation.pattern.type === 'function-call') {
385
+ const searchStr = transformation.pattern.value;
386
+ let index = 0;
387
+ while ((index = code.indexOf(searchStr, index)) !== -1) {
388
+ const lineNumber = code.substring(0, index).split('\n').length;
389
+ const column = index - code.lastIndexOf('\n', index - 1);
390
+ matches.push({
391
+ location: {
392
+ file: 'preview',
393
+ startLine: lineNumber,
394
+ endLine: lineNumber,
395
+ startColumn: column,
396
+ endColumn: column + searchStr.length,
397
+ },
398
+ original: searchStr,
399
+ preview: transformation.replacement.value,
400
+ });
401
+ index += searchStr.length;
402
+ }
403
+ }
404
+ return { matches, wouldApply: matches.length > 0 };
405
+ }
406
+ /**
407
+ * Validate code after transformation
408
+ */
409
+ validateTransformation(_originalCode, transformedCode) {
410
+ const issues = [];
411
+ // Basic validation
412
+ if (transformedCode.trim().length === 0) {
413
+ issues.push('Transformation resulted in empty code');
414
+ }
415
+ // Check bracket balance
416
+ const brackets = ['()', '[]', '{}'];
417
+ for (const pair of brackets) {
418
+ const open = (transformedCode.match(new RegExp('\\' + pair[0], 'g')) || []).length;
419
+ const close = (transformedCode.match(new RegExp('\\' + pair[1], 'g')) || []).length;
420
+ if (open !== close) {
421
+ issues.push(`Unbalanced ${pair}: ${open} opens, ${close} closes`);
422
+ }
423
+ }
424
+ // Check for common syntax issues
425
+ const syntaxPatterns = [
426
+ { pattern: /;\s*;/g, issue: 'Double semicolon' },
427
+ { pattern: /\(\s*,/g, issue: 'Missing argument before comma' },
428
+ { pattern: /,\s*\)/g, issue: 'Trailing comma before parenthesis' },
429
+ { pattern: /\[\s*,/g, issue: 'Missing element before comma in array' },
430
+ ];
431
+ for (const { pattern, issue } of syntaxPatterns) {
432
+ if (pattern.test(transformedCode)) {
433
+ issues.push(issue);
434
+ }
435
+ }
436
+ return { valid: issues.length === 0, issues };
437
+ }
438
+ // ============================================================================
439
+ // Private Methods
440
+ // ============================================================================
441
+ getApplicableTransformations(options) {
442
+ let transformations = [...this.transformations.values()];
443
+ // Filter by enabled categories
444
+ transformations = transformations.filter(t => this.options.enabledCategories.has(t.category));
445
+ // Filter by language
446
+ transformations = transformations.filter(t => t.languages.includes(this.options.language));
447
+ // Filter by specific IDs
448
+ if (options.onlyTransformations) {
449
+ const ids = new Set(options.onlyTransformations);
450
+ transformations = transformations.filter(t => ids.has(t.id));
451
+ }
452
+ // Exclude specific IDs
453
+ if (options.excludeTransformations) {
454
+ const excludeIds = new Set(options.excludeTransformations);
455
+ transformations = transformations.filter(t => !excludeIds.has(t.id));
456
+ }
457
+ // Sort by risk level (safest first)
458
+ const riskOrder = { 'safe': 0, 'caution': 1, 'review-required': 2 };
459
+ transformations.sort((a, b) => riskOrder[a.riskLevel] - riskOrder[b.riskLevel]);
460
+ return transformations;
461
+ }
462
+ applyTransformation(code, transformation) {
463
+ const applications = [];
464
+ let newCode = code;
465
+ if (transformation.pattern.type === 'regex') {
466
+ const regex = new RegExp(transformation.pattern.value, transformation.pattern.flags || 'g');
467
+ const matches = [];
468
+ let match;
469
+ while ((match = regex.exec(code)) !== null) {
470
+ matches.push({ match: [...match], index: match.index });
471
+ }
472
+ // Apply in reverse order to preserve indices
473
+ for (let i = matches.length - 1; i >= 0; i--) {
474
+ const { match, index } = matches[i];
475
+ const original = match[0];
476
+ const replacement = this.generateReplacement(original, match, transformation.replacement);
477
+ const lineNumber = code.substring(0, index).split('\n').length;
478
+ const lastNewline = code.lastIndexOf('\n', index - 1);
479
+ const column = index - lastNewline;
480
+ newCode = newCode.substring(0, index) + replacement + newCode.substring(index + original.length);
481
+ applications.unshift({
482
+ transformationId: transformation.id,
483
+ location: {
484
+ file: 'unknown',
485
+ startLine: lineNumber,
486
+ endLine: lineNumber,
487
+ startColumn: column,
488
+ endColumn: column + original.length,
489
+ },
490
+ original,
491
+ replacement,
492
+ });
493
+ }
494
+ }
495
+ else if (transformation.pattern.type === 'function-call') {
496
+ const searchStr = transformation.pattern.value;
497
+ let index = 0;
498
+ const indices = [];
499
+ while ((index = code.indexOf(searchStr, index)) !== -1) {
500
+ indices.push(index);
501
+ index += searchStr.length;
502
+ }
503
+ // Apply in reverse order
504
+ for (let i = indices.length - 1; i >= 0; i--) {
505
+ const idx = indices[i];
506
+ const lineNumber = code.substring(0, idx).split('\n').length;
507
+ const lastNewline = code.lastIndexOf('\n', idx - 1);
508
+ const column = idx - lastNewline;
509
+ newCode = newCode.substring(0, idx) +
510
+ transformation.replacement.value +
511
+ newCode.substring(idx + searchStr.length);
512
+ applications.unshift({
513
+ transformationId: transformation.id,
514
+ location: {
515
+ file: 'unknown',
516
+ startLine: lineNumber,
517
+ endLine: lineNumber,
518
+ startColumn: column,
519
+ endColumn: column + searchStr.length,
520
+ },
521
+ original: searchStr,
522
+ replacement: transformation.replacement.value,
523
+ });
524
+ }
525
+ }
526
+ return {
527
+ applied: applications.length > 0,
528
+ code: newCode,
529
+ applications,
530
+ };
531
+ }
532
+ generateReplacement(original, match, replacement) {
533
+ let result = replacement.value;
534
+ // Replace capture groups
535
+ for (let i = 1; i < match.length; i++) {
536
+ result = result.replace(new RegExp(`\\$${i}`, 'g'), match[i] || '');
537
+ }
538
+ if (replacement.wrapExisting) {
539
+ result = result.replace('$0', original);
540
+ }
541
+ return result;
542
+ }
543
+ addImports(code, imports) {
544
+ // Deduplicate imports
545
+ const uniqueImports = new Map();
546
+ for (const imp of imports) {
547
+ const existing = uniqueImports.get(imp.module);
548
+ if (existing) {
549
+ // Merge named imports
550
+ if (imp.named) {
551
+ existing.named = [...new Set([...(existing.named || []), ...imp.named])];
552
+ }
553
+ }
554
+ else {
555
+ uniqueImports.set(imp.module, { ...imp });
556
+ }
557
+ }
558
+ // Generate import statements
559
+ const importStatements = [];
560
+ for (const imp of uniqueImports.values()) {
561
+ if (imp.default && imp.named?.length) {
562
+ importStatements.push(`import ${imp.default}, { ${imp.named.join(', ')} } from '${imp.module}';`);
563
+ }
564
+ else if (imp.default) {
565
+ importStatements.push(`import ${imp.default} from '${imp.module}';`);
566
+ }
567
+ else if (imp.named?.length) {
568
+ const keyword = imp.typeOnly ? 'import type' : 'import';
569
+ importStatements.push(`${keyword} { ${imp.named.join(', ')} } from '${imp.module}';`);
570
+ }
571
+ }
572
+ if (importStatements.length === 0)
573
+ return code;
574
+ // Find insertion point (after existing imports or at start)
575
+ const lines = code.split('\n');
576
+ let insertIndex = 0;
577
+ for (let i = 0; i < lines.length; i++) {
578
+ if (lines[i].startsWith('import ')) {
579
+ insertIndex = i + 1;
580
+ }
581
+ else if (insertIndex > 0 && !lines[i].trim().startsWith('import')) {
582
+ break;
583
+ }
584
+ }
585
+ lines.splice(insertIndex, 0, ...importStatements);
586
+ return lines.join('\n');
587
+ }
588
+ mapVulnerabilityToCategory(vulnType) {
589
+ const mapping = {
590
+ 'xss': 'output-encoding',
591
+ 'sql-injection': 'input-validation',
592
+ 'path-traversal': 'input-validation',
593
+ 'command-injection': 'input-validation',
594
+ 'hardcoded-secret': 'data-protection',
595
+ 'weak-crypto': 'cryptography',
596
+ 'weak-random': 'cryptography',
597
+ 'information-disclosure': 'error-handling',
598
+ 'session-fixation': 'session-management',
599
+ };
600
+ return mapping[vulnType] || 'general';
601
+ }
602
+ }
603
+ // ============================================================================
604
+ // Factory Functions
605
+ // ============================================================================
606
+ /**
607
+ * Create a secure code transformer
608
+ */
609
+ export function createSecureCodeTransformer(options) {
610
+ return new SecureCodeTransformer(options);
611
+ }
612
+ /**
613
+ * Quick transform code
614
+ */
615
+ export function quickTransform(code) {
616
+ const transformer = createSecureCodeTransformer();
617
+ return transformer.transform(code);
618
+ }
619
+ /**
620
+ * Get all built-in transformations
621
+ */
622
+ export function getBuiltInTransformations() {
623
+ return [...BUILT_IN_TRANSFORMATIONS];
624
+ }
625
+ //# sourceMappingURL=secure-code-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-code-transformer.js","sourceRoot":"","sources":["../../src/remediation/secure-code-transformer.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ import type { SourceLocation, Severity } from './vulnerability.js';
8
8
  * Fix strategy type
9
9
  * @trace REQ-SEC-FIX-001
10
10
  */
11
- export type FixStrategy = 'parameterized-query' | 'html-escape' | 'command-escape' | 'path-validation' | 'url-validation' | 'input-validation' | 'authentication' | 'authorization' | 'encryption' | 'sanitization' | 'configuration' | 'dependency-update';
11
+ export type FixStrategy = 'parameterized-query' | 'html-escape' | 'command-escape' | 'path-validation' | 'url-validation' | 'input-validation' | 'authentication' | 'authorization' | 'encryption' | 'sanitization' | 'configuration' | 'dependency-update' | 'encoding' | 'parameterization' | 'validation' | 'replacement' | 'combined' | 'revert';
12
12
  /**
13
13
  * Code edit to apply
14
14
  * @trace DES-SEC-FIX-001
@@ -37,6 +37,8 @@ export interface ImportEdit {
37
37
  namespaceImport?: string;
38
38
  /** Insert at line (0 for top of file) */
39
39
  insertLine: number;
40
+ /** Whether this is a type-only import */
41
+ isTypeOnly?: boolean;
40
42
  }
41
43
  /**
42
44
  * Fix suggestion for a vulnerability