-
-
Notifications
You must be signed in to change notification settings - Fork 62
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature: documenting external/extraneous dependencies #321
Comments
A PR would be good. Or at a minimum, a prototype on this ticket describing a proposal. FYI, v1.6 has a new top-level element called |
Did not find "definitions" in the current (draft) state of
👍 I might sketch out possible schema changes and new test cases based on "component". |
The It currently only consists of |
related to CycloneDX#321 CycloneDX#321 Signed-off-by: Jan Kowalleck <[email protected]>
related to CycloneDX#321 CycloneDX#321 Signed-off-by: Jan Kowalleck <[email protected]>
re: #321 (comment)
here is a sketch: #326 |
related to CycloneDX#321 CycloneDX#321 Signed-off-by: Jan Kowalleck <[email protected]>
read: #293 (comment)
|
related to CycloneDX#321 CycloneDX#321 Signed-off-by: Jan Kowalleck <[email protected]>
Does this invalidate your change request? Sound like However, scope cannot currently not describe a difference between an extraneous optional and required component. What about dev dependencies? |
Dropped this issue/request from the 1.6 milestone goals, and moved it to 1.7 for the following reasons: did not finish in time for 1.6, needs further discussion. |
@Jerod might have additional ideas how he implemented a process to get around todays limitations ... @stevespringett proposed to
need to think about all of this. will come back later. :-) |
now that the enum cases for specification/schema/bom-1.6.schema.json Lines 930 to 934 in d6835a9
|
I've seen a need for this when dealing with Java -- you release a jar or war artifact and it defines dependencies. There is no indication on if they're what you say you need or what's packaged within/distributed with what you're describing. My thoughts:
That being said I am for a I know there's some edge cases in that maybe I tested with python 3.6, 3.8, and 3.11 -- do i list them all as dependencies? I can't attest |
@DarthHater could you check #321 (comment) and see how CDX fits in the Java world when it comes to "externals"? |
So, with 1.6 out of the way now, I'd like to revisit this. So far
and both of these are orthogonal to scope (whether the component is used for runtime or other purposes) and ComponentType. |
Note that in the current 1.6 version, it is already possible to differentiate external and embedded dependencies:
This mechanism is very expressive: you can say the |
CISA and NTIA before it, had discussed the possibility of documenting runtime requirements. These are external dependencies that must be met, which will add to the dependency graph when installed. For example: Acme Application requires one of:
In my mind, these are runtime or environmental requirements. This is very different from |
in fact, when releasing a war, dependencies are included in another typical case in Java is when you build and ship a library: dependencies are not shipped with the library, so not "part of shipped product". Can we really consider them "extraneous"? That's what #578 tried to challenge, that has common aspects to this issue (like some notion of version range), and some differences (extraneous or not extraneous). I'm sure it's the same when someone builds and ship a Javascript / npm library: typically, in their
Then the SBOM generated at build time does not represent what they ship but what they built with, particularly precise versions of components = the built-time resolution of dependencies version range defined in |
that is literally what the first use case of this ticket describes. Was this not clear? please help me improve the ticket, could you provide a use-case description that makes this explains this better, so I could replace the existing description? PS: added the following alt description:
|
related to #321 #321 Signed-off-by: Jan Kowalleck <[email protected]>
FYI: i am currently working on this. |
related to #321 #321 Signed-off-by: Jan Kowalleck <[email protected]>
current state
CycloneDX allows describing components, and the dependency graph.
Each component can have exactly one version, no version range.
Components can be connected in a dependency graph.
feature
Make it possible to describe external dependencies that are not part of a shipped product,
like runtime environments, shared objects and dynamically linked libraries, operating system, hardware (architecture) etc.
use cases
It would enable identifying vendor locks, dependency to outdated external software, and enable DevOps better spec runtime environments.
The SBOM I get handed out with said library should tell which externals are needed to provide/install, so that I know, how my licensing posture is.
The extraneous dependencies are not version-locked, they may be in a range of compatible versions.
— Or, in other words —
As the author of a software library, I want to provide an SBOM that not only includes the bundled runtime-dependencies, but also the info which runtime-dependencies need to be provided by the user of my library.
php-fpm
,php-executable, etc), nor required php-extensions and runtime libraries(libssl
, etc). see the php/composer spec.The SBOM I get handed out with the product should tell which version range of PHP is required to run the software, and which version of required PHP-extensions are required to be installed/enabled. This would help identify risks with the product, that are implied by locks or depending on outdated external software.
The SBOM I get handed out should state this compatibility range.
The SBOM I get handed out should state the compatible hardware architecture.
libSSL
. Therefore,libSSL
is a dependency of my product. For licensing reasons, I ship only my product and none of the dynamically linked dependencies.My SBOM must express these dependencies (name, version-range, distribution-options(download-URL)), so that my clients know what they need to provide, in order to run the software I've shipped.
possible solution
Idea: a new boolean property of
Component
, to indicate the fact that something is not part of the assembly, but needs to be provided.( "external"? "extraneous"? wording unclear)
Alternative: add a new value for
ComponenScope
. Current values: { "required", "optional", "excluded"} -- see Feature: documenting external/extraneous dependencies #321 (comment)❗ see discussion below
add an optional property to
Component
that allowed documenting a version-range, instead of a disjunctive version.might utilize existing schema definition for "range", which uses the still unfinished purlspec's VERS: https://github.com/package-url/purl-spec/blob/version-range-spec/VERSION-RANGE-SPEC.rst
unchanged: allow components to be vendor-less. Some externals need to be able to describe a product-class, instead of an exact product.
document the following, and if possible, then formulate it in schema language:
version
MUST be omitted, if component's is "external"version-range
MUST be omitted, if component's is not "external"reminder: a version-range can also be a value that matches only one exact version - like
VERS:1.44.7
might utilize new
ComponentType
"runtime" -- Feature Request: newComponentType
"runtime" #233Followup
We might add to the authoritative guide, that a BOM for non-bundled/non-shipped MUST NOT have concrete version, but MAY have a version-range(which may match exactly one version), and MUST be flagged as "extraneous".
The same goes to BOMs with the
$.metadata.lifecycles[].phase=design
.Discussion
First of, the goal is to allow describing externals, this is not SBOM in the traditional way, this is about the capability of CycloneDX.
howto name?
options:
how mark "externals"
Question: Where to put a marker that signals the fact that something is external?
Is
scope
the best place to put this? No! What if something is eternal and optional at the same time?!So it might be better to have a dedicated marker for that purpose.
Question: Which element/object to use?
The existing "Component" seams good, but might be just to broad.
Maybe use "Definitions"' child element, as soon as it is clear? see #321 (comment)
motivation / need
As requested by the community, and canned as tickets
As described by German Cybersecurity Agency BSI
As a solution for the package registries
Package registries that (are planning to) provide SBOMS for libraries which do not include all their dependencies. These SBOMs pretend/predict the dependencies as "components" but in fact, the components are not packaged with these libraries, but need to be fetched additionally. It these package registries would make unresolved dependencies as "extraneous", that would be great.
The text was updated successfully, but these errors were encountered: