@cdxgen/cdxgen 13.4.0 → 13.5.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 (208) hide show
  1. package/README.md +7 -7
  2. package/bin/cdxgen-secure.js +15 -0
  3. package/bin/cdxgen.js +25 -5
  4. package/bin/evinse.js +5 -0
  5. package/bin/hbom.js +15 -7
  6. package/bin/repl.js +29 -0
  7. package/data/cbomosdb-queries.json +13 -1
  8. package/data/component-tags.json +8 -0
  9. package/data/queries-darwin.json +25 -1
  10. package/data/queries-win.json +19 -1
  11. package/data/queries.json +41 -0
  12. package/data/remediations.json +283 -1
  13. package/data/rules/cbom-security.yaml +235 -4
  14. package/data/rules/go-binaries.yaml +46 -0
  15. package/data/rules/golem-go.yaml +80 -0
  16. package/data/rules/hbom-compliance.yaml +40 -22
  17. package/data/rules/hbom-performance.yaml +7 -1
  18. package/data/rules/host-topology.yaml +1 -1
  19. package/data/rules/obom-runtime.yaml +31 -2
  20. package/data/rules/php-runtime.yaml +143 -0
  21. package/lib/audit/index.js +14 -0
  22. package/lib/cli/bomAssembly.js +28 -3
  23. package/lib/cli/cliOptions.js +110 -3
  24. package/lib/cli/index.js +73 -4
  25. package/lib/cli/jvmBom.js +126 -20
  26. package/lib/cli/managedBom.js +711 -71
  27. package/lib/cli/nativeBom.js +225 -28
  28. package/lib/core/env.js +30 -8
  29. package/lib/core/fs.js +28 -19
  30. package/lib/core/httpClient.js +74 -45
  31. package/lib/core/projectConfig.js +1 -0
  32. package/lib/core/projectTooling.js +97 -0
  33. package/lib/core/propertySanitizer.js +72 -0
  34. package/lib/ecosystems/golem.js +550 -6
  35. package/lib/ecosystems/gradleutils.js +30 -20
  36. package/lib/ecosystems/parsers-dotnet.js +117 -18
  37. package/lib/ecosystems/parsers-go.js +1090 -367
  38. package/lib/ecosystems/parsers-jvm.js +259 -17
  39. package/lib/ecosystems/parsers-misc.js +229 -44
  40. package/lib/ecosystems/parsers-python.js +11 -10
  41. package/lib/ecosystems/rubyutils.js +6 -3
  42. package/lib/ecosystems/rusi.js +10 -0
  43. package/lib/ecosystems/scalacliutils.js +2 -1
  44. package/lib/ecosystems/scalasem.js +3 -1
  45. package/lib/evinser/evinser.js +126 -18
  46. package/lib/evinser/swiftsem.js +68 -5
  47. package/lib/inventory/agentSkillSpec.js +17 -0
  48. package/lib/inventory/apkInstalledDb.js +243 -0
  49. package/lib/inventory/atomUtils.js +33 -0
  50. package/lib/inventory/auditCategories.js +3 -3
  51. package/lib/inventory/cacheDir.js +52 -9
  52. package/lib/inventory/certificates.js +2371 -0
  53. package/lib/inventory/communityAiConfigParser.js +4 -9
  54. package/lib/inventory/deps.js +6 -4
  55. package/lib/inventory/display.js +200 -3
  56. package/lib/inventory/dosai.js +500 -58
  57. package/lib/inventory/dynamic.js +45 -3
  58. package/lib/inventory/envcontext.js +168 -5
  59. package/lib/inventory/evidenceUtils.js +436 -23
  60. package/lib/inventory/formulationParsers.js +3 -2
  61. package/lib/inventory/goBuildInfo.js +140 -0
  62. package/lib/inventory/hbom.js +67 -7
  63. package/lib/inventory/hbomAnalysis.js +16 -0
  64. package/lib/inventory/hostTopology.js +21 -0
  65. package/lib/inventory/osPackagePurl.js +244 -0
  66. package/lib/inventory/osPackageResolver.js +89 -87
  67. package/lib/inventory/osinfo.js +79 -31
  68. package/lib/inventory/osqueryTransform.js +114 -5
  69. package/lib/inventory/phpBuildInfo.js +487 -0
  70. package/lib/inventory/phpHostProbe.js +641 -0
  71. package/lib/inventory/rootfsCerts.js +426 -0
  72. package/lib/inventory/source.js +207 -3
  73. package/lib/inventory/spdx.js +144 -0
  74. package/lib/inventory/traceRunner.js +5 -1
  75. package/lib/inventory/tracedCrypto.js +129 -0
  76. package/lib/managers/binary.js +529 -183
  77. package/lib/managers/docker.js +166 -12
  78. package/lib/parsers/email.js +277 -0
  79. package/lib/parsers/largeJson.js +34 -2
  80. package/lib/server/server.js +186 -1
  81. package/lib/stages/postgen/annotator.js +17 -1
  82. package/lib/stages/postgen/introspection/reflect.js +4 -1
  83. package/lib/stages/postgen/postgen.js +5 -5
  84. package/lib/stages/postgen/ruleEngine.js +58 -1
  85. package/lib/stages/postgen/specVersionCompat.js +30 -0
  86. package/lib/stages/pregen/pregen.js +117 -5
  87. package/lib/validator/bomValidator.js +26 -5
  88. package/lib/validator/generated/runtime.mjs +13 -0
  89. package/lib/validator/generated/validate-1.6.mjs +26 -7
  90. package/lib/validator/generated/validate-1.7.mjs +31 -12
  91. package/lib/validator/generated/validate-2.0.mjs +30 -11
  92. package/package.json +17 -17
  93. package/types/bin/cdxgen-secure.d.ts +3 -0
  94. package/types/bin/cdxgen-secure.d.ts.map +1 -0
  95. package/types/bin/repl.d.ts.map +1 -1
  96. package/types/lib/audit/index.d.ts.map +1 -1
  97. package/types/lib/cli/bomAssembly.d.ts +9 -2
  98. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  99. package/types/lib/cli/cliOptions.d.ts +43 -0
  100. package/types/lib/cli/cliOptions.d.ts.map +1 -1
  101. package/types/lib/cli/index.d.ts.map +1 -1
  102. package/types/lib/cli/jvmBom.d.ts +20 -0
  103. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  104. package/types/lib/cli/managedBom.d.ts.map +1 -1
  105. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  106. package/types/lib/core/env.d.ts +18 -2
  107. package/types/lib/core/env.d.ts.map +1 -1
  108. package/types/lib/core/fs.d.ts.map +1 -1
  109. package/types/lib/core/httpClient.d.ts.map +1 -1
  110. package/types/lib/core/projectConfig.d.ts.map +1 -1
  111. package/types/lib/core/projectTooling.d.ts +41 -0
  112. package/types/lib/core/projectTooling.d.ts.map +1 -0
  113. package/types/lib/core/propertySanitizer.d.ts +26 -0
  114. package/types/lib/core/propertySanitizer.d.ts.map +1 -1
  115. package/types/lib/ecosystems/cppEvidence.d.ts +1 -1
  116. package/types/lib/ecosystems/golem.d.ts +81 -1
  117. package/types/lib/ecosystems/golem.d.ts.map +1 -1
  118. package/types/lib/ecosystems/gradleutils.d.ts +10 -8
  119. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  120. package/types/lib/ecosystems/parsers-dotnet.d.ts +40 -4
  121. package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -1
  122. package/types/lib/ecosystems/parsers-go.d.ts +85 -13
  123. package/types/lib/ecosystems/parsers-go.d.ts.map +1 -1
  124. package/types/lib/ecosystems/parsers-jvm.d.ts +28 -2
  125. package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -1
  126. package/types/lib/ecosystems/parsers-misc.d.ts +18 -58
  127. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
  128. package/types/lib/ecosystems/parsers-python.d.ts +4 -3
  129. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  130. package/types/lib/ecosystems/pythonutils.d.ts +1 -1
  131. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
  132. package/types/lib/ecosystems/rusi.d.ts.map +1 -1
  133. package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -1
  134. package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
  135. package/types/lib/evinser/evinser.d.ts +25 -0
  136. package/types/lib/evinser/evinser.d.ts.map +1 -1
  137. package/types/lib/evinser/swiftsem.d.ts +10 -0
  138. package/types/lib/evinser/swiftsem.d.ts.map +1 -1
  139. package/types/lib/inventory/agentSkillSpec.d.ts +13 -0
  140. package/types/lib/inventory/agentSkillSpec.d.ts.map +1 -0
  141. package/types/lib/inventory/apkInstalledDb.d.ts +42 -0
  142. package/types/lib/inventory/apkInstalledDb.d.ts.map +1 -0
  143. package/types/lib/inventory/atomUtils.d.ts +14 -0
  144. package/types/lib/inventory/atomUtils.d.ts.map +1 -1
  145. package/types/lib/inventory/cacheDir.d.ts +12 -4
  146. package/types/lib/inventory/cacheDir.d.ts.map +1 -1
  147. package/types/lib/inventory/certificates.d.ts +205 -0
  148. package/types/lib/inventory/certificates.d.ts.map +1 -0
  149. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
  150. package/types/lib/inventory/deps.d.ts +2 -1
  151. package/types/lib/inventory/deps.d.ts.map +1 -1
  152. package/types/lib/inventory/display.d.ts +18 -0
  153. package/types/lib/inventory/display.d.ts.map +1 -1
  154. package/types/lib/inventory/dosai.d.ts +145 -6
  155. package/types/lib/inventory/dosai.d.ts.map +1 -1
  156. package/types/lib/inventory/dynamic.d.ts +6 -1
  157. package/types/lib/inventory/dynamic.d.ts.map +1 -1
  158. package/types/lib/inventory/envcontext.d.ts +40 -2
  159. package/types/lib/inventory/envcontext.d.ts.map +1 -1
  160. package/types/lib/inventory/evidenceUtils.d.ts +29 -10
  161. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  162. package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
  163. package/types/lib/inventory/goBuildInfo.d.ts +10 -0
  164. package/types/lib/inventory/goBuildInfo.d.ts.map +1 -0
  165. package/types/lib/inventory/hbom.d.ts.map +1 -1
  166. package/types/lib/inventory/hbomAnalysis.d.ts +10 -0
  167. package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -1
  168. package/types/lib/inventory/hostTopology.d.ts.map +1 -1
  169. package/types/lib/inventory/osPackagePurl.d.ts +99 -0
  170. package/types/lib/inventory/osPackagePurl.d.ts.map +1 -0
  171. package/types/lib/inventory/osPackageResolver.d.ts +6 -2
  172. package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
  173. package/types/lib/inventory/osinfo.d.ts +31 -6
  174. package/types/lib/inventory/osinfo.d.ts.map +1 -1
  175. package/types/lib/inventory/osqueryTransform.d.ts +51 -0
  176. package/types/lib/inventory/osqueryTransform.d.ts.map +1 -1
  177. package/types/lib/inventory/phpBuildInfo.d.ts +142 -0
  178. package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -0
  179. package/types/lib/inventory/phpHostProbe.d.ts +35 -0
  180. package/types/lib/inventory/phpHostProbe.d.ts.map +1 -0
  181. package/types/lib/inventory/rootfsCerts.d.ts +27 -0
  182. package/types/lib/inventory/rootfsCerts.d.ts.map +1 -0
  183. package/types/lib/inventory/source.d.ts +28 -0
  184. package/types/lib/inventory/source.d.ts.map +1 -1
  185. package/types/lib/inventory/spdx.d.ts +15 -0
  186. package/types/lib/inventory/spdx.d.ts.map +1 -1
  187. package/types/lib/inventory/traceRunner.d.ts +4 -1
  188. package/types/lib/inventory/traceRunner.d.ts.map +1 -1
  189. package/types/lib/inventory/tracedCrypto.d.ts +22 -0
  190. package/types/lib/inventory/tracedCrypto.d.ts.map +1 -1
  191. package/types/lib/managers/binary.d.ts +10 -0
  192. package/types/lib/managers/binary.d.ts.map +1 -1
  193. package/types/lib/managers/docker.d.ts +12 -0
  194. package/types/lib/managers/docker.d.ts.map +1 -1
  195. package/types/lib/parsers/email.d.ts +19 -0
  196. package/types/lib/parsers/email.d.ts.map +1 -0
  197. package/types/lib/parsers/largeJson.d.ts +13 -0
  198. package/types/lib/parsers/largeJson.d.ts.map +1 -1
  199. package/types/lib/server/server.d.ts +8 -0
  200. package/types/lib/server/server.d.ts.map +1 -1
  201. package/types/lib/stages/postgen/annotator.d.ts.map +1 -1
  202. package/types/lib/stages/postgen/introspection/reflect.d.ts.map +1 -1
  203. package/types/lib/stages/postgen/ruleEngine.d.ts +7 -4
  204. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  205. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
  206. package/types/lib/stages/pregen/pregen.d.ts +14 -1
  207. package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
  208. package/types/lib/validator/bomValidator.d.ts.map +1 -1
@@ -111,6 +111,30 @@
111
111
  },
112
112
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=java"
113
113
  },
114
+ "jvm.maven.tooling-disabled": {
115
+ "ecosystem": "java",
116
+ "kind": "fallback.engaged",
117
+ "impact": "transitive-deps",
118
+ "title": "Maven was skipped because dependency installation is disabled; only the direct dependencies declared in pom.xml files were captured",
119
+ "targetTier": "resolved",
120
+ "actions": [
121
+ {
122
+ "kind": "config",
123
+ "command": "Only for a project you trust: pass --install-deps so cdxgen can run Maven. Secure mode keeps installs off unless this flag is given. Outside secure mode, --introspect also runs Maven without installing packages."
124
+ },
125
+ {
126
+ "kind": "rerun"
127
+ }
128
+ ],
129
+ "verify": {
130
+ "rules": [],
131
+ "expectTier": "resolved",
132
+ "eventsCleared": [
133
+ "jvm.maven.tooling-disabled"
134
+ ]
135
+ },
136
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=java"
137
+ },
114
138
  "jvm.gradle.unresolved-config": {
115
139
  "ecosystem": "java",
116
140
  "kind": "fallback.engaged",
@@ -615,6 +639,30 @@
615
639
  },
616
640
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
617
641
  },
642
+ "python.poetry-export.tooling-disabled": {
643
+ "ecosystem": "python",
644
+ "kind": "fallback.engaged",
645
+ "impact": "transitive-deps",
646
+ "title": "poetry export and pdm export were skipped because dependency installation is disabled; only the packages in the lock file were captured",
647
+ "targetTier": null,
648
+ "actions": [
649
+ {
650
+ "kind": "config",
651
+ "command": "Only for a project you trust: pass --install-deps so cdxgen can run Poetry or PDM. Secure mode keeps installs off unless this flag is given. Outside secure mode, --introspect also runs Poetry or PDM without installing packages."
652
+ },
653
+ {
654
+ "kind": "rerun"
655
+ }
656
+ ],
657
+ "verify": {
658
+ "rules": [],
659
+ "expectTier": null,
660
+ "eventsCleared": [
661
+ "python.poetry-export.tooling-disabled"
662
+ ]
663
+ },
664
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
665
+ },
618
666
  "clojure.lein.missing": {
619
667
  "ecosystem": "clojure",
620
668
  "kind": "fallback.engaged",
@@ -672,6 +720,30 @@
672
720
  },
673
721
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
674
722
  },
723
+ "clojure.lein.tooling-disabled": {
724
+ "ecosystem": "clojure",
725
+ "kind": "fallback.engaged",
726
+ "impact": "transitive-deps",
727
+ "title": "Leiningen was skipped because dependency installation is disabled; only the dependencies declared in project.clj were captured",
728
+ "targetTier": null,
729
+ "actions": [
730
+ {
731
+ "kind": "config",
732
+ "command": "Only for a project you trust: pass --install-deps so cdxgen can run Leiningen. Secure mode keeps installs off unless this flag is given. Outside secure mode, --introspect also runs Leiningen without installing packages."
733
+ },
734
+ {
735
+ "kind": "rerun"
736
+ }
737
+ ],
738
+ "verify": {
739
+ "rules": [],
740
+ "expectTier": null,
741
+ "eventsCleared": [
742
+ "clojure.lein.tooling-disabled"
743
+ ]
744
+ },
745
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
746
+ },
675
747
  "swift.toolchain.missing": {
676
748
  "ecosystem": "swift",
677
749
  "kind": "fallback.engaged",
@@ -718,11 +790,35 @@
718
790
  },
719
791
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
720
792
  },
793
+ "swift.tooling-disabled": {
794
+ "ecosystem": "swift",
795
+ "kind": "fallback.engaged",
796
+ "impact": "transitive-deps",
797
+ "title": "SwiftPM was skipped because dependency installation is disabled; only the packages in Package.resolved were captured",
798
+ "targetTier": null,
799
+ "actions": [
800
+ {
801
+ "kind": "config",
802
+ "command": "Only for a project you trust: pass --install-deps so cdxgen can run SwiftPM. Secure mode keeps installs off unless this flag is given. Outside secure mode, --introspect also runs SwiftPM without installing packages."
803
+ },
804
+ {
805
+ "kind": "rerun"
806
+ }
807
+ ],
808
+ "verify": {
809
+ "rules": [],
810
+ "expectTier": null,
811
+ "eventsCleared": [
812
+ "swift.tooling-disabled"
813
+ ]
814
+ },
815
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
816
+ },
721
817
  "dotnet.sdk.missing": {
722
818
  "ecosystem": "csharp",
723
819
  "kind": "evidence.degraded",
724
820
  "impact": "components",
725
- "title": ".NET SDK is not installed, so dotnet slices are degraded",
821
+ "title": "The .NET runtime dosai needs is not installed, so dotnet slices are degraded",
726
822
  "targetTier": "resolved",
727
823
  "actions": [
728
824
  {
@@ -749,6 +845,30 @@
749
845
  },
750
846
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
751
847
  },
848
+ "dotnet.msbuild.tooling-disabled": {
849
+ "ecosystem": "csharp",
850
+ "kind": "fallback.engaged",
851
+ "impact": "versions",
852
+ "title": "dotnet msbuild was skipped because dependency installation is disabled; package versions set by MSBuild properties that no project or props file defines are empty",
853
+ "targetTier": "manifest",
854
+ "actions": [
855
+ {
856
+ "kind": "config",
857
+ "command": "Only for a project you trust: pass --install-deps so cdxgen can run MSBuild. Secure mode keeps installs off unless this flag is given. Outside secure mode, --introspect also runs MSBuild without installing packages."
858
+ },
859
+ {
860
+ "kind": "rerun"
861
+ }
862
+ ],
863
+ "verify": {
864
+ "rules": [],
865
+ "expectTier": "manifest",
866
+ "eventsCleared": [
867
+ "dotnet.msbuild.tooling-disabled"
868
+ ]
869
+ },
870
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
871
+ },
752
872
  "dosai.semantics.persist-failed": {
753
873
  "ecosystem": "csharp",
754
874
  "kind": "evidence.degraded",
@@ -773,6 +893,48 @@
773
893
  },
774
894
  "docs": "https://cyclonedx.github.io/cdxgen/#/EVINSE"
775
895
  },
896
+ "dosai.semantics.trimmed-report": {
897
+ "ecosystem": "csharp",
898
+ "kind": "evidence.degraded",
899
+ "impact": "none",
900
+ "title": "The persisted dosai report is partial: its methods half was written with --sections",
901
+ "targetTier": "resolved",
902
+ "actions": [
903
+ {
904
+ "kind": "config",
905
+ "detail": "Run dosai methods without --sections, or run cdxgen with --evidence, so the persisted report holds every section."
906
+ }
907
+ ],
908
+ "verify": {
909
+ "rules": [],
910
+ "expectTier": "resolved",
911
+ "eventsCleared": [
912
+ "dosai.semantics.trimmed-report"
913
+ ]
914
+ },
915
+ "docs": "https://cyclonedx.github.io/cdxgen/#/EVINSE"
916
+ },
917
+ "dosai.usages.trimmed-report": {
918
+ "ecosystem": "csharp",
919
+ "kind": "evidence.degraded",
920
+ "impact": "components",
921
+ "title": "The supplied dosai usages slice was written without sections cdxgen reads",
922
+ "targetTier": "resolved",
923
+ "actions": [
924
+ {
925
+ "kind": "config",
926
+ "detail": "Run dosai methods without --sections, or with every section cdxgen reads, for the report passed with --usages-slices-file."
927
+ }
928
+ ],
929
+ "verify": {
930
+ "rules": [],
931
+ "expectTier": "resolved",
932
+ "eventsCleared": [
933
+ "dosai.usages.trimmed-report"
934
+ ]
935
+ },
936
+ "docs": "https://cyclonedx.github.io/cdxgen/#/EVINSE"
937
+ },
776
938
  "cocoa.pods.missing": {
777
939
  "ecosystem": "cocoa",
778
940
  "kind": "fallback.engaged",
@@ -796,6 +958,54 @@
796
958
  },
797
959
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
798
960
  },
961
+ "cocoa.podfile-json.tooling-disabled": {
962
+ "ecosystem": "cocoa",
963
+ "kind": "fallback.engaged",
964
+ "impact": "components",
965
+ "title": "pod ipc podfile-json was skipped because dependency installation is disabled; every pod from Podfile.lock is included without per-target filtering",
966
+ "targetTier": null,
967
+ "actions": [
968
+ {
969
+ "kind": "config",
970
+ "command": "Only for a project you trust: pass --install-deps so cdxgen can run CocoaPods. Secure mode keeps installs off unless this flag is given. Outside secure mode, --introspect also runs CocoaPods without installing packages."
971
+ },
972
+ {
973
+ "kind": "rerun"
974
+ }
975
+ ],
976
+ "verify": {
977
+ "rules": [],
978
+ "expectTier": null,
979
+ "eventsCleared": [
980
+ "cocoa.podfile-json.tooling-disabled"
981
+ ]
982
+ },
983
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
984
+ },
985
+ "cocoa.podspec.tooling-disabled": {
986
+ "ecosystem": "cocoa",
987
+ "kind": "fallback.engaged",
988
+ "impact": "licenses",
989
+ "title": "Ruby podspecs were not evaluated because dependency installation is disabled; their pods lack license and author details",
990
+ "targetTier": null,
991
+ "actions": [
992
+ {
993
+ "kind": "config",
994
+ "command": "Only for a project you trust: pass --install-deps so cdxgen can run CocoaPods. Secure mode keeps installs off unless this flag is given. Outside secure mode, --introspect also runs CocoaPods without installing packages."
995
+ },
996
+ {
997
+ "kind": "rerun"
998
+ }
999
+ ],
1000
+ "verify": {
1001
+ "rules": [],
1002
+ "expectTier": null,
1003
+ "eventsCleared": [
1004
+ "cocoa.podspec.tooling-disabled"
1005
+ ]
1006
+ },
1007
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
1008
+ },
799
1009
  "ruby.build-deps.missing": {
800
1010
  "ecosystem": "ruby",
801
1011
  "kind": "evidence.degraded",
@@ -1048,6 +1258,54 @@
1048
1258
  },
1049
1259
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=php"
1050
1260
  },
1261
+ "php.host-probe.package-db-unreadable": {
1262
+ "ecosystem": "php",
1263
+ "kind": "evidence.degraded",
1264
+ "impact": "components",
1265
+ "title": "A package database could not be read in full, so the PHP no package owns on this host was not identified",
1266
+ "targetTier": null,
1267
+ "actions": [
1268
+ {
1269
+ "kind": "config",
1270
+ "command": "Run cdxgen as a user that can read the package databases (for example with sudo), so PHP files can be matched to the packages that own them"
1271
+ },
1272
+ {
1273
+ "kind": "rerun"
1274
+ }
1275
+ ],
1276
+ "verify": {
1277
+ "rules": [],
1278
+ "expectTier": null,
1279
+ "eventsCleared": [
1280
+ "php.host-probe.package-db-unreadable"
1281
+ ]
1282
+ },
1283
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=php"
1284
+ },
1285
+ "php.composer.platform-unattributed": {
1286
+ "ecosystem": "php",
1287
+ "kind": "evidence.degraded",
1288
+ "impact": "versions",
1289
+ "title": "A composer.lock below the scanned directory sits beside a composer.json without a name, so its PHP and extension requirements were not recorded",
1290
+ "targetTier": null,
1291
+ "actions": [
1292
+ {
1293
+ "kind": "config",
1294
+ "command": "Give the project a \"name\" in its composer.json, or scan the project directory itself"
1295
+ },
1296
+ {
1297
+ "kind": "rerun"
1298
+ }
1299
+ ],
1300
+ "verify": {
1301
+ "rules": [],
1302
+ "expectTier": null,
1303
+ "eventsCleared": [
1304
+ "php.composer.platform-unattributed"
1305
+ ]
1306
+ },
1307
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=php"
1308
+ },
1051
1309
  "dart.pub-get-needed": {
1052
1310
  "ecosystem": "dart",
1053
1311
  "kind": "evidence.degraded",
@@ -1143,6 +1401,30 @@
1143
1401
  },
1144
1402
  "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
1145
1403
  },
1404
+ "os.apk-installed-db.unreadable": {
1405
+ "ecosystem": "generic",
1406
+ "kind": "evidence.degraded",
1407
+ "impact": "components",
1408
+ "title": "The apk installed database could not be read in full, so the packages of this host are missing from the OBOM",
1409
+ "targetTier": null,
1410
+ "actions": [
1411
+ {
1412
+ "kind": "config",
1413
+ "command": "Run cdxgen as a user that can read the apk installed database (for example as root), so the packages it lists are inventoried"
1414
+ },
1415
+ {
1416
+ "kind": "rerun"
1417
+ }
1418
+ ],
1419
+ "verify": {
1420
+ "rules": [],
1421
+ "expectTier": null,
1422
+ "eventsCleared": [
1423
+ "os.apk-installed-db.unreadable"
1424
+ ]
1425
+ },
1426
+ "docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES"
1427
+ },
1146
1428
  "policy.secure-mode": {
1147
1429
  "ecosystem": "generic",
1148
1430
  "kind": "evidence.degraded",
@@ -141,21 +141,22 @@
141
141
  }
142
142
 
143
143
  - id: CBC-001
144
- name: "Expired or Expiring Certificate"
145
- description: "Certificates that have expired or are close to their expiration date will cause service disruptions or trust validation failures."
144
+ name: "Expired Certificate"
145
+ description: "A certificate whose validity ended before the audit ran will fail trust validation and cause service disruptions."
146
146
  severity: high
147
147
  category: cbom-compliance
148
148
  dry-run-support: full
149
149
  condition: |
150
150
  components[
151
151
  cryptoProperties.assetType = 'certificate'
152
- and $hasProp($, 'cdx:cert:isExpired', 'true')
152
+ and $certEndMillis(cryptoProperties.certificateProperties.notValidAfter) != null
153
+ and $certEndMillis(cryptoProperties.certificateProperties.notValidAfter) < $toMillis($now())
153
154
  ]
154
155
  location: |
155
156
  {
156
157
  "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
157
158
  }
158
- message: "Certificate for Subject '{{ cryptoProperties.certificateProperties.subjectName }}' has expired or is invalid"
159
+ message: "Certificate for Subject '{{ cryptoProperties.certificateProperties.subjectName }}' expired on {{ cryptoProperties.certificateProperties.notValidAfter }}"
159
160
  mitigation: "Renew the certificate and update the deployment trust stores."
160
161
  evidence: |
161
162
  {
@@ -163,3 +164,233 @@
163
164
  "issuer": cryptoProperties.certificateProperties.issuerName,
164
165
  "notValidAfter": cryptoProperties.certificateProperties.notValidAfter
165
166
  }
167
+
168
+ - id: CBC-002
169
+ name: "Certificate expiring within 30 days"
170
+ description: "A certificate that is still valid but expires within 30 days will soon cause trust validation failures."
171
+ severity: medium
172
+ category: cbom-compliance
173
+ dry-run-support: full
174
+ condition: |
175
+ components[
176
+ cryptoProperties.assetType = 'certificate'
177
+ and $certEndMillis(cryptoProperties.certificateProperties.notValidAfter) != null
178
+ and $certEndMillis(cryptoProperties.certificateProperties.notValidAfter) >= $toMillis($now())
179
+ and $certEndMillis(cryptoProperties.certificateProperties.notValidAfter) < ($toMillis($now()) + 2592000000)
180
+ ]
181
+ location: |
182
+ {
183
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
184
+ }
185
+ message: "Certificate for Subject '{{ cryptoProperties.certificateProperties.subjectName }}' expires on {{ cryptoProperties.certificateProperties.notValidAfter }}"
186
+ mitigation: "Plan the certificate renewal and update the deployment trust stores before it expires."
187
+ evidence: |
188
+ {
189
+ "subject": cryptoProperties.certificateProperties.subjectName,
190
+ "issuer": cryptoProperties.certificateProperties.issuerName,
191
+ "notValidAfter": cryptoProperties.certificateProperties.notValidAfter
192
+ }
193
+
194
+ # The eight SPKI SHA-256 hashes Go 1.27.3 and 1.26.10 hard-code into
195
+ # crypto/x509 (CVE-2026-111943).
196
+ # https://github.com/golang/go/commit/90617fb7ceb59cf08bee7826bb51b8c8fb8c11de
197
+ - id: CBC-003
198
+ name: "Certificate or key distrusted by Go (CVE-2026-111943)"
199
+ description: "Go 1.27.3 and 1.26.10 reject every chain containing one of eight intermediate CA keys, matched by the SHA-256 of the certificate's SubjectPublicKeyInfo. The hash matches re-issued and cross-signed copies of the same key as well."
200
+ severity: high
201
+ category: cbom-security
202
+ dry-run-support: full
203
+ standards:
204
+ nist-800-53:
205
+ - "SC-13 Cryptographic Protection"
206
+ condition: |
207
+ (
208
+ $deny := [
209
+ "ebed6475c2c2d80fcb199f3fe8dd6e6b3ce60b77eb15d4e42c3dec0c6f5b5105",
210
+ "49dd353dc2b919a3770645117d0e60c16115e7d1bc259eefe734b00ea434fe5f",
211
+ "e0254c7fcdc265e2f0f8a428dabb75ab4ae039b4872d62f5ee57f0877d5a8a41",
212
+ "5c0660a2b164910d8ff589c18e14552e9e0ec237dcefe2cb736d41a4811f81a0",
213
+ "43bffa19d6ef651451f6841e019931e96f6f2eaeff28ab4b6f1ce4576de2717b",
214
+ "63ecefee431d49523bc1136c4e72d0206a477086caf606cd5cf025686c109cf8",
215
+ "ec4ffa1ad0ac88081314b7aaffef6a91f97cd57291bb5ba686c5415f5eb4f6b6",
216
+ "92c063d67e8f14db71d288e11266ffdaf69cbf115f7bab14f3bc2f68d25e0e30"
217
+ ];
218
+ components[
219
+ (
220
+ cryptoProperties.assetType = 'certificate'
221
+ or cryptoProperties.assetType = 'related-crypto-material'
222
+ )
223
+ and $exists(properties[name = 'cdx:crypto:spkiSha256'].value[$lowercase($) in $deny])
224
+ ]
225
+ )
226
+ location: |
227
+ {
228
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
229
+ }
230
+ message: "Certificate or key '{{ name }}' carries a public key Go 1.27.3/1.26.10 distrust (CVE-2026-111943)"
231
+ mitigation: "Replace the certificate chain and remove the key from every trust store, bundle and pin. https://github.com/golang/go/commit/90617fb7ceb59cf08bee7826bb51b8c8fb8c11de"
232
+ evidence: |
233
+ {
234
+ "spkiSha256": $prop($, 'cdx:crypto:spkiSha256'),
235
+ "subject": cryptoProperties.certificateProperties.subjectName,
236
+ "locations": $count(evidence.occurrences)
237
+ }
238
+
239
+ - id: CBC-004
240
+ name: "Certificate issued under a Go-distrusted key (CVE-2026-111943)"
241
+ description: "The certificate was issued by one of the eight intermediate CA keys Go 1.27.3 and 1.26.10 distrust, so Go clients rebuilt with those releases will refuse the chain even while the operating system still accepts it."
242
+ severity: high
243
+ category: cbom-security
244
+ dry-run-support: full
245
+ standards:
246
+ nist-800-53:
247
+ - "SC-13 Cryptographic Protection"
248
+ condition: |
249
+ (
250
+ $deny := [
251
+ "ebed6475c2c2d80fcb199f3fe8dd6e6b3ce60b77eb15d4e42c3dec0c6f5b5105",
252
+ "49dd353dc2b919a3770645117d0e60c16115e7d1bc259eefe734b00ea434fe5f",
253
+ "e0254c7fcdc265e2f0f8a428dabb75ab4ae039b4872d62f5ee57f0877d5a8a41",
254
+ "5c0660a2b164910d8ff589c18e14552e9e0ec237dcefe2cb736d41a4811f81a0",
255
+ "43bffa19d6ef651451f6841e019931e96f6f2eaeff28ab4b6f1ce4576de2717b",
256
+ "63ecefee431d49523bc1136c4e72d0206a477086caf606cd5cf025686c109cf8",
257
+ "ec4ffa1ad0ac88081314b7aaffef6a91f97cd57291bb5ba686c5415f5eb4f6b6",
258
+ "92c063d67e8f14db71d288e11266ffdaf69cbf115f7bab14f3bc2f68d25e0e30"
259
+ ];
260
+ $badSkis := components[
261
+ cryptoProperties.assetType = 'certificate'
262
+ and $exists(properties[name = 'cdx:crypto:spkiSha256'].value[$lowercase($) in $deny])
263
+ ].properties[name = 'cdx:crypto:subjectKeyId'].value[$ != null].$lowercase($);
264
+ components[
265
+ cryptoProperties.assetType = 'certificate'
266
+ and $not($exists(properties[name = 'cdx:crypto:spkiSha256'].value[$lowercase($) in $deny]))
267
+ and (
268
+ $count(properties[name = 'cdx:crypto:issuerSpkiSha256' or name = 'cdx:crypto:unverifiedIssuerSpkiSha256'].value[$lowercase($) in $deny]) > 0
269
+ or (
270
+ $prop($, 'cdx:crypto:authorityKeyId') != null
271
+ and $lowercase($nullSafeProp($, 'cdx:crypto:authorityKeyId')) in $badSkis
272
+ )
273
+ )
274
+ ]
275
+ )
276
+ location: |
277
+ {
278
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
279
+ }
280
+ message: "Certificate '{{ name }}' was issued under a public key Go 1.27.3/1.26.10 distrust (CVE-2026-111943)"
281
+ mitigation: "Re-issue the certificate under a trusted CA and update the server chain. https://github.com/golang/go/commit/90617fb7ceb59cf08bee7826bb51b8c8fb8c11de"
282
+ evidence: |
283
+ {
284
+ "authorityKeyId": $prop($, 'cdx:crypto:authorityKeyId'),
285
+ "issuerSpkiSha256": properties[name = 'cdx:crypto:issuerSpkiSha256'].value,
286
+ "subject": cryptoProperties.certificateProperties.subjectName
287
+ }
288
+
289
+ # Post-quantum OIDs (ML-DSA RFC 9881, SLH-DSA RFC 9909, ML-KEM RFC 9935) and
290
+ # the classical-only cutoff. NIST IR 8547 (initial public draft) proposes
291
+ # classical algorithms be disallowed after 2035.
292
+ - id: CBC-005
293
+ name: "Classical-only CA certificate valid past the post-quantum transition"
294
+ description: "A CA certificate whose key and signature algorithms are both classical stays valid beyond 2035-01-01, past the date NIST IR 8547 (initial public draft) proposes to disallow classical algorithms."
295
+ severity: low
296
+ category: cbom-security
297
+ dry-run-support: full
298
+ condition: |
299
+ (
300
+ $pq := [
301
+ "2.16.840.1.101.3.4.3.17", "2.16.840.1.101.3.4.3.18", "2.16.840.1.101.3.4.3.19",
302
+ "2.16.840.1.101.3.4.3.20", "2.16.840.1.101.3.4.3.21", "2.16.840.1.101.3.4.3.22",
303
+ "2.16.840.1.101.3.4.3.23", "2.16.840.1.101.3.4.3.24", "2.16.840.1.101.3.4.3.25",
304
+ "2.16.840.1.101.3.4.3.26", "2.16.840.1.101.3.4.3.27", "2.16.840.1.101.3.4.3.28",
305
+ "2.16.840.1.101.3.4.3.29", "2.16.840.1.101.3.4.3.30", "2.16.840.1.101.3.4.3.31",
306
+ "2.16.840.1.101.3.4.4.1", "2.16.840.1.101.3.4.4.2", "2.16.840.1.101.3.4.4.3"
307
+ ];
308
+ $cutoff := '2035-01-01T00:00:00Z';
309
+ components[
310
+ cryptoProperties.assetType = 'certificate'
311
+ and $prop($, 'cdx:crypto:certRole') in ['root', 'intermediate']
312
+ and $prop($, 'cdx:crypto:publicKeyAlgorithmOid') != null
313
+ and $prop($, 'cdx:crypto:signatureAlgorithmOid') != null
314
+ and $not($prop($, 'cdx:crypto:publicKeyAlgorithmOid') in $pq)
315
+ and $not($prop($, 'cdx:crypto:signatureAlgorithmOid') in $pq)
316
+ and $certEndMillis(cryptoProperties.certificateProperties.notValidAfter) != null
317
+ and $certEndMillis(cryptoProperties.certificateProperties.notValidAfter) > $toMillis($cutoff)
318
+ ]
319
+ )
320
+ location: |
321
+ {
322
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
323
+ }
324
+ message: "CA certificate '{{ name }}' uses only classical algorithms but is valid past the 2035-01-01 cutoff"
325
+ mitigation: "Plan a migration to post-quantum algorithms before the classical-only validity window ends."
326
+ evidence: |
327
+ {
328
+ "keyAlgorithmOid": $prop($, 'cdx:crypto:publicKeyAlgorithmOid'),
329
+ "signatureAlgorithmOid": $prop($, 'cdx:crypto:signatureAlgorithmOid'),
330
+ "notValidAfter": cryptoProperties.certificateProperties.notValidAfter
331
+ }
332
+
333
+ - id: CBC-006
334
+ name: "Post-quantum key certified with a classical signature"
335
+ description: "The certificate's public key is post-quantum but its signature algorithm is classical, so the authentication of that key is only as strong as the classical signature."
336
+ severity: medium
337
+ category: cbom-security
338
+ dry-run-support: full
339
+ condition: |
340
+ (
341
+ $pq := [
342
+ "2.16.840.1.101.3.4.3.17", "2.16.840.1.101.3.4.3.18", "2.16.840.1.101.3.4.3.19",
343
+ "2.16.840.1.101.3.4.3.20", "2.16.840.1.101.3.4.3.21", "2.16.840.1.101.3.4.3.22",
344
+ "2.16.840.1.101.3.4.3.23", "2.16.840.1.101.3.4.3.24", "2.16.840.1.101.3.4.3.25",
345
+ "2.16.840.1.101.3.4.3.26", "2.16.840.1.101.3.4.3.27", "2.16.840.1.101.3.4.3.28",
346
+ "2.16.840.1.101.3.4.3.29", "2.16.840.1.101.3.4.3.30", "2.16.840.1.101.3.4.3.31",
347
+ "2.16.840.1.101.3.4.4.1", "2.16.840.1.101.3.4.4.2", "2.16.840.1.101.3.4.4.3"
348
+ ];
349
+ components[
350
+ cryptoProperties.assetType = 'certificate'
351
+ and $prop($, 'cdx:crypto:publicKeyAlgorithmOid') in $pq
352
+ and $prop($, 'cdx:crypto:signatureAlgorithmOid') != null
353
+ and $not($prop($, 'cdx:crypto:signatureAlgorithmOid') in $pq)
354
+ ]
355
+ )
356
+ location: |
357
+ {
358
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
359
+ }
360
+ message: "Certificate '{{ name }}' binds a post-quantum key with the classical signature '{{ $prop($, 'cdx:crypto:signatureAlgorithm') }}'"
361
+ mitigation: "Re-issue the certificate under a post-quantum or composite signature scheme once one is standardised for your chain."
362
+ evidence: |
363
+ {
364
+ "keyAlgorithmOid": $prop($, 'cdx:crypto:publicKeyAlgorithmOid'),
365
+ "signatureAlgorithmOid": $prop($, 'cdx:crypto:signatureAlgorithmOid')
366
+ }
367
+
368
+ - id: CBC-007
369
+ name: "Unrecognised certificate algorithm"
370
+ description: "The key or signature algorithm is named only by its dotted OID, which means a composite, pre-standard or otherwise unregistered algorithm the inventory cannot classify. PLAN assigns this rule info severity; the rule engine's lowest level is low."
371
+ severity: low
372
+ category: cbom-security
373
+ dry-run-support: full
374
+ condition: |
375
+ components[
376
+ (
377
+ cryptoProperties.assetType = 'certificate'
378
+ and $match($safeStr($prop($, 'cdx:crypto:signatureAlgorithm')), /^[0-9]+(\.[0-9]+)+$/)
379
+ )
380
+ or (
381
+ cryptoProperties.assetType = 'related-crypto-material'
382
+ and $match(name, /^[0-9]+(\.[0-9]+)+$/)
383
+ )
384
+ ]
385
+ location: |
386
+ {
387
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
388
+ }
389
+ message: "Certificate '{{ name }}' uses an algorithm named only by its OID '{{ $firstNonEmpty($prop($, 'cdx:crypto:signatureAlgorithm'), name) }}'"
390
+ mitigation: "Identify the algorithm behind the OID and confirm it is an approved one for this use."
391
+ evidence: |
392
+ {
393
+ "signatureAlgorithm": $prop($, 'cdx:crypto:signatureAlgorithm'),
394
+ "signatureAlgorithmOid": $prop($, 'cdx:crypto:signatureAlgorithmOid'),
395
+ "name": name
396
+ }
@@ -0,0 +1,46 @@
1
+ # Go binary toolchain rules
2
+ # Category: go-security
3
+ # Evaluates the cdx:go:buildVersion property recorded for executable file
4
+ # components during container/rootfs scans.
5
+
6
+ - id: GO-TLS-001
7
+ name: "Go binary built with a toolchain that lacks the CVE-2026-111943 distrust list"
8
+ description: "Go links its standard library statically, so a binary keeps the trust behaviour of the toolchain it was built with. Releases before go1.26.10, and go1.27.0 through go1.27.2, lack the eight SPKI hashes Go uses to distrust the CVE-2026-111943 intermediate CA keys, and older release lines (1.25 and earlier) will never receive them. Release candidates of newer lines (go1.28rc1) already carry the fix."
9
+ severity: high
10
+ category: go-security
11
+ dry-run-support: full
12
+ condition: |
13
+ components[
14
+ type = 'file'
15
+ and $hasProp($, 'cdx:go:buildVersion')
16
+ and (
17
+ $prop($, 'cdx:go:buildVersion') = 'unknown-pre-1.18'
18
+ or (
19
+ $m := $match($prop($, 'cdx:go:buildVersion'), /^go(\d+)\.(\d+)(?:\.(\d+))?/);
20
+ $m != null
21
+ and $number($m.groups[0]) = 1
22
+ and (
23
+ $number($m.groups[1]) < 26
24
+ or (
25
+ $number($m.groups[1]) = 26
26
+ and ($m.groups[2] != null ? $number($m.groups[2]) : 0) < 10
27
+ )
28
+ or (
29
+ $number($m.groups[1]) = 27
30
+ and ($m.groups[2] != null ? $number($m.groups[2]) : 0) < 3
31
+ )
32
+ )
33
+ )
34
+ )
35
+ ]
36
+ location: |
37
+ {
38
+ "bomRef": $firstNonEmpty($."bom-ref", bom.serialNumber)
39
+ }
40
+ message: "Go binary '{{ name }}' was built with {{ $prop($, 'cdx:go:buildVersion') }}, which lacks the CVE-2026-111943 distrust list"
41
+ mitigation: "Rebuild the binary with go1.26.10, go1.27.3 or newer so its crypto/x509 rejects the distrusted intermediate CA keys."
42
+ evidence: |
43
+ {
44
+ "buildVersion": $prop($, 'cdx:go:buildVersion'),
45
+ "srcFile": $prop($, 'internal:SrcFile')
46
+ }