Quickly visualizing an SBOM document
Have you ever had a Software Bill-of-Materials (SBOM) document
and just want to look at the dang thing ? Preferably using CLI tools? SBOMs
tend to be quite large for non-trivial software projects, so
looking at them in a text editor becomes difficult fast.
Many "solutions" for visualizing an SBOM document require running
a service which is something I don't want to do. Here's what you can do to quickly visualize an SBOM document
using Anthony Harrison's sbom2dot project, the DOT language, and GraphViz:
# Ensure GraphViz and sbom2dot are installed.
$ dot --version
$ python -m pip install sbom2dot
# Create an SVG from an SBOM!
$ sbom2dot -i bom.cdx.json | dot -Tsvg -o bom.cdx.svg
# Open the SVG, either in image viewer or browser.
$ firefox bom.cdx.svg
Here's what the visualization looks like for a work-in-progress SBOM generation
for the Python Cryptography package:
sbom
cryptography
pkg:pypi/cryptography@44.0.0
NOASSERTION
cryptography-cffi
cryptography-cffi
NOASSERTION
cryptography->cryptography-cffi
cryptography-keepalive
cryptography-keepalive
NOASSERTION
cryptography->cryptography-keepalive
cryptography-key-parsing
cryptography-key-parsing
NOASSERTION
cryptography->cryptography-key-parsing
cryptography-openssl
cryptography-openssl
NOASSERTION
cryptography->cryptography-openssl
cryptography-x509
cryptography-x509
NOASSERTION
cryptography->cryptography-x509
cryptography-x509-verification
cryptography-x509-verification
NOASSERTION
cryptography->cryptography-x509-verification
pyo3
pkg:cargo/pyo3@0.23.2
MIT OR Apache-2.0
cryptography-cffi->pyo3
openssl-sys
pkg:cargo/openssl-sys@0.9.104
MIT
cryptography-cffi->openssl-sys
cryptography-keepalive->pyo3
cryptography-key-parsing->cryptography-x509
cryptography-key-parsing->openssl-sys
cfg-if
pkg:cargo/cfg-if@1.0.0
MIT OR Apache-2.0
cryptography-key-parsing->cfg-if
openssl
pkg:cargo/openssl@0.10.68
Apache-2.0
cryptography-key-parsing->openssl
asn1
pkg:cargo/asn1@0.20.0
BSD-3-Clause
cryptography-key-parsing->asn1
cryptography-openssl->openssl-sys
cryptography-openssl->cfg-if
cryptography-openssl->openssl
foreign-types
pkg:cargo/foreign-types@0.3.2
MIT OR Apache-2.0
cryptography-openssl->foreign-types
foreign-types-shared
pkg:cargo/foreign-types-shared@0.1.1
MIT OR Apache-2.0
cryptography-openssl->foreign-types-shared
cryptography-x509->asn1
cryptography-x509-verification->cryptography-key-parsing
cryptography-x509-verification->cryptography-x509
cryptography-x509-verification->asn1
once_cell
pkg:cargo/once_cell@1.20.2
MIT OR Apache-2.0
cryptography-x509-verification->once_cell
pyo3-macros-backend
pkg:cargo/pyo3-macros-backend@0.23.2
MIT OR Apache-2.0
quote
pkg:cargo/quote@1.0.37
MIT OR Apache-2.0
pyo3-macros-backend->quote
pyo3-build-config
pkg:cargo/pyo3-build-config@0.23.2
MIT OR Apache-2.0
pyo3-macros-backend->pyo3-build-config
proc-macro2
pkg:cargo/proc-macro2@1.0.92
MIT OR Apache-2.0
pyo3-macros-backend->proc-macro2
syn
pkg:cargo/syn@2.0.89
MIT OR Apache-2.0
pyo3-macros-backend->syn
heck
pkg:cargo/heck@0.5.0
MIT OR Apache-2.0
pyo3-macros-backend->heck
quote->proc-macro2
pyo3-build-config->once_cell
target-lexicon
pkg:cargo/target-lexicon@0.12.16
Apache-2.0
pyo3-build-config->target-lexicon
unicode-ident
pkg:cargo/unicode-ident@1.0.14
(MIT OR Apache-2.0) AND Unicode-3.0
proc-macro2->unicode-ident
syn->quote
syn->proc-macro2
syn->unicode-ident
libc
pkg:cargo/libc@0.2.166
MIT OR Apache-2.0
pyo3->libc
pyo3->cfg-if
pyo3-macros
pkg:cargo/pyo3-macros@0.23.2
MIT OR Apache-2.0
pyo3->pyo3-macros
portable-atomic
pkg:cargo/portable-atomic@1.10.0
Apache-2.0 OR MIT
pyo3->portable-atomic
pyo3->once_cell
memoffset
pkg:cargo/memoffset@0.9.1
MIT
pyo3->memoffset
pyo3-ffi
pkg:cargo/pyo3-ffi@0.23.2
MIT OR Apache-2.0
pyo3->pyo3-ffi
indoc
pkg:cargo/indoc@2.0.5
MIT OR Apache-2.0
pyo3->indoc
unindent
pkg:cargo/unindent@0.2.3
MIT OR Apache-2.0
pyo3->unindent
openssl-sys->libc
openssl->openssl-sys
openssl->libc
openssl->cfg-if
openssl->once_cell
openssl-macros
pkg:cargo/openssl-macros@0.1.1
MIT OR Apache-2.0
openssl->openssl-macros
openssl->foreign-types
bitflags
pkg:cargo/bitflags@2.6.0
MIT OR Apache-2.0
openssl->bitflags
asn1_derive
pkg:cargo/asn1_derive@0.20.0
BSD-3-Clause
asn1->asn1_derive
itoa
pkg:cargo/itoa@1.0.14
MIT OR Apache-2.0
asn1->itoa
pyo3-macros->pyo3-macros-backend
pyo3-macros->quote
pyo3-macros->proc-macro2
pyo3-macros->syn
asn1_derive->quote
asn1_derive->proc-macro2
asn1_derive->syn
pyo3-ffi->libc
openssl-macros->quote
openssl-macros->proc-macro2
openssl-macros->syn
foreign-types->foreign-types-shared
pem
pkg:cargo/pem@3.0.4
MIT
base64
pkg:cargo/base64@0.22.1
MIT OR Apache-2.0
pem->base64
Notice the dependencies off on the top-right that aren't a part of the graph? This visualization
makes it easy to spot those types of issues. You can fiddle with the options of dot to match how you'd like the visualization to be rendered.
Do you have a better method for quick SBOM visualization in the terminal? Send me an email please!
Wow, you made it to the end!