✅ BenefitsCyberIntermediate✨ AI-assisted

Benefits of an AI Bill of Materials for Audits

WittyTech Daily··4 min read
#ai-bom#cyclonedx#model-provenance#audit

The auditor asks which model was behind a decision made on a given date, and the honest answer is a Slack thread. An AI bill of materials (AI-BOM) replaces the thread with a file: a machine-readable inventory of the models, datasets, prompts and services a system depends on. This piece covers what that file buys you at audit time, using CycloneDX's ML-BOM format, and when it isn't worth the trouble.

What an AI bill of materials records

CycloneDX added ML-BOM support in version 1.5, which made machine-learning-model a valid component type. The current spec, v1.7, is standardized as ECMA-424, and OWASP publishes an Authoritative Guide to ML-BOM for it. Wavect's AI-BOM guide lists what belongs in one: the base model, adapters, prompts or policy packages that change behavior, training and evaluation datasets, the serving runtime, retrieval indexes, external APIs, licenses, hashes and suppliers.

A minimal CycloneDX document for a service that uses one model and one evaluation dataset looks like this:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.7",
  "version": 1,
  "components": [
    {
      "type": "application",
      "bom-ref": "svc-claims-triage",
      "name": "claims-triage-service",
      "version": "<release-tag>"
    },
    {
      "type": "machine-learning-model",
      "bom-ref": "model-claims-classifier",
      "name": "claims-classifier",
      "version": "<model-version>",
      "hashes": [
        { "alg": "SHA-256", "content": "<64-hex-chars-from-sha256sum-of-the-weights>" }
      ]
    },
    {
      "type": "data",
      "bom-ref": "data-claims-eval",
      "name": "claims-eval-set",
      "version": "<dataset-version>",
      "hashes": [
        { "alg": "SHA-256", "content": "<64-hex-chars-from-sha256sum-of-the-dataset-archive>" }
      ]
    }
  ],
  "dependencies": [
    {
      "ref": "svc-claims-triage",
      "dependsOn": ["model-claims-classifier", "data-claims-eval"]
    }
  ]
}

Every artifact gets a bom-ref, a version and a hashes entry with alg and content. The dependencies block says what uses what. Replace the angle-bracket placeholders with real values: a SHA-256 content must be 64 hex characters, and sha256sum <file> produces it.

Benefits of an AI bill of materials at audit time

1. Provenance by digest, not by name. claims-classifier:latest is a promise; a SHA-256 is a fact. Wavect's guide says to identify artifacts by immutable hashes or registry digests, never by a display name like latest. If someone swaps the weights under the same name, the digest in your BOM stops matching what is running, and that mismatch is your evidence. Hosted models have no weights for you to hash, so record the provider's dated model ID instead of a moving alias.

2. A withdrawn dependency becomes a search, not a meeting. A provider retires a model, a dataset is pulled over licensing, or a weights file turns out to be tampered with. The question is always "where do we run it?" Keep one BOM per release in a folder or artifact store and search by digest:

jq -r --arg h "<sha256-of-the-withdrawn-model>" '
  select(any(.components[]?; .type == "machine-learning-model"
    and any(.hashes[]?; .content == $h)))
  | input_filename' boms/*.cdx.json

This prints the file name of every BOM that contains the withdrawn digest. Name your files after the release and environment, and the output is your impact list.

3. Audit evidence that already exists. A BOM archived next to each release tag answers "what was behind this system on that date?" without anyone reconstructing it from memory. A summary of the OWASP guide says it maps CycloneDX elements to EU AI Act obligations such as Article 53 and Annex XI technical documentation. Those obligations sit mainly with general-purpose model providers, so check which ones apply to you. Wavect's framing is the useful one: an AI-BOM is evidence infrastructure, not a compliance badge.

4. A release gate that enforces the inventory. Wavect suggests failing a release for missing identity, prohibited licenses, unapproved models or absent evaluations. The smallest version is a check that every model carries a hash:

jq -e '[.components[]
  | select(.type == "machine-learning-model")
  | select((.hashes // []) | length == 0)] | length == 0' bom.cdx.json

With -e, jq exits non-zero when the result is false, so your CI job fails when any model has no hash. Extend the filter for licenses and approved suppliers as your policy grows.

When an AI-BOM is not worth it

One notebook, one hosted API, no customer data and nobody to audit you? A BOM is a file that goes stale before anyone reads it. A README line with the model ID and dataset version does the job.

Start generating BOMs when you have a second deployment, a customer security questionnaire or an actual auditor. Wavect sketches a two-sprint pilot if you want a rollout plan.

For anyone deploying AI in production, the BOM is the difference between answering an audit or a model withdrawal with a lookup and answering it with an afternoon of Slack archaeology.

← More in Cyber