<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cdxgen | Haksung</title><link>https://haksungjang.github.io/en/tags/cdxgen/</link><description>Haksung Jang — Open Source Program Manager at SK telecom</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sun, 09 Aug 2026 22:27:14 +0900</lastBuildDate><atom:link href="https://haksungjang.github.io/en/tags/cdxgen/index.xml" rel="self" type="application/rss+xml"/><item><title>Tools and Automation</title><link>https://haksungjang.github.io/en/docs/sbom_guide/5-tools/</link><pubDate>Sun, 09 Aug 2026 22:27:14 +0900</pubDate><guid>https://haksungjang.github.io/en/docs/sbom_guide/5-tools/</guid><description>Covers SBOM generation, management, and scanning tools, and where automation ends and human responsibility begins.</description><content:encoded>&lt;![CDATA[<p>An SBOM workflow is not completed by a single tool. The three capabilities of generation,
vulnerability matching, and lifecycle management are split across different tools, and the
common conclusion of recent tool comparison analyses is that no single tool covers all three
areas completely. It is more accurate to think of it as assembling a pipeline from a combination
of tools.</p><h2 id="the-division-of-labor-among-generation-management-and-scanning">The Division of Labor Among Generation, Management, and Scanning</h2><p><img src="/docs/sbom_guide/5-tools/tool-roles-en.png" alt="Three categories of SBOM tools — generation, management, and matching — divide roles, with management and matching exchanging data on every new vulnerability"/><p><strong>Figure 1.</strong> The three roles of SBOM tools<em>(source: compiled from tool comparison analyses,
2026-01. Retrieved 2026-06-14)</em></p><p>In the generation space, Anchore&rsquo;s Syft is regarded as &ldquo;the dedicated tool that does SBOM
generation, and only that, best.&rdquo; Its attestation workflow, combined with the signing tool
cosign, is mature. OWASP CycloneDX&rsquo;s cdxgen is distinguished by broad support for multiple
languages and container images, and by a dedicated AI BOM mode.</p><p>In the management space, OWASP Dependency-Track has established itself as a platform for
monitoring component usage and security/license compliance across an organization&rsquo;s entire
application portfolio. Eclipse SW360 is another option centered on license compliance.</p><p>In the scanning space, Grype takes an SBOM as input and matches it against vulnerabilities,
while Aqua Security&rsquo;s Trivy is both a scanner and an SBOM generator.</p><table><thead><tr><th>Role</th><th>Representative open source tools</th><th>Characteristics</th></tr></thead><tbody><tr><td>Generation</td><td>Syft, cdxgen</td><td>Syft is generation-only with mature attestation; cdxgen offers multi-language support and an AI BOM mode</td></tr><tr><td>Management</td><td>Dependency-Track, SW360</td><td>Portfolio monitoring, license and vulnerability tracking</td></tr><tr><td>Matching/Scanning</td><td>Grype, Trivy</td><td>Matches an SBOM against a vulnerability database</td></tr></tbody></table><p><strong>Table 1.</strong> Classification of SBOM tools by role<em>(source: compiled from tool comparison
analyses, 2026-01. Retrieved 2026-06-14)</em></p><h2 id="how-far-does-automation-go">How Far Does Automation Go</h2><p>It is important to honestly distinguish between areas where automation works well and areas that
people must fill in.</p><table><thead><tr><th>Task</th><th>Automation maturity</th></tr></thead><tbody><tr><td>Code/dependency SBOM generation</td><td>Mature</td></tr><tr><td>Container image component identification</td><td>Mature</td></tr><tr><td>SBOM storage and vulnerability monitoring</td><td>Mature</td></tr><tr><td>Automated license identifier extraction</td><td>Partial (requires review)</td></tr><tr><td>Interpreting non-standard licenses and tracking compliance</td><td>Immature (people/policy)</td></tr></tbody></table><p><strong>Table 2.</strong> Automation maturity of SBOM tasks<em>(source: compiled from tool comparison analyses.
Retrieved 2026-06-14)</em></p><p>Tools do generation well. Put Syft or cdxgen into the build pipeline, and the component list
fills in automatically. But whether the license field of a generated SBOM is accurate, whether
the obligations of a non-standard license are met, and whether obligations propagate downstream
without omission are things no tool guarantees automatically. This area is filled by policy and
human review.</p><h2 id="the-tool-itself-is-an-attack-surface">The Tool Itself Is an Attack Surface</h2><p>Before trusting an automation tool, its own integrity must be verified. In January 2026, a case
was reported in which an SBOM tool was implicated in two supply chain attacks within a short
period, with the damage spreading to downstream projects. On this basis, some pipeline operators
removed the tool in question.</p><p>The fact that an SBOM generation tool can itself become a target of supply chain risk requires
combining hashes, signatures, and attestations at the generation and verification stages. This
same concern lies behind CISA&rsquo;s 2025 minimum elements draft adding Tool Name, Generation Context,
and Component Hash as new fields. Avoiding the paradox that &ldquo;an SBOM made by an untrustworthy
tool cannot be trusted&rdquo; requires pinning tool versions, verifying provenance, and signing the
output.</p><h2 id="sources">Sources</h2><p>Anchore.<em>Syft</em><a href="https://github.com/anchore/syft">https://github.com/anchore/syft</a>,<em>Grype</em><a href="https://github.com/anchore/grype">https://github.com/anchore/grype</a>.
OWASP.<em>cdxgen</em><a href="https://github.com/CycloneDX/cdxgen">https://github.com/CycloneDX/cdxgen</a>,<em>Dependency-Track</em><a href="https://dependencytrack.org/">https://dependencytrack.org/</a>. Aqua Security.<em>Trivy</em><a href="https://github.com/aquasecurity/trivy">https://github.com/aquasecurity/trivy</a>. Eclipse<em>SW360</em><a href="https://www.eclipse.org/sw360/">https://www.eclipse.org/sw360/</a>.
(All retrieved: 2026-06-14)</p>
]]></content:encoded></item><item><title>cdxgen</title><link>https://haksungjang.github.io/en/docs/ai-sbom_guide/5-tools/2-cdxgen/</link><pubDate>Sun, 09 Aug 2026 17:03:59 +0900</pubDate><guid>https://haksungjang.github.io/en/docs/ai-sbom_guide/5-tools/2-cdxgen/</guid><description>Explains how to use the AI BOM mode of OWASP cdxgen, which generates a CycloneDX SBOM from projects and models, together with actual execution output.</description><content:encoded>&lt;![CDATA[<h2 id="overview">Overview</h2><p>cdxgen is the official SBOM generator of the OWASP CycloneDX project. It supports more than 20
languages and package managers, and the latest version offers a dedicated AI BOM mode. It
automatically identifies the dependencies of AI applications (PyTorch, Transformers, and so on) and
integrates well with CI/CD pipelines.</p><p>From an AI SBOM standpoint, cdxgen&rsquo;s strength is speed and automation. Its weakness is that it does
not fill in license information in a default run. This trait shows up in the execution result below.
Where OWASP AIBOM Generator centers on model card metadata, cdxgen centers on code and dependencies.
Using both together covers both models and dependencies.</p><h2 id="key-features">Key Features</h2><ul><li>Identifies dependencies from source code and container images to generate a CycloneDX SBOM.</li><li>Includes AI/ML metadata (formulation) with AI BOM mode (<code>-t ai</code>).</li><li>Takes Hugging Face model URLs, Modelfiles, and GGUF artifacts directly as input.</li><li>Automatically submits SBOMs to a Dependency-Track server for continuous management.</li></ul><h2 id="installation">Installation</h2><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic"># One-off run (requires Node.js)</span></span></span><span style="display:flex;"><span>npx @cyclonedx/cdxgen@latest --version</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic"># Global install</span></span></span><span style="display:flex;"><span>npm install -g @cyclonedx/cdxgen</span></span></code></pre></div><h2 id="usage--generating-an-ai-bom">Usage — Generating an AI BOM</h2><p>Run in AI BOM mode from the AI project directory.</p><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic"># Generate an AI BOM</span></span></span><span style="display:flex;"><span>cdxgen -t ai -o aibom.json .</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic"># Generate including AI/ML metadata (formulation)</span></span></span><span style="display:flex;"><span>cdxgen -t ai --include-formulation -o aibom.json .</span></span></code></pre></div><p>Below is the actual result of running cdxgen against a summarization app (<code>transformers</code>,<code>torch</code>
dependencies) that loads a pretrained model (<code>facebook/bart-large-cnn</code>). It automatically identifies
5 dependencies and produces a CycloneDX 1.7 BOM.</p><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>$ cdxgen -t python --include-formulation -o aibom.json .</span></span><span style="display:flex;"><span>CycloneDX Generator 12.5.1 (Node.js)</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>Generated components — 5 entries (CycloneDX 1.7):</span></span><span style="display:flex;"><span> transformers 4.44.2 pkg:pypi/transformers@4.44.2 license: empty</span></span><span style="display:flex;"><span> torch 2.4.0 pkg:pypi/torch@2.4.0 license: empty</span></span><span style="display:flex;"><span> numpy 1.26.4 pkg:pypi/numpy@1.26.4 license: empty</span></span><span style="display:flex;"><span> tokenizers 0.19.1 pkg:pypi/tokenizers@0.19.1 license: empty</span></span><span style="display:flex;"><span> huggingface-hub 0.24.6 pkg:pypi/huggingface-hub@0.24.6 license: empty</span></span></code></pre></div><p><strong>Figure 1.</strong> cdxgen execution output<em>(cdxgen 12.5.1, run 2026-06-13)</em></p><p>One of the generated components looks like this. The identification evidence is filled in, but the<code>licenses</code> field is empty.</p><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#000;font-weight:bold">{</span></span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">"name"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#4e9a06">"transformers"</span><span style="color:#000;font-weight:bold">,</span></span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">"version"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#4e9a06">"4.44.2"</span><span style="color:#000;font-weight:bold">,</span></span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">"purl"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#4e9a06">"pkg:pypi/transformers@4.44.2"</span><span style="color:#000;font-weight:bold">,</span></span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">"type"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#4e9a06">"library"</span><span style="color:#000;font-weight:bold">,</span></span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">"evidence"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#000;font-weight:bold">{</span></span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">"identity"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#000;font-weight:bold">[</span></span></span><span style="display:flex;"><span><span style="color:#000;font-weight:bold">{</span><span style="color:#204a87;font-weight:bold">"field"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#4e9a06">"purl"</span><span style="color:#000;font-weight:bold">,</span><span style="color:#204a87;font-weight:bold">"confidence"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#0000cf;font-weight:bold">0.5</span><span style="color:#000;font-weight:bold">,</span></span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">"methods"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#000;font-weight:bold">[{</span><span style="color:#204a87;font-weight:bold">"technique"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#4e9a06">"manifest-analysis"</span><span style="color:#000;font-weight:bold">,</span><span style="color:#204a87;font-weight:bold">"value"</span><span style="color:#000;font-weight:bold">:</span><span style="color:#4e9a06">"requirements.txt"</span><span style="color:#000;font-weight:bold">}]</span><span style="color:#000;font-weight:bold">}</span></span></span><span style="display:flex;"><span><span style="color:#000;font-weight:bold">]</span></span></span><span style="display:flex;"><span><span style="color:#000;font-weight:bold">}</span></span></span><span style="display:flex;"><span><span style="color:#000;font-weight:bold">}</span></span></span></code></pre></div><h2 id="what-the-execution-result-shows">What the Execution Result Shows</h2><div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">cdxgen identifies quickly, but a human must fill in the license</div><p>cdxgen quickly identified 5 dependencies from<code>requirements.txt</code>, but the<code>licenses</code> field of each
component is empty. Also, the pretrained model<code>facebook/bart-large-cnn</code> that the app loads was not
captured in the BOM by code scanning alone. It must be collected separately as inbound material and
added. A realistic combination is to build the dependency skeleton quickly with cdxgen, have a human
verify and fill in the licenses, and generate the model separately with OWASP AIBOM Generator before
merging.</p></div><h2 id="see-also">See Also</h2><ul><li>AI SBOM generation and management procedure:<a href="/en/docs/ai-sbom_guide/2-ai-extension/3-ai-sbom/">3.9 AI SBOM</a></li><li>Generator centered on model metadata:<a href="/en/docs/ai-sbom_guide/5-tools/1-aibom-generator/">OWASP AIBOM Generator</a></li><li>SBOM management:<a href="https://openchain-project.github.io/OpenChain-KWG/guide/tools/7-dependency-track/">Dependency-Track</a>,<a href="https://openchain-project.github.io/OpenChain-KWG/guide/tools/8-cdxgen-dt/">cdxgen + Dependency-Track integration</a></li><li>Official:<a href="https://github.com/cdxgen/cdxgen/blob/master/docs/AI_BOM.md">cdxgen AI-BOM documentation</a></li></ul>
]]></content:encoded></item></channel></rss>