@nahisaho/musubix-security 1.8.0 → 1.8.5
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.
- package/README.md +27 -0
- package/dist/analyzers/ai/index.d.ts +6 -0
- package/dist/analyzers/ai/index.d.ts.map +1 -0
- package/dist/analyzers/ai/index.js +6 -0
- package/dist/analyzers/ai/index.js.map +1 -0
- package/dist/analyzers/ai/prompt-injection-detector.d.ts +152 -0
- package/dist/analyzers/ai/prompt-injection-detector.d.ts.map +1 -0
- package/dist/analyzers/ai/prompt-injection-detector.js +468 -0
- package/dist/analyzers/ai/prompt-injection-detector.js.map +1 -0
- package/dist/analyzers/api/api-security-analyzer.d.ts +263 -0
- package/dist/analyzers/api/api-security-analyzer.d.ts.map +1 -0
- package/dist/analyzers/api/api-security-analyzer.js +581 -0
- package/dist/analyzers/api/api-security-analyzer.js.map +1 -0
- package/dist/analyzers/compliance/compliance-checker.d.ts +201 -0
- package/dist/analyzers/compliance/compliance-checker.d.ts.map +1 -0
- package/dist/analyzers/compliance/compliance-checker.js +772 -0
- package/dist/analyzers/compliance/compliance-checker.js.map +1 -0
- package/dist/analyzers/container/image-scanner.d.ts +163 -0
- package/dist/analyzers/container/image-scanner.d.ts.map +1 -0
- package/dist/analyzers/container/image-scanner.js +459 -0
- package/dist/analyzers/container/image-scanner.js.map +1 -0
- package/dist/analyzers/container/index.d.ts +6 -0
- package/dist/analyzers/container/index.d.ts.map +1 -0
- package/dist/analyzers/container/index.js +6 -0
- package/dist/analyzers/container/index.js.map +1 -0
- package/dist/analyzers/dashboard/security-dashboard.d.ts +286 -0
- package/dist/analyzers/dashboard/security-dashboard.d.ts.map +1 -0
- package/dist/analyzers/dashboard/security-dashboard.js +796 -0
- package/dist/analyzers/dashboard/security-dashboard.js.map +1 -0
- package/dist/analyzers/iac/iac-checker.d.ts +124 -0
- package/dist/analyzers/iac/iac-checker.d.ts.map +1 -0
- package/dist/analyzers/iac/iac-checker.js +755 -0
- package/dist/analyzers/iac/iac-checker.js.map +1 -0
- package/dist/analyzers/iac/index.d.ts +6 -0
- package/dist/analyzers/iac/index.d.ts.map +1 -0
- package/dist/analyzers/iac/index.js +6 -0
- package/dist/analyzers/iac/index.js.map +1 -0
- package/dist/analyzers/index.d.ts +9 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +13 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/monitor/realtime-monitor.d.ts +216 -0
- package/dist/analyzers/monitor/realtime-monitor.d.ts.map +1 -0
- package/dist/analyzers/monitor/realtime-monitor.js +601 -0
- package/dist/analyzers/monitor/realtime-monitor.js.map +1 -0
- package/dist/analyzers/sast/index.d.ts +7 -0
- package/dist/analyzers/sast/index.d.ts.map +1 -0
- package/dist/analyzers/sast/index.js +7 -0
- package/dist/analyzers/sast/index.js.map +1 -0
- package/dist/analyzers/sast/interprocedural-analyzer.d.ts +276 -0
- package/dist/analyzers/sast/interprocedural-analyzer.d.ts.map +1 -0
- package/dist/analyzers/sast/interprocedural-analyzer.js +635 -0
- package/dist/analyzers/sast/interprocedural-analyzer.js.map +1 -0
- package/dist/analyzers/sast/zero-day-detector.d.ts +183 -0
- package/dist/analyzers/sast/zero-day-detector.d.ts.map +1 -0
- package/dist/analyzers/sast/zero-day-detector.js +593 -0
- package/dist/analyzers/sast/zero-day-detector.js.map +1 -0
- package/dist/analyzers/sca/dependency-scanner.d.ts +275 -0
- package/dist/analyzers/sca/dependency-scanner.d.ts.map +1 -0
- package/dist/analyzers/sca/dependency-scanner.js +642 -0
- package/dist/analyzers/sca/dependency-scanner.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pipeline-manager.d.ts +105 -0
- package/dist/core/pipeline-manager.d.ts.map +1 -0
- package/dist/core/pipeline-manager.js +449 -0
- package/dist/core/pipeline-manager.js.map +1 -0
- package/dist/core/result-aggregator.d.ts +96 -0
- package/dist/core/result-aggregator.d.ts.map +1 -0
- package/dist/core/result-aggregator.js +462 -0
- package/dist/core/result-aggregator.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/ci-integration.d.ts +227 -0
- package/dist/integrations/ci-integration.d.ts.map +1 -0
- package/dist/integrations/ci-integration.js +472 -0
- package/dist/integrations/ci-integration.js.map +1 -0
- package/dist/integrations/git-hooks.d.ts +155 -0
- package/dist/integrations/git-hooks.d.ts.map +1 -0
- package/dist/integrations/git-hooks.js +425 -0
- package/dist/integrations/git-hooks.js.map +1 -0
- package/dist/integrations/index.d.ts +9 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +9 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/report-aggregator.d.ts +250 -0
- package/dist/integrations/report-aggregator.d.ts.map +1 -0
- package/dist/integrations/report-aggregator.js +488 -0
- package/dist/integrations/report-aggregator.js.map +1 -0
- package/dist/integrations/vscode-integration.d.ts +245 -0
- package/dist/integrations/vscode-integration.d.ts.map +1 -0
- package/dist/integrations/vscode-integration.js +449 -0
- package/dist/integrations/vscode-integration.js.map +1 -0
- package/dist/intelligence/attack-pattern-matcher.d.ts +217 -0
- package/dist/intelligence/attack-pattern-matcher.d.ts.map +1 -0
- package/dist/intelligence/attack-pattern-matcher.js +887 -0
- package/dist/intelligence/attack-pattern-matcher.js.map +1 -0
- package/dist/intelligence/index.d.ts +12 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +18 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/intelligence/neuro-symbolic-core.d.ts +88 -0
- package/dist/intelligence/neuro-symbolic-core.d.ts.map +1 -0
- package/dist/intelligence/neuro-symbolic-core.js +403 -0
- package/dist/intelligence/neuro-symbolic-core.js.map +1 -0
- package/dist/intelligence/predictive-analyzer.d.ts +317 -0
- package/dist/intelligence/predictive-analyzer.d.ts.map +1 -0
- package/dist/intelligence/predictive-analyzer.js +714 -0
- package/dist/intelligence/predictive-analyzer.js.map +1 -0
- package/dist/intelligence/risk-scorer.d.ts +333 -0
- package/dist/intelligence/risk-scorer.d.ts.map +1 -0
- package/dist/intelligence/risk-scorer.js +824 -0
- package/dist/intelligence/risk-scorer.js.map +1 -0
- package/dist/intelligence/security-analytics.d.ts +349 -0
- package/dist/intelligence/security-analytics.d.ts.map +1 -0
- package/dist/intelligence/security-analytics.js +813 -0
- package/dist/intelligence/security-analytics.js.map +1 -0
- package/dist/intelligence/threat-intelligence.d.ts +288 -0
- package/dist/intelligence/threat-intelligence.d.ts.map +1 -0
- package/dist/intelligence/threat-intelligence.js +639 -0
- package/dist/intelligence/threat-intelligence.js.map +1 -0
- package/dist/policy/index.d.ts +6 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +6 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy-engine.d.ts +254 -0
- package/dist/policy/policy-engine.d.ts.map +1 -0
- package/dist/policy/policy-engine.js +651 -0
- package/dist/policy/policy-engine.js.map +1 -0
- package/dist/remediation/auto-fixer.d.ts +179 -0
- package/dist/remediation/auto-fixer.d.ts.map +1 -0
- package/dist/remediation/auto-fixer.js +540 -0
- package/dist/remediation/auto-fixer.js.map +1 -0
- package/dist/remediation/fix-validator.d.ts +195 -0
- package/dist/remediation/fix-validator.d.ts.map +1 -0
- package/dist/remediation/fix-validator.js +462 -0
- package/dist/remediation/fix-validator.js.map +1 -0
- package/dist/remediation/index.d.ts +10 -0
- package/dist/remediation/index.d.ts.map +1 -0
- package/dist/remediation/index.js +15 -0
- package/dist/remediation/index.js.map +1 -0
- package/dist/remediation/patch-generator.d.ts +203 -0
- package/dist/remediation/patch-generator.d.ts.map +1 -0
- package/dist/remediation/patch-generator.js +533 -0
- package/dist/remediation/patch-generator.js.map +1 -0
- package/dist/remediation/remediation-planner.d.ts +262 -0
- package/dist/remediation/remediation-planner.d.ts.map +1 -0
- package/dist/remediation/remediation-planner.js +531 -0
- package/dist/remediation/remediation-planner.js.map +1 -0
- package/dist/remediation/secure-code-transformer.d.ts +222 -0
- package/dist/remediation/secure-code-transformer.d.ts.map +1 -0
- package/dist/remediation/secure-code-transformer.js +625 -0
- package/dist/remediation/secure-code-transformer.js.map +1 -0
- package/dist/types/fix.d.ts +3 -1
- package/dist/types/fix.d.ts.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/interprocedural.d.ts +203 -0
- package/dist/types/interprocedural.d.ts.map +1 -0
- package/dist/types/interprocedural.js +7 -0
- package/dist/types/interprocedural.js.map +1 -0
- package/dist/types/neuro-symbolic.d.ts +179 -0
- package/dist/types/neuro-symbolic.d.ts.map +1 -0
- package/dist/types/neuro-symbolic.js +7 -0
- package/dist/types/neuro-symbolic.js.map +1 -0
- package/dist/types/pipeline.d.ts +173 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +7 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/types/result.d.ts +134 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +25 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/vulnerability.d.ts +2 -2
- package/dist/types/vulnerability.d.ts.map +1 -1
- package/dist/types/zero-day.d.ts +146 -0
- package/dist/types/zero-day.d.ts.map +1 -0
- package/dist/types/zero-day.js +7 -0
- package/dist/types/zero-day.js.map +1 -0
- 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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"}
|