@cdxgen/cdxgen 13.5.0 → 13.6.0

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 (182) hide show
  1. package/README.md +6 -6
  2. package/bin/cdxgen.js +4 -0
  3. package/bin/evinse.js +3 -0
  4. package/bin/validate.js +6 -0
  5. package/data/license-aliases.json +24 -2
  6. package/data/remediations.json +124 -0
  7. package/data/rules/ai-bom.yaml +1 -1
  8. package/data/rules/brotli-decoder.yaml +107 -0
  9. package/data/rules/vscode-extensions.yaml +75 -0
  10. package/data/spdx-license-list.json +121 -7
  11. package/data/spdx-licenses.json +69 -0
  12. package/data/spdx.schema.json +845 -2
  13. package/lib/cli/bomAssembly.js +92 -3
  14. package/lib/cli/index.js +108 -1
  15. package/lib/cli/jsBom.js +153 -64
  16. package/lib/cli/jvmBom.js +237 -46
  17. package/lib/cli/managedBom.js +142 -16
  18. package/lib/cli/nativeBom.js +42 -5
  19. package/lib/core/boundedFile.js +344 -0
  20. package/lib/core/brotliProbe.js +182 -0
  21. package/lib/core/env.js +8 -0
  22. package/lib/core/fs.js +12 -0
  23. package/lib/core/httpClient.js +98 -1
  24. package/lib/core/lockPaths.js +38 -0
  25. package/lib/core/paths.js +24 -1
  26. package/lib/core/processTree.js +5 -0
  27. package/lib/core/toolRegistry.js +170 -0
  28. package/lib/ecosystems/cppEvidence.js +263 -106
  29. package/lib/ecosystems/cppIncludeResolver.js +16 -5
  30. package/lib/ecosystems/ecosystems.js +25 -10
  31. package/lib/ecosystems/gemHostProbe.js +301 -0
  32. package/lib/ecosystems/gradleutils.js +828 -224
  33. package/lib/ecosystems/parsers-bazel.js +107 -6
  34. package/lib/ecosystems/parsers-js.js +505 -22
  35. package/lib/ecosystems/parsers-misc.js +209 -20
  36. package/lib/ecosystems/parsers-python.js +89 -2
  37. package/lib/ecosystems/pythonutils.js +128 -2
  38. package/lib/ecosystems/rubyutils.js +538 -31
  39. package/lib/ecosystems/scalacliutils.js +2 -0
  40. package/lib/ecosystems/scalasem.js +796 -151
  41. package/lib/ecosystems/vendoredCode.js +237 -3
  42. package/lib/ecosystems/venvProbe.js +360 -0
  43. package/lib/evinser/evinser.js +346 -43
  44. package/lib/helpers/agenticToolutils.js +413 -93
  45. package/lib/helpers/vsixutils.js +1574 -315
  46. package/lib/inventory/atomUtils.js +77 -0
  47. package/lib/inventory/brotliDecoder.js +142 -0
  48. package/lib/inventory/buildToolRateLimit.js +1 -1
  49. package/lib/inventory/cbomutils.js +56 -7
  50. package/lib/inventory/deps.js +35 -0
  51. package/lib/inventory/dosai.js +139 -5
  52. package/lib/inventory/dotnetRuntime.js +217 -0
  53. package/lib/inventory/envcontext.js +307 -13
  54. package/lib/inventory/evidenceUtils.js +11 -0
  55. package/lib/inventory/fetchBatch.js +1 -1
  56. package/lib/inventory/formulationParsers.js +31 -3
  57. package/lib/inventory/gtfobins.js +13 -0
  58. package/lib/inventory/hostRuntimeProbe.js +686 -0
  59. package/lib/inventory/jvmLocalRepos.js +9 -2
  60. package/lib/inventory/jvmToolEnv.js +29 -0
  61. package/lib/inventory/licenseEnhancer.js +12 -0
  62. package/lib/inventory/mavenCentralMirror.js +534 -0
  63. package/lib/inventory/nodeBuildInfo.js +218 -0
  64. package/lib/inventory/nodeHostProbe.js +202 -0
  65. package/lib/inventory/osPackageResolver.js +182 -0
  66. package/lib/inventory/phpBuildInfo.js +10 -59
  67. package/lib/inventory/phpHostProbe.js +32 -488
  68. package/lib/inventory/rubyBuildInfo.js +972 -0
  69. package/lib/inventory/rubyHostProbe.js +218 -0
  70. package/lib/inventory/scalaCoords.js +4 -3
  71. package/lib/inventory/scalaDedupe.js +440 -0
  72. package/lib/inventory/source.js +49 -2
  73. package/lib/managers/binary.js +337 -3
  74. package/lib/managers/docker.js +79 -0
  75. package/lib/parsers/largeJson.js +28 -11
  76. package/lib/parsers/vscodeExtensionId.js +183 -0
  77. package/lib/server/server.js +12 -1
  78. package/lib/stages/postgen/ruleEngine.js +13 -5
  79. package/lib/stages/pregen/envAudit.js +1 -0
  80. package/lib/stages/pregen/pregen.js +114 -57
  81. package/lib/validator/bomValidator.js +6 -1
  82. package/lib/validator/generated/validate-1.6.mjs +1 -1
  83. package/lib/validator/generated/validate-1.7.mjs +1 -1
  84. package/lib/validator/generated/validate-2.0.mjs +1 -1
  85. package/lib/validator/index.js +1 -1
  86. package/package.json +3 -2
  87. package/types/lib/cli/bomAssembly.d.ts +13 -1
  88. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  89. package/types/lib/cli/index.d.ts.map +1 -1
  90. package/types/lib/cli/jsBom.d.ts +1 -17
  91. package/types/lib/cli/jsBom.d.ts.map +1 -1
  92. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  93. package/types/lib/cli/managedBom.d.ts.map +1 -1
  94. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  95. package/types/lib/core/boundedFile.d.ts +70 -0
  96. package/types/lib/core/boundedFile.d.ts.map +1 -0
  97. package/types/lib/core/brotliProbe.d.ts +37 -0
  98. package/types/lib/core/brotliProbe.d.ts.map +1 -0
  99. package/types/lib/core/env.d.ts +4 -0
  100. package/types/lib/core/env.d.ts.map +1 -1
  101. package/types/lib/core/fs.d.ts.map +1 -1
  102. package/types/lib/core/httpClient.d.ts +24 -0
  103. package/types/lib/core/httpClient.d.ts.map +1 -1
  104. package/types/lib/core/lockPaths.d.ts +19 -0
  105. package/types/lib/core/lockPaths.d.ts.map +1 -0
  106. package/types/lib/core/processTree.d.ts +2 -0
  107. package/types/lib/core/processTree.d.ts.map +1 -1
  108. package/types/lib/core/toolRegistry.d.ts +36 -0
  109. package/types/lib/core/toolRegistry.d.ts.map +1 -0
  110. package/types/lib/ecosystems/cppEvidence.d.ts +40 -13
  111. package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
  112. package/types/lib/ecosystems/cppIncludeResolver.d.ts +2 -1
  113. package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -1
  114. package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
  115. package/types/lib/ecosystems/gemHostProbe.d.ts +28 -0
  116. package/types/lib/ecosystems/gemHostProbe.d.ts.map +1 -0
  117. package/types/lib/ecosystems/gradleutils.d.ts +47 -13
  118. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  119. package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -1
  120. package/types/lib/ecosystems/parsers-js.d.ts +17 -20
  121. package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
  122. package/types/lib/ecosystems/parsers-misc.d.ts +19 -0
  123. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
  124. package/types/lib/ecosystems/parsers-python.d.ts +10 -0
  125. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  126. package/types/lib/ecosystems/pythonutils.d.ts +20 -2
  127. package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
  128. package/types/lib/ecosystems/rubyutils.d.ts +144 -12
  129. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
  130. package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -1
  131. package/types/lib/ecosystems/vendoredCode.d.ts +26 -0
  132. package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -1
  133. package/types/lib/ecosystems/venvProbe.d.ts +40 -0
  134. package/types/lib/ecosystems/venvProbe.d.ts.map +1 -0
  135. package/types/lib/evinser/evinser.d.ts +63 -8
  136. package/types/lib/evinser/evinser.d.ts.map +1 -1
  137. package/types/lib/inventory/atomUtils.d.ts +19 -0
  138. package/types/lib/inventory/atomUtils.d.ts.map +1 -1
  139. package/types/lib/inventory/brotliDecoder.d.ts +58 -0
  140. package/types/lib/inventory/brotliDecoder.d.ts.map +1 -0
  141. package/types/lib/inventory/cbomutils.d.ts +17 -0
  142. package/types/lib/inventory/cbomutils.d.ts.map +1 -1
  143. package/types/lib/inventory/deps.d.ts.map +1 -1
  144. package/types/lib/inventory/dosai.d.ts +17 -1
  145. package/types/lib/inventory/dosai.d.ts.map +1 -1
  146. package/types/lib/inventory/dotnetRuntime.d.ts +44 -0
  147. package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -0
  148. package/types/lib/inventory/envcontext.d.ts +52 -6
  149. package/types/lib/inventory/envcontext.d.ts.map +1 -1
  150. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  151. package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
  152. package/types/lib/inventory/gtfobins.d.ts.map +1 -1
  153. package/types/lib/inventory/hostRuntimeProbe.d.ts +44 -0
  154. package/types/lib/inventory/hostRuntimeProbe.d.ts.map +1 -0
  155. package/types/lib/inventory/jvmToolEnv.d.ts +12 -0
  156. package/types/lib/inventory/jvmToolEnv.d.ts.map +1 -1
  157. package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -1
  158. package/types/lib/inventory/mavenCentralMirror.d.ts +170 -0
  159. package/types/lib/inventory/mavenCentralMirror.d.ts.map +1 -0
  160. package/types/lib/inventory/nodeBuildInfo.d.ts +95 -0
  161. package/types/lib/inventory/nodeBuildInfo.d.ts.map +1 -0
  162. package/types/lib/inventory/nodeHostProbe.d.ts +15 -0
  163. package/types/lib/inventory/nodeHostProbe.d.ts.map +1 -0
  164. package/types/lib/inventory/osPackageResolver.d.ts +38 -0
  165. package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
  166. package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -1
  167. package/types/lib/inventory/phpHostProbe.d.ts.map +1 -1
  168. package/types/lib/inventory/rubyBuildInfo.d.ts +271 -0
  169. package/types/lib/inventory/rubyBuildInfo.d.ts.map +1 -0
  170. package/types/lib/inventory/rubyHostProbe.d.ts +47 -0
  171. package/types/lib/inventory/rubyHostProbe.d.ts.map +1 -0
  172. package/types/lib/inventory/source.d.ts +10 -0
  173. package/types/lib/inventory/source.d.ts.map +1 -1
  174. package/types/lib/managers/binary.d.ts.map +1 -1
  175. package/types/lib/managers/docker.d.ts +12 -0
  176. package/types/lib/managers/docker.d.ts.map +1 -1
  177. package/types/lib/parsers/largeJson.d.ts +4 -3
  178. package/types/lib/parsers/largeJson.d.ts.map +1 -1
  179. package/types/lib/server/server.d.ts.map +1 -1
  180. package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
  181. package/types/lib/stages/pregen/pregen.d.ts +12 -8
  182. package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
package/README.md CHANGED
@@ -216,7 +216,7 @@ Common asset names:
216
216
  #### Linux
217
217
 
218
218
  ```bash
219
- VERSION="v13.5.0"
219
+ VERSION="v13.6.0"
220
220
  ASSET="cdx-audit-linux-amd64"
221
221
  BASE_URL="https://github.com/cdxgen/cdxgen/releases/download/${VERSION}"
222
222
 
@@ -230,7 +230,7 @@ chmod +x "${ASSET}"
230
230
  #### macOS
231
231
 
232
232
  ```bash
233
- VERSION="v13.5.0"
233
+ VERSION="v13.6.0"
234
234
  ASSET="cdx-audit-darwin-arm64"
235
235
  BASE_URL="https://github.com/cdxgen/cdxgen/releases/download/${VERSION}"
236
236
 
@@ -244,7 +244,7 @@ chmod +x "${ASSET}"
244
244
  #### Windows (PowerShell)
245
245
 
246
246
  ```powershell
247
- $Version = "v13.5.0"
247
+ $Version = "v13.6.0"
248
248
  $Asset = "cdx-audit-windows-amd64.exe"
249
249
  $BaseUrl = "https://github.com/cdxgen/cdxgen/releases/download/$Version"
250
250
 
@@ -269,7 +269,7 @@ steps:
269
269
  env:
270
270
  GH_TOKEN: ${{ github.token }}
271
271
  run: |
272
- gh release download v13.5.0 \
272
+ gh release download v13.6.0 \
273
273
  --repo cdxgen/cdxgen \
274
274
  --pattern 'cdx-audit-linux-amd64' \
275
275
  --pattern 'cdx-audit-linux-amd64.sha256'
@@ -296,7 +296,7 @@ winget install cdxgen
296
296
 
297
297
  You can also use the cdxgen container image with node, deno, or bun runtime versions.
298
298
 
299
- The default version uses Node.js 24
299
+ The default version uses Node.js 26
300
300
 
301
301
  ```bash
302
302
  docker run --rm -e CDXGEN_DEBUG_MODE=debug -v /tmp:/tmp -v $(pwd):/app:rw -t ghcr.io/cdxgen/cdxgen:master -r /app -o /app/bom.json
@@ -337,7 +337,7 @@ npm install -g @cdxgen/cdxgen --ignore-scripts --min-release-age=2
337
337
  **pnpm**:
338
338
 
339
339
  ```shell
340
- pnpm add -g @cdxgen/cdxgen --omit=optional --ignore-scripts --minimum-release-age=2880
340
+ pnpm add -g @cdxgen/cdxgen --ignore-scripts --config.minimum-release-age=2880
341
341
  ```
342
342
 
343
343
  **bun**:
package/bin/cdxgen.js CHANGED
@@ -490,6 +490,10 @@ const args = _yargs
490
490
  description: "Path for the usages slices file created by atom.",
491
491
  hidden: true,
492
492
  })
493
+ .option("callsites-slices-file", {
494
+ description: "Path for the callsites slices file created by atom.",
495
+ hidden: true,
496
+ })
493
497
  .option("data-flow-slices-file", {
494
498
  description: "Path for the data-flow slices file created by atom.",
495
499
  hidden: true,
package/bin/evinse.js CHANGED
@@ -269,6 +269,9 @@ const args = yargs(hideBin(process.argv))
269
269
  description: "Use an existing usages slices file.",
270
270
  default: "usages.slices.json",
271
271
  })
272
+ .option("callsites-slices-file", {
273
+ description: "Use an existing callsites slices file (JS/TS).",
274
+ })
272
275
  .option("scalasem-command", {
273
276
  description:
274
277
  "Use a specific scalasem script for Scala evidence analysis. Defaults to SCALASEM_CMD.",
package/bin/validate.js CHANGED
@@ -19,6 +19,7 @@ import process from "node:process";
19
19
  import yargs from "yargs";
20
20
  import { hideBin } from "yargs/helpers";
21
21
 
22
+ import { installConsoleShim, restoreConsole } from "../lib/core/ui.js";
22
23
  import {
23
24
  dirNameStr,
24
25
  retrieveCdxgenVersion,
@@ -144,6 +145,11 @@ const args = _yargs
144
145
  .help()
145
146
  .wrap(Math.min(120, yargs().terminalWidth())).argv;
146
147
 
148
+ // stdout carries the report and nothing else; messages from the validators
149
+ // go to the diagnostic stream so `-r json` and `-r sarif` stay parseable.
150
+ installConsoleShim();
151
+ process.once("exit", restoreConsole);
152
+
147
153
  /**
148
154
  * Loads the BOM. When signatures are verified, the text must also pass
149
155
  * parseStrictJson(), and `strictError` explains why it did not.
@@ -18,8 +18,6 @@
18
18
  "httpsopensourceorglicenseapache20": "Apache-2.0",
19
19
  "httpwwwapacheorglicenseslicense20html": "Apache-2.0",
20
20
  "zeroclausebsd": "0BSD",
21
- "newbsdlicense": "BSD-3-Clause",
22
- "newbsd": "BSD-3-Clause",
23
21
  "bsd2clause": "BSD-2-Clause",
24
22
  "bsd2clauselicense": "BSD-2-Clause",
25
23
  "thebsd2clauselicense": "BSD-2-Clause",
@@ -30,11 +28,13 @@
30
28
  "thebsd3clauselicense": "BSD-3-Clause",
31
29
  "bsd3clauseneworrevisedlicensebsd3clause": "BSD-3-Clause",
32
30
  "eclipsedistributionlicensenewbsdlicense": "BSD-3-Clause",
31
+ "newbsdlicense": "BSD-3-Clause",
33
32
  "modifiedbsdlicense": "BSD-3-Clause",
34
33
  "revisedbsd": "BSD-3-Clause",
35
34
  "revisedbsdlicense": "BSD-3-Clause",
36
35
  "thenewbsdlicense": "BSD-3-Clause",
37
36
  "3clausebsdlicense": "BSD-3-Clause",
37
+ "newbsd": "BSD-3-Clause",
38
38
  "bsd4clause": "BSD-4-Clause",
39
39
  "bsd4clauselicense": "BSD-4-Clause",
40
40
  "thebsd4clauselicense": "BSD-4-Clause",
@@ -258,6 +258,8 @@
258
258
  "aswfdigitalassetslicenseversion10": "ASWF-Digital-Assets-1.0",
259
259
  "aswfdigitalassets11": "ASWF-Digital-Assets-1.1",
260
260
  "aswfdigitalassetslicense11": "ASWF-Digital-Assets-1.1",
261
+ "atcgame": "atc-game",
262
+ "atcgamelicense": "atc-game",
261
263
  "baekmuk": "Baekmuk",
262
264
  "baekmuklicense": "Baekmuk",
263
265
  "bahyph": "Bahyph",
@@ -309,6 +311,8 @@
309
311
  "bsd2clausepluspatentlicense": "BSD-2-Clause-Patent",
310
312
  "bsd2clausepkgconfdisclaimer": "BSD-2-Clause-pkgconf-disclaimer",
311
313
  "bsd2clausepkgconfdisclaimervariant": "BSD-2-Clause-pkgconf-disclaimer",
314
+ "bsd2clauseposunchanged": "BSD-2-Clause-pos-unchanged",
315
+ "bsd2clausepositionunchangedvariant": "BSD-2-Clause-pos-unchanged",
312
316
  "bsd2clauseviews": "BSD-2-Clause-Views",
313
317
  "bsd2clausewithviewssentence": "BSD-2-Clause-Views",
314
318
  "bsd3clauseneworrevisedlicense": "BSD-3-Clause",
@@ -331,6 +335,8 @@
331
335
  "bsd3clausenonuclearwarranty": "BSD-3-Clause-No-Nuclear-Warranty",
332
336
  "bsd3clauseopenmpi": "BSD-3-Clause-Open-MPI",
333
337
  "bsd3clauseopenmpivariant": "BSD-3-Clause-Open-MPI",
338
+ "bsd3clauseopenwebui": "BSD-3-Clause-OpenWebUI",
339
+ "bsd3clauseopenwebuivariant": "BSD-3-Clause-OpenWebUI",
334
340
  "bsd3clausesun": "BSD-3-Clause-Sun",
335
341
  "bsd3clausesunmicrosystems": "BSD-3-Clause-Sun",
336
342
  "bsd3clausetso": "BSD-3-Clause-Tso",
@@ -345,6 +351,7 @@
345
351
  "bsd43tahoelicense": "BSD-4.3TAHOE",
346
352
  "bsdadvertisingacknowledgement": "BSD-Advertising-Acknowledgement",
347
353
  "bsdadvertisingacknowledgementlicense": "BSD-Advertising-Acknowledgement",
354
+ "bsdasktoendorse": "BSD-ask-to-endorse",
348
355
  "bsdattributionhpnddisclaimer": "BSD-Attribution-HPND-disclaimer",
349
356
  "bsdwithattributionandhpnddisclaimer": "BSD-Attribution-HPND-disclaimer",
350
357
  "bsdinfernonettverk": "BSD-Inferno-Nettverk",
@@ -352,10 +359,14 @@
352
359
  "bsdmarkmodificationslicense": "BSD-Mark-Modifications",
353
360
  "bsdprotection": "BSD-Protection",
354
361
  "bsdprotectionlicense": "BSD-Protection",
362
+ "bsdsourcealtgpl": "BSD-Source-alt-GPL",
363
+ "bsdsourcecodeattributiongplalternative": "BSD-Source-alt-GPL",
355
364
  "bsdsourcebeginningfile": "BSD-Source-beginning-file",
356
365
  "bsdsourcecodeattributionbeginningoffilevariant": "BSD-Source-beginning-file",
357
366
  "bsdsourcecode": "BSD-Source-Code",
358
367
  "bsdsourcecodeattribution": "BSD-Source-Code",
368
+ "bsdsourcecodenodisclaimer": "BSD-Source-Code-no-disclaimer",
369
+ "bsdsourcecodeattributionnodisclaimer": "BSD-Source-Code-no-disclaimer",
359
370
  "bsdsystemics": "BSD-Systemics",
360
371
  "systemicsbsdvariantlicense": "BSD-Systemics",
361
372
  "bsdsystemicsw3works": "BSD-Systemics-W3Works",
@@ -364,6 +375,8 @@
364
375
  "boostsoftwarelicense10": "BSL-1.0",
365
376
  "buddy": "Buddy",
366
377
  "buddylicense": "Buddy",
378
+ "bugroff": "Bugroff",
379
+ "bugrofflicense": "Bugroff",
367
380
  "busl11": "BUSL-1.1",
368
381
  "businesssourcelicense11": "BUSL-1.1",
369
382
  "bzip2105": "bzip2-1.0.6",
@@ -420,6 +433,8 @@
420
433
  "creativecommonsattributionnoncommercial30unported": "CC-BY-NC-3.0",
421
434
  "ccbync30de": "CC-BY-NC-3.0-DE",
422
435
  "creativecommonsattributionnoncommercial30germany": "CC-BY-NC-3.0-DE",
436
+ "ccbync30igo": "CC-BY-NC-3.0-IGO",
437
+ "creativecommonsattributionnoncommercial30igo": "CC-BY-NC-3.0-IGO",
423
438
  "ccbync40": "CC-BY-NC-4.0",
424
439
  "creativecommonsattributionnoncommercial40international": "CC-BY-NC-4.0",
425
440
  "ccbyncnd10": "CC-BY-NC-ND-1.0",
@@ -657,6 +672,8 @@
657
672
  "fuzzybitmaplicense": "FBM",
658
673
  "fdkaac": "FDK-AAC",
659
674
  "fraunhoferfdkaaccodeclibrary": "FDK-AAC",
675
+ "fdkmpegh": "FDK-MPEG-H",
676
+ "fraunhoferfdkmpeghsoftware": "FDK-MPEG-H",
660
677
  "fergusontwofish": "Ferguson-Twofish",
661
678
  "fergusontwofishlicense": "Ferguson-Twofish",
662
679
  "frameworx10": "Frameworx-1.0",
@@ -795,6 +812,8 @@
795
812
  "hidapilicense": "HIDAPI",
796
813
  "hippocratic21": "Hippocratic-2.1",
797
814
  "hippocraticlicense21": "Hippocratic-2.1",
815
+ "hippocratic30core": "Hippocratic-3.0-core",
816
+ "hippocraticlicense30": "Hippocratic-3.0-core",
798
817
  "hp1986": "HP-1986",
799
818
  "hewlettpackard1986license": "HP-1986",
800
819
  "hp1989": "HP-1989",
@@ -873,6 +892,8 @@
873
892
  "imlib2license": "Imlib2",
874
893
  "infozip": "Info-ZIP",
875
894
  "infoziplicense": "Info-ZIP",
895
+ "informatica": "Informatica",
896
+ "informaticalicense": "Informatica",
876
897
  "innernet20": "Inner-Net-2.0",
877
898
  "innernetlicensev20": "Inner-Net-2.0",
878
899
  "innosetup": "InnoSetup",
@@ -1660,6 +1681,7 @@
1660
1681
  "shl21": "SHL-2.1",
1661
1682
  "solderpadhardwarelicensev21": "SHL-2.1",
1662
1683
  "simplelibraryusageexception": "Simple-Library-Usage-exception",
1684
+ "spellingproviderlgplexception": "Spelling-Provider-LGPL-exception",
1663
1685
  "sqlitestudioopensslexception": "sqlitestudio-OpenSSL-exception",
1664
1686
  "stunnelexception": "stunnel-exception",
1665
1687
  "swiexception": "SWI-exception",
@@ -431,6 +431,34 @@
431
431
  },
432
432
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
433
433
  },
434
+ "js.lockfile-unsafe-path": {
435
+ "ecosystem": "npm",
436
+ "kind": "evidence.degraded",
437
+ "impact": "transitive-deps",
438
+ "title": "Secure mode omitted package-lock.json entries whose paths point outside the project",
439
+ "targetTier": "lockfile",
440
+ "actions": [
441
+ {
442
+ "kind": "config",
443
+ "command": "Review the file: and link entries the warning names; remove any you did not add, and regenerate the lockfile with npm install --package-lock-only"
444
+ },
445
+ {
446
+ "kind": "config",
447
+ "command": "For trusted sibling file: or npm link dependencies, rerun outside secure mode on a trusted checkout to keep them"
448
+ },
449
+ {
450
+ "kind": "rerun"
451
+ }
452
+ ],
453
+ "verify": {
454
+ "rules": [],
455
+ "expectTier": "lockfile",
456
+ "eventsCleared": [
457
+ "js.lockfile-unsafe-path"
458
+ ]
459
+ },
460
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
461
+ },
434
462
  "js.pnpm-lock-unparseable": {
435
463
  "ecosystem": "npm",
436
464
  "kind": "evidence.degraded",
@@ -935,6 +963,30 @@
935
963
  },
936
964
  "docs": "https://cyclonedx.github.io/cdxgen/#/EVINSE"
937
965
  },
966
+ "dosai.method-calls-capped": {
967
+ "ecosystem": "csharp",
968
+ "kind": "evidence.degraded",
969
+ "impact": "components",
970
+ "title": "The dosai report holds more distinct method calls than cdxgen keeps, so some occurrence evidence was dropped",
971
+ "targetTier": "resolved",
972
+ "actions": [
973
+ {
974
+ "kind": "config",
975
+ "detail": "Raise the cap with CDXGEN_DOSAI_MAX_METHOD_CALLS, or write the report with dosai's --sections so it holds less."
976
+ },
977
+ {
978
+ "kind": "rerun"
979
+ }
980
+ ],
981
+ "verify": {
982
+ "rules": [],
983
+ "expectTier": "resolved",
984
+ "eventsCleared": [
985
+ "dosai.method-calls-capped"
986
+ ]
987
+ },
988
+ "docs": "https://cyclonedx.github.io/cdxgen/#/EVINSE"
989
+ },
938
990
  "cocoa.pods.missing": {
939
991
  "ecosystem": "cocoa",
940
992
  "kind": "fallback.engaged",
@@ -1282,6 +1334,54 @@
1282
1334
  },
1283
1335
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=php"
1284
1336
  },
1337
+ "ruby.host-probe.package-db-unreadable": {
1338
+ "ecosystem": "ruby",
1339
+ "kind": "evidence.degraded",
1340
+ "impact": "components",
1341
+ "title": "A package database could not be read in full, so the Ruby no package owns on this host was not identified",
1342
+ "targetTier": null,
1343
+ "actions": [
1344
+ {
1345
+ "kind": "config",
1346
+ "command": "Run cdxgen as a user that can read the package databases (for example with sudo), so Ruby files can be matched to the packages that own them"
1347
+ },
1348
+ {
1349
+ "kind": "rerun"
1350
+ }
1351
+ ],
1352
+ "verify": {
1353
+ "rules": [],
1354
+ "expectTier": null,
1355
+ "eventsCleared": [
1356
+ "ruby.host-probe.package-db-unreadable"
1357
+ ]
1358
+ },
1359
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=ruby"
1360
+ },
1361
+ "npm.host-probe.package-db-unreadable": {
1362
+ "ecosystem": "npm",
1363
+ "kind": "evidence.degraded",
1364
+ "impact": "components",
1365
+ "title": "A package database could not be read in full, so the Node.js no package owns on this host was not identified",
1366
+ "targetTier": null,
1367
+ "actions": [
1368
+ {
1369
+ "kind": "config",
1370
+ "command": "Run cdxgen as a user that can read the package databases (for example with sudo), so node binaries can be matched to the packages that own them"
1371
+ },
1372
+ {
1373
+ "kind": "rerun"
1374
+ }
1375
+ ],
1376
+ "verify": {
1377
+ "rules": [],
1378
+ "expectTier": null,
1379
+ "eventsCleared": [
1380
+ "npm.host-probe.package-db-unreadable"
1381
+ ]
1382
+ },
1383
+ "docs": "https://cyclonedx.github.io/cdxgen/#/OBOM_LESSONS"
1384
+ },
1285
1385
  "php.composer.platform-unattributed": {
1286
1386
  "ecosystem": "php",
1287
1387
  "kind": "evidence.degraded",
@@ -1401,6 +1501,30 @@
1401
1501
  },
1402
1502
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
1403
1503
  },
1504
+ "binary.brotli-probe.capped": {
1505
+ "ecosystem": "generic",
1506
+ "kind": "evidence.degraded",
1507
+ "impact": "components",
1508
+ "title": "The Brotli decoder probe reached its file or byte cap, so some native files were not read for an embedded decoder",
1509
+ "targetTier": null,
1510
+ "actions": [
1511
+ {
1512
+ "kind": "config",
1513
+ "command": "Scan the image or root filesystem in smaller parts (for example one application directory at a time with -t rootfs), so every native file is read for an embedded Brotli decoder"
1514
+ },
1515
+ {
1516
+ "kind": "rerun"
1517
+ }
1518
+ ],
1519
+ "verify": {
1520
+ "rules": [],
1521
+ "expectTier": null,
1522
+ "eventsCleared": [
1523
+ "binary.brotli-probe.capped"
1524
+ ]
1525
+ },
1526
+ "docs": "https://cyclonedx.github.io/cdxgen/#/BOM_AUDIT?id=brotli-security"
1527
+ },
1404
1528
  "os.apk-installed-db.unreadable": {
1405
1529
  "ecosystem": "generic",
1406
1530
  "kind": "evidence.degraded",
@@ -330,7 +330,7 @@
330
330
  components[
331
331
  type = 'machine-learning-model'
332
332
  and $prop($, 'cdx:ai:artifactFormat') = 'onnx'
333
- and not $hasProp($, 'cdx:onnx:producer')
333
+ and $not($hasProp($, 'cdx:onnx:producer'))
334
334
  ]
335
335
  location: |
336
336
  {
@@ -0,0 +1,107 @@
1
+ # Embedded Brotli decoder rules
2
+ # Category: brotli-security
3
+ # Evaluates the cdx:brotli:* properties recorded for native files (container,
4
+ # rootfs and OS scans) and vendored source trees (C/C++ source scans).
5
+ # CVE-2026-111497 is an out-of-bounds write in Google's Brotli decoder
6
+ # (CWE-252, CWE-787) reachable from any Brotli stream an attacker controls:
7
+ # an HTTP response a client decodes, a request body a server inflates, a
8
+ # compressed file. Fixed in google/brotli 1.0.10, 1.1.1 and 1.2.1 (commit
9
+ # 0ed4268). The Go port, andybalholm/brotli, had the same logic error but
10
+ # only crashes; it is fixed in v1.2.7.
11
+ # https://github.com/google/brotli/commit/0ed4268a4401abcb4472096340477cf4af7d1a2b
12
+ #
13
+ # The fix is read from the decoder itself (its BLOCK_SWITCH error name), not
14
+ # from a version number, so a distro backport that keeps the old version is
15
+ # recognised as fixed and a Node.js that still reports brotli 1.2.0 after the
16
+ # fix is not flagged.
17
+
18
+ - id: BROTLI-RCE-001
19
+ name: "Native file embeds a Brotli decoder affected by CVE-2026-111497"
20
+ description: "A binary, shared library or extension module carries its own copy of Google's C Brotli decoder without the fix for CVE-2026-111497. Updating the system libbrotli does not fix a private copy: the file itself has to be replaced by a release built from a fixed decoder."
21
+ severity: high
22
+ category: brotli-security
23
+ dry-run-support: full
24
+ condition: |
25
+ components[
26
+ $hasProp($, 'cdx:brotli:c:blockSwitchFix', 'false')
27
+ and $not($hasProp($, 'cdx:vendored', 'true'))
28
+ ]
29
+ location: |
30
+ {
31
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
32
+ }
33
+ message: "'{{ name }}' embeds a Brotli decoder without the CVE-2026-111497 fix; a crafted Brotli stream can write past a decoder buffer (possible code execution). {{ $hasProp($, 'cdx:node:buildVersion') ? 'Upgrade Node.js ' & $prop($, 'cdx:node:buildVersion') & ' to 22.23.4, 24.22.1, 26.12.1 or later.' : 'Replace it with a build that bundles brotli 1.0.10, 1.1.1 or 1.2.1 (or google/brotli commit 0ed4268).' }}"
34
+ mitigation: "Node.js: 22.23.4, 24.22.1, 26.12.1. Python: Brotli 1.2.1, brotlicffi 1.2.1.0. Ruby: brotli gem 0.9.2. Java: Brotli4j 1.24.0. Other software: a release that bundles brotli 1.0.10, 1.1.1 or 1.2.1, or a rebuild with google/brotli commit 0ed4268. Until then, reject Content-Encoding: br request bodies at the proxy and keep untrusted Brotli data away from the affected process."
35
+ evidence: |
36
+ {
37
+ "srcFile": $prop($, 'internal:SrcFile'),
38
+ "evidence": $prop($, 'cdx:brotli:c:evidence'),
39
+ "nodeVersion": $prop($, 'cdx:node:buildVersion')
40
+ }
41
+
42
+ - id: BROTLI-RCE-002
43
+ name: "Vendored Brotli source affected by CVE-2026-111497"
44
+ description: "The project carries a copy of Google's Brotli sources whose decoder lacks the fix for CVE-2026-111497. Everything built from this tree inherits the bug, and no package manager or distro update will reach it."
45
+ severity: high
46
+ category: brotli-security
47
+ dry-run-support: full
48
+ condition: |
49
+ components[
50
+ $hasProp($, 'cdx:vendored', 'true')
51
+ and $hasProp($, 'cdx:brotli:c:blockSwitchFix', 'false')
52
+ ]
53
+ location: |
54
+ {
55
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
56
+ }
57
+ message: "Vendored Brotli {{ version }} at '{{ $prop($, 'cdx:vendored:path') }}' lacks the CVE-2026-111497 fix; update it to 1.0.10, 1.1.1 or 1.2.1, or cherry-pick google/brotli commit 0ed4268."
58
+ mitigation: "Update the vendored copy to brotli 1.0.10, 1.1.1 or 1.2.1, or cherry-pick google/brotli commit 0ed4268 (with 50a9b70, b418fa8 and da98063), then rebuild everything that links it."
59
+ evidence: |
60
+ {
61
+ "path": $prop($, 'cdx:vendored:path'),
62
+ "version": version,
63
+ "versionSource": $prop($, 'cdx:vendored:versionSource')
64
+ }
65
+
66
+ - id: BROTLI-DOS-001
67
+ name: "Go binary embeds a Brotli port affected by the CVE-2026-111497 logic error"
68
+ description: "The Go port of the Brotli decoder (github.com/andybalholm/brotli) before v1.2.7 has the same unchecked block-switch error as the C decoder. Go's bounds checks turn it into a panic rather than a memory write, so a crafted stream crashes the process."
69
+ severity: medium
70
+ category: brotli-security
71
+ dry-run-support: full
72
+ condition: |
73
+ components[
74
+ $hasProp($, 'cdx:brotli:go:blockSwitchFix', 'false')
75
+ ]
76
+ location: |
77
+ {
78
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
79
+ }
80
+ message: "'{{ name }}' embeds github.com/andybalholm/brotli older than v1.2.7; a crafted Brotli stream makes it panic. Rebuild with v1.2.7 or later."
81
+ mitigation: "Update github.com/andybalholm/brotli to v1.2.7 or later and rebuild the binary."
82
+ evidence: |
83
+ {
84
+ "srcFile": $prop($, 'internal:SrcFile')
85
+ }
86
+
87
+ - id: BROTLI-RCE-003
88
+ name: "Native file embeds a Brotli decoder whose CVE-2026-111497 fix state cannot be read"
89
+ description: "A binary, shared library or extension module carries Google's C Brotli decoder, recognised by its decoding tables, but the linker dropped the error-name table that shows whether the fix is in (--gc-sections, LTO and -dead_strip do this when nothing calls BrotliDecoderErrorString). Whether the copy is vulnerable has to be settled from the release that built the file."
90
+ severity: low
91
+ category: brotli-security
92
+ dry-run-support: full
93
+ condition: |
94
+ components[
95
+ $hasProp($, 'cdx:brotli:c:blockSwitchFix', 'unknown')
96
+ ]
97
+ location: |
98
+ {
99
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
100
+ }
101
+ message: "'{{ name }}' embeds a Brotli decoder whose CVE-2026-111497 fix state cannot be read from the file; check that it was built from brotli 1.0.10, 1.1.1, 1.2.1 or later, or with google/brotli commit 0ed4268."
102
+ mitigation: "Find the release the file belongs to and confirm it bundles a fixed decoder (brotli 1.0.10, 1.1.1, 1.2.1, or commit 0ed4268); replace it otherwise."
103
+ evidence: |
104
+ {
105
+ "srcFile": $prop($, 'internal:SrcFile'),
106
+ "evidence": $prop($, 'cdx:brotli:c:evidence')
107
+ }
@@ -235,3 +235,78 @@
235
235
  "main": $prop($, 'cdx:vscode-extension:main'),
236
236
  "contributes": $prop($, 'cdx:vscode-extension:contributes')
237
237
  }
238
+
239
+ - id: VSC-010
240
+ name: "Extension folder the editor never registered"
241
+ description: "An extension folder that is on disk but missing from the editor's extensions.json was copied in by hand rather than installed by the editor, so no marketplace or signature check applied to it"
242
+ severity: high
243
+ category: vscode-extension
244
+ dry-run-support: full
245
+ condition: |
246
+ components[
247
+ $startsWith(purl, 'pkg:vscode-extension/')
248
+ and $prop($, 'cdx:vscode-extension:registered') = 'false'
249
+ ]
250
+ location: |
251
+ {
252
+ "bomRef": $. "bom-ref",
253
+ "purl": purl,
254
+ "srcFile": $prop($, 'internal:SrcFile')
255
+ }
256
+ message: "VS Code extension '{{ publisher }}.{{ name }}@{{ version }}' is in the extensions folder of {{ $prop($, 'cdx:vscode-extension:ide') }} but not in its registry"
257
+ mitigation: "Find out who placed the folder; remove it and reinstall the extension from the marketplace if it is wanted"
258
+ evidence: |
259
+ {
260
+ "ide": $prop($, 'cdx:vscode-extension:ide'),
261
+ "activationEvents": $prop($, 'cdx:vscode-extension:activationEvents'),
262
+ "main": $prop($, 'cdx:vscode-extension:main')
263
+ }
264
+
265
+ - id: VSC-011
266
+ name: "Extension installed from a .vsix file"
267
+ description: "An extension installed from a local .vsix file bypassed the marketplace, so its publisher, signature and version history were not checked at install time"
268
+ severity: medium
269
+ category: vscode-extension
270
+ dry-run-support: full
271
+ condition: |
272
+ components[
273
+ $startsWith(purl, 'pkg:vscode-extension/')
274
+ and $listContains($propList($, 'cdx:vscode-extension:installSource'), 'vsix')
275
+ ]
276
+ location: |
277
+ {
278
+ "bomRef": $. "bom-ref",
279
+ "purl": purl,
280
+ "srcFile": $prop($, 'internal:SrcFile')
281
+ }
282
+ message: "VS Code extension '{{ publisher }}.{{ name }}@{{ version }}' was installed from a .vsix file in {{ $prop($, 'cdx:vscode-extension:ide') }}"
283
+ mitigation: "Confirm where the .vsix came from and compare the entry-file hash with the marketplace build of the same version"
284
+ evidence: |
285
+ {
286
+ "ide": $prop($, 'cdx:vscode-extension:ide'),
287
+ "installedAt": $prop($, 'cdx:vscode-extension:installedAt')
288
+ }
289
+
290
+ - id: VSC-012
291
+ name: "Two copies of one extension build run different code"
292
+ description: "The same publisher, name, version and platform is installed in more than one place, but the entry files differ, so at least one copy was changed after it was installed"
293
+ severity: high
294
+ category: vscode-extension
295
+ dry-run-support: full
296
+ condition: |
297
+ components[
298
+ $startsWith(purl, 'pkg:vscode-extension/')
299
+ and $prop($, 'cdx:vscode-extension:entryHashMismatch') = 'true'
300
+ ]
301
+ location: |
302
+ {
303
+ "bomRef": $. "bom-ref",
304
+ "purl": purl
305
+ }
306
+ message: "VS Code extension '{{ publisher }}.{{ name }}@{{ version }}' has different entry-file bytes in {{ $prop($, 'cdx:vscode-extension:ide') }}"
307
+ mitigation: "Compare each copy's entry-file SHA-256 with the marketplace build of the same version, remove the copy that differs and reinstall it from the marketplace"
308
+ evidence: |
309
+ {
310
+ "ide": $prop($, 'cdx:vscode-extension:ide'),
311
+ "entryFiles": components.{ "name": name, "sha256": hashes[0].content }
312
+ }