Exporting an AI SBOM in CycloneDX 1.5
Your security team already has SBOM plumbing: Dependency-Track watching for new CVEs, procurement portals demanding SBOM attachments, maybe GUAC or an internal artifact store. The fastest way to get your AI supply chain into that machinery is to speak the format it already ingests: CycloneDX.
Why CycloneDX for AI components
CycloneDX 1.5 is an OWASP flagship standard with two properties that matter here:
- Package URLs (PURLs) give every component a canonical identity (
pkg:pypi/transformers@4.44.2), which is what downstream tools key vulnerability matching on. - The spec added ML-aware component types (
machine-learning-model,data) and model-card support, so a model is not forced to masquerade as a library.
An AI-BOM in CycloneDX form means one pipeline, one policy engine, one dashboard for both openssl and pytorch_model.bin.
Generating it in CI
The AIcap CLI emits CycloneDX with a single flag. In GitHub Actions:
jobs:
ai-sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate CycloneDX AI SBOM
run: |
curl -sL https://github.com/istrategeorge/AIcap/releases/download/v1.2.0/aicap-linux-amd64 -o aicap
chmod +x aicap
./aicap --cli . --cyclonedx > ai-sbom.cdx.json
- name: Upload SBOM artifact
uses: actions/upload-artifact@v4
with:
name: ai-sbom
path: ai-sbom.cdx.json
GitLab CI and Bitbucket Pipelines templates ship in the repository (templates/), pre-wired with the same artifact step.
What lands in the document
The export covers the full AI-BOM, not just pip packages:
- Libraries with versions, PURLs, and licences from every supported manifest (Python, Node, Go, Conda, poetry/pnpm/yarn lockfiles)
- Local model weights discovered on disk or inside container image layers, with their location as evidence
- Hosted-model dependencies detected from SDK usage and hardcoded model IDs
- Licence metadata where detectable — including model licences whose restrictions your policy engine may care about more than MIT-vs-Apache
Feeding Dependency-Track
Dependency-Track ingests the file as-is:
curl -X POST "https://dtrack.example.com/api/v1/bom" \
-H "X-Api-Key: $DTRACK_API_KEY" \
-F "project=$PROJECT_UUID" \
-F "bom=@ai-sbom.cdx.json"
From there your existing alerting applies: a new GHSA against transformers pages the same on-call as one against log4j. That single sentence is the entire business case — AI components stop being a separate, unmonitored universe.
Where the standard still falls short
Honesty section. CycloneDX's ML support is young:
- Vulnerability databases key on package PURLs; weight files don't have CVE identifiers, so a poisoned checkpoint won't page anyone. Treat the SBOM entry as inventory and provenance, not as vulnerability coverage.
- Hosted models (a
gpt-4oAPI dependency) have no registry to resolve against — they appear as components with evidence, and policy on them is yours to write. - Model cards in the wild are sparse; the spec supports more metadata than most sources provide.
These gaps are why the AI-BOM itself (with its OWASP ML / MITRE ATLAS risk register) remains the richer artefact — the CycloneDX export is the interoperability layer, not the whole story.
Compliance double-duty
The same export answers the EU AI Act. Annex IV Section 2 requires a description of system components including pre-trained models; attaching a standards-formatted, per-commit SBOM is a stronger answer than prose. Run both outputs from one scan: the JSON AI-BOM + Annex IV draft for the compliance file, the --cyclonedx document for the security toolchain.
AIcap generates your AI-BOM, risk register, and Annex IV draft from a single CI run — free CLI, EU-hosted ledger.
Get started free →