@cyclonedx/cdxgen 12.3.3 → 12.4.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 (175) hide show
  1. package/README.md +69 -25
  2. package/bin/audit.js +21 -7
  3. package/bin/cdxgen.js +270 -127
  4. package/bin/convert.js +34 -15
  5. package/bin/hbom.js +495 -0
  6. package/bin/repl.js +592 -37
  7. package/bin/validate.js +31 -4
  8. package/bin/verify.js +18 -5
  9. package/data/README.md +298 -25
  10. package/data/component-tags.json +6 -0
  11. package/data/crypto-oid.json +16 -0
  12. package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
  13. package/data/predictive-audit-allowlist.json +11 -0
  14. package/data/queries-darwin.json +12 -1
  15. package/data/queries-win.json +7 -1
  16. package/data/queries.json +39 -2
  17. package/data/rules/ai-agent-governance.yaml +16 -0
  18. package/data/rules/asar-archives.yaml +150 -0
  19. package/data/rules/chrome-extensions.yaml +8 -0
  20. package/data/rules/ci-permissions.yaml +42 -18
  21. package/data/rules/container-risk.yaml +14 -7
  22. package/data/rules/dependency-sources.yaml +11 -0
  23. package/data/rules/hbom-compliance.yaml +325 -0
  24. package/data/rules/hbom-performance.yaml +307 -0
  25. package/data/rules/hbom-security.yaml +248 -0
  26. package/data/rules/host-topology.yaml +165 -0
  27. package/data/rules/mcp-servers.yaml +18 -3
  28. package/data/rules/obom-runtime.yaml +907 -22
  29. package/data/rules/package-integrity.yaml +14 -0
  30. package/data/rules/rootfs-hardening.yaml +179 -0
  31. package/data/rules/vscode-extensions.yaml +9 -0
  32. package/lib/audit/index.js +210 -8
  33. package/lib/audit/index.poku.js +332 -0
  34. package/lib/audit/reporters.js +222 -0
  35. package/lib/audit/targets.js +146 -1
  36. package/lib/audit/targets.poku.js +186 -0
  37. package/lib/cli/asar.poku.js +328 -0
  38. package/lib/cli/index.js +527 -99
  39. package/lib/cli/index.poku.js +1469 -212
  40. package/lib/evinser/evinser.js +14 -9
  41. package/lib/helpers/analyzer.js +1406 -29
  42. package/lib/helpers/analyzer.poku.js +342 -0
  43. package/lib/helpers/analyzerScope.js +712 -0
  44. package/lib/helpers/asarutils.js +1556 -0
  45. package/lib/helpers/asarutils.poku.js +443 -0
  46. package/lib/helpers/auditCategories.js +12 -0
  47. package/lib/helpers/auditCategories.poku.js +32 -0
  48. package/lib/helpers/bomUtils.js +155 -1
  49. package/lib/helpers/bomUtils.poku.js +79 -1
  50. package/lib/helpers/cbomutils.js +271 -1
  51. package/lib/helpers/cbomutils.poku.js +248 -5
  52. package/lib/helpers/display.js +291 -1
  53. package/lib/helpers/display.poku.js +149 -0
  54. package/lib/helpers/evidenceUtils.js +58 -0
  55. package/lib/helpers/evidenceUtils.poku.js +54 -0
  56. package/lib/helpers/exportUtils.js +9 -0
  57. package/lib/helpers/gtfobins.js +142 -8
  58. package/lib/helpers/gtfobins.poku.js +24 -1
  59. package/lib/helpers/hbom.js +710 -0
  60. package/lib/helpers/hbom.poku.js +496 -0
  61. package/lib/helpers/hbomAnalysis.js +268 -0
  62. package/lib/helpers/hbomAnalysis.poku.js +249 -0
  63. package/lib/helpers/hbomLoader.js +35 -0
  64. package/lib/helpers/hostTopology.js +803 -0
  65. package/lib/helpers/hostTopology.poku.js +363 -0
  66. package/lib/helpers/inventoryStats.js +69 -0
  67. package/lib/helpers/inventoryStats.poku.js +86 -0
  68. package/lib/helpers/lolbas.js +19 -1
  69. package/lib/helpers/lolbas.poku.js +23 -0
  70. package/lib/helpers/osqueryTransform.js +47 -0
  71. package/lib/helpers/osqueryTransform.poku.js +47 -0
  72. package/lib/helpers/plugins.js +350 -0
  73. package/lib/helpers/plugins.poku.js +57 -0
  74. package/lib/helpers/protobom.js +209 -45
  75. package/lib/helpers/protobom.poku.js +183 -5
  76. package/lib/helpers/protobomLoader.js +43 -0
  77. package/lib/helpers/protobomLoader.poku.js +31 -0
  78. package/lib/helpers/remote/dependency-track.js +36 -3
  79. package/lib/helpers/remote/dependency-track.poku.js +44 -0
  80. package/lib/helpers/source.js +24 -0
  81. package/lib/helpers/source.poku.js +32 -0
  82. package/lib/helpers/utils.js +1438 -93
  83. package/lib/helpers/utils.poku.js +846 -4
  84. package/lib/managers/binary.e2e.poku.js +367 -0
  85. package/lib/managers/binary.js +2293 -353
  86. package/lib/managers/binary.poku.js +1699 -1
  87. package/lib/managers/docker.js +201 -79
  88. package/lib/managers/docker.poku.js +337 -12
  89. package/lib/server/server.js +4 -28
  90. package/lib/stages/postgen/annotator.js +38 -0
  91. package/lib/stages/postgen/annotator.poku.js +107 -1
  92. package/lib/stages/postgen/auditBom.js +121 -18
  93. package/lib/stages/postgen/auditBom.poku.js +1366 -31
  94. package/lib/stages/postgen/hostTopologyAudit.poku.js +186 -0
  95. package/lib/stages/postgen/postgen.js +406 -8
  96. package/lib/stages/postgen/postgen.poku.js +484 -0
  97. package/lib/stages/postgen/ruleEngine.js +116 -0
  98. package/lib/stages/pregen/envAudit.js +14 -3
  99. package/lib/validator/bomValidator.js +90 -38
  100. package/lib/validator/bomValidator.poku.js +90 -0
  101. package/lib/validator/complianceRules.js +4 -2
  102. package/lib/validator/index.poku.js +14 -0
  103. package/package.json +23 -21
  104. package/types/bin/hbom.d.ts +3 -0
  105. package/types/bin/hbom.d.ts.map +1 -0
  106. package/types/bin/repl.d.ts +1 -1
  107. package/types/bin/repl.d.ts.map +1 -1
  108. package/types/lib/audit/index.d.ts +44 -0
  109. package/types/lib/audit/index.d.ts.map +1 -1
  110. package/types/lib/audit/reporters.d.ts +16 -0
  111. package/types/lib/audit/reporters.d.ts.map +1 -1
  112. package/types/lib/audit/targets.d.ts.map +1 -1
  113. package/types/lib/cli/index.d.ts +16 -0
  114. package/types/lib/cli/index.d.ts.map +1 -1
  115. package/types/lib/evinser/evinser.d.ts +4 -0
  116. package/types/lib/evinser/evinser.d.ts.map +1 -1
  117. package/types/lib/helpers/analyzer.d.ts +33 -0
  118. package/types/lib/helpers/analyzer.d.ts.map +1 -1
  119. package/types/lib/helpers/analyzerScope.d.ts +11 -0
  120. package/types/lib/helpers/analyzerScope.d.ts.map +1 -0
  121. package/types/lib/helpers/asarutils.d.ts +34 -0
  122. package/types/lib/helpers/asarutils.d.ts.map +1 -0
  123. package/types/lib/helpers/auditCategories.d.ts +5 -0
  124. package/types/lib/helpers/auditCategories.d.ts.map +1 -1
  125. package/types/lib/helpers/bomUtils.d.ts +10 -0
  126. package/types/lib/helpers/bomUtils.d.ts.map +1 -1
  127. package/types/lib/helpers/cbomutils.d.ts +3 -2
  128. package/types/lib/helpers/cbomutils.d.ts.map +1 -1
  129. package/types/lib/helpers/display.d.ts.map +1 -1
  130. package/types/lib/helpers/evidenceUtils.d.ts +8 -0
  131. package/types/lib/helpers/evidenceUtils.d.ts.map +1 -0
  132. package/types/lib/helpers/exportUtils.d.ts.map +1 -1
  133. package/types/lib/helpers/gtfobins.d.ts +8 -0
  134. package/types/lib/helpers/gtfobins.d.ts.map +1 -1
  135. package/types/lib/helpers/hbom.d.ts +49 -0
  136. package/types/lib/helpers/hbom.d.ts.map +1 -0
  137. package/types/lib/helpers/hbomAnalysis.d.ts +76 -0
  138. package/types/lib/helpers/hbomAnalysis.d.ts.map +1 -0
  139. package/types/lib/helpers/hbomLoader.d.ts +7 -0
  140. package/types/lib/helpers/hbomLoader.d.ts.map +1 -0
  141. package/types/lib/helpers/hostTopology.d.ts +12 -0
  142. package/types/lib/helpers/hostTopology.d.ts.map +1 -0
  143. package/types/lib/helpers/inventoryStats.d.ts +11 -0
  144. package/types/lib/helpers/inventoryStats.d.ts.map +1 -0
  145. package/types/lib/helpers/lolbas.d.ts.map +1 -1
  146. package/types/lib/helpers/osqueryTransform.d.ts +3 -0
  147. package/types/lib/helpers/osqueryTransform.d.ts.map +1 -1
  148. package/types/lib/helpers/plugins.d.ts +58 -0
  149. package/types/lib/helpers/plugins.d.ts.map +1 -0
  150. package/types/lib/helpers/protobom.d.ts +5 -4
  151. package/types/lib/helpers/protobom.d.ts.map +1 -1
  152. package/types/lib/helpers/protobomLoader.d.ts +17 -0
  153. package/types/lib/helpers/protobomLoader.d.ts.map +1 -0
  154. package/types/lib/helpers/remote/dependency-track.d.ts +10 -3
  155. package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -1
  156. package/types/lib/helpers/source.d.ts.map +1 -1
  157. package/types/lib/helpers/utils.d.ts +45 -8
  158. package/types/lib/helpers/utils.d.ts.map +1 -1
  159. package/types/lib/managers/binary.d.ts +5 -0
  160. package/types/lib/managers/binary.d.ts.map +1 -1
  161. package/types/lib/managers/docker.d.ts.map +1 -1
  162. package/types/lib/server/server.d.ts +2 -1
  163. package/types/lib/server/server.d.ts.map +1 -1
  164. package/types/lib/stages/postgen/annotator.d.ts.map +1 -1
  165. package/types/lib/stages/postgen/auditBom.d.ts +26 -1
  166. package/types/lib/stages/postgen/auditBom.d.ts.map +1 -1
  167. package/types/lib/stages/postgen/postgen.d.ts +2 -1
  168. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  169. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  170. package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
  171. package/types/lib/third-party/arborist/lib/node.d.ts +23 -0
  172. package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -1
  173. package/types/lib/validator/bomValidator.d.ts.map +1 -1
  174. package/types/lib/validator/complianceRules.d.ts.map +1 -1
  175. package/data/spdx-model-v3.0.1.jsonld +0 -15999
@@ -10,6 +10,7 @@ import {
10
10
  expandBomAuditCategories,
11
11
  validateBomAuditCategories,
12
12
  } from "../../helpers/auditCategories.js";
13
+ import { isHbomLikeBom as isHbomLikeBomDocument } from "../../helpers/hbomAnalysis.js";
13
14
  import { table } from "../../helpers/table.js";
14
15
  import {
15
16
  DEBUG_MODE,
@@ -21,17 +22,7 @@ import { evaluateRules, loadRules } from "./ruleEngine.js";
21
22
  const __dirname = fileURLToPath(new URL(".", import.meta.url));
22
23
  const BUILTIN_RULES_DIR = join(__dirname, "..", "..", "..", "data", "rules");
23
24
 
24
- /**
25
- * Audit BOM formulation section using JSONata-powered rule engine
26
- * @param {Object} bomJson - Generated CycloneDX BOM
27
- * @param {Object} options - CLI options
28
- * @returns {Promise<Array>} Array of audit findings
29
- */
30
- export async function auditBom(bomJson, options) {
31
- if (!bomJson) {
32
- return [];
33
- }
34
- const findings = [];
25
+ async function loadConfiguredBomAuditRules(options = {}) {
35
26
  const rules = await loadRules(BUILTIN_RULES_DIR);
36
27
  if (options.bomAuditRulesDir && safeExistsSync(options.bomAuditRulesDir)) {
37
28
  const userRulesDir = resolve(options.bomAuditRulesDir);
@@ -41,11 +32,11 @@ export async function auditBom(bomJson, options) {
41
32
  }
42
33
  rules.push(...userRules);
43
34
  }
44
- if (rules.length === 0) {
45
- if (DEBUG_MODE) {
46
- console.log("No audit rules loaded; formulation audit skipped");
47
- }
48
- return findings;
35
+ if (!rules.length) {
36
+ return {
37
+ activeRules: [],
38
+ rules,
39
+ };
49
40
  }
50
41
  let activeRules = rules;
51
42
  if (options.bomAuditCategories) {
@@ -64,6 +55,107 @@ export async function auditBom(bomJson, options) {
64
55
  }
65
56
  }
66
57
  }
58
+ return {
59
+ activeRules,
60
+ rules,
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Detect whether a BOM looks like an HBOM inventory.
66
+ *
67
+ * @param {object} bomJson CycloneDX BOM
68
+ * @returns {boolean} True when the BOM appears to represent hardware inventory
69
+ */
70
+ export function isHbomLikeBom(bomJson) {
71
+ return isHbomLikeBomDocument(bomJson);
72
+ }
73
+
74
+ /**
75
+ * Detect whether a BOM looks like an OBOM/runtime inventory.
76
+ *
77
+ * @param {object} bomJson CycloneDX BOM
78
+ * @returns {boolean} True when the BOM appears to represent operations/runtime data
79
+ */
80
+ export function isObomLikeBom(bomJson) {
81
+ if (!bomJson) {
82
+ return false;
83
+ }
84
+ if (isHbomLikeBom(bomJson)) {
85
+ return false;
86
+ }
87
+ if (
88
+ bomJson?.metadata?.component?.type === "operating-system" ||
89
+ bomJson?.metadata?.component?.type === "device"
90
+ ) {
91
+ return true;
92
+ }
93
+ if (
94
+ Array.isArray(bomJson?.metadata?.lifecycles) &&
95
+ bomJson.metadata.lifecycles.some(
96
+ (lifecycle) => lifecycle?.phase === "operations",
97
+ )
98
+ ) {
99
+ return true;
100
+ }
101
+ return (bomJson?.components || []).some((component) =>
102
+ (component?.properties || []).some(
103
+ (property) => property?.name === "cdx:osquery:category",
104
+ ),
105
+ );
106
+ }
107
+
108
+ function summarizeDryRunSupport(activeRules = []) {
109
+ const summary = {
110
+ fullCount: 0,
111
+ noCount: 0,
112
+ partialCount: 0,
113
+ totalRules: activeRules.length,
114
+ };
115
+ for (const rule of activeRules) {
116
+ if (rule?.dryRunSupport === "no") {
117
+ summary.noCount += 1;
118
+ continue;
119
+ }
120
+ if (rule?.dryRunSupport === "full") {
121
+ summary.fullCount += 1;
122
+ continue;
123
+ }
124
+ summary.partialCount += 1;
125
+ }
126
+ return summary;
127
+ }
128
+
129
+ export async function getBomAuditDryRunSupportSummary(options = {}) {
130
+ const { activeRules } = await loadConfiguredBomAuditRules(options);
131
+ return summarizeDryRunSupport(activeRules);
132
+ }
133
+
134
+ export function formatDryRunSupportSummary(summary) {
135
+ if (!summary) {
136
+ return "";
137
+ }
138
+ return `BOM audit dry-run summary: ${summary.noCount} rule(s) do not support dry-run, ${summary.partialCount} rule(s) have partial dry-run support, ${summary.totalRules} active rule(s) total.`;
139
+ }
140
+
141
+ /**
142
+ * Audit BOM formulation section using JSONata-powered rule engine
143
+ * @param {Object} bomJson - Generated CycloneDX BOM
144
+ * @param {Object} options - CLI options
145
+ * @returns {Promise<Array>} Array of audit findings
146
+ */
147
+ export async function auditBom(bomJson, options) {
148
+ if (!bomJson) {
149
+ return [];
150
+ }
151
+ const findings = [];
152
+ const { activeRules, rules } = await loadConfiguredBomAuditRules(options);
153
+ if (rules.length === 0) {
154
+ if (DEBUG_MODE) {
155
+ console.log("No audit rules loaded; formulation audit skipped");
156
+ }
157
+ return findings;
158
+ }
67
159
  const allFindings = await evaluateRules(activeRules, bomJson);
68
160
  if (options.bomAuditMinSeverity) {
69
161
  const minSeverity = options.bomAuditMinSeverity.toLowerCase();
@@ -87,7 +179,7 @@ export async function auditBom(bomJson, options) {
87
179
  /**
88
180
  * Format findings for console output with color-coded severity
89
181
  */
90
- export function formatConsoleOutput(findings) {
182
+ export function renderBomAuditConsoleReport(findings) {
91
183
  if (!findings?.length) {
92
184
  return "";
93
185
  }
@@ -119,7 +211,18 @@ export function formatConsoleOutput(findings) {
119
211
  line.push(f.location?.file || "");
120
212
  data.push(line);
121
213
  }
122
- console.log(table(data, config));
214
+ return table(data, config);
215
+ }
216
+
217
+ /**
218
+ * Format findings for console output with color-coded severity
219
+ */
220
+ export function formatConsoleOutput(findings) {
221
+ const output = renderBomAuditConsoleReport(findings);
222
+ if (output) {
223
+ console.log(output);
224
+ }
225
+ return output;
123
226
  }
124
227
 
125
228
  /**