cve-scanner 0.0.0 → 0.0.2

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 (140) hide show
  1. package/README.md +96 -45
  2. package/assets/gradle-init/list-dependencies.init.gradle +20 -0
  3. package/data/dataset.hash +1 -0
  4. package/data/dataset.json +288056 -0
  5. package/dist/ai/AiAssistant.d.ts +11 -0
  6. package/dist/ai/AiAssistant.js +34 -0
  7. package/dist/ai/AiAssistant.js.map +1 -0
  8. package/dist/ai/ProjectManifestReader.d.ts +8 -0
  9. package/dist/ai/ProjectManifestReader.js +34 -0
  10. package/dist/ai/ProjectManifestReader.js.map +1 -0
  11. package/dist/ai/ProjectManifestReader.test.d.ts +1 -0
  12. package/dist/ai/ProjectManifestReader.test.js +59 -0
  13. package/dist/ai/ProjectManifestReader.test.js.map +1 -0
  14. package/dist/ai/PromptBuilder.d.ts +5 -0
  15. package/dist/ai/PromptBuilder.js +42 -0
  16. package/dist/ai/PromptBuilder.js.map +1 -0
  17. package/dist/ai/PromptBuilder.test.d.ts +1 -0
  18. package/dist/ai/PromptBuilder.test.js +66 -0
  19. package/dist/ai/PromptBuilder.test.js.map +1 -0
  20. package/dist/cmd/cve-scanner.d.ts +2 -0
  21. package/dist/cmd/cve-scanner.js +60 -0
  22. package/dist/cmd/cve-scanner.js.map +1 -0
  23. package/dist/core/CommandRunner.d.ts +6 -0
  24. package/dist/core/CommandRunner.js +16 -0
  25. package/dist/core/CommandRunner.js.map +1 -0
  26. package/dist/core/DatasetLoader.d.ts +14 -0
  27. package/dist/core/DatasetLoader.js +44 -0
  28. package/dist/core/DatasetLoader.js.map +1 -0
  29. package/dist/core/DatasetLoader.test.d.ts +1 -0
  30. package/dist/core/DatasetLoader.test.js +41 -0
  31. package/dist/core/DatasetLoader.test.js.map +1 -0
  32. package/dist/core/ProjectRootDiscovery.d.ts +9 -0
  33. package/dist/core/ProjectRootDiscovery.js +62 -0
  34. package/dist/core/ProjectRootDiscovery.js.map +1 -0
  35. package/dist/core/ProjectRootDiscovery.test.d.ts +1 -0
  36. package/dist/core/ProjectRootDiscovery.test.js +47 -0
  37. package/dist/core/ProjectRootDiscovery.test.js.map +1 -0
  38. package/dist/core/Scanner.d.ts +19 -0
  39. package/dist/core/Scanner.js +66 -0
  40. package/dist/core/Scanner.js.map +1 -0
  41. package/dist/core/Scanner.test.d.ts +1 -0
  42. package/dist/core/Scanner.test.js +157 -0
  43. package/dist/core/Scanner.test.js.map +1 -0
  44. package/dist/core/VersionComparator.d.ts +6 -0
  45. package/dist/core/VersionComparator.js +35 -0
  46. package/dist/core/VersionComparator.js.map +1 -0
  47. package/dist/core/VersionComparator.test.d.ts +1 -0
  48. package/dist/core/VersionComparator.test.js +21 -0
  49. package/dist/core/VersionComparator.test.js.map +1 -0
  50. package/dist/core/cpe.d.ts +9 -0
  51. package/dist/core/cpe.js +32 -0
  52. package/dist/core/cpe.js.map +1 -0
  53. package/dist/core/cpe.test.d.ts +1 -0
  54. package/dist/core/cpe.test.js +25 -0
  55. package/dist/core/cpe.test.js.map +1 -0
  56. package/dist/core/types.d.ts +57 -0
  57. package/dist/core/types.js +3 -0
  58. package/dist/core/types.js.map +1 -0
  59. package/dist/ecosystems/enrichment/CveListCache.d.ts +13 -0
  60. package/dist/ecosystems/enrichment/CveListCache.js +88 -0
  61. package/dist/ecosystems/enrichment/CveListCache.js.map +1 -0
  62. package/dist/ecosystems/enrichment/CveListCache.test.d.ts +1 -0
  63. package/dist/ecosystems/enrichment/CveListCache.test.js +49 -0
  64. package/dist/ecosystems/enrichment/CveListCache.test.js.map +1 -0
  65. package/dist/ecosystems/enrichment/CveOrgDatasetReader.d.ts +12 -0
  66. package/dist/ecosystems/enrichment/CveOrgDatasetReader.js +59 -0
  67. package/dist/ecosystems/enrichment/CveOrgDatasetReader.js.map +1 -0
  68. package/dist/ecosystems/enrichment/CveOrgDatasetReader.test.d.ts +1 -0
  69. package/dist/ecosystems/enrichment/CveOrgDatasetReader.test.js +48 -0
  70. package/dist/ecosystems/enrichment/CveOrgDatasetReader.test.js.map +1 -0
  71. package/dist/ecosystems/enrichment/ZipExtractor.d.ts +18 -0
  72. package/dist/ecosystems/enrichment/ZipExtractor.js +105 -0
  73. package/dist/ecosystems/enrichment/ZipExtractor.js.map +1 -0
  74. package/dist/ecosystems/enrichment/ZipExtractor.test.d.ts +1 -0
  75. package/dist/ecosystems/enrichment/ZipExtractor.test.js +36 -0
  76. package/dist/ecosystems/enrichment/ZipExtractor.test.js.map +1 -0
  77. package/dist/ecosystems/java/GradleDependencyDetector.d.ts +9 -0
  78. package/dist/ecosystems/java/GradleDependencyDetector.js +33 -0
  79. package/dist/ecosystems/java/GradleDependencyDetector.js.map +1 -0
  80. package/dist/ecosystems/java/MavenDependencyDetector.d.ts +9 -0
  81. package/dist/ecosystems/java/MavenDependencyDetector.js +39 -0
  82. package/dist/ecosystems/java/MavenDependencyDetector.js.map +1 -0
  83. package/dist/ecosystems/java/parsers/gradleDependencyOutputParser.d.ts +12 -0
  84. package/dist/ecosystems/java/parsers/gradleDependencyOutputParser.js +32 -0
  85. package/dist/ecosystems/java/parsers/gradleDependencyOutputParser.js.map +1 -0
  86. package/dist/ecosystems/java/parsers/gradleDependencyOutputParser.test.d.ts +1 -0
  87. package/dist/ecosystems/java/parsers/gradleDependencyOutputParser.test.js +36 -0
  88. package/dist/ecosystems/java/parsers/gradleDependencyOutputParser.test.js.map +1 -0
  89. package/dist/ecosystems/java/parsers/mavenDependencyListParser.d.ts +11 -0
  90. package/dist/ecosystems/java/parsers/mavenDependencyListParser.js +31 -0
  91. package/dist/ecosystems/java/parsers/mavenDependencyListParser.js.map +1 -0
  92. package/dist/ecosystems/java/parsers/mavenDependencyListParser.test.d.ts +1 -0
  93. package/dist/ecosystems/java/parsers/mavenDependencyListParser.test.js +37 -0
  94. package/dist/ecosystems/java/parsers/mavenDependencyListParser.test.js.map +1 -0
  95. package/dist/ecosystems/java/resolveExecutable.d.ts +8 -0
  96. package/dist/ecosystems/java/resolveExecutable.js +22 -0
  97. package/dist/ecosystems/java/resolveExecutable.js.map +1 -0
  98. package/dist/ecosystems/java/resolveExecutable.test.d.ts +1 -0
  99. package/dist/ecosystems/java/resolveExecutable.test.js +42 -0
  100. package/dist/ecosystems/java/resolveExecutable.test.js.map +1 -0
  101. package/dist/ecosystems/npm/NpmDetector.d.ts +6 -0
  102. package/dist/ecosystems/npm/NpmDetector.js +31 -0
  103. package/dist/ecosystems/npm/NpmDetector.js.map +1 -0
  104. package/dist/ecosystems/npm/PackageLockParser.d.ts +11 -0
  105. package/dist/ecosystems/npm/PackageLockParser.js +65 -0
  106. package/dist/ecosystems/npm/PackageLockParser.js.map +1 -0
  107. package/dist/ecosystems/npm/PackageLockParser.test.d.ts +1 -0
  108. package/dist/ecosystems/npm/PackageLockParser.test.js +59 -0
  109. package/dist/ecosystems/npm/PackageLockParser.test.js.map +1 -0
  110. package/dist/lib/CveScannerApi.d.ts +13 -0
  111. package/dist/lib/CveScannerApi.js +55 -0
  112. package/dist/lib/CveScannerApi.js.map +1 -0
  113. package/dist/lib/report.d.ts +4 -0
  114. package/dist/lib/report.js +47 -0
  115. package/dist/lib/report.js.map +1 -0
  116. package/dist/pipeline/dedupeEntries.d.ts +8 -0
  117. package/dist/pipeline/dedupeEntries.js +20 -0
  118. package/dist/pipeline/dedupeEntries.js.map +1 -0
  119. package/dist/pipeline/dedupeEntries.test.d.ts +1 -0
  120. package/dist/pipeline/dedupeEntries.test.js +27 -0
  121. package/dist/pipeline/dedupeEntries.test.js.map +1 -0
  122. package/dist/pipeline/hashDataset.d.ts +7 -0
  123. package/dist/pipeline/hashDataset.js +13 -0
  124. package/dist/pipeline/hashDataset.js.map +1 -0
  125. package/dist/pipeline/hashDataset.test.d.ts +1 -0
  126. package/dist/pipeline/hashDataset.test.js +28 -0
  127. package/dist/pipeline/hashDataset.test.js.map +1 -0
  128. package/dist/pipeline/mapSeverityToScore.d.ts +9 -0
  129. package/dist/pipeline/mapSeverityToScore.js +26 -0
  130. package/dist/pipeline/mapSeverityToScore.js.map +1 -0
  131. package/dist/pipeline/mapSeverityToScore.test.d.ts +1 -0
  132. package/dist/pipeline/mapSeverityToScore.test.js +20 -0
  133. package/dist/pipeline/mapSeverityToScore.test.js.map +1 -0
  134. package/dist/pipeline/parseOsvRecord.d.ts +37 -0
  135. package/dist/pipeline/parseOsvRecord.js +88 -0
  136. package/dist/pipeline/parseOsvRecord.js.map +1 -0
  137. package/dist/pipeline/parseOsvRecord.test.d.ts +1 -0
  138. package/dist/pipeline/parseOsvRecord.test.js +220 -0
  139. package/dist/pipeline/parseOsvRecord.test.js.map +1 -0
  140. package/package.json +37 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupeEntries.test.js","sourceRoot":"","sources":["../../src/pipeline/dedupeEntries.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAwC;AACxC,yCAAiC;AAEjC,mDAAgD;AAEhD,MAAM,KAAK,GAAoB;IAC7B,SAAS,EAAE,KAAK;IAChB,GAAG,EAAE,yCAAyC;IAC9C,mBAAmB,EAAE,SAAS;IAC9B,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjD,CAAC;AAEF,IAAA,gBAAI,EAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,MAAM,GAAG,IAAA,6BAAa,EAAC,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/B,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,wCAAwC,EAAE,GAAG,EAAE;IAClD,MAAM,KAAK,GAAoB,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC;IAC5E,gBAAM,CAAC,SAAS,CAAC,IAAA,6BAAa,EAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,uBAAuB,EAAE,GAAG,EAAE;IACjC,gBAAM,CAAC,SAAS,CAAC,IAAA,6BAAa,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { VulnerableEntry } from '../core/types';
2
+ /**
3
+ * Deterministic content hash of a dataset's entries (not including
4
+ * generatedAt), used to detect whether a freshly-built dataset actually
5
+ * differs from the last one that was published. See specs/60-data-pipeline.md.
6
+ */
7
+ export declare function hashEntries(entries: VulnerableEntry[]): string;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hashEntries = hashEntries;
4
+ const crypto_1 = require("crypto");
5
+ /**
6
+ * Deterministic content hash of a dataset's entries (not including
7
+ * generatedAt), used to detect whether a freshly-built dataset actually
8
+ * differs from the last one that was published. See specs/60-data-pipeline.md.
9
+ */
10
+ function hashEntries(entries) {
11
+ return (0, crypto_1.createHash)('sha256').update(JSON.stringify(entries)).digest('hex');
12
+ }
13
+ //# sourceMappingURL=hashDataset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashDataset.js","sourceRoot":"","sources":["../../src/pipeline/hashDataset.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAGpC;;;;GAIG;AACH,qBAA4B,OAA0B;IACpD,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const hashDataset_1 = require("./hashDataset");
9
+ const entry = {
10
+ ecosystem: 'npm',
11
+ cpe: 'cpe:2.3:a:lodash:lodash:*:*:*:*:*:*:*:*',
12
+ versionEndExcluding: '4.17.12',
13
+ cves: [{ id: 'CVE-1', score: 5, title: 'test' }],
14
+ };
15
+ (0, node_test_1.test)('produces a sha256 hex digest', () => {
16
+ strict_1.default.match((0, hashDataset_1.hashEntries)([entry]), /^[0-9a-f]{64}$/);
17
+ });
18
+ (0, node_test_1.test)('same entries produce the same hash', () => {
19
+ strict_1.default.equal((0, hashDataset_1.hashEntries)([entry]), (0, hashDataset_1.hashEntries)([{ ...entry }]));
20
+ });
21
+ (0, node_test_1.test)('different entries produce a different hash', () => {
22
+ const other = { ...entry, versionEndExcluding: '4.17.21' };
23
+ strict_1.default.notEqual((0, hashDataset_1.hashEntries)([entry]), (0, hashDataset_1.hashEntries)([other]));
24
+ });
25
+ (0, node_test_1.test)('empty dataset has a stable hash too', () => {
26
+ strict_1.default.equal((0, hashDataset_1.hashEntries)([]), (0, hashDataset_1.hashEntries)([]));
27
+ });
28
+ //# sourceMappingURL=hashDataset.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashDataset.test.js","sourceRoot":"","sources":["../../src/pipeline/hashDataset.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAwC;AACxC,yCAAiC;AAEjC,+CAA4C;AAE5C,MAAM,KAAK,GAAoB;IAC7B,SAAS,EAAE,KAAK;IAChB,GAAG,EAAE,yCAAyC;IAC9C,mBAAmB,EAAE,SAAS;IAC9B,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjD,CAAC;AAEF,IAAA,gBAAI,EAAC,8BAA8B,EAAE,GAAG,EAAE;IACxC,gBAAM,CAAC,KAAK,CAAC,IAAA,yBAAW,EAAC,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,oCAAoC,EAAE,GAAG,EAAE;IAC9C,gBAAM,CAAC,KAAK,CAAC,IAAA,yBAAW,EAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAA,yBAAW,EAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,4CAA4C,EAAE,GAAG,EAAE;IACtD,MAAM,KAAK,GAAoB,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC;IAC5E,gBAAM,CAAC,QAAQ,CAAC,IAAA,yBAAW,EAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAA,yBAAW,EAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,qCAAqC,EAAE,GAAG,EAAE;IAC/C,gBAAM,CAAC,KAAK,CAAC,IAAA,yBAAW,EAAC,EAAE,CAAC,EAAE,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * OSV records almost always carry a qualitative severity rating
3
+ * (database_specific.severity), not a numeric CVSS base score directly.
4
+ * This maps that rating to a representative numeric score within NVD's own
5
+ * qualitative bands (Low 0.1-3.9, Medium 4.0-6.9, High 7.0-8.9, Critical
6
+ * 9.0-10.0) so --fail-on-score gating still works. Approximate by design —
7
+ * see specs/60-data-pipeline.md.
8
+ */
9
+ export declare function mapSeverityToScore(severity: string | undefined): number;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapSeverityToScore = mapSeverityToScore;
4
+ /**
5
+ * OSV records almost always carry a qualitative severity rating
6
+ * (database_specific.severity), not a numeric CVSS base score directly.
7
+ * This maps that rating to a representative numeric score within NVD's own
8
+ * qualitative bands (Low 0.1-3.9, Medium 4.0-6.9, High 7.0-8.9, Critical
9
+ * 9.0-10.0) so --fail-on-score gating still works. Approximate by design —
10
+ * see specs/60-data-pipeline.md.
11
+ */
12
+ function mapSeverityToScore(severity) {
13
+ switch (severity) {
14
+ case 'CRITICAL':
15
+ return 9.5;
16
+ case 'HIGH':
17
+ return 7.5;
18
+ case 'MODERATE':
19
+ return 5.5;
20
+ case 'LOW':
21
+ return 2.0;
22
+ default:
23
+ return 5.0;
24
+ }
25
+ }
26
+ //# sourceMappingURL=mapSeverityToScore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapSeverityToScore.js","sourceRoot":"","sources":["../../src/pipeline/mapSeverityToScore.ts"],"names":[],"mappings":";;;AAAA;;;;;;;GAOG;AACH,4BAAmC,QAA4B;IAC7D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;QACb,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;QACb,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QACb;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const mapSeverityToScore_1 = require("./mapSeverityToScore");
9
+ (0, node_test_1.test)('maps known severity ratings into their NVD qualitative band', () => {
10
+ strict_1.default.ok((0, mapSeverityToScore_1.mapSeverityToScore)('CRITICAL') >= 9.0);
11
+ strict_1.default.ok((0, mapSeverityToScore_1.mapSeverityToScore)('HIGH') >= 7.0 && (0, mapSeverityToScore_1.mapSeverityToScore)('HIGH') < 9.0);
12
+ strict_1.default.ok((0, mapSeverityToScore_1.mapSeverityToScore)('MODERATE') >= 4.0 &&
13
+ (0, mapSeverityToScore_1.mapSeverityToScore)('MODERATE') < 7.0);
14
+ strict_1.default.ok((0, mapSeverityToScore_1.mapSeverityToScore)('LOW') > 0 && (0, mapSeverityToScore_1.mapSeverityToScore)('LOW') < 4.0);
15
+ });
16
+ (0, node_test_1.test)('falls back to a neutral score for unknown/missing severity', () => {
17
+ strict_1.default.equal((0, mapSeverityToScore_1.mapSeverityToScore)(undefined), 5.0);
18
+ strict_1.default.equal((0, mapSeverityToScore_1.mapSeverityToScore)('UNKNOWN'), 5.0);
19
+ });
20
+ //# sourceMappingURL=mapSeverityToScore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapSeverityToScore.test.js","sourceRoot":"","sources":["../../src/pipeline/mapSeverityToScore.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAwC;AACxC,yCAAiC;AACjC,6DAA0D;AAE1D,IAAA,gBAAI,EAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,gBAAM,CAAC,EAAE,CAAC,IAAA,uCAAkB,EAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;IACjD,gBAAM,CAAC,EAAE,CACP,IAAA,uCAAkB,EAAC,MAAM,CAAC,IAAI,GAAG,IAAI,IAAA,uCAAkB,EAAC,MAAM,CAAC,GAAG,GAAG,CACtE,CAAC;IACF,gBAAM,CAAC,EAAE,CACP,IAAA,uCAAkB,EAAC,UAAU,CAAC,IAAI,GAAG;QACnC,IAAA,uCAAkB,EAAC,UAAU,CAAC,GAAG,GAAG,CACvC,CAAC;IACF,gBAAM,CAAC,EAAE,CAAC,IAAA,uCAAkB,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAA,uCAAkB,EAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AAC9E,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,4DAA4D,EAAE,GAAG,EAAE;IACtE,gBAAM,CAAC,KAAK,CAAC,IAAA,uCAAkB,EAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,gBAAM,CAAC,KAAK,CAAC,IAAA,uCAAkB,EAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { VulnerableEntry } from '../core/types';
2
+ export type OsvEcosystem = 'Maven' | 'npm';
3
+ interface OsvEvent {
4
+ introduced?: string;
5
+ fixed?: string;
6
+ last_affected?: string;
7
+ limit?: string;
8
+ }
9
+ interface OsvRange {
10
+ type: string;
11
+ events: OsvEvent[];
12
+ }
13
+ interface OsvAffected {
14
+ package?: {
15
+ name?: string;
16
+ ecosystem?: string;
17
+ };
18
+ ranges?: OsvRange[];
19
+ versions?: string[];
20
+ }
21
+ export interface OsvRecord {
22
+ id: string;
23
+ summary?: string;
24
+ details?: string;
25
+ aliases?: string[];
26
+ affected?: OsvAffected[];
27
+ database_specific?: {
28
+ severity?: string;
29
+ };
30
+ }
31
+ /**
32
+ * Pure function: an OSV vulnerability record -> zero or more VulnerableEntry
33
+ * for the given ecosystem. Records without a CVE alias are dropped entirely
34
+ * (this tool is CVE-keyed throughout). See specs/60-data-pipeline.md.
35
+ */
36
+ export declare function parseOsvRecord(record: OsvRecord, targetEcosystem: OsvEcosystem): VulnerableEntry[];
37
+ export {};
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOsvRecord = parseOsvRecord;
4
+ const cpe_1 = require("../core/cpe");
5
+ const mapSeverityToScore_1 = require("./mapSeverityToScore");
6
+ /**
7
+ * Walks an OSV range's `events`, which alternate "introduced" (opens a bound
8
+ * group) and "fixed"/"last_affected" (closes it). A group left open at the
9
+ * end of the array has no upper bound (still affected, no known fix).
10
+ * `limit` events are not supported in v1. See specs/60-data-pipeline.md.
11
+ */
12
+ function extractBoundGroups(events) {
13
+ const groups = [];
14
+ let current;
15
+ for (const event of events) {
16
+ if (event.introduced !== undefined) {
17
+ if (current)
18
+ groups.push(current);
19
+ current = { start: event.introduced };
20
+ }
21
+ else if (event.fixed !== undefined && current) {
22
+ current.fixedExclusive = event.fixed;
23
+ groups.push(current);
24
+ current = undefined;
25
+ }
26
+ else if (event.last_affected !== undefined && current) {
27
+ current.lastAffectedInclusive = event.last_affected;
28
+ groups.push(current);
29
+ current = undefined;
30
+ }
31
+ }
32
+ if (current)
33
+ groups.push(current);
34
+ return groups;
35
+ }
36
+ function selectRanges(ranges) {
37
+ const ecosystemRanges = ranges.filter((r) => r.type === 'ECOSYSTEM');
38
+ if (ecosystemRanges.length > 0)
39
+ return ecosystemRanges;
40
+ return ranges.filter((r) => r.type === 'SEMVER');
41
+ }
42
+ /**
43
+ * Pure function: an OSV vulnerability record -> zero or more VulnerableEntry
44
+ * for the given ecosystem. Records without a CVE alias are dropped entirely
45
+ * (this tool is CVE-keyed throughout). See specs/60-data-pipeline.md.
46
+ */
47
+ function parseOsvRecord(record, targetEcosystem) {
48
+ const cveIds = (record.aliases ?? []).filter((a) => /^CVE-\d{4}-\d+$/.test(a));
49
+ if (cveIds.length === 0)
50
+ return [];
51
+ const title = record.summary || record.details?.slice(0, 200) || record.id;
52
+ const score = (0, mapSeverityToScore_1.mapSeverityToScore)(record.database_specific?.severity);
53
+ const cves = cveIds.map((id) => ({ id, score, title }));
54
+ const ecosystem = targetEcosystem === 'Maven' ? 'maven' : 'npm';
55
+ const entries = [];
56
+ for (const affected of record.affected ?? []) {
57
+ if (affected.package?.ecosystem !== targetEcosystem)
58
+ continue;
59
+ const coordinate = affected.package?.name;
60
+ if (!coordinate)
61
+ continue;
62
+ const ranges = selectRanges(affected.ranges ?? []);
63
+ const cpe = (0, cpe_1.buildCpe)(ecosystem, coordinate);
64
+ if (ranges.length > 0) {
65
+ for (const range of ranges) {
66
+ for (const group of extractBoundGroups(range.events)) {
67
+ entries.push({
68
+ ecosystem,
69
+ cpe,
70
+ versionStartIncluding: group.start,
71
+ versionEndExcluding: group.fixedExclusive,
72
+ versionEndIncluding: group.lastAffectedInclusive,
73
+ cves,
74
+ });
75
+ }
76
+ }
77
+ }
78
+ else if (affected.versions && affected.versions.length > 0) {
79
+ // No ranges at all, just an enumerated list of affected versions -
80
+ // one exact-match VulnerableEntry per version. See specs/60-data-pipeline.md.
81
+ for (const version of affected.versions) {
82
+ entries.push({ ecosystem, cpe, versionExact: version, cves });
83
+ }
84
+ }
85
+ }
86
+ return entries;
87
+ }
88
+ //# sourceMappingURL=parseOsvRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseOsvRecord.js","sourceRoot":"","sources":["../../src/pipeline/parseOsvRecord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const parseOsvRecord_1 = require("./parseOsvRecord");
9
+ const mavenRecord = {
10
+ id: 'GHSA-xxv9-w5hm-328j',
11
+ aliases: ['CVE-2024-28155'],
12
+ summary: 'Jenkins AppSpider Plugin missing permission checks',
13
+ database_specific: { severity: 'MODERATE' },
14
+ affected: [
15
+ {
16
+ package: {
17
+ name: 'com.rapid7:jenkinsci-appspider-plugin',
18
+ ecosystem: 'Maven',
19
+ },
20
+ ranges: [
21
+ {
22
+ type: 'ECOSYSTEM',
23
+ events: [{ introduced: '0' }, { fixed: '1.0.17' }],
24
+ },
25
+ ],
26
+ },
27
+ ],
28
+ };
29
+ (0, node_test_1.test)('maps a Maven OSV record to a VulnerableEntry with the package.name as-is', () => {
30
+ const entries = (0, parseOsvRecord_1.parseOsvRecord)(mavenRecord, 'Maven');
31
+ strict_1.default.deepEqual(entries, [
32
+ {
33
+ ecosystem: 'maven',
34
+ cpe: 'cpe:2.3:a:com.rapid7:jenkinsci-appspider-plugin:*:*:*:*:*:*:*:*',
35
+ versionStartIncluding: '0',
36
+ versionEndExcluding: '1.0.17',
37
+ versionEndIncluding: undefined,
38
+ cves: [
39
+ {
40
+ id: 'CVE-2024-28155',
41
+ score: 5.5,
42
+ title: 'Jenkins AppSpider Plugin missing permission checks',
43
+ },
44
+ ],
45
+ },
46
+ ]);
47
+ });
48
+ (0, node_test_1.test)('drops records with no CVE alias', () => {
49
+ const noCve = { ...mavenRecord, aliases: [] };
50
+ strict_1.default.deepEqual((0, parseOsvRecord_1.parseOsvRecord)(noCve, 'Maven'), []);
51
+ });
52
+ (0, node_test_1.test)('skips affected entries for a different ecosystem', () => {
53
+ strict_1.default.deepEqual((0, parseOsvRecord_1.parseOsvRecord)(mavenRecord, 'npm'), []);
54
+ });
55
+ (0, node_test_1.test)('falls back to details/id when summary is missing, and to a neutral score when severity is missing', () => {
56
+ const record = {
57
+ id: 'GHSA-aaaa-bbbb-cccc',
58
+ aliases: ['CVE-2023-0001'],
59
+ details: 'A very long details field that should be truncated at some point for the title fallback use case here',
60
+ affected: [
61
+ {
62
+ package: { name: 'lodash', ecosystem: 'npm' },
63
+ ranges: [
64
+ {
65
+ type: 'ECOSYSTEM',
66
+ events: [{ introduced: '0' }, { fixed: '4.17.12' }],
67
+ },
68
+ ],
69
+ },
70
+ ],
71
+ };
72
+ const [entry] = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
73
+ strict_1.default.equal(entry.cpe, 'cpe:2.3:a:lodash:lodash:*:*:*:*:*:*:*:*');
74
+ strict_1.default.equal(entry.cves[0].score, 5.0);
75
+ strict_1.default.match(entry.cves[0].title, /^A very long details field/);
76
+ });
77
+ (0, node_test_1.test)('produces one entry per disjoint bound group within a single range', () => {
78
+ const record = {
79
+ id: 'GHSA-multi',
80
+ aliases: ['CVE-2023-0002'],
81
+ summary: 'two independently-fixed branches',
82
+ affected: [
83
+ {
84
+ package: { name: 'left-pad', ecosystem: 'npm' },
85
+ ranges: [
86
+ {
87
+ type: 'ECOSYSTEM',
88
+ events: [
89
+ { introduced: '0' },
90
+ { fixed: '1.2.0' },
91
+ { introduced: '2.0.0' },
92
+ { fixed: '2.5.0' },
93
+ ],
94
+ },
95
+ ],
96
+ },
97
+ ],
98
+ };
99
+ const entries = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
100
+ strict_1.default.equal(entries.length, 2);
101
+ strict_1.default.equal(entries[0].versionStartIncluding, '0');
102
+ strict_1.default.equal(entries[0].versionEndExcluding, '1.2.0');
103
+ strict_1.default.equal(entries[1].versionStartIncluding, '2.0.0');
104
+ strict_1.default.equal(entries[1].versionEndExcluding, '2.5.0');
105
+ });
106
+ (0, node_test_1.test)('uses last_affected as an inclusive upper bound when there is no fixed version', () => {
107
+ const record = {
108
+ id: 'GHSA-last-affected',
109
+ aliases: ['CVE-2023-0003'],
110
+ summary: 'no known fix',
111
+ affected: [
112
+ {
113
+ package: { name: 'left-pad', ecosystem: 'npm' },
114
+ ranges: [
115
+ {
116
+ type: 'ECOSYSTEM',
117
+ events: [{ introduced: '0' }, { last_affected: '1.0.0' }],
118
+ },
119
+ ],
120
+ },
121
+ ],
122
+ };
123
+ const [entry] = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
124
+ strict_1.default.equal(entry.versionEndIncluding, '1.0.0');
125
+ strict_1.default.equal(entry.versionEndExcluding, undefined);
126
+ });
127
+ (0, node_test_1.test)('leaves the upper bound open when no fixed/last_affected event ever closes the group', () => {
128
+ const record = {
129
+ id: 'GHSA-open-ended',
130
+ aliases: ['CVE-2023-0004'],
131
+ summary: 'still vulnerable, no fix released',
132
+ affected: [
133
+ {
134
+ package: { name: 'left-pad', ecosystem: 'npm' },
135
+ ranges: [{ type: 'ECOSYSTEM', events: [{ introduced: '0' }] }],
136
+ },
137
+ ],
138
+ };
139
+ const [entry] = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
140
+ strict_1.default.equal(entry.versionStartIncluding, '0');
141
+ strict_1.default.equal(entry.versionEndExcluding, undefined);
142
+ strict_1.default.equal(entry.versionEndIncluding, undefined);
143
+ });
144
+ (0, node_test_1.test)('falls back to SEMVER ranges when no ECOSYSTEM range is present', () => {
145
+ const record = {
146
+ id: 'GHSA-semver-only',
147
+ aliases: ['CVE-2023-0005'],
148
+ summary: 'semver only',
149
+ affected: [
150
+ {
151
+ package: { name: 'left-pad', ecosystem: 'npm' },
152
+ ranges: [
153
+ { type: 'SEMVER', events: [{ introduced: '0' }, { fixed: '1.0.0' }] },
154
+ ],
155
+ },
156
+ ],
157
+ };
158
+ const entries = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
159
+ strict_1.default.equal(entries.length, 1);
160
+ strict_1.default.equal(entries[0].versionEndExcluding, '1.0.0');
161
+ });
162
+ (0, node_test_1.test)('emits multiple Cve entries when a record has multiple CVE aliases', () => {
163
+ const record = {
164
+ id: 'GHSA-multi-cve',
165
+ aliases: ['CVE-2023-0006', 'CVE-2023-0007'],
166
+ summary: 'two CVEs for the same advisory',
167
+ affected: [
168
+ {
169
+ package: { name: 'left-pad', ecosystem: 'npm' },
170
+ ranges: [
171
+ {
172
+ type: 'ECOSYSTEM',
173
+ events: [{ introduced: '0' }, { fixed: '1.0.0' }],
174
+ },
175
+ ],
176
+ },
177
+ ],
178
+ };
179
+ const [entry] = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
180
+ strict_1.default.deepEqual(entry.cves.map((c) => c.id), ['CVE-2023-0006', 'CVE-2023-0007']);
181
+ });
182
+ (0, node_test_1.test)('falls back to an enumerated versions[] list as exact matches when there are no ranges at all', () => {
183
+ const record = {
184
+ id: 'GHSA-versions-only',
185
+ aliases: ['CVE-2023-0008'],
186
+ summary: 'no ranges, just a version list',
187
+ affected: [
188
+ {
189
+ package: { name: 'left-pad', ecosystem: 'npm' },
190
+ versions: ['1.0.0', '1.0.1', '1.0.2'],
191
+ },
192
+ ],
193
+ };
194
+ const entries = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
195
+ strict_1.default.deepEqual(entries.map((e) => e.versionExact), ['1.0.0', '1.0.1', '1.0.2']);
196
+ strict_1.default.ok(entries.every((e) => e.versionStartIncluding === undefined));
197
+ });
198
+ (0, node_test_1.test)('prefers ranges over versions[] when both are present', () => {
199
+ const record = {
200
+ id: 'GHSA-both',
201
+ aliases: ['CVE-2023-0009'],
202
+ summary: 'has both',
203
+ affected: [
204
+ {
205
+ package: { name: 'left-pad', ecosystem: 'npm' },
206
+ ranges: [
207
+ {
208
+ type: 'ECOSYSTEM',
209
+ events: [{ introduced: '0' }, { fixed: '1.0.0' }],
210
+ },
211
+ ],
212
+ versions: ['0.5.0'],
213
+ },
214
+ ],
215
+ };
216
+ const entries = (0, parseOsvRecord_1.parseOsvRecord)(record, 'npm');
217
+ strict_1.default.equal(entries.length, 1);
218
+ strict_1.default.equal(entries[0].versionEndExcluding, '1.0.0');
219
+ });
220
+ //# sourceMappingURL=parseOsvRecord.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseOsvRecord.test.js","sourceRoot":"","sources":["../../src/pipeline/parseOsvRecord.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,41 @@
1
1
  {
2
2
  "name": "cve-scanner",
3
- "version": "0.0.0",
4
- "description": "OIDC trusted publishing setup package for cve-scanner",
3
+ "version": "0.0.2",
4
+ "scripts": {
5
+ "build": "npm run format && tsc -p .",
6
+ "format": "prettier --write .",
7
+ "release": "npm run refresh-dataset && npm run check-dataset-changed && git add data/dataset.hash && npm version patch && npm run build && npm publish && git push --follow-tags",
8
+ "run": "npm run build && node ./dist/cmd/cve-scanner.js",
9
+ "test": "npm run build && node --test ./dist",
10
+ "fetch-osv-data": "node scripts/fetch-osv-data.js .osv-data",
11
+ "build-dataset": "npm run build && node scripts/build-dataset.js .osv-data/maven .osv-data/npm data/dataset.json",
12
+ "refresh-dataset": "npm run fetch-osv-data && npm run build-dataset",
13
+ "check-dataset-changed": "node scripts/check-dataset-changed.js data/dataset.json data/dataset.hash"
14
+ },
15
+ "bin": "dist/cmd/cve-scanner.js",
16
+ "devDependencies": {
17
+ "@types/node": "^26.6.5",
18
+ "@types/yauzl": "^3.4.0",
19
+ "prettier": "^3.9.10",
20
+ "typescript": "^7.0.2"
21
+ },
22
+ "dependencies": {
23
+ "commander": "^15.0.0",
24
+ "yauzl": "^3.4.0"
25
+ },
26
+ "homepage": "https://github.com/tomasbjerre/cve-scanner",
27
+ "repository": "git@github.com:tomasbjerre/cve-scanner.git",
28
+ "files": [
29
+ "dist",
30
+ "data",
31
+ "assets"
32
+ ],
33
+ "author": "Tomas Bjerre",
5
34
  "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
35
+ "cve",
36
+ "security",
37
+ "vulnerability",
38
+ "sca"
39
+ ],
40
+ "license": "Apache 2"
10
41
  }