@nahisaho/musubix-security 3.0.7 → 3.0.11

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 (117) hide show
  1. package/dist/analysis/index.d.ts +3 -0
  2. package/dist/analysis/index.d.ts.map +1 -1
  3. package/dist/analysis/index.js +3 -0
  4. package/dist/analysis/index.js.map +1 -1
  5. package/dist/analysis/multi-language-scanner.d.ts +78 -0
  6. package/dist/analysis/multi-language-scanner.d.ts.map +1 -0
  7. package/dist/analysis/multi-language-scanner.js +236 -0
  8. package/dist/analysis/multi-language-scanner.js.map +1 -0
  9. package/dist/analysis/php-scanner.d.ts +61 -0
  10. package/dist/analysis/php-scanner.d.ts.map +1 -0
  11. package/dist/analysis/php-scanner.js +551 -0
  12. package/dist/analysis/php-scanner.js.map +1 -0
  13. package/dist/analysis/python-scanner.d.ts +61 -0
  14. package/dist/analysis/python-scanner.d.ts.map +1 -0
  15. package/dist/analysis/python-scanner.js +472 -0
  16. package/dist/analysis/python-scanner.js.map +1 -0
  17. package/dist/analysis/vulnerability-scanner.d.ts.map +1 -1
  18. package/dist/analysis/vulnerability-scanner.js +535 -0
  19. package/dist/analysis/vulnerability-scanner.js.map +1 -1
  20. package/dist/cli/commands.d.ts.map +1 -1
  21. package/dist/cli/commands.js +221 -0
  22. package/dist/cli/commands.js.map +1 -1
  23. package/dist/codedb/builder.d.ts +106 -0
  24. package/dist/codedb/builder.d.ts.map +1 -0
  25. package/dist/codedb/builder.js +50 -0
  26. package/dist/codedb/builder.js.map +1 -0
  27. package/dist/codedb/database.d.ts +74 -0
  28. package/dist/codedb/database.d.ts.map +1 -0
  29. package/dist/codedb/database.js +81 -0
  30. package/dist/codedb/database.js.map +1 -0
  31. package/dist/codedb/index.d.ts +13 -0
  32. package/dist/codedb/index.d.ts.map +1 -0
  33. package/dist/codedb/index.js +13 -0
  34. package/dist/codedb/index.js.map +1 -0
  35. package/dist/codedb/serializer.d.ts +316 -0
  36. package/dist/codedb/serializer.d.ts.map +1 -0
  37. package/dist/codedb/serializer.js +433 -0
  38. package/dist/codedb/serializer.js.map +1 -0
  39. package/dist/extractors/base-extractor.d.ts +487 -0
  40. package/dist/extractors/base-extractor.d.ts.map +1 -0
  41. package/dist/extractors/base-extractor.js +164 -0
  42. package/dist/extractors/base-extractor.js.map +1 -0
  43. package/dist/extractors/go-extractor.d.ts +105 -0
  44. package/dist/extractors/go-extractor.d.ts.map +1 -0
  45. package/dist/extractors/go-extractor.js +805 -0
  46. package/dist/extractors/go-extractor.js.map +1 -0
  47. package/dist/extractors/index.d.ts +16 -0
  48. package/dist/extractors/index.d.ts.map +1 -0
  49. package/dist/extractors/index.js +35 -0
  50. package/dist/extractors/index.js.map +1 -0
  51. package/dist/extractors/java-extractor.d.ts +109 -0
  52. package/dist/extractors/java-extractor.d.ts.map +1 -0
  53. package/dist/extractors/java-extractor.js +962 -0
  54. package/dist/extractors/java-extractor.js.map +1 -0
  55. package/dist/index.d.ts +29 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +65 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/mql/executor.d.ts +151 -0
  60. package/dist/mql/executor.d.ts.map +1 -0
  61. package/dist/mql/executor.js +713 -0
  62. package/dist/mql/executor.js.map +1 -0
  63. package/dist/mql/index.d.ts +65 -0
  64. package/dist/mql/index.d.ts.map +1 -0
  65. package/dist/mql/index.js +102 -0
  66. package/dist/mql/index.js.map +1 -0
  67. package/dist/mql/lexer.d.ts +193 -0
  68. package/dist/mql/lexer.d.ts.map +1 -0
  69. package/dist/mql/lexer.js +490 -0
  70. package/dist/mql/lexer.js.map +1 -0
  71. package/dist/mql/parser.d.ts +124 -0
  72. package/dist/mql/parser.d.ts.map +1 -0
  73. package/dist/mql/parser.js +620 -0
  74. package/dist/mql/parser.js.map +1 -0
  75. package/dist/mql/planner.d.ts +100 -0
  76. package/dist/mql/planner.d.ts.map +1 -0
  77. package/dist/mql/planner.js +479 -0
  78. package/dist/mql/planner.js.map +1 -0
  79. package/dist/types/codedb.d.ts +530 -0
  80. package/dist/types/codedb.d.ts.map +1 -0
  81. package/dist/types/codedb.js +7 -0
  82. package/dist/types/codedb.js.map +1 -0
  83. package/dist/types/index.d.ts +3 -0
  84. package/dist/types/index.d.ts.map +1 -1
  85. package/dist/types/index.js +6 -0
  86. package/dist/types/index.js.map +1 -1
  87. package/dist/types/mql.d.ts +422 -0
  88. package/dist/types/mql.d.ts.map +1 -0
  89. package/dist/types/mql.js +48 -0
  90. package/dist/types/mql.js.map +1 -0
  91. package/dist/types/variant.d.ts +582 -0
  92. package/dist/types/variant.d.ts.map +1 -0
  93. package/dist/types/variant.js +66 -0
  94. package/dist/types/variant.js.map +1 -0
  95. package/dist/types/vulnerability.d.ts +1 -1
  96. package/dist/types/vulnerability.d.ts.map +1 -1
  97. package/dist/variant/detector.d.ts +92 -0
  98. package/dist/variant/detector.d.ts.map +1 -0
  99. package/dist/variant/detector.js +257 -0
  100. package/dist/variant/detector.js.map +1 -0
  101. package/dist/variant/index.d.ts +15 -0
  102. package/dist/variant/index.d.ts.map +1 -0
  103. package/dist/variant/index.js +22 -0
  104. package/dist/variant/index.js.map +1 -0
  105. package/dist/variant/model.d.ts +78 -0
  106. package/dist/variant/model.d.ts.map +1 -0
  107. package/dist/variant/model.js +719 -0
  108. package/dist/variant/model.js.map +1 -0
  109. package/dist/variant/sarif.d.ts +68 -0
  110. package/dist/variant/sarif.d.ts.map +1 -0
  111. package/dist/variant/sarif.js +293 -0
  112. package/dist/variant/sarif.js.map +1 -0
  113. package/dist/variant/scanner.d.ts +98 -0
  114. package/dist/variant/scanner.d.ts.map +1 -0
  115. package/dist/variant/scanner.js +348 -0
  116. package/dist/variant/scanner.js.map +1 -0
  117. package/package.json +35 -5
@@ -7,4 +7,7 @@ export { TaintAnalyzer, createTaintAnalyzer, resetTaintCounters, } from './taint
7
7
  export { EnhancedTaintAnalyzer, createEnhancedTaintAnalyzer, type EnhancedTaintOptions, type EnhancedTaintResult, } from './enhanced-taint-analyzer.js';
8
8
  export { SecretDetector, createSecretDetector, resetSecretCounter, } from './secret-detector.js';
9
9
  export { DependencyAuditor, createDependencyAuditor, } from './dependency-auditor.js';
10
+ export { PythonScanner, createPythonScanner, resetPythonVulnCounter, } from './python-scanner.js';
11
+ export { PhpScanner, createPhpScanner, resetPhpVulnCounter, } from './php-scanner.js';
12
+ export { MultiLanguageScanner, createMultiLanguageScanner, type SupportedLanguage, type MultiLanguageScanOptions, type MultiLanguageScanResult, } from './multi-language-scanner.js';
10
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,6BAA6B,CAAC"}
@@ -7,4 +7,7 @@ export { TaintAnalyzer, createTaintAnalyzer, resetTaintCounters, } from './taint
7
7
  export { EnhancedTaintAnalyzer, createEnhancedTaintAnalyzer, } from './enhanced-taint-analyzer.js';
8
8
  export { SecretDetector, createSecretDetector, resetSecretCounter, } from './secret-detector.js';
9
9
  export { DependencyAuditor, createDependencyAuditor, } from './dependency-auditor.js';
10
+ export { PythonScanner, createPythonScanner, resetPythonVulnCounter, } from './python-scanner.js';
11
+ export { PhpScanner, createPhpScanner, resetPhpVulnCounter, } from './php-scanner.js';
12
+ export { MultiLanguageScanner, createMultiLanguageScanner, } from './multi-language-scanner.js';
10
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAG5B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAG5B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAI3B,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @fileoverview Multi-language vulnerability scanner - unified scanner for TypeScript, JavaScript, Python, PHP
3
+ * @module @nahisaho/musubix-security/analysis/multi-language-scanner
4
+ * @trace REQ-SEC-MULTI-001
5
+ */
6
+ import type { Vulnerability, ScanOptions, ScanResult } from '../types/index.js';
7
+ /**
8
+ * Language type
9
+ */
10
+ export type SupportedLanguage = 'typescript' | 'javascript' | 'python' | 'php';
11
+ /**
12
+ * Multi-language scan options
13
+ */
14
+ export interface MultiLanguageScanOptions extends ScanOptions {
15
+ /** Languages to scan (default: all) */
16
+ languages?: SupportedLanguage[];
17
+ }
18
+ /**
19
+ * Multi-language scan result
20
+ */
21
+ export interface MultiLanguageScanResult extends ScanResult {
22
+ /** Results by language */
23
+ byLanguage: Record<SupportedLanguage, {
24
+ vulnerabilities: Vulnerability[];
25
+ scannedFiles: number;
26
+ }>;
27
+ }
28
+ /**
29
+ * Multi-language vulnerability scanner
30
+ */
31
+ export declare class MultiLanguageScanner {
32
+ private tsScanner;
33
+ private pythonScanner;
34
+ private phpScanner;
35
+ constructor();
36
+ /**
37
+ * Detect language from file extension
38
+ */
39
+ detectLanguage(filePath: string): SupportedLanguage | null;
40
+ /**
41
+ * Get all supported languages
42
+ */
43
+ getSupportedLanguages(): SupportedLanguage[];
44
+ /**
45
+ * Get supported extensions
46
+ */
47
+ getSupportedExtensions(): string[];
48
+ /**
49
+ * Scan a single file
50
+ */
51
+ scanFile(filePath: string): Promise<Vulnerability[]>;
52
+ /**
53
+ * Scan content with specified language
54
+ * Note: TypeScript/JavaScript only supports file-based scanning via ts-morph
55
+ */
56
+ scanContent(content: string, language: SupportedLanguage, filePath?: string): Vulnerability[];
57
+ /**
58
+ * Scan a directory for all supported languages
59
+ */
60
+ scanDirectory(rootPath: string, options?: MultiLanguageScanOptions): Promise<MultiLanguageScanResult>;
61
+ /**
62
+ * Get rule count by language
63
+ */
64
+ getRuleCountByLanguage(): Record<SupportedLanguage, number>;
65
+ /**
66
+ * Get total rule count
67
+ */
68
+ getTotalRuleCount(): number;
69
+ /**
70
+ * Get CWE coverage
71
+ */
72
+ getCWECoverage(): string[];
73
+ }
74
+ /**
75
+ * Create multi-language scanner
76
+ */
77
+ export declare function createMultiLanguageScanner(): MultiLanguageScanner;
78
+ //# sourceMappingURL=multi-language-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-language-scanner.d.ts","sourceRoot":"","sources":["../../src/analysis/multi-language-scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAK3B;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,uCAAuC;IACvC,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,UAAU;IACzD,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE;QACpC,eAAe,EAAE,aAAa,EAAE,CAAC;QACjC,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ;AAsBD;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAa;;IAQ/B;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAK1D;;OAEG;IACH,qBAAqB,IAAI,iBAAiB,EAAE;IAI5C;;OAEG;IACH,sBAAsB,IAAI,MAAM,EAAE;IAIlC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAmB1D;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAiB7F;;OAEG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,uBAAuB,CAAC;IAsFnC;;OAEG;IACH,sBAAsB,IAAI,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAS3D;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAM3B;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;CA6B3B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * @fileoverview Multi-language vulnerability scanner - unified scanner for TypeScript, JavaScript, Python, PHP
3
+ * @module @nahisaho/musubix-security/analysis/multi-language-scanner
4
+ * @trace REQ-SEC-MULTI-001
5
+ */
6
+ import * as fs from 'node:fs/promises';
7
+ import * as path from 'node:path';
8
+ import { createVulnerabilityScanner } from './vulnerability-scanner.js';
9
+ import { createPythonScanner } from './python-scanner.js';
10
+ import { createPhpScanner } from './php-scanner.js';
11
+ /**
12
+ * File extension to language mapping
13
+ */
14
+ const EXTENSION_TO_LANGUAGE = {
15
+ '.ts': 'typescript',
16
+ '.tsx': 'typescript',
17
+ '.mts': 'typescript',
18
+ '.cts': 'typescript',
19
+ '.js': 'javascript',
20
+ '.jsx': 'javascript',
21
+ '.mjs': 'javascript',
22
+ '.cjs': 'javascript',
23
+ '.py': 'python',
24
+ '.pyw': 'python',
25
+ '.php': 'php',
26
+ '.phtml': 'php',
27
+ '.php5': 'php',
28
+ '.php7': 'php',
29
+ };
30
+ /**
31
+ * Multi-language vulnerability scanner
32
+ */
33
+ export class MultiLanguageScanner {
34
+ tsScanner;
35
+ pythonScanner;
36
+ phpScanner;
37
+ constructor() {
38
+ this.tsScanner = createVulnerabilityScanner();
39
+ this.pythonScanner = createPythonScanner();
40
+ this.phpScanner = createPhpScanner();
41
+ }
42
+ /**
43
+ * Detect language from file extension
44
+ */
45
+ detectLanguage(filePath) {
46
+ const ext = path.extname(filePath).toLowerCase();
47
+ return EXTENSION_TO_LANGUAGE[ext] ?? null;
48
+ }
49
+ /**
50
+ * Get all supported languages
51
+ */
52
+ getSupportedLanguages() {
53
+ return ['typescript', 'javascript', 'python', 'php'];
54
+ }
55
+ /**
56
+ * Get supported extensions
57
+ */
58
+ getSupportedExtensions() {
59
+ return Object.keys(EXTENSION_TO_LANGUAGE);
60
+ }
61
+ /**
62
+ * Scan a single file
63
+ */
64
+ async scanFile(filePath) {
65
+ const language = this.detectLanguage(filePath);
66
+ if (!language) {
67
+ return [];
68
+ }
69
+ switch (language) {
70
+ case 'typescript':
71
+ case 'javascript':
72
+ return this.tsScanner.scanFile(filePath);
73
+ case 'python':
74
+ return this.pythonScanner.scanFile(filePath);
75
+ case 'php':
76
+ return this.phpScanner.scanFile(filePath);
77
+ default:
78
+ return [];
79
+ }
80
+ }
81
+ /**
82
+ * Scan content with specified language
83
+ * Note: TypeScript/JavaScript only supports file-based scanning via ts-morph
84
+ */
85
+ scanContent(content, language, filePath) {
86
+ switch (language) {
87
+ case 'typescript':
88
+ case 'javascript':
89
+ // TypeScript scanner requires file-based scanning (ts-morph)
90
+ // For content scanning, use Python or PHP
91
+ console.warn('TypeScript/JavaScript content scanning not supported. Use scanFile() instead.');
92
+ return [];
93
+ case 'python':
94
+ return this.pythonScanner.scanContent(content, filePath ?? 'unknown.py');
95
+ case 'php':
96
+ return this.phpScanner.scanContent(content, filePath ?? 'unknown.php');
97
+ default:
98
+ return [];
99
+ }
100
+ }
101
+ /**
102
+ * Scan a directory for all supported languages
103
+ */
104
+ async scanDirectory(rootPath, options) {
105
+ const startTime = Date.now();
106
+ const allVulnerabilities = [];
107
+ let totalScannedFiles = 0;
108
+ let totalSkippedFiles = 0;
109
+ const byLanguage = {
110
+ typescript: { vulnerabilities: [], scannedFiles: 0 },
111
+ javascript: { vulnerabilities: [], scannedFiles: 0 },
112
+ python: { vulnerabilities: [], scannedFiles: 0 },
113
+ php: { vulnerabilities: [], scannedFiles: 0 },
114
+ };
115
+ const enabledLanguages = options?.languages ?? this.getSupportedLanguages();
116
+ const scanDir = async (dirPath) => {
117
+ let entries;
118
+ try {
119
+ entries = await fs.readdir(dirPath, { withFileTypes: true });
120
+ }
121
+ catch {
122
+ return;
123
+ }
124
+ for (const entry of entries) {
125
+ const fullPath = path.join(dirPath, entry.name);
126
+ if (entry.isDirectory()) {
127
+ // Skip common non-source directories
128
+ const skipDirs = [
129
+ '.git', 'node_modules', '__pycache__', 'venv', '.venv',
130
+ 'env', '.env', 'vendor', 'cache', 'tmp', 'dist', 'build',
131
+ '.next', '.nuxt', 'coverage', '.nyc_output'
132
+ ];
133
+ if (skipDirs.includes(entry.name)) {
134
+ continue;
135
+ }
136
+ await scanDir(fullPath);
137
+ }
138
+ else if (entry.isFile()) {
139
+ const language = this.detectLanguage(fullPath);
140
+ if (!language || !enabledLanguages.includes(language)) {
141
+ continue;
142
+ }
143
+ // Apply exclude patterns
144
+ if (options?.excludePatterns?.some(p => fullPath.includes(p))) {
145
+ totalSkippedFiles++;
146
+ continue;
147
+ }
148
+ try {
149
+ const vulns = await this.scanFile(fullPath);
150
+ allVulnerabilities.push(...vulns);
151
+ byLanguage[language].vulnerabilities.push(...vulns);
152
+ byLanguage[language].scannedFiles++;
153
+ totalScannedFiles++;
154
+ }
155
+ catch (error) {
156
+ console.warn(`Warning: Failed to scan ${fullPath}: ${error}`);
157
+ totalSkippedFiles++;
158
+ }
159
+ }
160
+ }
161
+ };
162
+ await scanDir(rootPath);
163
+ const duration = Date.now() - startTime;
164
+ return {
165
+ vulnerabilities: allVulnerabilities,
166
+ scannedFiles: totalScannedFiles,
167
+ skippedFiles: totalSkippedFiles,
168
+ duration,
169
+ timestamp: new Date(),
170
+ options: options ?? {},
171
+ summary: {
172
+ critical: allVulnerabilities.filter(v => v.severity === 'critical').length,
173
+ high: allVulnerabilities.filter(v => v.severity === 'high').length,
174
+ medium: allVulnerabilities.filter(v => v.severity === 'medium').length,
175
+ low: allVulnerabilities.filter(v => v.severity === 'low').length,
176
+ info: allVulnerabilities.filter(v => v.severity === 'info').length,
177
+ total: allVulnerabilities.length,
178
+ },
179
+ byLanguage,
180
+ };
181
+ }
182
+ /**
183
+ * Get rule count by language
184
+ */
185
+ getRuleCountByLanguage() {
186
+ return {
187
+ typescript: this.tsScanner.getRuleCount(),
188
+ javascript: this.tsScanner.getRuleCount(), // Same as TypeScript
189
+ python: this.pythonScanner.getRuleCount(),
190
+ php: this.phpScanner.getRuleCount(),
191
+ };
192
+ }
193
+ /**
194
+ * Get total rule count
195
+ */
196
+ getTotalRuleCount() {
197
+ const counts = this.getRuleCountByLanguage();
198
+ // TypeScript and JavaScript share rules, so count only once
199
+ return counts.typescript + counts.python + counts.php;
200
+ }
201
+ /**
202
+ * Get CWE coverage
203
+ */
204
+ getCWECoverage() {
205
+ const cwes = new Set();
206
+ // TypeScript/JavaScript CWEs
207
+ const tsRules = [
208
+ 'CWE-89', 'CWE-79', 'CWE-78', 'CWE-22', 'CWE-327', 'CWE-798',
209
+ 'CWE-918', 'CWE-502', 'CWE-611', 'CWE-90', 'CWE-1333', 'CWE-362'
210
+ ];
211
+ tsRules.forEach(cwe => cwes.add(cwe));
212
+ // Python CWEs
213
+ const pythonRules = [
214
+ 'CWE-89', 'CWE-78', 'CWE-94', 'CWE-95', 'CWE-22', 'CWE-502',
215
+ 'CWE-611', 'CWE-918', 'CWE-90', 'CWE-798', 'CWE-327', 'CWE-328',
216
+ 'CWE-489', 'CWE-1333', 'CWE-1336', 'CWE-617'
217
+ ];
218
+ pythonRules.forEach(cwe => cwes.add(cwe));
219
+ // PHP CWEs
220
+ const phpRules = [
221
+ 'CWE-89', 'CWE-79', 'CWE-78', 'CWE-94', 'CWE-95', 'CWE-98',
222
+ 'CWE-22', 'CWE-502', 'CWE-918', 'CWE-611', 'CWE-90', 'CWE-798',
223
+ 'CWE-327', 'CWE-328', 'CWE-384', 'CWE-601', 'CWE-209', 'CWE-614',
224
+ 'CWE-1004'
225
+ ];
226
+ phpRules.forEach(cwe => cwes.add(cwe));
227
+ return Array.from(cwes).sort();
228
+ }
229
+ }
230
+ /**
231
+ * Create multi-language scanner
232
+ */
233
+ export function createMultiLanguageScanner() {
234
+ return new MultiLanguageScanner();
235
+ }
236
+ //# sourceMappingURL=multi-language-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-language-scanner.js","sourceRoot":"","sources":["../../src/analysis/multi-language-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @fileoverview PHP vulnerability scanner - static analysis for PHP security vulnerabilities
3
+ * @module @nahisaho/musubix-security/analysis/php-scanner
4
+ * @trace REQ-SEC-PHP-001
5
+ */
6
+ import type { Vulnerability, ScanOptions, ScanResult, Severity, OWASPCategory } from '../types/index.js';
7
+ /**
8
+ * Reset PHP vulnerability counter (for testing)
9
+ */
10
+ export declare function resetPhpVulnCounter(): void;
11
+ /**
12
+ * PHP vulnerability pattern
13
+ */
14
+ interface PhpPattern {
15
+ ruleId: string;
16
+ pattern: RegExp;
17
+ type: string;
18
+ severity: Severity;
19
+ cwes: string[];
20
+ owasp: OWASPCategory[];
21
+ description: string;
22
+ recommendation: string;
23
+ confidence: number;
24
+ }
25
+ /**
26
+ * PHP vulnerability scanner
27
+ */
28
+ export declare class PhpScanner {
29
+ private patterns;
30
+ constructor();
31
+ /**
32
+ * Scan a single PHP file
33
+ */
34
+ scanFile(filePath: string): Promise<Vulnerability[]>;
35
+ /**
36
+ * Scan PHP content
37
+ */
38
+ scanContent(content: string, filePath?: string): Vulnerability[];
39
+ /**
40
+ * Scan a directory for PHP files
41
+ */
42
+ scanDirectory(rootPath: string, options?: ScanOptions): Promise<ScanResult>;
43
+ /**
44
+ * Add custom pattern
45
+ */
46
+ addPattern(pattern: PhpPattern): void;
47
+ /**
48
+ * Get rule IDs
49
+ */
50
+ getRuleIds(): string[];
51
+ /**
52
+ * Get rule count
53
+ */
54
+ getRuleCount(): number;
55
+ }
56
+ /**
57
+ * Create PHP scanner
58
+ */
59
+ export declare function createPhpScanner(): PhpScanner;
60
+ export {};
61
+ //# sourceMappingURL=php-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-scanner.d.ts","sourceRoot":"","sources":["../../src/analysis/php-scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,UAAU,EAEV,QAAQ,EACR,aAAa,EACd,MAAM,mBAAmB,CAAC;AAY3B;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0ZD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAe;;IAM/B;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK1D;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAsB,GAAG,aAAa,EAAE;IA6B/E;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA2DjF;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAIrC;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,YAAY,IAAI,MAAM;CAGvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}