Architecture

cudabom is a Cargo workspace. Each crate owns one stage of the pipeline and depends only on what that stage needs, so the ELF parser does not drag in the archive stack and the reporting layer does not depend on the advisory database.

Crates

CrateResponsibility
cudabomclap front end, output selection, exit codes
cudabom-coreshared types (Artifact, Location, Component, Evidence, Confidence, Finding) and tunable safety Limits
cudabom-extractsafe, streaming walkers for wheels, sdists, archives, directories, and container images
cudabom-elfELF facts: SONAME, NEEDED, symbols, symbol versions, build-id, sections, notes, rodata strings
cudabom-fatbinfatbin/cubin/PTX parsing
cudabom-identifyfingerprint DB + matchers turning facts into CUDA identities with confidence
cudabom-advisoryNVIDIA CSAF ingestion, normalization, local index, matching
cudabom-sbomCycloneDX 1.6 emit/enrich/merge, PEP 770 reader, VEX
cudabom-reportterminal table, native JSON, SARIF, Markdown renderers
cudabom-policypolicy-file evaluation for gate
xtaskfixture builds, fingerprint-DB builder, corpus evaluation (not shipped)

Pipeline

input
  -> extract (safe, streaming, bounded by Limits)
  -> per-file facts (ELF, fatbin, rodata strings)
  -> identify (evidence -> component identity + confidence)
  -> reconcile with declared SBOMs (PEP 770 / input SBOM)
  -> correlate advisories (local index)
  -> render outputs / evaluate policy

Per-file facts are cached by content hash so re-scans and multi-layer container images are fast.

Design invariants

  • Never execute, load, or JIT anything scanned.
  • No network except the explicit refresh/fetch commands (cudabom db update, cudabom update, and reconcile --ngc-image).
  • Parsers are panic-free on malformed input and are fuzzed.
  • Output is deterministic (stable ordering).
  • #![forbid(unsafe_code)] across all crates.

See evidence-model.md and threat-model.md.