Comparative analysis

SBOM, CBOM and AI-BOM: what four scanners build, and what each leaves out

Software, cryptography and AI bills of materials across Palo Alto Networks Prisma Cloud, GitLab Ultimate, Snyk and Vulnetix. The comparison covers how each inventory is built rather than which export formats appear in a feature list, because what a scanner resolves decides what the document omits.

Each competitor verdict traces to that vendor's documentation, an open issue in its own tracker, or — for Prisma Cloud — written answers from Palo Alto Networks, reproduced in full at the end. Verdicts carry a qualifier, and the qualifier holds the claim: a capability with a documented exception is recorded as partial, with the exception named. On that basis Vulnetix is partial on 4 of 34 rows and behind Snyk on two.

Scope: 4 tools · 34 capabilities · 3 BOM types. Evidence: vendor documentation, vendor issue trackers, written vendor answers. Verified: 30 July 2026.

Vendors ship continuously, so check the linked sources before quoting any of this.

How these verdicts were reached

The comparison

SBOM — software bill of materials

How the inventory is built decides what is missing from it. These rows are about resolution, not export buttons.

Capability Vulnetix Prisma CloudGitLabSnyk
Formats emitted
Your auditor, your customer and your registry rarely want the same format.
✓ Yes
CycloneDX 1.6 and 1.7 for SBOM, CBOM and AI-BOM; SPDX 2.3 JSON from vulnetix license
~ Partial
CycloneDX or CSV export from the console; SPDX not documented
~ Partial
CycloneDX 1.4 (pipeline) and 1.6 (project) plus GitLab JSON and CSV; SPDX export is an open issue (436388)
✓ Yes
CycloneDX 1.4, 1.5 and 1.6 in JSON or XML, plus SPDX 2.3 JSON
Runs where your code already is
A scanner that clones your repository into its own cloud is a copy of your source you now have to govern.
✓ Yes
CLI runs on your laptop or CI runner; no repository clone into our cloud, no source content uploaded
✗ No
Vendor-side git clone into a cloud snapshot that all scanners read (vendor answer)
✓ Yes
Analyzer runs as a CI job in your own runners
✓ Yes
CLI runs locally or in your CI; an internet connection is required
Resolves without a committed lockfile
Plenty of real repositories have a manifest and no lockfile. What happens then decides whether the SBOM is complete or fiction.
~ Partial
Parses committed manifests and lockfiles; a few ecosystems (Cargo, Composer) ask you to build or generate a lockfile rather than guess
✓ Yes
Runs the real package manager for Python, Maven, Gradle, Go, PHP, Ruby and .NET when no lockfile exists (vendor answer)
~ Partial
Automatic resolution for Maven, Gradle and Python; other ecosystems need a committed lockfile or graph export
~ Partial
Resolution depends on the ecosystem plugin; several need installed dependencies or a lockfile present
Manifest and lockfile breadth
Coverage is the difference between an SBOM and a partial SBOM nobody labelled as partial.
✓ Yes
100+ manifest and lockfile filenames across ~25 ecosystems, including OS and container package databases
~ Partial
Manifests and lockfiles matched by filename per language; several common ecosystems unsupported (vendor answer)
✓ Yes
npm, pnpm, Yarn, bun, pip, pipenv, Poetry, uv, Maven, Gradle, Ivy, Go, Cargo, Composer, NuGet, bundler, Conda, CocoaPods, Swift and more; vulnerability matching runs across 10 PURL types
✓ Yes
Mature coverage across npm, Yarn, pnpm, Maven, Gradle, NuGet, pip, Poetry, pipenv, Go, Cargo, Composer, RubyGems and more
Modern JavaScript workflows
pnpm, Yarn Berry and npm workspaces are ordinary in 2026. A monorepo read only at the root is a monorepo mostly unread.
✓ Yes
package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb and npm-shrinkwrap parsed wherever they appear in the tree
✗ No
Vendor answer: Yarn v1 workspaces incomplete; npm workspaces v7+, Yarn Berry, pnpm and Lerna/Nx "not supported at all"
✓ Yes
npm, pnpm, Yarn and bun lockfiles all supported
✓ Yes
npm, pnpm and Yarn supported; partial support for Lerna
Modern Python workflows
uv and Poetry moved fast; scanners that only know requirements.txt quietly under-report.
✓ Yes
uv.lock, poetry.lock, pdm.lock, Pipfile.lock, requirements.txt and pyproject.toml, no plan gate
~ Partial
pip and Pipfile.lock supported; Poetry not supported (vendor answer)
✓ Yes
pip, pipenv, Poetry and uv supported
~ Partial
pip, Poetry, pipenv and setup.py supported; uv is Early Access on Enterprise plans only
Dev and test scope carried into the BOM
Without scope, a test-only CVE and a production CVE look identical to whoever reads the SBOM.
✓ Yes
CycloneDX scope plus a vulnetix:environment property (production / development / test) per component, across npm, Maven, Ruby, Debian and more
~ Partial
Vendor answer: present for npm and Yarn, absent for Java, Ruby and PHP — "a current limitation"
✓ Yes
DS_INCLUDE_DEV_DEPENDENCIES across Composer, Conda, Gradle, Maven, npm, pnpm, Pipenv, Poetry and uv
~ Partial
--dev includes dev dependencies and SPDX marks DEV_DEPENDENCY_OF, but CycloneDX output does not differentiate them
Vendored and embedded components
Copied-in source and committed binaries are exactly where an SBOM is most often wrong.
~ Partial
Committed binaries are hashed, looked up (CIRCL hashlookup, MalwareBazaar) and read for the packages compiled into them; vendored third-party source is still not fingerprinted
✗ No
Vendor answer: committed vendor/ folders, bundled .jar/.dll and pasted-in code "will not be detected"; image scanning reads package databases only
✗ No
Inventory is built from lockfiles and graph exports; undeclared vendored or binary components are out of scope
~ Partial
--unmanaged fingerprints C/C++ source against Snyk's database; custom-built JARs are explicitly unsupported and modified source reduces accuracy
Packages recovered from compiled binaries
A statically linked binary carries its whole dependency tree inside it, and no manifest in the repository mentions any of it.
✓ Yes
Go build info (main module, every linked module with its go.sum H1 hash, and the toolchain as stdlib), Rust cargo-auditable crate lists with their edges, and JVM archive coordinates — in the project tree and in container rootfs/archives, merged into the same document
✗ No
Vendor answer: bundled .jar and .dll files "will not be detected", and image scanning reads package databases rather than arbitrary files — no documented binary metadata extraction
~ Partial
Container scanning (Trivy) can report non-OS packages including Go binaries and jar files, but it is opt-in — CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN must be set to "false" — and lands in the container-scanning report, not the dependency SBOM
~ Partial
Snyk Container reverse-parses Go binaries built with module support and unpacks nested JARs (--nested-jars-depth), on by default since CLI 1.1090.0 — but inside an image, not for a binary committed to a repository, and Rust cargo-auditable data is not read
Files in an image attributed to their OS package
A binary no package manager installed is the one worth asking about, and you cannot spot it without file ownership.
✓ Yes
dpkg, apk and pacman file lists read from the image, so the owning package becomes the parent of each file it installed and anything unclaimed is flagged unpackaged; rpm databases need a native library, so those images are never flagged either way
✗ No
Image scanning enumerates the distro package database; no documented file-to-package attribution or unpackaged-file signal
✗ No
Container scanning enumerates packages; no file-to-package attribution or unpackaged-file signal in the report
✗ No
Application dependencies and OS packages are reported separately; no file-to-package attribution or unpackaged-file signal
Packages installed by pipelines and scripts
A build agent that apt-gets a package has that package in the build, whether or not any manifest declares it.
✓ Yes
Install commands parsed from ~40 CI/CD systems by name, directory and suffix — GitLab CI, GitHub/Gitea/Forgejo Actions, Azure, Bitbucket, CodeBuild, Cloud Build, Tekton, Argo, Concourse, Jenkins, TeamCity and more — plus shell scripts, Makefiles and task recipes, into the same BOM as the manifests
✗ No
Vendor answer: source-repo scanning does not parse Dockerfiles or CI configuration for dependencies
✗ No
The analyzer resolves lockfiles, manifests and graph exports; nothing published on extracting packages from .gitlab-ci.yml or shell install commands
✗ No
Nothing published on extracting packages from CI/CD configuration or shell install commands; Dockerfile support is IaC misconfiguration scanning, not package extraction
Build-time dependencies from Dockerfiles
A package installed by a RUN line ships to production whether or not a manifest mentions it.
✓ Yes
Dockerfile and Containerfile parsed in the same pass: base images from FROM and packages from RUN install lines, in the same BOM
~ Partial
Dockerfile and CI files not parsed by source scanning; image scanning catches build-installed packages as a separate, unmerged output (vendor answer)
~ Partial
Container scanning covers packages installed at image build; not merged into the dependency SBOM
~ Partial
snyk container sbom inventories the built image; Dockerfile RUN installs are not folded into the source SBOM
Private registry awareness
Internal packages resolved from a private registry are the ones least covered by public advisories.
~ Partial
Registry configuration (.npmrc and friends) is detected and reported as evidence; authentication itself stays with your package manager
~ Partial
Credentials handled platform-side, but coverage is JFrog only and a subset of languages (vendor answer)
~ Partial
Resolution jobs honour PIP_INDEX_URL, PIP_EXTRA_INDEX_URL and MAVEN_ARGS
~ Partial
Private registry access relies on the package manager's own configuration and Snyk Broker rather than registry credentials in the SBOM tool
Per-repository BOM metadata
An SBOM that cannot say which repo, branch and commit it describes is hard to use as evidence later.
✓ Yes
metadata.component built from git: project name, version from tags, branch, commit, author, timestamp, dirty state and VCS external references
✗ No
Vendor answer: no supported mechanism to set app name, repo URL, branch or org context per repository
~ Partial
BOM metadata derives from the pipeline and project context; no documented per-repository override file
~ Partial
BOM metadata comes from the project and org context; no documented per-repository metadata override file
Ingests BOMs produced elsewhere
You will always have a tool that produced a BOM before this one existed.
✓ Yes
Uploads accept CycloneDX, SPDX, SARIF, OpenVEX and CSAF-VEX; merged into the same inventory as first-party scans
~ Partial
Third-party ingestion is documented for SARIF and SonarQube findings; no documented path for ingesting an externally produced SBOM
✓ Yes
Any CycloneDX report uploaded from the default-branch pipeline appears in the dependency list
✓ Yes
snyk sbom test accepts CycloneDX 1.4–1.6 and SPDX 2.3 documents produced by other tools
Container image inventory
The image is what actually runs, and it contains packages no repository manifest declares.
~ Partial
An unpacked rootfs or a saved image tar is read without a Docker/Podman daemon — dpkg, apk and pacman databases, binaries and Dockerfile parsing in one document — but there is no registry pull; bring a Syft, Trivy or Grype image SBOM and it is ingested
✓ Yes
Builds or pulls the image and reads OS and language package databases; separate output from the source SBOM
✓ Yes
Container scanning produces an image inventory as its own report
✓ Yes
snyk container sbom generates an image SBOM in the same formats
Dependency graph inside the document
A flat component list cannot answer "what pulled this in", and the answer has to survive leaving your tool.
✓ Yes
CycloneDX dependencies array built from lockfile and installed-tree edges, plus the module graph recovered from binaries; the project component owns its direct dependencies
~ Partial
The console shows a package dependency graph; whether the exported CycloneDX carries a dependencies array is not documented
~ Partial
Dependency paths are ingested and shown in the dependency list (GA 17.4), but adding a CycloneDX dependencies array with ref/dependsOn to the emitted SBOM is open issue 428073
✓ Yes
CycloneDX output carries a dependencies array with ref/dependsOn, built from the resolved dependency graph — transitive relationships included
Signature and transparency-log evidence per component
An inventory that cannot say whether a component was signed leaves the supply-chain question unanswered.
✓ Yes
Signature and attestation sidecars beside each discovered file (.sig, .asc, .minisig, .sigstore, .bundle, .intoto.jsonl and more) recorded as component properties, with Rekor inclusion metadata parsed offline — no live transparency-log lookups
✗ No
Nothing published on signature or transparency-log evidence for the components in an SBOM
~ Partial
SLSA level 2/3 provenance for artefacts your own pipeline builds, Sigstore signing components and an Attestations API returning Sigstore bundles; the SBOM components themselves carry no signature or transparency-log evidence
✗ No
Nothing published on signature or transparency-log evidence for the components in an SBOM
Generates a BOM with no account and no network
Air-gapped builds and evaluation-before-purchase both need an artefact produced without calling anyone.
✓ Yes
vulnetix cdx (alias sbom) writes a schema-validated document with zero API calls, no credentials and no telemetry; SBOM, CBOM and AI-BOM in the same file
✗ No
Vendor answer: the platform clones the repository into cloud storage and scanners read it there — there is no local, accountless generation path
~ Partial
Offline deployment is documented, but it needs self-managed GitLab, a docker or kubernetes runner, mirrored analyzer images and a mirrored advisory database — and Ultimate
✗ No
Documented plainly: "The snyk sbom feature requires an internet connection", and it is Enterprise-plan only
Regenerating the BOM keeps prior findings
If a fresh inventory silently drops the triage you did last week, the document is not evidence of anything.
✓ Yes
A regenerated document carries over the vulnerability entries and VEX analysis already recorded, plus any component they reference, marked carried-over
✗ No
Nothing published on carrying vulnerability or VEX state forward into a regenerated SBOM document
✗ No
SBOM artefacts are produced per pipeline; nothing published on carrying VEX or triage state into a regenerated document (VEX in SBOM reports is itself open issue 413694)
✗ No
Each snyk sbom run emits a fresh document; nothing published on carrying prior findings or VEX into it (no VEX output either)
VEX generated beside the BOM
An SBOM tells a customer what is in the box. VEX tells them which of it actually affects them.
✓ Yes
OpenVEX minted from triage decisions and per BOM type (vex-cbom, vex-aibom); versioned and downloadable
✗ No
VEX appears as a format Prisma Cloud consumes for Red Hat security data, not as customer VEX authored from triage
✗ No
VEX in SBOM reports is an open issue (413694)
✗ No
No documented VEX or OpenVEX output
Available without an enterprise upsell
A BOM capability sold only at the top tier is a compliance obligation with a paywall in front of it.
✓ Yes
SBOM, CBOM and AI-BOM generation are in the free CLI and write to disk unauthenticated; syncing a BOM into the Vulnetix platform is what needs an account above the community tier
✗ No
SBOM page requires an SCA module subscription
✗ No
Dependency scanning and the dependency list are Ultimate-tier features
✗ No
snyk sbom is documented as available to Enterprise plan customers only

CBOM — cryptography bill of materials

CycloneDX added crypto assets in 1.6 (ECMA-424). Post-quantum migration planning needs an inventory before it needs a plan.

Capability Vulnetix Prisma CloudGitLabSnyk
CBOM generation
CycloneDX 1.6 (ECMA-424) defines crypto assets. Producing one is the entry ticket to PQC migration work.
✓ Yes
vulnetix cbom emits a CycloneDX 1.6 or 1.7 CBOM from source, config, certificates and declared crypto libraries
✗ No
No cryptography bill of materials in the Application Security documentation
✗ No
Crypto asset support is an open epic (14930) and open SCA issue (585268)
✗ No
No cryptography bill of materials documented
Post-quantum posture per algorithm
An inventory that does not say which algorithms are quantum-vulnerable leaves the actual work undone.
✓ Yes
Every algorithm classified quantum-safe, quantum-vulnerable, deprecated or hybrid, with its NIST quantum-security level
✗ No
No algorithm-level quantum posture
✗ No
No algorithm-level quantum posture
✗ No
No algorithm-level quantum posture
Certificate and key inventory
Signature algorithms and key sizes on disk are half the migration problem.
✓ Yes
X.509 certificates and keys inventoried by signature algorithm, key type, size and validity; metadata only, key bytes are never read
✗ No
No certificate or key inventory in the SCA product
✗ No
No certificate or key inventory
✗ No
No certificate or key inventory
Regulator approval matrix
CNSA 2.0, BSI and ACSC do not agree on every algorithm, and you may owe more than one of them an answer.
✓ Yes
Per-algorithm approval annotated for NIST, CNSA 2.0, BSI, ACSC, CCCS, NUKIB, AIVD, NCSC and KpqC
✗ No
No regulator approval matrix
✗ No
No regulator approval matrix
✗ No
No regulator approval matrix
Crypto in protocol and configuration files
Most weak cryptography in production is configured, not coded: a cipher suite list, an SSH Kex line, a JWT alg.
✓ Yes
TLS cipher suites and versions, SSH Ciphers/KexAlgorithms/MACs, JWT alg values, OpenSSL and IPsec configuration read alongside source-code crypto APIs and declared crypto libraries
✗ No
No crypto inventory of any kind in the Application Security documentation
✗ No
Crypto assets are an open epic (14930); protocol and config crypto is not inventoried
✗ No
No crypto inventory documented, in source or in configuration
CI gate on post-quantum posture
An inventory nobody can fail a build on is a report, not a control.
✓ Yes
vulnetix cbom --fail-on quantum-vulnerable (or deprecated) exits non-zero; opt-in, so the default run stays a report
✗ No
No CBOM, so nothing to gate a build on
✗ No
No CBOM, so nothing to gate a build on
✗ No
No CBOM, so nothing to gate a build on

AI-BOM — AI bill of materials

Models, agents, tool calls and MCP servers are dependencies now. Most SCA tools cannot see any of them.

Capability Vulnetix Prisma CloudGitLabSnyk
AI-BOM generation
EO 14412 and the EU AI Act both push toward declaring what AI is inside a product.
✓ Yes
vulnetix aibom emits a CycloneDX AI-BOM; no source content leaves the machine
✗ No
No repository-scoped AI-BOM; AI-SPM and Prisma AIRS inventory cloud and SaaS AI assets instead
✗ No
No AI bill of materials in the product
✓ Yes
snyk aibom is GA and emits CycloneDX 1.6 JSON, with an optional HTML view
Models and providers from source
The model string in a call site is the dependency, and it changes without a version bump.
✓ Yes
SDK usage per language plus the model literals passed to it, anchored on the SDK parameter so unreleased model names are still captured
~ Partial
AI-SPM and AIRS discover models and agents in cloud, SaaS and endpoint environments — not from a repository scan
✗ No
No model or dataset inventory from source
✓ Yes
Foundational and open-source models with model-card and licence information where available
Agents, tools and MCP servers
An MCP server is remote code with your credentials. It belongs in an inventory.
✓ Yes
Agent and assistant configs, skills, hooks, plugins, commands and MCP manifests (.mcp.json and friends) recorded as evidence
~ Partial
AIRS 3.0 discovers AI agents and connections at runtime; no MCP inventory tied to a commit
✗ No
No agent, tool-call or MCP inventory
✓ Yes
Agents from popular agent libraries, tool calls from common patterns, MCP servers from the official SDK
AI infrastructure from IaC
A vLLM deployment and a vector database are part of the AI system whether or not any Python imports them.
✓ Yes
Kubernetes (incl. KServe, Kubeflow, KubeRay), compose and Dockerfiles: serving runtimes, agent platforms, vector databases, declared model identities and GPU requests
~ Partial
Cloud posture management covers deployed AI infrastructure; not derived from IaC in the repo
✗ No
AI infrastructure in IaC is not inventoried as AI components
✗ No
Source-code centric; AI infrastructure declared in Kubernetes or compose files is not inventoried
Shadow-AI signals outside code
Most unsanctioned AI arrives as a config file or an environment variable, not an import.
✓ Yes
Known AI tool and provider environment variable NAMES (values are never read) plus tool config directories, instructions and ignore files
~ Partial
Shadow-AI discovery exists at the network and cloud layer, not in the code scanner
✗ No
No shadow-AI discovery from configs or environment variable names
~ Partial
Detects AI usage present in source for four languages; no config-directory or environment-variable-name discovery
Agent-authored commits as AI evidence
A coding agent that leaves no config behind still leaves its commits, and a cloud agent may leave nothing else at all.
✓ Yes
Commit history matched against the catalog: Co-Authored-By trailers, session markers and agent bot identities, so agents like Devin or Jules are inventoried even with no working-tree trace
✗ No
No commit-history analysis for agent authorship in the code scanner
✗ No
AI Impact analytics measure GitLab Duo usage; no commit-authorship inventory of third-party coding agents, and no AI-BOM to put one in
✗ No
snyk aibom reads source code for models, agents and MCP servers; commit authorship is not an input

Palo Alto Networks: Prisma Cloud — Application Security (SCA)

A cloud security platform whose SCA module produces an SBOM as one output among many. Strongest where the rest of the platform is: the cloud runtime.

Evidence. Prisma Cloud publishes less implementation detail than the other two vendors here, so we sent Palo Alto Networks a ten-question SBOM questionnaire and they answered it in writing. Every Prisma Cloud verdict below is either from that written answer or from the public SCA documentation. Their answers were candid about limitations, and the gaps listed here are largely ones they named themselves.

What Prisma Cloud does well

Documented gaps

Where Prisma Cloud is genuinely ahead

Live resolution is the real strength. For seven ecosystems the platform runs the actual package manager against the cloned repository, which means the dependency tree matches what the customer's own build would produce — including transitive resolution rules that are painful to emulate correctly. Vulnetix parses committed manifests and lockfiles and, for a few ecosystems, asks you to build or generate a lockfile first rather than guess at a tree. Where no lockfile exists and nobody will add one, Prisma Cloud gets an answer and Vulnetix asks a question.

The second strength is the platform around the SBOM. Image-to-repository tracing, runtime context and an infrastructure BOM are things a repository-scoped tool cannot produce, and for an organisation whose primary risk surface is the cloud estate, that context is worth more than a more complete manifest parse.

Where the inventory has holes

The gaps cluster in one place: anything that is not a recognised manifest file. Vendored source, committed binaries, Dockerfile RUN installs and CI-installed tooling are all invisible to source-repo scanning, and the vendor says so plainly. Container image scanning recovers part of that, but as a separate output with its own scope — packages installed through a package manager during the image build — and it is not merged into the source SBOM. So the answer to "is this component in my SBOM" depends on which of two SBOMs you are looking at.

Vulnetix takes the opposite approach on both counts: Dockerfile and Containerfile parsing happens in the same pass as manifest parsing and lands in the same BOM, and committed ELF binaries are hashed and looked up against CIRCL hashlookup and MalwareBazaar. We are not better everywhere — Snyk fingerprints vendored C/C++ source, which neither Prisma Cloud nor Vulnetix does — but the specific case of "somebody committed a binary" is covered here and explicitly not there.

The JavaScript and Python gaps are the ones most likely to bite an ordinary engineering org. pnpm, Yarn Berry, npm workspaces and Poetry are not exotic; a monorepo read only at its root produces an SBOM that looks complete and is not. Vulnetix reads all of those lockfiles wherever they appear in the tree, and so does GitLab.

The same shape of gap covers two newer rows in this comparison. A statically linked Go service carries its whole module list inside the binary, and a CI job that apt-gets a package puts that package in the build; Prisma Cloud reads neither — the vendor answer says bundled binaries "will not be detected" and that source scanning does not parse CI configuration. Vulnetix reads Go build info, Rust cargo-auditable data and JVM archive coordinates out of the artefacts themselves, and parses install commands out of around forty CI systems plus shell scripts and Makefiles, into the same document.

CBOM and AI-BOM: not a comparison

There is nothing to compare here. Prisma Cloud produces no cryptography bill of materials and no repository-scoped AI-BOM. Palo Alto Networks does have serious AI security products — AI-SPM for cloud AI posture, and Prisma AIRS for discovering agents and models across cloud, SaaS and endpoints — and an organisation buying AI runtime security should look at them. But an AI asset inventory in a cloud console is not a CycloneDX AI-BOM attached to a commit, and it does not satisfy a customer or regulator asking for one.

If a CBOM is on your roadmap because of post-quantum migration deadlines, this is a hard gap rather than a soft one: no crypto inventory, no algorithm classification, no certificate posture.

Verdict against Vulnetix. Prisma Cloud is a cloud platform with an SBOM feature, not a bill-of-materials tool. If your problem is "what is running in my cloud and where did it come from", it answers that better than Vulnetix does. If your problem is "produce a complete, accurate, signed inventory of this repository, including crypto and AI", the vendor's own answers describe several holes in that inventory, and two of the three BOM types do not exist at all.

Sources: Prisma Cloud — Software Composition Analysis · Prisma Cloud — SBOM · Palo Alto Networks — AI-SPM · Written vendor answers to our SBOM questionnaire (reproduced on this page)

GitLab: GitLab Ultimate — Dependency Scanning (SBOM-based)

SBOM-based dependency scanning went generally available in GitLab 19.0. If your code already lives in GitLab, this is the least friction available to anyone.

Evidence. All GitLab verdicts come from GitLab's public documentation and its own issue tracker, which is unusually candid — where something is not shipped, there is generally an open issue saying so.

What GitLab does well

Documented gaps

Where GitLab is genuinely ahead

Friction. The analyzer is a CI job in a pipeline you already run, the results land in a UI your developers already have open, and dependency paths are one click from the finding. Vulnetix runs as a CLI in your pipeline and posts results to a separate console; for a team that lives inside GitLab, that is one more place to look.

Automatic dependency resolution deserves credit too. For Maven, Gradle and Python, GitLab will generate the missing lockfile or graph export by running the ecosystem's own tooling rather than refusing to produce an answer. Vulnetix is more conservative here — for Cargo and Composer we ask you to build or generate a lockfile instead of inferring a tree we cannot verify. Both positions are defensible; GitLab's produces an SBOM in more situations, ours produces fewer SBOMs that are quietly wrong.

And the CycloneDX ingestion path is genuinely good design: any CycloneDX report from any tool joins the same dependency list. That is the same instinct behind Vulnetix accepting CycloneDX, SPDX, SARIF, OpenVEX and CSAF-VEX uploads.

The static reachability phase deserves particular credit. GitLab parses source files to mark which SBOM components are actually used and writes that back into the SBOM, so the artefact carries prioritisation signal rather than just an inventory. Vulnetix builds a tree-sitter call graph and walks it from entry points to the vulnerable symbol named in the advisory, which is a different route to the same goal; the point worth making here is that GitLab is doing this properly and it is the second vendor in this comparison that does.

One BOM out of three

The substantive difference is scope. GitLab produces an SBOM. It produces no CBOM — that work is an open epic — and no AI-BOM at all. If your driver is post-quantum readiness or an AI transparency obligation, GitLab does not have an answer today, and its own tracker is where you can watch for one.

Vulnetix emits all three from the same CLI, into the same CycloneDX 1.6/1.7 family, with the AI-BOM covering models, agents, MCP servers, AI infrastructure declared in Kubernetes and compose files, and shadow-AI signals from tool configs and environment variable names. The CBOM classifies every algorithm for quantum posture and annotates it against nine regulators.

Format and evidence gaps

Two smaller gaps matter in regulated procurement. SPDX is not available — the export menu offers GitLab JSON, CSV and CycloneDX — and a customer whose supply-chain policy is written around SPDX will not accept "we can give you CycloneDX instead" as an answer forever. Vulnetix emits SPDX 2.3 JSON as well as CycloneDX.

The other is VEX. GitLab has an open issue to add VEX to SBOM reports; until it ships, an SBOM handed to a customer says what is in the product but not which of the listed CVEs actually affect it. Vulnetix mints OpenVEX from triage decisions and alongside each BOM type, which is the difference between shipping a list of 400 CVEs and shipping a defensible statement about them.

A third is quieter and shows up in the new dependency-graph row. GitLab ingests dependency paths and shows them in the dependency list, which is genuinely useful in the UI — but adding a CycloneDX dependencies array with ref and dependsOn to the emitted SBOM is still open issue 428073. So the graph exists inside GitLab and not inside the artefact you hand to someone else. Snyk emits the array; so does Vulnetix, built from lockfile and installed-tree edges plus the module graph recovered from binaries.

Verdict against Vulnetix. GitLab has the best SBOM story of the three competitors here, and for a GitLab-native team the friction argument is close to unanswerable. The comparison is not really about SBOM quality — it is that GitLab produces one of the three bills of materials, in one format family, without VEX, and only on Ultimate.

Sources: GitLab — Dependency scanning by using SBOM · GitLab — Dependency list · GitLab — Dependency list export API (formats) · GitLab epic 14930 — Add support for crypto assets [CBOM] (open) · GitLab issue 436388 — Export dependency list in SPDX format (open) · GitLab issue 413694 — Support VEX in SBOM reports (open) · GitLab issue 428073 — Add CycloneDX dependency relationship and author fields (open) · GitLab — Container scanning (CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN) · GitLab — Offline environments · GitLab — SLSA provenance attestations

Snyk: Snyk Open Source — snyk sbom, snyk sbom test, snyk aibom

The strongest BOM tooling of the three competitors, and the only one besides Vulnetix shipping an AI-BOM. Format support is excellent; the constraint is what sits behind the Enterprise plan.

Evidence. All Snyk verdicts come from Snyk's CLI documentation and supported-language pages.

What Snyk does well

Documented gaps

Where Snyk is genuinely ahead

Vendored C/C++ is the honest one. snyk test --unmanaged converts files into hashes and matches them against Snyk's database, so a copied-in library with no manifest still resolves to a package, a version and its CVEs. Vulnetix hashes committed ELF binaries and looks them up against CIRCL hashlookup and MalwareBazaar, which answers "is this binary known and is it malicious" but not "which open source library is this source tree a copy of". For C and C++ estates where vendoring is the norm rather than the exception, that is a real advantage and it should weigh in the decision.

Format breadth is the second. CycloneDX in three spec versions and two encodings plus SPDX 2.3 covers essentially any customer request. Vulnetix emits CycloneDX 1.6/1.7 JSON and SPDX 2.3 JSON — no XML — so a customer with an XML-only intake pipeline is better served by Snyk today.

And snyk sbom test is a genuinely useful piece of the ecosystem: point it at a vendor-supplied SBOM and get vulnerabilities back. Vulnetix ingests third-party CycloneDX, SPDX, SARIF, OpenVEX and CSAF-VEX for the same reason.

Binaries inside images are close to a draw. Snyk Container reverse-parses Go binaries built with module support and unpacks nested JARs as deep as you ask, on by default since CLI 1.1090.0, which covers the common case well. Vulnetix reads the same Go build info plus Rust cargo-auditable crate lists and JVM archive coordinates, and does it for binaries committed to a repository as well as ones inside an unpacked image or a saved tar — then attributes each file to the dpkg, apk or pacman package that installed it, so a binary that arrived outside the package manager is visible as such. Snyk covers more languages in the image; Vulnetix covers more places and says where each artefact came from.

AI-BOM: the one comparison that is close

Both tools ship an AI-BOM and both emit CycloneDX 1.6. Snyk covers Python, Java, JavaScript and Go, identifying foundational and open-source models with model-card and licence metadata where available, agents from popular agent libraries, tool calls from common patterns, and MCP servers from the official SDK. That is a strong, well-scoped product.

Vulnetix approaches the same problem from more directions: SDK call sites and the model literals passed to them (anchored on the SDK parameter, so a model released next month is still captured); AI tool and provider environment variable names, read as names only, never values; agent and assistant config directories, instructions, skills, hooks, plugins and MCP manifests; and AI infrastructure declared in Kubernetes manifests including KServe, Kubeflow and KubeRay CRDs, compose files and Dockerfiles — serving runtimes such as vLLM, TGI, Triton and Ollama, vector databases, model-artifact volumes and GPU requests.

The practical difference is what counts as AI in your organisation. If AI means SDK calls in application code, the two are comparable. If it means a self-hosted inference stack, a vector database and a fleet of coding agents configured per developer, more of that is visible to a scanner that also reads IaC and tool configuration. Vulnetix also drops values it cannot verify — templated Helm values, secret-referenced envs, non-semver image tags — rather than guessing, which is the behaviour you want in an artefact you may have to defend.

CBOM, VEX and the plan gate

Snyk has no CBOM. For an organisation with a post-quantum migration on its roadmap — and after EO 14412 that is a growing number of them — that is a hard gap: no crypto asset inventory, no quantum-vulnerable classification, no certificate or key posture, no regulator matrix. Vulnetix classifies every detected algorithm as quantum-safe, quantum-vulnerable, deprecated or hybrid, records its NIST quantum-security level, and annotates approval status for NIST, CNSA 2.0, BSI, ACSC, CCCS, NUKIB, AIVD, NCSC and KpqC.

VEX is the second gap. Neither an SBOM nor an AI-BOM tells a customer which listed vulnerabilities actually affect the product; Vulnetix mints OpenVEX from triage decisions and per BOM type, versioned so an auditor can see what was asserted and when.

The third is commercial rather than technical, and worth stating plainly because it decides who can act: snyk sbom requires an Enterprise plan, and uv support sits behind Enterprise Early Access. Vulnetix generates SBOM, CBOM and AI-BOM from the free CLI. That is not a claim about which product is better — it is a claim about who gets to produce a bill of materials at all.

One consequence of that is worth its own row: Snyk documents that snyk sbom "requires an internet connection", so there is no way to produce a bill of materials on an air-gapped build agent or during an evaluation without an account. vulnetix cdx writes a schema-validated document with zero API calls and no credentials, which is the difference between a capability you can try today and one you can try after procurement.

Verdict against Vulnetix. Snyk is the closest competitor in this comparison and beats Vulnetix outright on vendored C/C++ detection and on CycloneDX XML output. The differences that remain are CBOM (Snyk has none), the breadth of the AI-BOM beyond source code, VEX, and the fact that generating an SBOM at all requires an Enterprise plan.

Sources: Snyk — snyk sbom · Snyk — snyk sbom test · Snyk — snyk aibom · Snyk — C/C++ unmanaged scanning · Snyk — support for uv · Snyk — detect application vulnerabilities in container images (Go binaries, nested JARs) · Snyk — container sbom

What Palo Alto Networks told us, in writing

Prisma Cloud publishes less SBOM implementation detail than the other two vendors, so rather than infer, we asked. These are the ten questions we sent and the substance of the answers Palo Alto Networks returned. Their answers were candid, and most of the gaps in the Prisma Cloud column are ones they named themselves.

1. How does Prisma Cloud generate an SBOM from source code — does it clone the repository?

Yes. The platform authenticates to the customer's VCS provider with a configured integration token, runs a real git clone, and stages the working tree into cloud storage as a snapshot that all scanners read. The SCA scanner then finds manifests and lockfiles per language and either parses the lockfile directly or runs the real package manager against the cloned files.

2. What types of files does the SBOM scanner inspect?

Source-repo scanning inspects manifests and lockfiles detected by filename — package.json and its lockfile, pom.xml, requirements.txt, go.mod and so on. Container image scanning is a separate layer that builds or pulls the image and reads OS and language package databases. The two are tracked as separate outputs and are not merged into one dependency graph.

3. Can it detect vendored or embedded components — binaries or library source committed into the repository?

No. In the vendor's words, a committed vendor/ folder, a bundled .jar or .dll, or third-party code pasted in rather than pulled via a package manager "will not be detected". Image scanning does not close the gap: it detects packages via OS and language package-manager databases, not arbitrary files copied in outside a package manager.

4. How is the build system determined?

Fully automatically, from which manifest and lockfile files are present, with disambiguation rules when several candidates share a folder (a lockfile takes precedence over its manifest). There is no way for a user to configure or override detection from a file in the repository.

5. How are alternative package managers and workflows handled — for example Yarn workspaces?

Yarn v1 workspaces produce incomplete results: only the root package.json and yarn.lock are read, so per-workspace direct dependencies and cross-workspace links are missed. npm-native workspaces (v7+), Yarn Berry (v2+), pnpm, Lerna/Nx and Poetry are not supported at all.

6. Does the SBOM distinguish test and development dependencies from runtime ones?

Inconsistently. The distinction exists for npm and Yarn but not for Java, Ruby or PHP, even where the underlying package metadata supports it. The vendor asked for this to be treated as a current limitation rather than a uniform guarantee.

7. Can it identify build-time dependencies, such as those installed by a Dockerfile or CI configuration?

Not at the source-repo level — Dockerfile instructions and CI pipeline files are not parsed for dependencies. Container image scanning partially covers this by inspecting the built image, as a separate scan and output that is not merged into the source SBOM.

8. What dependency resolution strategy is applied?

The package manager's own. Where a lockfile exists it is trusted and parsed directly; where one does not, the platform invokes the real build tool (Python, Maven, Gradle, Go, PHP, Ruby, .NET) so that resolution rules such as Maven nearest-wins are native behaviour rather than a reimplementation.

9. What support exists for private registries and authentication?

Private registries are recognised and credentials are handled securely through a platform-side integration, but coverage today is narrow — JFrog only, and only part of the languages. Other ecosystems are a current gap.

10. Can SBOM metadata — application name, repository URL, branch, organisation context — be customised per repository?

No. There is currently no supported mechanism for a repository owner to customise or override SBOM metadata from a configuration file in the repository.

Generate all three from one CLI

Vulnetix emits an SBOM, a CBOM and an AI-BOM in CycloneDX 1.6 or 1.7, SPDX 2.3 for licences, and OpenVEX beside each one. It runs on your machine or your CI runner: no repository clone into anyone's cloud, and no source content uploaded.

vulnetix scan     # SBOM  → .vulnetix/sbom.cdx.json
vulnetix cbom     # CBOM  → .vulnetix/cbom.cdx.json
vulnetix aibom    # AIBOM → .vulnetix/ai-bom.cdx.json

See how the code scanner works or read why SCA tools miss what they miss.

Get Started Free →