@nahisaho/musubix-security 1.8.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 (116) hide show
  1. package/README.md +105 -0
  2. package/bin/musubix-security-mcp.js +12 -0
  3. package/bin/musubix-security.js +12 -0
  4. package/dist/analysis/dependency-auditor.d.ts +30 -0
  5. package/dist/analysis/dependency-auditor.d.ts.map +1 -0
  6. package/dist/analysis/dependency-auditor.js +325 -0
  7. package/dist/analysis/dependency-auditor.js.map +1 -0
  8. package/dist/analysis/index.d.ts +9 -0
  9. package/dist/analysis/index.d.ts.map +1 -0
  10. package/dist/analysis/index.js +9 -0
  11. package/dist/analysis/index.js.map +1 -0
  12. package/dist/analysis/secret-detector.d.ts +44 -0
  13. package/dist/analysis/secret-detector.d.ts.map +1 -0
  14. package/dist/analysis/secret-detector.js +465 -0
  15. package/dist/analysis/secret-detector.js.map +1 -0
  16. package/dist/analysis/taint-analyzer.d.ts +62 -0
  17. package/dist/analysis/taint-analyzer.d.ts.map +1 -0
  18. package/dist/analysis/taint-analyzer.js +519 -0
  19. package/dist/analysis/taint-analyzer.js.map +1 -0
  20. package/dist/analysis/vulnerability-scanner.d.ts +58 -0
  21. package/dist/analysis/vulnerability-scanner.d.ts.map +1 -0
  22. package/dist/analysis/vulnerability-scanner.js +417 -0
  23. package/dist/analysis/vulnerability-scanner.js.map +1 -0
  24. package/dist/cli/commands.d.ts +15 -0
  25. package/dist/cli/commands.d.ts.map +1 -0
  26. package/dist/cli/commands.js +405 -0
  27. package/dist/cli/commands.js.map +1 -0
  28. package/dist/cli/index.d.ts +6 -0
  29. package/dist/cli/index.d.ts.map +1 -0
  30. package/dist/cli/index.js +6 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/index.d.ts +42 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +66 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/infrastructure/ast-parser.d.ts +87 -0
  37. package/dist/infrastructure/ast-parser.d.ts.map +1 -0
  38. package/dist/infrastructure/ast-parser.js +273 -0
  39. package/dist/infrastructure/ast-parser.js.map +1 -0
  40. package/dist/infrastructure/cache.d.ts +100 -0
  41. package/dist/infrastructure/cache.d.ts.map +1 -0
  42. package/dist/infrastructure/cache.js +288 -0
  43. package/dist/infrastructure/cache.js.map +1 -0
  44. package/dist/infrastructure/config-loader.d.ts +35 -0
  45. package/dist/infrastructure/config-loader.d.ts.map +1 -0
  46. package/dist/infrastructure/config-loader.js +358 -0
  47. package/dist/infrastructure/config-loader.js.map +1 -0
  48. package/dist/infrastructure/file-scanner.d.ts +94 -0
  49. package/dist/infrastructure/file-scanner.d.ts.map +1 -0
  50. package/dist/infrastructure/file-scanner.js +189 -0
  51. package/dist/infrastructure/file-scanner.js.map +1 -0
  52. package/dist/infrastructure/index.d.ts +9 -0
  53. package/dist/infrastructure/index.d.ts.map +1 -0
  54. package/dist/infrastructure/index.js +9 -0
  55. package/dist/infrastructure/index.js.map +1 -0
  56. package/dist/mcp/index.d.ts +7 -0
  57. package/dist/mcp/index.d.ts.map +1 -0
  58. package/dist/mcp/index.js +7 -0
  59. package/dist/mcp/index.js.map +1 -0
  60. package/dist/mcp/server.d.ts +34 -0
  61. package/dist/mcp/server.d.ts.map +1 -0
  62. package/dist/mcp/server.js +88 -0
  63. package/dist/mcp/server.js.map +1 -0
  64. package/dist/mcp/tools.d.ts +88 -0
  65. package/dist/mcp/tools.d.ts.map +1 -0
  66. package/dist/mcp/tools.js +443 -0
  67. package/dist/mcp/tools.js.map +1 -0
  68. package/dist/services/fix-generator.d.ts +56 -0
  69. package/dist/services/fix-generator.d.ts.map +1 -0
  70. package/dist/services/fix-generator.js +346 -0
  71. package/dist/services/fix-generator.js.map +1 -0
  72. package/dist/services/fix-verifier.d.ts +62 -0
  73. package/dist/services/fix-verifier.d.ts.map +1 -0
  74. package/dist/services/fix-verifier.js +224 -0
  75. package/dist/services/fix-verifier.js.map +1 -0
  76. package/dist/services/index.d.ts +9 -0
  77. package/dist/services/index.d.ts.map +1 -0
  78. package/dist/services/index.js +13 -0
  79. package/dist/services/index.js.map +1 -0
  80. package/dist/services/report-generator.d.ts +87 -0
  81. package/dist/services/report-generator.d.ts.map +1 -0
  82. package/dist/services/report-generator.js +463 -0
  83. package/dist/services/report-generator.js.map +1 -0
  84. package/dist/services/security-service.d.ts +151 -0
  85. package/dist/services/security-service.d.ts.map +1 -0
  86. package/dist/services/security-service.js +279 -0
  87. package/dist/services/security-service.js.map +1 -0
  88. package/dist/types/config.d.ts +188 -0
  89. package/dist/types/config.d.ts.map +1 -0
  90. package/dist/types/config.js +89 -0
  91. package/dist/types/config.js.map +1 -0
  92. package/dist/types/dependency.d.ts +266 -0
  93. package/dist/types/dependency.d.ts.map +1 -0
  94. package/dist/types/dependency.js +7 -0
  95. package/dist/types/dependency.js.map +1 -0
  96. package/dist/types/fix.d.ts +213 -0
  97. package/dist/types/fix.d.ts.map +1 -0
  98. package/dist/types/fix.js +7 -0
  99. package/dist/types/fix.js.map +1 -0
  100. package/dist/types/index.d.ts +14 -0
  101. package/dist/types/index.d.ts.map +1 -0
  102. package/dist/types/index.js +8 -0
  103. package/dist/types/index.js.map +1 -0
  104. package/dist/types/secret.d.ts +151 -0
  105. package/dist/types/secret.d.ts.map +1 -0
  106. package/dist/types/secret.js +91 -0
  107. package/dist/types/secret.js.map +1 -0
  108. package/dist/types/taint.d.ts +182 -0
  109. package/dist/types/taint.d.ts.map +1 -0
  110. package/dist/types/taint.js +24 -0
  111. package/dist/types/taint.js.map +1 -0
  112. package/dist/types/vulnerability.d.ts +136 -0
  113. package/dist/types/vulnerability.d.ts.map +1 -0
  114. package/dist/types/vulnerability.js +7 -0
  115. package/dist/types/vulnerability.js.map +1 -0
  116. package/package.json +87 -0
@@ -0,0 +1,519 @@
1
+ /**
2
+ * @fileoverview Taint analysis engine
3
+ * @module @nahisaho/musubix-security/analysis/taint-analyzer
4
+ * @trace REQ-SEC-TAINT-001, REQ-SEC-TAINT-002, REQ-SEC-TAINT-003, REQ-SEC-TAINT-004
5
+ */
6
+ import { SyntaxKind } from 'ts-morph';
7
+ import { BUILTIN_SANITIZERS } from '../types/taint.js';
8
+ import { getASTParser } from '../infrastructure/ast-parser.js';
9
+ import { createFileScanner } from '../infrastructure/file-scanner.js';
10
+ /**
11
+ * Generate taint source ID
12
+ */
13
+ let sourceCounter = 0;
14
+ function generateSourceId() {
15
+ return `SRC-${String(++sourceCounter).padStart(4, '0')}`;
16
+ }
17
+ /**
18
+ * Generate taint sink ID
19
+ */
20
+ let sinkCounter = 0;
21
+ function generateSinkId() {
22
+ return `SNK-${String(++sinkCounter).padStart(4, '0')}`;
23
+ }
24
+ /**
25
+ * Generate taint path ID
26
+ */
27
+ let pathCounter = 0;
28
+ function generatePathId() {
29
+ return `PATH-${String(++pathCounter).padStart(4, '0')}`;
30
+ }
31
+ /**
32
+ * Reset counters (for testing)
33
+ */
34
+ export function resetTaintCounters() {
35
+ sourceCounter = 0;
36
+ sinkCounter = 0;
37
+ pathCounter = 0;
38
+ }
39
+ /**
40
+ * Built-in source patterns
41
+ */
42
+ const SOURCE_PATTERNS = [
43
+ {
44
+ category: 'user-input',
45
+ patterns: [
46
+ { receiver: 'req', property: 'body' },
47
+ { receiver: 'req', property: 'query' },
48
+ { receiver: 'req', property: 'params' },
49
+ { receiver: 'req', property: 'headers' },
50
+ { receiver: 'req', property: 'cookies' },
51
+ { receiver: 'ctx', property: 'request' },
52
+ { receiver: 'ctx', property: 'query' },
53
+ { method: 'prompt' },
54
+ { method: 'getElementById' },
55
+ { method: 'querySelector' },
56
+ ],
57
+ description: 'User-controlled input',
58
+ },
59
+ {
60
+ category: 'database',
61
+ patterns: [
62
+ { method: 'findOne' },
63
+ { method: 'findMany' },
64
+ { method: 'find' },
65
+ { receiver: 'db', method: 'query' },
66
+ ],
67
+ description: 'Database query results',
68
+ },
69
+ {
70
+ category: 'file-system',
71
+ patterns: [
72
+ { method: 'readFile' },
73
+ { method: 'readFileSync' },
74
+ { receiver: 'fs', method: 'readFile' },
75
+ ],
76
+ description: 'File system reads',
77
+ },
78
+ {
79
+ category: 'network',
80
+ patterns: [
81
+ { method: 'fetch' },
82
+ { method: 'axios' },
83
+ { receiver: 'http', method: 'get' },
84
+ { receiver: 'https', method: 'get' },
85
+ ],
86
+ description: 'Network responses',
87
+ },
88
+ {
89
+ category: 'environment',
90
+ patterns: [
91
+ { receiver: 'process', property: 'env' },
92
+ ],
93
+ description: 'Environment variables',
94
+ },
95
+ {
96
+ category: 'cli-args',
97
+ patterns: [
98
+ { receiver: 'process', property: 'argv' },
99
+ ],
100
+ description: 'Command line arguments',
101
+ },
102
+ ];
103
+ /**
104
+ * Built-in sink patterns
105
+ */
106
+ const SINK_PATTERNS = [
107
+ {
108
+ category: 'sql-query',
109
+ severity: 'critical',
110
+ patterns: [
111
+ { method: 'query', argIndex: 0 },
112
+ { method: 'execute', argIndex: 0 },
113
+ { receiver: 'knex', method: 'raw', argIndex: 0 },
114
+ ],
115
+ expectedSanitizers: ['escape', 'parameterize'],
116
+ description: 'SQL query execution',
117
+ },
118
+ {
119
+ category: 'command-exec',
120
+ severity: 'critical',
121
+ patterns: [
122
+ { method: 'exec', argIndex: 0 },
123
+ { method: 'execSync', argIndex: 0 },
124
+ { receiver: 'child_process', method: 'spawn', argIndex: 0 },
125
+ ],
126
+ expectedSanitizers: ['quote', 'escape'],
127
+ description: 'OS command execution',
128
+ },
129
+ {
130
+ category: 'file-read',
131
+ severity: 'high',
132
+ patterns: [
133
+ { method: 'readFile', argIndex: 0 },
134
+ { method: 'readFileSync', argIndex: 0 },
135
+ { receiver: 'fs', method: 'access', argIndex: 0 },
136
+ ],
137
+ expectedSanitizers: ['basename', 'resolve'],
138
+ description: 'File system read',
139
+ },
140
+ {
141
+ category: 'file-write',
142
+ severity: 'high',
143
+ patterns: [
144
+ { method: 'writeFile', argIndex: 0 },
145
+ { method: 'writeFileSync', argIndex: 0 },
146
+ ],
147
+ expectedSanitizers: ['basename', 'resolve'],
148
+ description: 'File system write',
149
+ },
150
+ {
151
+ category: 'html-output',
152
+ severity: 'high',
153
+ patterns: [
154
+ { receiver: 'res', method: 'send', argIndex: 0 },
155
+ { receiver: 'res', method: 'write', argIndex: 0 },
156
+ { receiver: 'res', method: 'render', argIndex: 1 },
157
+ ],
158
+ expectedSanitizers: ['escapeHtml', 'encode', 'sanitizeHtml'],
159
+ description: 'HTML response output',
160
+ },
161
+ {
162
+ category: 'redirect',
163
+ severity: 'medium',
164
+ patterns: [
165
+ { receiver: 'res', method: 'redirect', argIndex: 0 },
166
+ ],
167
+ expectedSanitizers: ['validateUrl', 'isAllowedDomain'],
168
+ description: 'URL redirect',
169
+ },
170
+ {
171
+ category: 'eval',
172
+ severity: 'critical',
173
+ patterns: [
174
+ { method: 'eval', argIndex: 0 },
175
+ { method: 'Function', argIndex: 0 },
176
+ ],
177
+ expectedSanitizers: [],
178
+ description: 'Dynamic code evaluation',
179
+ },
180
+ {
181
+ category: 'http-request',
182
+ severity: 'high',
183
+ patterns: [
184
+ { method: 'fetch', argIndex: 0 },
185
+ { receiver: 'axios', method: 'get', argIndex: 0 },
186
+ { receiver: 'axios', method: 'post', argIndex: 0 },
187
+ ],
188
+ expectedSanitizers: ['validateUrl', 'isAllowedDomain'],
189
+ description: 'Outbound HTTP request',
190
+ },
191
+ ];
192
+ /**
193
+ * Taint analyzer engine
194
+ */
195
+ export class TaintAnalyzer {
196
+ parser;
197
+ fileScanner;
198
+ options;
199
+ sourcePatterns;
200
+ sinkPatterns;
201
+ constructor(options = {}) {
202
+ this.parser = getASTParser();
203
+ this.fileScanner = createFileScanner();
204
+ this.options = options;
205
+ this.sourcePatterns = [...SOURCE_PATTERNS];
206
+ this.sinkPatterns = [...SINK_PATTERNS];
207
+ // Add custom sources
208
+ if (options.customSources) {
209
+ for (const custom of options.customSources) {
210
+ this.sourcePatterns.push({
211
+ category: custom.category,
212
+ patterns: [{ method: custom.pattern }],
213
+ description: custom.description,
214
+ });
215
+ }
216
+ }
217
+ // Add custom sinks
218
+ if (options.customSinks) {
219
+ for (const custom of options.customSinks) {
220
+ this.sinkPatterns.push({
221
+ category: custom.category,
222
+ severity: custom.severity,
223
+ patterns: [{ method: custom.pattern, argIndex: 0 }],
224
+ expectedSanitizers: [],
225
+ description: custom.description,
226
+ });
227
+ }
228
+ }
229
+ }
230
+ /**
231
+ * Analyze a single file for taint issues
232
+ */
233
+ analyzeFile(filePath) {
234
+ const sourceFile = this.parser.parseFile(filePath);
235
+ return {
236
+ sources: this.findSources(sourceFile),
237
+ sinks: this.findSinks(sourceFile),
238
+ };
239
+ }
240
+ /**
241
+ * Find taint sources in a source file
242
+ */
243
+ findSources(sourceFile) {
244
+ const sources = [];
245
+ // Find property access expressions (req.body, process.env, etc.)
246
+ const propertyAccesses = sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression);
247
+ for (const access of propertyAccesses) {
248
+ const receiver = access.getExpression();
249
+ const property = access.getName();
250
+ let receiverName;
251
+ if (receiver.getKind() === SyntaxKind.Identifier) {
252
+ receiverName = receiver.getText();
253
+ }
254
+ for (const pattern of this.sourcePatterns) {
255
+ for (const p of pattern.patterns) {
256
+ if (p.receiver && p.property) {
257
+ if (receiverName === p.receiver && property === p.property) {
258
+ sources.push({
259
+ id: generateSourceId(),
260
+ category: pattern.category,
261
+ location: this.parser.getLocation(access),
262
+ variableName: access.getText(),
263
+ expression: access.getText(),
264
+ description: pattern.description,
265
+ confidence: 0.9,
266
+ });
267
+ }
268
+ }
269
+ }
270
+ }
271
+ }
272
+ // Find call expressions (getElementById, fetch, etc.)
273
+ const calls = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
274
+ for (const call of calls) {
275
+ const funcName = this.parser.getFunctionName(call);
276
+ const receiverName = this.parser.getReceiverName(call);
277
+ for (const pattern of this.sourcePatterns) {
278
+ for (const p of pattern.patterns) {
279
+ if (p.method && funcName === p.method) {
280
+ if (!p.receiver || receiverName === p.receiver) {
281
+ sources.push({
282
+ id: generateSourceId(),
283
+ category: pattern.category,
284
+ location: this.parser.getLocation(call),
285
+ variableName: call.getText(),
286
+ expression: call.getText(),
287
+ description: pattern.description,
288
+ confidence: 0.85,
289
+ });
290
+ }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ return sources;
296
+ }
297
+ /**
298
+ * Find taint sinks in a source file
299
+ */
300
+ findSinks(sourceFile) {
301
+ const sinks = [];
302
+ const calls = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
303
+ for (const call of calls) {
304
+ const funcName = this.parser.getFunctionName(call);
305
+ const receiverName = this.parser.getReceiverName(call);
306
+ for (const pattern of this.sinkPatterns) {
307
+ for (const p of pattern.patterns) {
308
+ if (funcName === p.method) {
309
+ if (!p.receiver || receiverName === p.receiver) {
310
+ sinks.push({
311
+ id: generateSinkId(),
312
+ category: pattern.category,
313
+ location: this.parser.getLocation(call),
314
+ functionName: funcName,
315
+ argumentIndex: p.argIndex,
316
+ expectedSanitizers: pattern.expectedSanitizers,
317
+ description: pattern.description,
318
+ severity: pattern.severity,
319
+ });
320
+ }
321
+ }
322
+ }
323
+ }
324
+ }
325
+ return sinks;
326
+ }
327
+ /**
328
+ * Trace taint flow from sources to sinks (simplified)
329
+ * Note: Full interprocedural analysis would require more sophisticated data flow analysis
330
+ */
331
+ tracePaths(sources, sinks, sourceFile) {
332
+ const paths = [];
333
+ // Simple intraprocedural analysis: check if source and sink are in same function
334
+ // and source appears before sink
335
+ for (const source of sources) {
336
+ for (const sink of sinks) {
337
+ // Check if in same file
338
+ if (source.location.file !== sink.location.file)
339
+ continue;
340
+ // Check if source is before sink
341
+ if (source.location.startLine > sink.location.startLine)
342
+ continue;
343
+ // Check if they could be connected (simplified - same function scope)
344
+ const isConnected = this.checkConnection(source, sink, sourceFile);
345
+ if (!isConnected)
346
+ continue;
347
+ // Check for sanitization
348
+ const sanitized = this.checkSanitization(source, sink, sourceFile, sink.expectedSanitizers);
349
+ // Only report unsanitized paths
350
+ if (!sanitized) {
351
+ const steps = this.buildFlowSteps(source, sink, sourceFile);
352
+ paths.push({
353
+ id: generatePathId(),
354
+ source,
355
+ sink,
356
+ steps,
357
+ sanitized: false,
358
+ confidence: Math.min(source.confidence, 0.8),
359
+ length: steps.length,
360
+ });
361
+ }
362
+ }
363
+ }
364
+ return paths;
365
+ }
366
+ /**
367
+ * Check if source and sink could be connected
368
+ */
369
+ checkConnection(source, sink, _sourceFile) {
370
+ // Simplified: just check if they're within reasonable line distance
371
+ const lineDistance = sink.location.startLine - source.location.startLine;
372
+ const maxDepth = this.options.maxPathDepth ?? 10;
373
+ return lineDistance >= 0 && lineDistance <= maxDepth * 5;
374
+ }
375
+ /**
376
+ * Check if there's sanitization between source and sink
377
+ */
378
+ checkSanitization(source, sink, sourceFile, expectedSanitizers) {
379
+ // Get code between source and sink
380
+ const calls = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
381
+ for (const call of calls) {
382
+ const loc = this.parser.getLocation(call);
383
+ // Check if call is between source and sink
384
+ if (loc.startLine > source.location.startLine &&
385
+ loc.startLine < sink.location.startLine) {
386
+ const funcName = this.parser.getFunctionName(call);
387
+ // Check against expected sanitizers
388
+ if (funcName && expectedSanitizers.includes(funcName)) {
389
+ return true;
390
+ }
391
+ // Check against built-in sanitizers
392
+ for (const sanitizer of BUILTIN_SANITIZERS) {
393
+ if (funcName === sanitizer.name && sanitizer.protects.includes(sink.category)) {
394
+ return true;
395
+ }
396
+ }
397
+ // Check additional sanitizers from options
398
+ if (this.options.additionalSanitizers) {
399
+ for (const sanitizer of this.options.additionalSanitizers) {
400
+ if (funcName === sanitizer.functionName &&
401
+ sanitizer.sinkCategories.includes(sink.category)) {
402
+ return true;
403
+ }
404
+ }
405
+ }
406
+ }
407
+ }
408
+ return false;
409
+ }
410
+ /**
411
+ * Build flow steps between source and sink
412
+ */
413
+ buildFlowSteps(source, sink, _sourceFile) {
414
+ // Simplified: just source and sink as steps
415
+ return [
416
+ {
417
+ index: 0,
418
+ location: source.location,
419
+ expression: source.expression,
420
+ variableName: source.variableName,
421
+ operation: 'assignment',
422
+ sanitized: false,
423
+ },
424
+ {
425
+ index: 1,
426
+ location: sink.location,
427
+ expression: `${sink.functionName}(...)`,
428
+ operation: 'call',
429
+ sanitized: false,
430
+ },
431
+ ];
432
+ }
433
+ /**
434
+ * Analyze a directory for taint issues
435
+ */
436
+ async analyze(rootPath) {
437
+ const startTime = Date.now();
438
+ const files = await this.fileScanner.scan(rootPath);
439
+ const allSources = [];
440
+ const allSinks = [];
441
+ const allPaths = [];
442
+ let analyzedFiles = 0;
443
+ for (const file of files) {
444
+ if (this.options.excludePatterns?.some((p) => file.relativePath.includes(p))) {
445
+ continue;
446
+ }
447
+ try {
448
+ const sourceFile = this.parser.parseFile(file.path);
449
+ const { sources, sinks } = this.analyzeFile(file.path);
450
+ allSources.push(...sources);
451
+ allSinks.push(...sinks);
452
+ const paths = this.tracePaths(sources, sinks, sourceFile);
453
+ allPaths.push(...paths);
454
+ analyzedFiles++;
455
+ }
456
+ catch (error) {
457
+ console.warn(`Warning: Failed to analyze ${file.path}: ${error}`);
458
+ }
459
+ }
460
+ const duration = Date.now() - startTime;
461
+ // Build summary
462
+ const bySourceCategory = {
463
+ 'user-input': 0,
464
+ 'database': 0,
465
+ 'file-system': 0,
466
+ 'network': 0,
467
+ 'environment': 0,
468
+ 'config': 0,
469
+ 'cli-args': 0,
470
+ };
471
+ for (const source of allSources) {
472
+ bySourceCategory[source.category]++;
473
+ }
474
+ const bySinkCategory = {
475
+ 'sql-query': 0,
476
+ 'nosql-query': 0,
477
+ 'command-exec': 0,
478
+ 'file-write': 0,
479
+ 'file-read': 0,
480
+ 'html-output': 0,
481
+ 'redirect': 0,
482
+ 'eval': 0,
483
+ 'deserialization': 0,
484
+ 'ldap-query': 0,
485
+ 'xpath-query': 0,
486
+ 'http-request': 0,
487
+ };
488
+ for (const sink of allSinks) {
489
+ bySinkCategory[sink.category]++;
490
+ }
491
+ const bySeverity = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
492
+ for (const path of allPaths) {
493
+ bySeverity[path.sink.severity]++;
494
+ }
495
+ return {
496
+ sources: allSources,
497
+ sinks: allSinks,
498
+ unsafePaths: allPaths,
499
+ analyzedFiles,
500
+ duration,
501
+ timestamp: new Date(),
502
+ summary: {
503
+ totalSources: allSources.length,
504
+ totalSinks: allSinks.length,
505
+ unsafePathCount: allPaths.length,
506
+ bySeverity,
507
+ bySourceCategory,
508
+ bySinkCategory,
509
+ },
510
+ };
511
+ }
512
+ }
513
+ /**
514
+ * Create a taint analyzer
515
+ */
516
+ export function createTaintAnalyzer(options) {
517
+ return new TaintAnalyzer(options);
518
+ }
519
+ //# sourceMappingURL=taint-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taint-analyzer.js","sourceRoot":"","sources":["../../src/analysis/taint-analyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAYtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAa,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAe,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEnF;;GAEG;AACH,IAAI,aAAa,GAAG,CAAC,CAAC;AACtB,SAAS,gBAAgB;IACvB,OAAO,OAAO,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,SAAS,cAAc;IACrB,OAAO,OAAO,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,SAAS,cAAc;IACrB,OAAO,QAAQ,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,CAAC,CAAC;IAChB,WAAW,GAAG,CAAC,CAAC;AAClB,CAAC;AA8BD;;GAEG;AACH,MAAM,eAAe,GAAoB;IACvC;QACE,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE;YACR,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;YACrC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;YACtC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACvC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;YACxC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;YACxC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;YACxC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;YACtC,EAAE,MAAM,EAAE,QAAQ,EAAE;YACpB,EAAE,MAAM,EAAE,gBAAgB,EAAE;YAC5B,EAAE,MAAM,EAAE,eAAe,EAAE;SAC5B;QACD,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,SAAS,EAAE;YACrB,EAAE,MAAM,EAAE,UAAU,EAAE;YACtB,EAAE,MAAM,EAAE,MAAM,EAAE;YAClB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;SACpC;QACD,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,UAAU,EAAE;YACtB,EAAE,MAAM,EAAE,cAAc,EAAE;YAC1B,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;SACvC;QACD,WAAW,EAAE,mBAAmB;KACjC;IACD;QACE,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,OAAO,EAAE;YACnB,EAAE,MAAM,EAAE,OAAO,EAAE;YACnB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;YACnC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;SACrC;QACD,WAAW,EAAE,mBAAmB;KACjC;IACD;QACE,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE;YACR,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;SACzC;QACD,WAAW,EAAE,uBAAuB;KACrC;IACD;QACE,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE;SAC1C;QACD,WAAW,EAAE,wBAAwB;KACtC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,aAAa,GAAkB;IACnC;QACE,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;YAChC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;YAClC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;SACjD;QACD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC9C,WAAW,EAAE,qBAAqB;KACnC;IACD;QACE,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC/B,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;YACnC,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;SAC5D;QACD,kBAAkB,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QACvC,WAAW,EAAE,sBAAsB;KACpC;IACD;QACE,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;YACnC,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE;YACvC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE;SAClD;QACD,kBAAkB,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;QAC3C,WAAW,EAAE,kBAAkB;KAChC;IACD;QACE,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE;YACpC,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE;SACzC;QACD,kBAAkB,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;QAC3C,WAAW,EAAE,mBAAmB;KACjC;IACD;QACE,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;YAChD,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;YACjD,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE;SACnD;QACD,kBAAkB,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,cAAc,CAAC;QAC5D,WAAW,EAAE,sBAAsB;KACpC;IACD;QACE,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE;YACR,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;SACrD;QACD,kBAAkB,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC;QACtD,WAAW,EAAE,cAAc;KAC5B;IACD;QACE,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC/B,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;SACpC;QACD,kBAAkB,EAAE,EAAE;QACtB,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;YAChC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;YACjD,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;SACnD;QACD,kBAAkB,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC;QACtD,WAAW,EAAE,uBAAuB;KACrC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAY;IAClB,WAAW,CAAc;IACzB,OAAO,CAAuB;IAC9B,cAAc,CAAkB;IAChC,YAAY,CAAgB;IAEpC,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;QAEvC,qBAAqB;QACrB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;oBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtC,WAAW,EAAE,MAAM,CAAC,WAAW;iBAChC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;oBACnD,kBAAkB,EAAE,EAAE;oBACtB,WAAW,EAAE,MAAM,CAAC,WAAW;iBAChC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAgB;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACrC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SAClC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,UAAsB;QACxC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,iEAAiE;QACjE,MAAM,gBAAgB,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;QAC9F,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAElC,IAAI,YAAgC,CAAC;YACrC,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;gBACjD,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACjC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;wBAC7B,IAAI,YAAY,KAAK,CAAC,CAAC,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;4BAC3D,OAAO,CAAC,IAAI,CAAC;gCACX,EAAE,EAAE,gBAAgB,EAAE;gCACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gCAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;gCACzC,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE;gCAC9B,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE;gCAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;gCAChC,UAAU,EAAE,GAAG;6BAChB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,MAAM,KAAK,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEvD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACjC,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;wBACtC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,YAAY,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;4BAC/C,OAAO,CAAC,IAAI,CAAC;gCACX,EAAE,EAAE,gBAAgB,EAAE;gCACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gCAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;gCACvC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE;gCAC5B,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE;gCAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;gCAChC,UAAU,EAAE,IAAI;6BACjB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,UAAsB;QACtC,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAEzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEvD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACxC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACjC,IAAI,QAAQ,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;wBAC1B,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,YAAY,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;4BAC/C,KAAK,CAAC,IAAI,CAAC;gCACT,EAAE,EAAE,cAAc,EAAE;gCACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gCAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;gCACvC,YAAY,EAAE,QAAQ;gCACtB,aAAa,EAAE,CAAC,CAAC,QAAQ;gCACzB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gCAC9C,WAAW,EAAE,OAAO,CAAC,WAAW;gCAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;6BAC3B,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,UAAU,CAChB,OAAsB,EACtB,KAAkB,EAClB,UAAsB;QAEtB,MAAM,KAAK,GAAgB,EAAE,CAAC;QAE9B,iFAAiF;QACjF,iCAAiC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,wBAAwB;gBACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI;oBAAE,SAAS;gBAE1D,iCAAiC;gBACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS;oBAAE,SAAS;gBAElE,sEAAsE;gBACtE,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;gBACnE,IAAI,CAAC,WAAW;oBAAE,SAAS;gBAE3B,yBAAyB;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CACtC,MAAM,EACN,IAAI,EACJ,UAAU,EACV,IAAI,CAAC,kBAAkB,CACxB,CAAC;gBAEF,gCAAgC;gBAChC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;oBAC5D,KAAK,CAAC,IAAI,CAAC;wBACT,EAAE,EAAE,cAAc,EAAE;wBACpB,MAAM;wBACN,IAAI;wBACJ,KAAK;wBACL,SAAS,EAAE,KAAK;wBAChB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC;wBAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,eAAe,CACrB,MAAmB,EACnB,IAAe,EACf,WAAuB;QAEvB,oEAAoE;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAEjD,OAAO,YAAY,IAAI,CAAC,IAAI,YAAY,IAAI,QAAQ,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,MAAmB,EACnB,IAAe,EACf,UAAsB,EACtB,kBAA4B;QAE5B,mCAAmC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAEzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAE1C,2CAA2C;YAC3C,IACE,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS;gBACzC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvC,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAEnD,oCAAoC;gBACpC,IAAI,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACtD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,oCAAoC;gBACpC,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;oBAC3C,IAAI,QAAQ,KAAK,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9E,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;oBACtC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;wBAC1D,IACE,QAAQ,KAAK,SAAS,CAAC,YAAY;4BACnC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAChD,CAAC;4BACD,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,cAAc,CACpB,MAAmB,EACnB,IAAe,EACf,WAAuB;QAEvB,4CAA4C;QAC5C,OAAO;YACL;gBACE,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,SAAS,EAAE,YAAY;gBACvB,SAAS,EAAE,KAAK;aACjB;YACD;gBACE,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,GAAG,IAAI,CAAC,YAAY,OAAO;gBACvC,SAAS,EAAE,MAAM;gBACjB,SAAS,EAAE,KAAK;aACjB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAkB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvD,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBAExB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBAExB,aAAa,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,gBAAgB;QAChB,MAAM,gBAAgB,GAAwC;YAC5D,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;SACd,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;YAChC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,cAAc,GAAsC;YACxD,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,CAAC;YACT,iBAAiB,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,CAAC;SAClB,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,UAAU,GAA6B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAClG,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,CAAC;QAED,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,QAAQ;YACrB,aAAa;YACb,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE;gBACP,YAAY,EAAE,UAAU,CAAC,MAAM;gBAC/B,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,eAAe,EAAE,QAAQ,CAAC,MAAM;gBAChC,UAAU;gBACV,gBAAgB;gBAChB,cAAc;aACf;SACF,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA8B;IAChE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @fileoverview Vulnerability scanner - static analysis for security vulnerabilities
3
+ * @module @nahisaho/musubix-security/analysis/vulnerability-scanner
4
+ * @trace REQ-SEC-SCAN-001, REQ-SEC-SCAN-002, REQ-SEC-SCAN-003
5
+ */
6
+ import type { SourceFile } from 'ts-morph';
7
+ import type { Vulnerability, ScanOptions, ScanResult } from '../types/index.js';
8
+ import { ASTParser } from '../infrastructure/ast-parser.js';
9
+ /**
10
+ * Vulnerability detector interface
11
+ */
12
+ interface VulnerabilityDetector {
13
+ ruleId: string;
14
+ detect(sourceFile: SourceFile, parser: ASTParser): Vulnerability[];
15
+ }
16
+ /**
17
+ * Reset vulnerability counter (for testing)
18
+ */
19
+ export declare function resetVulnCounter(): void;
20
+ /**
21
+ * Vulnerability scanner
22
+ */
23
+ export declare class VulnerabilityScanner {
24
+ private parser;
25
+ private fileScanner;
26
+ private detectors;
27
+ constructor(options?: {
28
+ tsConfigPath?: string;
29
+ });
30
+ /**
31
+ * Scan a single file
32
+ */
33
+ scanFile(filePath: string): Vulnerability[];
34
+ /**
35
+ * Scan a directory
36
+ */
37
+ scanDirectory(rootPath: string, options?: ScanOptions): Promise<ScanResult>;
38
+ /**
39
+ * Add a custom detector
40
+ */
41
+ addDetector(detector: VulnerabilityDetector): void;
42
+ /**
43
+ * Get list of rule IDs
44
+ */
45
+ getRuleIds(): string[];
46
+ /**
47
+ * Get number of rules
48
+ */
49
+ getRuleCount(): number;
50
+ }
51
+ /**
52
+ * Create a vulnerability scanner
53
+ */
54
+ export declare function createVulnerabilityScanner(options?: {
55
+ tsConfigPath?: string;
56
+ }): VulnerabilityScanner;
57
+ export {};
58
+ //# sourceMappingURL=vulnerability-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vulnerability-scanner.d.ts","sourceRoot":"","sources":["../../src/analysis/vulnerability-scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAgB,MAAM,iCAAiC,CAAC;AAG1E;;GAEG;AACH,UAAU,qBAAqB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,aAAa,EAAE,CAAC;CACpE;AAYD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AA2UD;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAA0B;gBAE/B,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAM/C;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAY3C;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAyDjF;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAIlD;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,YAAY,IAAI,MAAM;CAGvB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,oBAAoB,CAEpG"}