@voidagency/web-scanner 0.0.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 (59) hide show
  1. package/README.md +198 -0
  2. package/dist/aggregator.d.ts +65 -0
  3. package/dist/aggregator.d.ts.map +1 -0
  4. package/dist/aggregator.js +546 -0
  5. package/dist/aggregator.js.map +1 -0
  6. package/dist/categories.d.ts +59 -0
  7. package/dist/categories.d.ts.map +1 -0
  8. package/dist/categories.js +278 -0
  9. package/dist/categories.js.map +1 -0
  10. package/dist/cli.d.ts +12 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +457 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/config.d.ts +19 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +121 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/coverage.d.ts +49 -0
  19. package/dist/coverage.d.ts.map +1 -0
  20. package/dist/coverage.js +165 -0
  21. package/dist/coverage.js.map +1 -0
  22. package/dist/enrichers/nvd.d.ts +55 -0
  23. package/dist/enrichers/nvd.d.ts.map +1 -0
  24. package/dist/enrichers/nvd.js +326 -0
  25. package/dist/enrichers/nvd.js.map +1 -0
  26. package/dist/report.d.ts +12 -0
  27. package/dist/report.d.ts.map +1 -0
  28. package/dist/report.js +460 -0
  29. package/dist/report.js.map +1 -0
  30. package/dist/runners/nuclei.d.ts +59 -0
  31. package/dist/runners/nuclei.d.ts.map +1 -0
  32. package/dist/runners/nuclei.js +531 -0
  33. package/dist/runners/nuclei.js.map +1 -0
  34. package/dist/runners/testssl.d.ts +16 -0
  35. package/dist/runners/testssl.d.ts.map +1 -0
  36. package/dist/runners/testssl.js +179 -0
  37. package/dist/runners/testssl.js.map +1 -0
  38. package/dist/runners/zap.d.ts +30 -0
  39. package/dist/runners/zap.d.ts.map +1 -0
  40. package/dist/runners/zap.js +389 -0
  41. package/dist/runners/zap.js.map +1 -0
  42. package/dist/types.d.ts +172 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +6 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +54 -0
  47. package/templates/drupal-api-index-exposed.yaml +81 -0
  48. package/templates/drupal-api-user-detail.yaml +76 -0
  49. package/templates/drupal-api-user-listing.yaml +59 -0
  50. package/templates/drupal-dev-files-exposed.yaml +73 -0
  51. package/templates/drupal-file-path-disclosure.yaml +59 -0
  52. package/templates/drupal-files-listing.yaml +63 -0
  53. package/templates/drupal-install-error-disclosure.yaml +62 -0
  54. package/templates/drupal-theme-lockfiles.yaml +79 -0
  55. package/templates/drupal-version-detect.yaml +89 -0
  56. package/templates/http-options-enabled.yaml +56 -0
  57. package/templates/nextjs-version-detect.yaml +35 -0
  58. package/templates/php-version-detect.yaml +37 -0
  59. package/zap.yaml +33 -0
@@ -0,0 +1,546 @@
1
+ /**
2
+ * Finding Aggregator
3
+ * Combine and normalize findings from all scanning tools
4
+ */
5
+ import { enrichWithNvd, getCvesForTechnology } from './enrichers/nvd.js';
6
+ import { calculateCoverage, markTestedCategories, getCoverageForReport, getPassedChecksForReport } from './coverage.js';
7
+ /**
8
+ * Count findings by severity
9
+ */
10
+ export function countSeverities(findings) {
11
+ const counts = {
12
+ critical: 0,
13
+ high: 0,
14
+ medium: 0,
15
+ low: 0,
16
+ info: 0,
17
+ };
18
+ for (const finding of findings) {
19
+ counts[finding.severity]++;
20
+ }
21
+ return counts;
22
+ }
23
+ /**
24
+ * Sort findings by severity (critical first)
25
+ */
26
+ export function sortBySeverity(findings) {
27
+ const order = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
28
+ return [...findings].sort((a, b) => order[a.severity] - order[b.severity]);
29
+ }
30
+ /**
31
+ * Re-number findings sequentially
32
+ */
33
+ export function renumberFindings(findings) {
34
+ return findings.map((f, i) => ({
35
+ ...f,
36
+ id: String(i + 1).padStart(3, '0'),
37
+ }));
38
+ }
39
+ /**
40
+ * Deduplicate findings by title and target
41
+ */
42
+ export function deduplicateFindings(findings) {
43
+ const seen = new Set();
44
+ const unique = [];
45
+ for (const finding of findings) {
46
+ const key = `${finding.title}|${finding.target}`;
47
+ if (!seen.has(key)) {
48
+ seen.add(key);
49
+ unique.push(finding);
50
+ }
51
+ }
52
+ return unique;
53
+ }
54
+ /**
55
+ * Patterns that identify version disclosure findings - should be consolidated
56
+ */
57
+ const VERSION_DISCLOSURE_PATTERNS = [
58
+ /Server Leaks.*Version/i,
59
+ /Server Leaks.*X-Powered-By/i,
60
+ /In Page Banner Information Leak/i,
61
+ /Version Information.*Leak/i,
62
+ /Information Leak.*Version/i,
63
+ ];
64
+ /**
65
+ * Check if a finding is about version disclosure
66
+ */
67
+ function isVersionDisclosure(finding) {
68
+ return VERSION_DISCLOSURE_PATTERNS.some(pattern => pattern.test(finding.title));
69
+ }
70
+ /**
71
+ * Check if a finding is a CSP-related finding
72
+ */
73
+ function isCspFinding(finding) {
74
+ return finding.title.startsWith('CSP:') ||
75
+ finding.title.includes('Content Security Policy');
76
+ }
77
+ /**
78
+ * Consolidate CSP findings into one
79
+ */
80
+ function consolidateCspFindings(findings) {
81
+ const cspFindings = findings.filter(isCspFinding);
82
+ const otherFindings = findings.filter(f => !isCspFinding(f));
83
+ if (cspFindings.length <= 1) {
84
+ return findings; // Nothing to consolidate
85
+ }
86
+ // Extract the specific CSP issues (e.g., "script-src unsafe-inline", "style-src unsafe-inline")
87
+ const issues = cspFindings.map(f => {
88
+ const match = /CSP:\s*(.+)/i.exec(f.title);
89
+ return match ? match[1] : f.title;
90
+ });
91
+ // Get highest severity among CSP findings
92
+ const severityOrder = { critical: 4, high: 3, medium: 2, low: 1, info: 0 };
93
+ const highestSeverity = cspFindings.reduce((max, f) => severityOrder[f.severity] > severityOrder[max.severity] ? f : max).severity;
94
+ const consolidated = {
95
+ id: '',
96
+ title: 'Content Security Policy Issues',
97
+ description: 'The Content Security Policy (CSP) header has multiple configuration issues that could allow XSS attacks:\n• ' +
98
+ issues.join('\n• ') +
99
+ '\n\nCSP is a security header that helps prevent XSS by specifying which sources of content are allowed to load.',
100
+ severity: highestSeverity,
101
+ source: cspFindings[0].source,
102
+ target: cspFindings[0].target,
103
+ cwe: 'CWE-693',
104
+ tags: ['csp', 'header', 'security-misconfiguration', 'xss'],
105
+ matcher: issues.join(', '),
106
+ references: [
107
+ 'https://content-security-policy.com/',
108
+ 'https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP',
109
+ ],
110
+ };
111
+ return [...otherFindings, consolidated];
112
+ }
113
+ /**
114
+ * Consolidate version disclosure findings into one
115
+ */
116
+ function consolidateVersionDisclosures(findings) {
117
+ const versionFindings = findings.filter(isVersionDisclosure);
118
+ const otherFindings = findings.filter(f => !isVersionDisclosure(f));
119
+ if (versionFindings.length <= 1) {
120
+ return findings; // Nothing to consolidate
121
+ }
122
+ // Merge all version disclosures into one
123
+ const versions = versionFindings
124
+ .map(f => f.matcher || f.extracted?.[0])
125
+ .filter(Boolean);
126
+ const consolidated = {
127
+ id: '',
128
+ title: 'Server Version Disclosure',
129
+ description: 'The server leaks version information through HTTP headers and responses. ' +
130
+ 'This information can help attackers identify specific vulnerabilities for the software versions in use.',
131
+ severity: 'low',
132
+ source: versionFindings[0].source,
133
+ target: versionFindings[0].target,
134
+ cwe: 'CWE-200',
135
+ tags: ['version-disclosure', 'info-disclosure', 'headers'],
136
+ matcher: versions.join(', '),
137
+ affectedUrls: versionFindings.map(f => f.target),
138
+ references: ['https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server'],
139
+ };
140
+ return [...otherFindings, consolidated];
141
+ }
142
+ /**
143
+ * Consolidate findings - group same vulnerability type across multiple URLs
144
+ * Results in one finding with list of affected URLs
145
+ */
146
+ export function consolidateFindings(findings) {
147
+ // Consolidate special categories first
148
+ findings = consolidateVersionDisclosures(findings);
149
+ findings = consolidateCspFindings(findings);
150
+ // Group by: title + severity + templateId (same vulnerability type)
151
+ const groups = new Map();
152
+ for (const finding of findings) {
153
+ // Use templateId if available, otherwise title
154
+ const key = `${finding.templateId || finding.title}|${finding.severity}`;
155
+ if (!groups.has(key)) {
156
+ groups.set(key, []);
157
+ }
158
+ groups.get(key).push(finding);
159
+ }
160
+ // Convert groups to consolidated findings
161
+ const consolidated = [];
162
+ for (const [, group] of groups) {
163
+ if (group.length === 1) {
164
+ // Single finding, no consolidation needed
165
+ consolidated.push(group[0]);
166
+ }
167
+ else {
168
+ // Multiple findings - consolidate
169
+ const first = group[0];
170
+ const allUrls = group.map(f => f.target);
171
+ const allExtracted = group.flatMap(f => f.extracted || []);
172
+ // Limit extracted values (avoid noise from files like composer.lock)
173
+ const uniqueExtracted = [...new Set(allExtracted)];
174
+ const limitedExtracted = uniqueExtracted.length > 5
175
+ ? [...uniqueExtracted.slice(0, 5), `... and ${uniqueExtracted.length - 5} more`]
176
+ : uniqueExtracted;
177
+ consolidated.push({
178
+ ...first,
179
+ // Keep first URL as main target
180
+ target: first.target,
181
+ // List all affected URLs
182
+ affectedUrls: allUrls,
183
+ // Merge extracted values (limited to avoid noise)
184
+ extracted: limitedExtracted.length > 0 ? limitedExtracted : undefined,
185
+ // Keep one curl command as example
186
+ curl: first.curl,
187
+ });
188
+ }
189
+ }
190
+ return consolidated;
191
+ }
192
+ /**
193
+ * Merge technology detections from multiple sources
194
+ */
195
+ export function mergeTechnologies(techLists) {
196
+ const byHost = new Map();
197
+ for (const techs of techLists) {
198
+ for (const tech of techs) {
199
+ if (!byHost.has(tech.host)) {
200
+ byHost.set(tech.host, new Set());
201
+ }
202
+ for (const t of tech.technologies) {
203
+ byHost.get(tech.host).add(t);
204
+ }
205
+ }
206
+ }
207
+ return Array.from(byHost.entries()).map(([host, techs]) => ({
208
+ host,
209
+ technologies: Array.from(techs).sort(),
210
+ }));
211
+ }
212
+ /**
213
+ * Format duration in human-readable format
214
+ */
215
+ export function formatDuration(ms) {
216
+ const seconds = Math.floor(ms / 1000);
217
+ const minutes = Math.floor(seconds / 60);
218
+ const remainingSeconds = seconds % 60;
219
+ if (minutes > 0) {
220
+ return `${minutes}m ${remainingSeconds}s`;
221
+ }
222
+ return `${seconds}s`;
223
+ }
224
+ /**
225
+ * Extract technology name from finding title
226
+ */
227
+ function extractTechFromTitle(title) {
228
+ // Common patterns: "Nginx End-of-Life - Detect", "Drupal - Detect", "PHP - Version"
229
+ const patterns = [
230
+ /^(nginx|apache|drupal|wordpress|php|mysql|nodejs|openssl|jquery|bootstrap|tomcat)/i,
231
+ /^([a-z0-9.]+)\s+(?:End-of-Life|Version|Detect)/i,
232
+ /^([a-z0-9.]+)\s+-\s+(?:Detect|Version)/i,
233
+ ];
234
+ for (const pattern of patterns) {
235
+ const match = title.match(pattern);
236
+ if (match) {
237
+ return match[1].toLowerCase();
238
+ }
239
+ }
240
+ return null;
241
+ }
242
+ /**
243
+ * Extract technology from finding (checks title and matcher field)
244
+ */
245
+ function extractTechFromFinding(finding) {
246
+ // First try title
247
+ const techFromTitle = extractTechFromTitle(finding.title);
248
+ if (techFromTitle) {
249
+ return techFromTitle;
250
+ }
251
+ // Check matcher field (e.g., "nginx/1.25.5" or "nextjs:12.1.6")
252
+ if (finding.matcher) {
253
+ const matcherPatterns = [
254
+ /^([a-z0-9.]+)\/(\d+\.\d+)/i, // nginx/1.25.5
255
+ /^([a-z0-9.]+):(\d+\.\d+)/i, // nextjs:12.1.6
256
+ ];
257
+ for (const pattern of matcherPatterns) {
258
+ const match = finding.matcher.match(pattern);
259
+ if (match) {
260
+ const tech = match[1].toLowerCase();
261
+ // Only return if it's in our default CVE check list
262
+ if (DEFAULT_CVE_CHECK_TECHNOLOGIES.has(tech) || DEFAULT_CVE_CHECK_TECHNOLOGIES.has(tech.replace('.', ''))) {
263
+ return tech.replace('.', ''); // Normalize "next.js" to "nextjs"
264
+ }
265
+ }
266
+ }
267
+ }
268
+ return null;
269
+ }
270
+ /**
271
+ * Extract version from various sources (extracted results, title, description, matcher)
272
+ */
273
+ function extractVersion(finding) {
274
+ // First check matcher field (e.g., "nginx/1.25.5" or "nextjs:12.1.6")
275
+ if (finding.matcher) {
276
+ const matcherPatterns = [
277
+ /^[a-z0-9.]+\/(\d+\.\d+\.?\d*)/i, // nginx/1.25.5
278
+ /^[a-z0-9.]+:(\d+\.\d+\.?\d*)/i, // nextjs:12.1.6
279
+ ];
280
+ for (const pattern of matcherPatterns) {
281
+ const match = finding.matcher.match(pattern);
282
+ if (match) {
283
+ return match[1];
284
+ }
285
+ }
286
+ }
287
+ // Check extracted results
288
+ if (finding.extracted && finding.extracted.length > 0) {
289
+ // Look for version-like patterns in extracted results
290
+ for (const result of finding.extracted) {
291
+ const versionMatch = result.match(/^(\d+\.\d+\.?\d*)/);
292
+ if (versionMatch) {
293
+ return versionMatch[1];
294
+ }
295
+ }
296
+ }
297
+ // Check title for version
298
+ const titleMatch = finding.title.match(/(\d+\.\d+\.?\d*)/);
299
+ if (titleMatch) {
300
+ return titleMatch[1];
301
+ }
302
+ // Check description for version patterns
303
+ const descMatch = finding.description?.match(/version[:\s]+(\d+\.\d+\.?\d*)/i);
304
+ if (descMatch) {
305
+ return descMatch[1];
306
+ }
307
+ return null;
308
+ }
309
+ /**
310
+ * Convert CVSS score to severity
311
+ */
312
+ function cvssToSeverity(score) {
313
+ if (!score)
314
+ return 'info';
315
+ if (score >= 9.0)
316
+ return 'critical';
317
+ if (score >= 7.0)
318
+ return 'high';
319
+ if (score >= 4.0)
320
+ return 'medium';
321
+ if (score >= 0.1)
322
+ return 'low';
323
+ return 'info';
324
+ }
325
+ /**
326
+ * Technologies to check for CVEs by default
327
+ * These are common server-side technologies where version-based CVEs are most relevant
328
+ */
329
+ const DEFAULT_CVE_CHECK_TECHNOLOGIES = new Set([
330
+ 'nginx',
331
+ 'drupal',
332
+ 'php',
333
+ 'nextjs',
334
+ 'next.js',
335
+ 'apache',
336
+ 'wordpress',
337
+ ]);
338
+ /**
339
+ * Generate consolidated CVE findings from detected technology versions
340
+ * Creates ONE finding per tech+version with a CVE table
341
+ * @param limitToDefaults - If true, only check CVEs for DEFAULT_CVE_CHECK_TECHNOLOGIES
342
+ */
343
+ async function generateCveFindingsFromVersions(findings, target, onProgress, limitToDefaults = false) {
344
+ const generatedFindings = [];
345
+ const processedTech = new Set();
346
+ // Find version detection findings
347
+ for (const finding of findings) {
348
+ const tech = extractTechFromFinding(finding);
349
+ if (!tech)
350
+ continue;
351
+ // If limiting to defaults, skip technologies not in the list
352
+ if (limitToDefaults && !DEFAULT_CVE_CHECK_TECHNOLOGIES.has(tech.toLowerCase())) {
353
+ continue;
354
+ }
355
+ const version = extractVersion(finding);
356
+ if (!version)
357
+ continue;
358
+ const techVersionKey = `${tech}:${version}`;
359
+ // Skip if already processed this tech+version
360
+ if (processedTech.has(techVersionKey))
361
+ continue;
362
+ processedTech.add(techVersionKey);
363
+ if (onProgress) {
364
+ onProgress(`Looking up CVEs for ${tech} ${version}...`);
365
+ }
366
+ // Query NVD for CVEs
367
+ const cves = await getCvesForTechnology(tech, version, 10);
368
+ if (cves.length === 0)
369
+ continue;
370
+ // Build CVE table entries
371
+ const cveTable = cves.map(cve => ({
372
+ cve: cve.id,
373
+ cvss: cve.cvssScore?.toFixed(1),
374
+ severity: cvssToSeverity(cve.cvssScore),
375
+ summary: truncateText(cve.description, 200),
376
+ references: cve.references,
377
+ }));
378
+ // Determine highest severity
379
+ const highestSeverity = getHighestSeverity(cveTable.map(c => c.severity));
380
+ // Capitalize tech name
381
+ const techName = tech.charAt(0).toUpperCase() + tech.slice(1);
382
+ // Create ONE consolidated finding for this tech+version
383
+ generatedFindings.push({
384
+ id: '', // Will be renumbered
385
+ title: `Vulnerabilities found for ${techName} ${version}`,
386
+ description: `${cves.length} known vulnerabilities affecting ${techName} version ${version}.`,
387
+ severity: highestSeverity,
388
+ target: finding.target || target,
389
+ source: 'nvd',
390
+ tags: ['cve', tech.toLowerCase(), 'nvd-enriched'],
391
+ cveTable,
392
+ });
393
+ }
394
+ return generatedFindings;
395
+ }
396
+ /**
397
+ * Truncate text to max length
398
+ */
399
+ function truncateText(text, maxLength) {
400
+ if (text.length <= maxLength)
401
+ return text;
402
+ return text.substring(0, maxLength).trim() + '...';
403
+ }
404
+ /**
405
+ * Get highest severity from array
406
+ */
407
+ function getHighestSeverity(severities) {
408
+ const order = ['critical', 'high', 'medium', 'low', 'info'];
409
+ for (const sev of order) {
410
+ if (severities.includes(sev))
411
+ return sev;
412
+ }
413
+ return 'info';
414
+ }
415
+ /**
416
+ * Lookup CVEs for detected technologies (default behavior)
417
+ * Only checks nginx, drupal, php, nextjs etc.
418
+ */
419
+ export async function lookupDefaultCves(findings, target, onProgress) {
420
+ if (onProgress) {
421
+ onProgress('Looking up CVEs for detected technologies...');
422
+ }
423
+ const cveFindings = await generateCveFindingsFromVersions(findings, target, onProgress, true // limitToDefaults
424
+ );
425
+ if (cveFindings.length > 0 && onProgress) {
426
+ onProgress(`Found ${cveFindings.length} CVEs for detected technologies`);
427
+ }
428
+ return [...findings, ...cveFindings];
429
+ }
430
+ /**
431
+ * Full NVD enrichment (--enrich flag)
432
+ * - Enriches existing CVE findings with full descriptions
433
+ * - Looks up CVEs for ALL detected technology versions
434
+ */
435
+ export async function enrichFindings(findings, target, options = {}) {
436
+ if (!options.enableNvd) {
437
+ return findings;
438
+ }
439
+ let enriched = [];
440
+ // Step 1: Enrich existing CVE findings with NVD descriptions
441
+ const cveFindings = findings.filter(f => f.cve);
442
+ if (cveFindings.length > 0 && options.onProgress) {
443
+ options.onProgress(`Enriching ${cveFindings.length} existing CVE findings...`);
444
+ }
445
+ for (const finding of findings) {
446
+ if (finding.cve) {
447
+ try {
448
+ const nvdData = await enrichWithNvd(finding.cve);
449
+ if (nvdData) {
450
+ enriched.push({
451
+ ...finding,
452
+ // Use NVD description if we don't have one or it's generic
453
+ description: finding.description && finding.description.length > 50
454
+ ? finding.description
455
+ : nvdData.description,
456
+ // Add CVSS if not present
457
+ cvss: finding.cvss || nvdData.cvssVector,
458
+ // Add CWE if not present
459
+ cwe: finding.cwe || nvdData.cweId,
460
+ // Merge references
461
+ references: [...new Set([...(finding.references || []), ...nvdData.references])],
462
+ });
463
+ continue;
464
+ }
465
+ }
466
+ catch (error) {
467
+ // Continue without enrichment on error
468
+ }
469
+ }
470
+ enriched.push(finding);
471
+ }
472
+ // Step 2: Generate new findings from version detections
473
+ if (options.onProgress) {
474
+ options.onProgress(`Looking for version detections to query NVD...`);
475
+ }
476
+ const versionCveFindings = await generateCveFindingsFromVersions(findings, target, options.onProgress);
477
+ if (versionCveFindings.length > 0 && options.onProgress) {
478
+ options.onProgress(`Generated ${versionCveFindings.length} CVE findings from version detections`);
479
+ }
480
+ enriched = enriched.concat(versionCveFindings);
481
+ // Step 3: Generate findings from manually specified technologies
482
+ if (options.manualTech && options.manualTech.length > 0) {
483
+ if (options.onProgress) {
484
+ options.onProgress(`Looking up CVEs for ${options.manualTech.length} manually specified technologies...`);
485
+ }
486
+ for (const { tech, version } of options.manualTech) {
487
+ const cves = await getCvesForTechnology(tech, version, 10);
488
+ for (const cve of cves) {
489
+ enriched.push({
490
+ id: '',
491
+ title: `${cve.id}: ${tech.charAt(0).toUpperCase() + tech.slice(1)} ${version}`,
492
+ description: cve.description,
493
+ severity: cvssToSeverity(cve.cvssScore),
494
+ target,
495
+ source: 'nvd',
496
+ cve: cve.id,
497
+ cwe: cve.cweId,
498
+ cvss: cve.cvssVector,
499
+ references: cve.references,
500
+ tags: ['cve', tech, 'nvd-enriched', 'manual-tech'],
501
+ });
502
+ }
503
+ }
504
+ }
505
+ return enriched;
506
+ }
507
+ /**
508
+ * Aggregate all findings into a report
509
+ */
510
+ export async function aggregateFindings(target, profile, startTime, endTime, allFindings, technologies, options = {}) {
511
+ // Deduplicate
512
+ const unique = deduplicateFindings(allFindings);
513
+ let findings = unique;
514
+ // Default: lookup CVEs for detected nginx, drupal, php, nextjs
515
+ // Skip if --no-cve or if --enrich (full enrichment handles it)
516
+ if (!options.disableCve && !options.enableNvd) {
517
+ findings = await lookupDefaultCves(findings, target, options.onProgress);
518
+ }
519
+ // Full NVD enrichment if --enrich flag (includes ALL technologies)
520
+ if (options.enableNvd && !options.disableCve) {
521
+ findings = await enrichFindings(findings, target, options);
522
+ }
523
+ // Consolidate same vulnerabilities across multiple URLs
524
+ findings = consolidateFindings(findings);
525
+ // Sort and renumber (after enrichment so new CVEs are sorted correctly)
526
+ findings = sortBySeverity(findings);
527
+ findings = renumberFindings(findings);
528
+ // Calculate test coverage
529
+ let coverage = calculateCoverage(findings);
530
+ coverage = markTestedCategories(coverage, profile, []);
531
+ const coverageItems = getCoverageForReport(coverage);
532
+ const passedChecks = getPassedChecksForReport(coverage);
533
+ return {
534
+ target,
535
+ scanDate: startTime.toISOString(),
536
+ duration: formatDuration(endTime.getTime() - startTime.getTime()),
537
+ profile,
538
+ summary: countSeverities(findings),
539
+ totalFindings: findings.length,
540
+ technologies,
541
+ findings,
542
+ coverage: coverageItems,
543
+ passedChecks,
544
+ };
545
+ }
546
+ //# sourceMappingURL=aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Test Categories Configuration
3
+ * Maps scanner tags to human-readable test categories
4
+ * Used to track test coverage and show "Nothing found" results
5
+ *
6
+ * Supports both ZAP (primary) and Nuclei (supplementary)
7
+ */
8
+ import { ToolSource } from './types.js';
9
+ export interface TestCategory {
10
+ id: string;
11
+ name: string;
12
+ description: string;
13
+ tags: string[];
14
+ templatePatterns?: string[];
15
+ sources?: ToolSource[];
16
+ zapPluginIds?: string[];
17
+ }
18
+ /**
19
+ * Define all test categories
20
+ * Order matters - this is how they'll appear in the report
21
+ *
22
+ * ZAP Plugin IDs reference:
23
+ * - 10003: Vulnerable JS Library (Retire.js)
24
+ * - 10038: CSP Header Not Set
25
+ * - 10020: Missing X-Frame-Options
26
+ * - 10035: Strict-Transport-Security Not Set
27
+ * - 10021: X-Content-Type-Options Missing
28
+ * - 10098: Cross-Domain Misconfiguration (CORS)
29
+ * - 10202: Absence of Anti-CSRF Tokens
30
+ * - 90003: Sub Resource Integrity Missing
31
+ * - 10037: X-Powered-By Information Leak
32
+ * - 10036: Server Version Leak
33
+ * - 10027: Information Disclosure - Suspicious Comments
34
+ * - 10031: User Controllable HTML Attribute (XSS hint)
35
+ * - 10017: Cross-Domain JavaScript Source
36
+ */
37
+ export declare const TEST_CATEGORIES: TestCategory[];
38
+ /**
39
+ * Category result for reporting
40
+ */
41
+ export interface CategoryResult {
42
+ category: TestCategory;
43
+ tested: boolean;
44
+ findingCount: number;
45
+ findings: string[];
46
+ }
47
+ /**
48
+ * Match a finding to categories based on tags and template ID
49
+ */
50
+ export declare function matchCategories(templateId: string, tags?: string[]): string[];
51
+ /**
52
+ * Get category by ID
53
+ */
54
+ export declare function getCategoryById(id: string): TestCategory | undefined;
55
+ /**
56
+ * Get all category IDs
57
+ */
58
+ export declare function getAllCategoryIds(): string[];
59
+ //# sourceMappingURL=categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../src/categories.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,EA4OzC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAM,EAAO,GAClB,MAAM,EAAE,CA6BV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C"}