Skip to main content

sorbet-cli : dependency analysis and SBOM generation for code, containers and binaries

CI License: Apache-2.0

sorbet-cli - dependency analysis and SBOM generation for code, containers and binaries

Sorbet CLI (sorb) is an open-source, cross-platform dependency-analysis and SBOM-generation tool.

Point it at software - a code repository, a container image, a binary, infrastructure config, or a whole machine - and it produces an evidence-backed SBOM (CycloneDX 1.6, SPDX 2.3/3.0): every component carries occurrence evidence, a provenance chain, and a confidence score.

pip install sorb              # or: uv tool install sorb / pipx install sorb
sorb scan .                   # scan a repo
sorb scan image:alpine:3.20   # scan a container image, per layer
sorb ui                       # browse the results in a local web UI
scanning this repository, then asking why one component is in the SBOM

Features

  • Explainable output. sorb explain <component> reports which detector found a component, in which file and at which byte range, and how its confidence was derived.
  • Offline by default. Network access is opt-in per scan (--allow-net); --offline disables it entirely. No telemetry.
  • Contained failures. An unparseable file becomes an analysis-gap annotation instead of failing the scan.
  • Reproducible output. With --reproducible, scanning unchanged input twice produces the identical file, because timestamps come from SOURCE_DATE_EPOCH instead of the clock. An SBOM can then be committed and regenerated in CI, where any diff means a dependency really changed.
  • A queryable evidence graph. Each scan writes an SQLite graph shared by explain, query, diff, merge, fleet and the UI. SBOM files are views over it, and any result exports as a CycloneDX or SPDX subgraph.

The evidence explorer

sorb ui opens a local, fully offline web UI over any scan: an overview dashboard, a filterable component inventory, an expandable dependency tree, per-layer container attribution, fleet-wide version skew, and SBOM export — every number clickable down to its evidence.

the sorb evidence explorer: dashboard, component inventory and dependency graph

What it scans

Target Examples
Source trees npm/pnpm/yarn, Python, Go, JVM (Maven/Gradle), .NET, Ruby, PHP, Rust, C/C++ (vcpkg/Conan/CMake), and a dozen long-tail lockfile formats
Container images image:REF registry-direct, OCI layouts, docker-save archives, daemons/containerd, running containers - with per-layer attribution, base-image splitting, and multi-arch support
Compiled binaries ELF/PE/Mach-O/WASM link graphs, embedded ground truth (Go buildinfo, cargo-auditable, .NET CLR), signature-DB fingerprinting of stripped/static libraries
Mobile & installers APK/AAB/IPA, installers, firmware images
IaC Terraform, Kubernetes/Helm/Kustomize, CloudFormation, Bicep, Ansible, Dockerfiles - with --follow-images chaining referenced images into container scans
Whole machines host:// inventories a running host (marking what's observed running and on which ports); disk:// reads disk images agentlessly - no mount, no root

It also inventories two things that are not packages:

  • Certificates and keys (a CBOM). Each certificate is recorded with its subject, issuer and expiry date. Private keys are noted as present, but their contents are never read into the SBOM.
  • Machine-learning models (an ML-BOM). Safetensors, GGUF, ONNX, PyTorch and pickle files, with their format and tensor metadata. Formats that run code when loaded, such as pickle and TorchScript, are flagged.

Beyond static analysis

Static analysis is the default. These optional modes gather more:

  • sorb scan --resolve=native runs the ecosystem's own build tool inside a deny-by-default sandbox (Linux and macOS) and reads what it resolved.
  • sorb trace -- <cmd> runs a command and records which libraries it actually loads, finding dependencies that are used but never declared, and declared but never used.
  • sorb snapshot compares installed state before and after a step such as a package install.
  • sorb watch records the same as trace, but across a longer session.

Working with SBOMs

sorb convert other.spdx.json -o cyclonedx-json --loss-report
sorb merge a.cdx.json b.spdx.json -o cyclonedx-json
sorb diff v1.cdx.json image:app:2.0 --fail-on-change
sorb validate sbom.json --require ntia
sorb sign / attest / verify        # air-gapped DSSE signing and verification
sorb query 'components where confidence < 0.9 | count by ecosystem'
sorb fleet '.sorb/results/*.sorb.db' -q '…'   # one question across every scanned host

For CI: --fail-on drift,stale-lockfile,version-conflict,phantom-deps, stable exit codes, a GitHub Action (action.yml), and a container image.

Scope

sorb generates SBOMs. Vulnerability matching is out of scope: that is the job of whatever platform consumes the SBOMs downstream.

Documentation

  • docs/usage.md - installation, every command, targets, formats, flags, configuration.
  • docs/architecture.md - how it's built: the evidence model, pipeline, subsystems, storage, plugins, testing.
  • docs/support.md - every ecosystem and file format read, and what is not supported yet.
  • docs/plugins.md - writing a cataloger or emitter, and the WASM plugin ABI.

Extending

Findings from all three plugin tiers are re-validated before they reach the graph, so a plugin cannot inject unchecked claims, impersonate a first-party detector, or claim more confidence than its technique allows.

  • Entry-point plugins - trusted Python packages registering catalogers or emitters (examples/sorb-plugin-example/).
  • WASM plugins - untrusted, must be signed, run with no filesystem, network, or environment access and a CPU-fuel cap (pip install 'sorb[wasm]').
  • gRPC plugins - out-of-process services, contacted only when named in trusted config (pip install 'sorb[grpc]').

The last two are declared per project in sorb.toml; see docs/plugins.md for the ABI and configuration.

Development

uv venv --python 3.13 .venv && uv pip install -e ".[dev]" -p .venv/bin/python
.venv/bin/sorb scan .                    # scan this repo
.venv/bin/pytest -q                      # tests (network-blocked)
.venv/bin/ruff check src tests && .venv/bin/mypy && .venv/bin/lint-imports

Requires Python ≥ 3.12. The optional Rust accelerator (native/sorb-accel) is used only after a load-time check proves its output byte-identical to the pure-Python implementation, which remains the reference.

License

Apache 2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sorb-0.2.0.tar.gz (1.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sorb-0.2.0-py3-none-any.whl (461.2 kB view details)

Uploaded Python 3

File details

Details for the file sorb-0.2.0.tar.gz.

File metadata

  • Download URL: sorb-0.2.0.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sorb-0.2.0.tar.gz
Algorithm Hash digest
SHA256 2392b1cf9da0ceccd71499749d963436b4436e2a30484f61fb13270bd1e8d163
MD5 2d7358e57f430747d2202732a35fce6c
BLAKE2b-256 380200ed0c21c654a611ba9d6b4ae675c252b063dd6043cb83be707b9c6d245a

See more details on using hashes here.

Provenance

The following attestation bundles were made for sorb-0.2.0.tar.gz:

Publisher: release.yml on SorbetSecurity/sorbet-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sorb-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: sorb-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 461.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sorb-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 37e59d98ea5cb8223977f5f5a510cbfd4de1ff01596eec0a0ca7fc4ab599f3dd
MD5 519bae0f34190aef99f813c00e4109e8
BLAKE2b-256 aefd60821aac13883ec8fd2a6eb8a0f99c77aaf41e1c24a36b3f2d40e0324a3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for sorb-0.2.0-py3-none-any.whl:

Publisher: release.yml on SorbetSecurity/sorbet-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page