@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,581 @@
1
+ /**
2
+ * @fileoverview API Security Analyzer - OpenAPI/REST API security analysis
3
+ * @module @nahisaho/musubix-security/analyzers/api/api-security-analyzer
4
+ * @trace DES-SEC3-API-001, REQ-SEC3-API-001
5
+ */
6
+ /**
7
+ * Built-in security rules
8
+ */
9
+ const BUILTIN_RULES = [
10
+ // Authentication rules
11
+ {
12
+ id: 'API-001',
13
+ name: 'Missing Authentication',
14
+ category: 'authentication',
15
+ severity: 'high',
16
+ check: (endpoint, spec) => {
17
+ const hasGlobalAuth = spec.security && spec.security.length > 0;
18
+ const hasEndpointAuth = endpoint.security && endpoint.security.length > 0;
19
+ const isPublicPath = endpoint.path.includes('/health') ||
20
+ endpoint.path.includes('/public') ||
21
+ endpoint.path.includes('/docs');
22
+ return !hasGlobalAuth && !hasEndpointAuth && !isPublicPath;
23
+ },
24
+ message: 'Endpoint has no authentication requirement',
25
+ recommendation: 'Add authentication security scheme to protect this endpoint',
26
+ owasp: ['A07:2021'],
27
+ cwe: ['CWE-306'],
28
+ },
29
+ {
30
+ id: 'API-002',
31
+ name: 'Weak Authentication Scheme',
32
+ category: 'authentication',
33
+ severity: 'medium',
34
+ check: (endpoint, spec) => {
35
+ const schemes = spec.components?.securitySchemes ?? {};
36
+ const usedSchemes = [...(spec.security ?? []), ...(endpoint.security ?? [])];
37
+ for (const req of usedSchemes) {
38
+ for (const schemeName of Object.keys(req)) {
39
+ const scheme = schemes[schemeName];
40
+ if (scheme?.type === 'apiKey' && scheme.in === 'query') {
41
+ return true;
42
+ }
43
+ if (scheme?.type === 'http' && scheme.scheme === 'basic') {
44
+ return true;
45
+ }
46
+ }
47
+ }
48
+ return false;
49
+ },
50
+ message: 'Endpoint uses weak authentication (API key in query or Basic Auth)',
51
+ recommendation: 'Use Bearer tokens or OAuth2 for better security',
52
+ owasp: ['A07:2021'],
53
+ cwe: ['CWE-287'],
54
+ },
55
+ // Authorization rules
56
+ {
57
+ id: 'API-003',
58
+ name: 'Missing Scope/Permission Check',
59
+ category: 'authorization',
60
+ severity: 'medium',
61
+ check: (endpoint, spec) => {
62
+ const security = endpoint.security ?? spec.security ?? [];
63
+ // Check if any OAuth2 scope is defined
64
+ for (const req of security) {
65
+ for (const scopes of Object.values(req)) {
66
+ if (Array.isArray(scopes) && scopes.length > 0) {
67
+ return false;
68
+ }
69
+ }
70
+ }
71
+ // Sensitive operations should have scopes
72
+ const sensitiveOps = ['POST', 'PUT', 'PATCH', 'DELETE'];
73
+ return sensitiveOps.includes(endpoint.method);
74
+ },
75
+ message: 'Sensitive operation lacks specific permission scopes',
76
+ recommendation: 'Define OAuth2 scopes or permission requirements for sensitive operations',
77
+ owasp: ['A01:2021'],
78
+ cwe: ['CWE-285'],
79
+ },
80
+ // Injection rules
81
+ {
82
+ id: 'API-004',
83
+ name: 'Missing Input Validation',
84
+ category: 'input-validation',
85
+ severity: 'high',
86
+ check: (endpoint) => {
87
+ const params = endpoint.parameters ?? [];
88
+ for (const param of params) {
89
+ if (!param.schema)
90
+ return true;
91
+ const schema = param.schema;
92
+ // Check if string params have validation
93
+ if (schema.type === 'string' && !schema.pattern && !schema.maxLength && !schema.enum) {
94
+ return true;
95
+ }
96
+ }
97
+ return false;
98
+ },
99
+ message: 'Input parameters lack validation constraints',
100
+ recommendation: 'Add pattern, maxLength, or enum constraints to string parameters',
101
+ owasp: ['A03:2021'],
102
+ cwe: ['CWE-20'],
103
+ },
104
+ {
105
+ id: 'API-005',
106
+ name: 'SQL Injection Risk',
107
+ category: 'injection',
108
+ severity: 'critical',
109
+ check: (endpoint) => {
110
+ // Check for dangerous parameter patterns
111
+ const dangerousPatterns = ['query', 'filter', 'where', 'orderBy', 'sortBy', 'search'];
112
+ const params = endpoint.parameters ?? [];
113
+ for (const param of params) {
114
+ if (dangerousPatterns.some(p => param.name.toLowerCase().includes(p))) {
115
+ if (!param.schema?.pattern && !param.schema?.enum) {
116
+ return true;
117
+ }
118
+ }
119
+ }
120
+ return false;
121
+ },
122
+ message: 'Query/filter parameter without validation may allow SQL injection',
123
+ recommendation: 'Validate and sanitize query parameters; use parameterized queries',
124
+ owasp: ['A03:2021'],
125
+ cwe: ['CWE-89'],
126
+ },
127
+ // Data exposure rules
128
+ {
129
+ id: 'API-006',
130
+ name: 'Sensitive Data in Response',
131
+ category: 'data-exposure',
132
+ severity: 'high',
133
+ check: (endpoint) => {
134
+ const sensitiveFields = ['password', 'secret', 'token', 'ssn', 'credit_card', 'cvv'];
135
+ const responses = endpoint.responses ?? {};
136
+ for (const [code, response] of Object.entries(responses)) {
137
+ if (!code.startsWith('2'))
138
+ continue;
139
+ for (const mediaType of Object.values(response.content ?? {})) {
140
+ const schema = mediaType.schema;
141
+ if (schema?.properties) {
142
+ for (const prop of Object.keys(schema.properties)) {
143
+ if (sensitiveFields.some(s => prop.toLowerCase().includes(s))) {
144
+ return true;
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ return false;
151
+ },
152
+ message: 'Response may contain sensitive data fields',
153
+ recommendation: 'Remove sensitive fields from API responses or mask them',
154
+ owasp: ['A01:2021'],
155
+ cwe: ['CWE-200'],
156
+ },
157
+ {
158
+ id: 'API-007',
159
+ name: 'Missing Rate Limiting Header',
160
+ category: 'rate-limiting',
161
+ severity: 'medium',
162
+ check: (endpoint) => {
163
+ const responses = endpoint.responses ?? {};
164
+ const hasRateLimitHeader = Object.values(responses).some(r => r.description?.toLowerCase().includes('rate limit'));
165
+ return !hasRateLimitHeader && endpoint.method === 'POST';
166
+ },
167
+ message: 'No rate limiting documented for POST endpoint',
168
+ recommendation: 'Implement and document rate limiting headers (X-RateLimit-*)',
169
+ owasp: ['A05:2021'],
170
+ cwe: ['CWE-770'],
171
+ },
172
+ // Transport security
173
+ {
174
+ id: 'API-008',
175
+ name: 'HTTP Server URL',
176
+ category: 'transport-security',
177
+ severity: 'high',
178
+ check: (_endpoint, spec) => {
179
+ const servers = spec.servers ?? [];
180
+ return servers.some(s => s.url.startsWith('http://') && !s.url.includes('localhost'));
181
+ },
182
+ message: 'API server uses insecure HTTP protocol',
183
+ recommendation: 'Use HTTPS for all API communications',
184
+ owasp: ['A02:2021'],
185
+ cwe: ['CWE-319'],
186
+ },
187
+ // Error handling
188
+ {
189
+ id: 'API-009',
190
+ name: 'Missing Error Response Schema',
191
+ category: 'error-handling',
192
+ severity: 'low',
193
+ check: (endpoint) => {
194
+ const responses = endpoint.responses ?? {};
195
+ const hasErrorSchema = Object.entries(responses).some(([code, r]) => {
196
+ const isError = code.startsWith('4') || code.startsWith('5');
197
+ return isError && r.content;
198
+ });
199
+ return !hasErrorSchema;
200
+ },
201
+ message: 'Error responses lack schema definition',
202
+ recommendation: 'Define error response schemas to ensure consistent error handling',
203
+ owasp: ['A09:2021'],
204
+ cwe: ['CWE-209'],
205
+ },
206
+ // Deprecated API
207
+ {
208
+ id: 'API-010',
209
+ name: 'Deprecated Endpoint',
210
+ category: 'deprecated-api',
211
+ severity: 'info',
212
+ check: (endpoint, spec) => {
213
+ // Check in the spec if operation is marked deprecated
214
+ const paths = spec.paths ?? {};
215
+ const pathItem = paths[endpoint.path];
216
+ if (!pathItem)
217
+ return false;
218
+ const method = endpoint.method.toLowerCase();
219
+ const operation = pathItem[method];
220
+ return operation?.deprecated === true;
221
+ },
222
+ message: 'Endpoint is marked as deprecated',
223
+ recommendation: 'Plan migration to the replacement API; document deprecation timeline',
224
+ owasp: ['A09:2021'],
225
+ cwe: ['CWE-1104'],
226
+ },
227
+ // CORS
228
+ {
229
+ id: 'API-011',
230
+ name: 'Missing CORS Configuration',
231
+ category: 'cors',
232
+ severity: 'medium',
233
+ check: (endpoint, spec) => {
234
+ // If there's no OPTIONS handler for paths, CORS might not be configured
235
+ const paths = spec.paths ?? {};
236
+ const pathItem = paths[endpoint.path];
237
+ if (!pathItem)
238
+ return false;
239
+ return !pathItem.options;
240
+ },
241
+ message: 'No OPTIONS method defined for CORS preflight',
242
+ recommendation: 'Configure CORS headers and OPTIONS handler appropriately',
243
+ owasp: ['A05:2021'],
244
+ cwe: ['CWE-942'],
245
+ },
246
+ // Misconfiguration
247
+ {
248
+ id: 'API-012',
249
+ name: 'Missing Content-Type Validation',
250
+ category: 'misconfiguration',
251
+ severity: 'medium',
252
+ check: (endpoint) => {
253
+ if (!endpoint.requestBody)
254
+ return false;
255
+ const content = endpoint.requestBody.content ?? {};
256
+ // Check if only specific content types are accepted
257
+ return Object.keys(content).includes('*/*');
258
+ },
259
+ message: 'Endpoint accepts any content type',
260
+ recommendation: 'Restrict accepted content types to prevent content type confusion attacks',
261
+ owasp: ['A05:2021'],
262
+ cwe: ['CWE-436'],
263
+ },
264
+ ];
265
+ /**
266
+ * API Security Analyzer
267
+ * @trace DES-SEC3-API-001
268
+ */
269
+ export class APISecurityAnalyzer {
270
+ options;
271
+ rules;
272
+ constructor(options = {}) {
273
+ this.options = {
274
+ checkAuth: options.checkAuth ?? true,
275
+ checkInjection: options.checkInjection ?? true,
276
+ checkDataExposure: options.checkDataExposure ?? true,
277
+ checkRateLimiting: options.checkRateLimiting ?? true,
278
+ checkCORS: options.checkCORS ?? true,
279
+ skipPaths: options.skipPaths ?? [],
280
+ customRules: options.customRules ?? [],
281
+ };
282
+ this.rules = [...BUILTIN_RULES];
283
+ }
284
+ /**
285
+ * Analyze OpenAPI specification
286
+ * @trace REQ-SEC3-API-001
287
+ */
288
+ async analyze(spec) {
289
+ const parsedSpec = typeof spec === 'string' ? JSON.parse(spec) : spec;
290
+ const endpoints = this.extractEndpoints(parsedSpec);
291
+ const issues = [];
292
+ // Filter endpoints
293
+ const filteredEndpoints = endpoints.filter(ep => !this.options.skipPaths.some(p => ep.path.startsWith(p)));
294
+ // Run rules on each endpoint
295
+ for (const endpoint of filteredEndpoints) {
296
+ for (const rule of this.rules) {
297
+ // Skip rules based on options
298
+ if (!this.shouldRunRule(rule.category))
299
+ continue;
300
+ try {
301
+ if (rule.check(endpoint, parsedSpec)) {
302
+ issues.push({
303
+ id: `${rule.id}-${endpoint.method}-${endpoint.path.replace(/\//g, '-')}`,
304
+ severity: rule.severity,
305
+ category: rule.category,
306
+ endpoint: endpoint.path,
307
+ method: endpoint.method,
308
+ title: rule.name,
309
+ description: rule.message,
310
+ recommendation: rule.recommendation,
311
+ owasp: rule.owasp,
312
+ cwe: rule.cwe,
313
+ });
314
+ }
315
+ }
316
+ catch {
317
+ // Ignore rule errors
318
+ }
319
+ }
320
+ }
321
+ // Run custom rules
322
+ for (const customRule of this.options.customRules) {
323
+ for (const endpoint of filteredEndpoints) {
324
+ try {
325
+ if (customRule.check(endpoint, parsedSpec)) {
326
+ issues.push({
327
+ id: `${customRule.id}-${endpoint.method}-${endpoint.path.replace(/\//g, '-')}`,
328
+ severity: customRule.severity,
329
+ category: customRule.category,
330
+ endpoint: endpoint.path,
331
+ method: endpoint.method,
332
+ title: customRule.name,
333
+ description: customRule.message,
334
+ recommendation: customRule.recommendation,
335
+ });
336
+ }
337
+ }
338
+ catch {
339
+ // Ignore rule errors
340
+ }
341
+ }
342
+ }
343
+ const coverage = this.calculateCoverage(filteredEndpoints, parsedSpec);
344
+ const score = this.calculateScore(issues, coverage);
345
+ return {
346
+ timestamp: new Date(),
347
+ specVersion: parsedSpec.openapi ?? parsedSpec.swagger,
348
+ title: parsedSpec.info?.title,
349
+ endpoints: filteredEndpoints.length,
350
+ issues,
351
+ coverage,
352
+ score,
353
+ summary: this.generateSummary(issues),
354
+ };
355
+ }
356
+ /**
357
+ * Analyze from file path
358
+ */
359
+ async analyzeFile(filePath) {
360
+ const fs = await import('node:fs');
361
+ const content = fs.readFileSync(filePath, 'utf-8');
362
+ // Try JSON first, then YAML
363
+ let spec;
364
+ try {
365
+ spec = JSON.parse(content);
366
+ }
367
+ catch {
368
+ // Try basic YAML parsing (simplified)
369
+ spec = this.parseSimpleYaml(content);
370
+ }
371
+ return this.analyze(spec);
372
+ }
373
+ /**
374
+ * Extract endpoints from spec
375
+ */
376
+ extractEndpoints(spec) {
377
+ const endpoints = [];
378
+ const paths = spec.paths ?? {};
379
+ for (const [path, pathItem] of Object.entries(paths)) {
380
+ const methods = ['get', 'post', 'put', 'patch', 'delete', 'options', 'head'];
381
+ for (const method of methods) {
382
+ const operation = pathItem[method];
383
+ if (!operation)
384
+ continue;
385
+ endpoints.push({
386
+ path,
387
+ method: method.toUpperCase(),
388
+ operationId: operation.operationId,
389
+ summary: operation.summary,
390
+ tags: operation.tags,
391
+ parameters: [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])],
392
+ requestBody: operation.requestBody,
393
+ responses: operation.responses,
394
+ security: operation.security,
395
+ });
396
+ }
397
+ }
398
+ return endpoints;
399
+ }
400
+ /**
401
+ * Check if rule should run based on options
402
+ */
403
+ shouldRunRule(category) {
404
+ switch (category) {
405
+ case 'authentication':
406
+ case 'authorization':
407
+ return this.options.checkAuth;
408
+ case 'injection':
409
+ case 'input-validation':
410
+ return this.options.checkInjection;
411
+ case 'data-exposure':
412
+ return this.options.checkDataExposure;
413
+ case 'rate-limiting':
414
+ return this.options.checkRateLimiting;
415
+ case 'cors':
416
+ return this.options.checkCORS;
417
+ default:
418
+ return true;
419
+ }
420
+ }
421
+ /**
422
+ * Calculate security coverage
423
+ */
424
+ calculateCoverage(endpoints, spec) {
425
+ let withAuth = 0;
426
+ let withValidation = 0;
427
+ let withRateLimiting = 0;
428
+ const globalAuth = spec.security && spec.security.length > 0;
429
+ for (const endpoint of endpoints) {
430
+ const hasAuth = globalAuth || (endpoint.security && endpoint.security.length > 0);
431
+ if (hasAuth)
432
+ withAuth++;
433
+ const hasValidation = endpoint.parameters?.some(p => p.schema?.pattern || p.schema?.maxLength || p.schema?.enum);
434
+ if (hasValidation)
435
+ withValidation++;
436
+ // Check for rate limit documentation
437
+ const hasRateLimit = Object.values(endpoint.responses ?? {}).some(r => r.description?.toLowerCase().includes('rate'));
438
+ if (hasRateLimit)
439
+ withRateLimiting++;
440
+ }
441
+ const total = endpoints.length;
442
+ return {
443
+ endpointsWithAuth: withAuth,
444
+ endpointsWithoutAuth: total - withAuth,
445
+ endpointsWithValidation: withValidation,
446
+ endpointsWithRateLimiting: withRateLimiting,
447
+ totalEndpoints: total,
448
+ authCoverage: total > 0 ? Math.round((withAuth / total) * 100) : 100,
449
+ validationCoverage: total > 0 ? Math.round((withValidation / total) * 100) : 100,
450
+ };
451
+ }
452
+ /**
453
+ * Calculate security score
454
+ */
455
+ calculateScore(issues, coverage) {
456
+ let score = 100;
457
+ // Deduct for issues
458
+ for (const issue of issues) {
459
+ switch (issue.severity) {
460
+ case 'critical':
461
+ score -= 15;
462
+ break;
463
+ case 'high':
464
+ score -= 10;
465
+ break;
466
+ case 'medium':
467
+ score -= 5;
468
+ break;
469
+ case 'low':
470
+ score -= 2;
471
+ break;
472
+ }
473
+ }
474
+ // Deduct for poor coverage
475
+ if (coverage.authCoverage < 100) {
476
+ score -= Math.round((100 - coverage.authCoverage) / 10);
477
+ }
478
+ if (coverage.validationCoverage < 50) {
479
+ score -= 10;
480
+ }
481
+ return Math.max(0, Math.min(100, score));
482
+ }
483
+ /**
484
+ * Generate summary
485
+ */
486
+ generateSummary(issues) {
487
+ const counts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
488
+ const categoryCount = {};
489
+ const recommendations = new Set();
490
+ for (const issue of issues) {
491
+ if (issue.severity in counts) {
492
+ counts[issue.severity]++;
493
+ }
494
+ categoryCount[issue.category] = (categoryCount[issue.category] ?? 0) + 1;
495
+ recommendations.add(issue.recommendation);
496
+ }
497
+ const topCategories = Object.entries(categoryCount)
498
+ .sort(([, a], [, b]) => b - a)
499
+ .slice(0, 5)
500
+ .map(([category, count]) => ({ category: category, count }));
501
+ return {
502
+ criticalIssues: counts.critical,
503
+ highIssues: counts.high,
504
+ mediumIssues: counts.medium,
505
+ lowIssues: counts.low + counts.info,
506
+ topCategories,
507
+ recommendations: Array.from(recommendations).slice(0, 5),
508
+ };
509
+ }
510
+ /**
511
+ * Simple YAML parser (for basic OpenAPI specs)
512
+ */
513
+ parseSimpleYaml(content) {
514
+ // This is a very simplified parser - in production, use js-yaml
515
+ const spec = {};
516
+ const lines = content.split('\n');
517
+ let currentPath = '';
518
+ let currentMethod = '';
519
+ for (const line of lines) {
520
+ const trimmed = line.trim();
521
+ // Skip comments and empty lines
522
+ if (trimmed.startsWith('#') || !trimmed)
523
+ continue;
524
+ // Detect openapi version
525
+ if (trimmed.startsWith('openapi:')) {
526
+ spec.openapi = trimmed.split(':')[1]?.trim().replace(/['"]/g, '');
527
+ }
528
+ // Detect swagger version
529
+ if (trimmed.startsWith('swagger:')) {
530
+ spec.swagger = trimmed.split(':')[1]?.trim().replace(/['"]/g, '');
531
+ }
532
+ // Detect paths
533
+ if (trimmed.match(/^\/[^:]*:/)) {
534
+ currentPath = trimmed.replace(':', '');
535
+ if (!spec.paths)
536
+ spec.paths = {};
537
+ spec.paths[currentPath] = {};
538
+ }
539
+ // Detect methods under paths
540
+ if (currentPath && ['get:', 'post:', 'put:', 'patch:', 'delete:'].includes(trimmed)) {
541
+ currentMethod = trimmed.replace(':', '');
542
+ if (spec.paths?.[currentPath]) {
543
+ spec.paths[currentPath][currentMethod] = {};
544
+ }
545
+ }
546
+ }
547
+ return spec;
548
+ }
549
+ /**
550
+ * Convert issues to vulnerabilities
551
+ */
552
+ toVulnerabilities(result) {
553
+ return result.issues.map(issue => ({
554
+ id: issue.id,
555
+ type: 'configuration',
556
+ severity: issue.severity,
557
+ cwes: issue.cwe ?? [],
558
+ owasp: (issue.owasp ?? []),
559
+ location: {
560
+ file: 'openapi.json',
561
+ startLine: 1,
562
+ endLine: 1,
563
+ startColumn: 0,
564
+ endColumn: 0,
565
+ },
566
+ description: `[${issue.method} ${issue.endpoint}] ${issue.title}: ${issue.description}`,
567
+ recommendation: issue.recommendation,
568
+ confidence: 0.9,
569
+ ruleId: issue.id,
570
+ codeSnippet: `${issue.method} ${issue.endpoint}`,
571
+ detectedAt: new Date(),
572
+ }));
573
+ }
574
+ }
575
+ /**
576
+ * Create API security analyzer instance
577
+ */
578
+ export function createAPISecurityAnalyzer(options) {
579
+ return new APISecurityAnalyzer(options);
580
+ }
581
+ //# sourceMappingURL=api-security-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-security-analyzer.js","sourceRoot":"","sources":["../../../src/analyzers/api/api-security-analyzer.ts"],"names":[],"mappings":"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"}