How to Check the Open Source in Your
Own Output in the AI Era

September 7, 2026
BomLens
1 / 8

Background

The Answer We Usually Get vs. What Scanning Actually Finds

The answer we usually get
Uses external software?
No
This is the answer most of the time
But
Scan a project shaped like that
Components
39
along with 19 vulnerabilities

The answer isn't wrong — it's that what we each mean by "external software" differs. It's hard to write Python without pulling in public libraries.

You declared 9 — what actually shipped was 39

requirements.txt
9
scan it
What actually shipped
39
Real dependency tree - each package you declared pulls in more libraries of its own

Those 9 pull in more libraries of their own. No one can track this list by hand.

Open Source Isn't Free — It's Conditional Permission

The source code is public
Anyone may use, modify, and redistribute it if they meet the conditions

It looks free because you don't pay for it, but what it really means is permission granted on condition. Break the condition and it becomes a copyright problem.

One command
pip install
and you're already using open source
ReferenceWhat is an open source license? sktelecom.github.io/guide/use/license/

A License Is the Copyright Holder's Terms of Use

Disclosure obligation increases
Permissive
MIT · Apache-2.0 · BSD
Just keep the attribution notice
Weak copyleft
LGPL · MPL
Only your changes to that library must be disclosed
Strong copyleft
GPL
You may have to disclose your own source too
A separate axis
Usage restrictions — terms like CC-BY-NC aren't about disclosure; they're about whether commercial use is allowed at all. You can't rank them on the same scale as the three tiers above.
When it applies
Only on redistribution — handing source or a binary to someone else: shipping to a customer, selling it, giving it to a third party. Using it purely in-house triggers no obligation.
ReferenceObligations by open source license sktelecom.github.io/guide/use/obligation/

Breaking License Terms Is Copyright InfringementCase

Jacobsen v. Katzer (2008, U.S. Court of Appeals for the Federal Circuit)
Jacobsen, who built model-railroad control software (the JMRI project), sued Katzer for using his open source code without the attribution the Artistic License required. The trial court treated it as a simple breach of contract, but the appeals court reversed, holding that violating open source license terms is copyright infringement.

Complying with license terms isn't optional. Break them and it becomes unauthorized use — copyright infringement.

ReferenceJacobsen v. Katzer summary wiki.creativecommons.org/wiki/Jacobsen_v._Katzer

Known Vulnerabilities Are Public, Disclosed Flaws

HIGH CVE-2024-34069
Version you're on
3.0.1
upgrade to
Fixed version
3.0.3

The problem is: if you don't know which library you use and at what version, you can't cross-check it at all.

A Flaw Like This Almost ShippedCase

The xz-utils backdoor (CVE-2024-3094, CVSS 10.0)
An account that had spent over two years building trust as a maintainer of the widely used compression library xz-utils planted a backdoor directly in it. Because OpenSSH depends on this library, an attacker holding a specific private key could execute remote code over SSH. It was about to land in major Linux distributions when one developer happened to notice SSH logins had gotten strangely slow — and caught it.

This was a package received normally through an official distribution channel. Without a record of the version and provenance, you wouldn't even know you were running that version after the problem became public.

ReferenceXZ Utils backdoor en.wikipedia.org/wiki/XZ_Utils_backdoor

An SBOM (Software Bill of Materials) Is a Parts List for Software

It records every component's name, version, license, and origin in a machine-readable format. It's not a document for people to read — it's a list a tool cross-checks automatically.

{
  "name": "Flask",
  "version": "3.0.0",
  "purl": "pkg:pypi/flask@3.0.0",
  "licenses": [{ "id": "BSD-3-Clause" }]
}

Name, version, license, and origin all go in a fixed format. There are two international standard formats: CycloneDX and SPDX.

ReferenceWhat is an SBOM? sktelecom.github.io/guide/supply-chain/sbom/

Regulation and Submission Requirements Have Already Started

202105.202609.2026Now
United States
SBOMs required for software delivered to the federal government
G7
50 minimum elements for AI SBOMs
Europe
CRA vulnerability-reporting duty takes effect
Customers and member companies
The submission requests already landing
ReferenceSoftware supply chain attacks and why security matters sktelecom.github.io/guide/supply-chain/overview/

Checking is a 3-step process

01
Build a list of
what's inside
One scan produces it
02
Use that list to check
obligations and vulnerabilities
Cross-check license terms and CVEs
03
A person judges what needs
review, and records it
This is where the tool can't answer for you

The tool does the first two. A person does the third.

2 / 8

What BomLens Can Check

SBOM Generation and Open Source Risk Assessment, Locally, in One PassToday's tool

From source code, containers, firmware, a received SBOM, or an AI model, it produces an SBOM, an open source notice file, and security/license risk reports.

BomLens
An open source tool released by SK Telecom
Anyone can download and use it
Runs on your own machine
Your code and data never leave it
No account needed
Install it and start right away
ReferenceBomLens repository github.com/sktelecom/bomlens

What Can It Scan

Source code
Java · Node.js · Python · Go · Ruby · PHP · Rust · .NET · Swift · Modelica
Build output and containers
The whole image
Firmware
Images that ship on a device
AI models
Weights and model cards
Public datasets
Research data repositories
The underlined ones are what we'll cover in depth today
ReferenceProcessing guide by input scenario sktelecom.github.io/bomlens/guides/by-input/

There Are 4 Ways to Run It — We'll Use the Script GUI Today

Windows installer
Double-click BomLens-Setup.exe
macOS installer
BomLens-Setup.dmg, needs quarantine removed
Script GUI
scan-sbom.sh --ui · today's demo environment (macOS)
Script
No screen — just produces result files
All four need a Docker engine
The installers aren't code-signed yet, so Windows shows SmartScreen and macOS shows a quarantine warning. Neither script form is affected. We'll go through each over the next 4 slides.
ReferenceQuick start for non-developers sktelecom.github.io/bomlens/start/no-cli/

The Windows Installer Is One Double-ClickRun mode 1 / 4

01
Install a Docker engine
(Rancher Desktop recommended)
Free, with a GUI. Docker Desktop is paid for large companies — watch out for that
02
Download and double-click
BomLens-Setup.exe
Get it from releases/latest. The UI opens with no console window
03
On SmartScreen, click
"More info → Run anyway"
The first run takes a few extra minutes to pull the image (about 250MB)
ReferenceQuick start for non-developers sktelecom.github.io/bomlens/start/no-cli/

The macOS Installer Needs One More Terminal CommandRun mode 2 / 4

01
Download and open
BomLens-Setup.dmg
Get it from releases/latest
02
Drag BomLens.app
to Applications
Same as installing any macOS app
03
Clear the quarantine
attribute in Terminal
Needed until it's notarized
xattr -dr com.apple.quarantine /Applications/BomLens.app

If it still won't open on Apple Silicon, run codesign --force --deep -s - /Applications/BomLens.app once more. Once it opens, the same web UI appears in the app's own window, not a browser.

ReferenceQuick start for non-developers sktelecom.github.io/bomlens/start/no-cli/

The Script GUI Opens With One Command in a FolderRun mode 3 / 4 · Today's demo

cd your-project-folder
./scripts/scan-sbom.sh --ui
The folder you ran it in becomes the "current folder"
There's no installer — the folder you ran it from in the console is both the scan target and where results are saved. A browser opens automatically at http://localhost:8080.

To scan a different folder, close that window and run it again from the folder you want.

ReferenceGetting started · Web UI sktelecom.github.io/bomlens/start/first-scan/

The Script Just Produces Files, With No ScreenRun mode 4 / 4

./scripts/scan-sbom.sh --project "MyApp" --version "1.0.0" \
  --target examples/nodejs --all --generate-only
Target
Current directory if --target is omitted
Also works with a ZIP (--target app.zip), an existing SBOM (--analyze), firmware (--firmware), a Docker image, or straight from --git with no clone step.
Use case
Automation and CI pipelines
--all produces the notice file, SBOM, and risk analysis together; --generate-only saves locally with no upload.
ReferenceCLI reference sktelecom.github.io/bomlens/reference/cli/
3 / 8

Before You Scan

The First Thing You Need Is a Manifest File

It's the file where your build tool declares which libraries the project uses. The scanner treats this file as its starting point, and the name differs by language — check where yours lives before you scan.

Java (Maven)pom.xml
Java (Gradle)build.gradle
Node.jspackage.json + package-lock.json
Pythonrequirements.txt or pyproject.toml
Gogo.mod + go.sum
RustCargo.lock
RubyGemfile.lock
PHPcomposer.lock
.NET*.csproj + packages.lock.json
SwiftPackage.resolved or Podfile.lock

Today's example (Python) uses requirements.txt. If you use another language, find your row above.

ReferenceSupported ecosystems sktelecom.github.io/bomlens/reference/ecosystems/

Delete the manifest file and 39 becomes 0Key point

app.pyrequirements.txt
39components
app.pyrequirements.txt
0components

The code hasn't changed at all. The scanner doesn't infer libraries by analyzing your code — it resolves dependencies starting from the manifest. Zero results doesn't mean safe. It means the scan never ran.

That Signal Shows Up in the Run Log

Check the run log for these two lines. They're logged at different points, under different conditions.

[INFO] Language: unknown -> cdxgen all-in-one
[WARN] No package manifest detected; using cdxgen all-in-one.
[WARN] For C/C++, use --identify-vendored to find vendored code.
… 30+ lines of build log …
[INFO] SBOM ready: python-example_1.0.0_bom.json
[WARN] SBOM has 0 components — missing lockfile or empty source.
Manifest not detected
Only appears when the language wasn't recognized
No manifest at all was found — no requirements.txt, no package.json, nothing.
Zero components
Shows up whenever the result is empty, regardless of cause
Appears whether there's no manifest or the path was simply wrong. Use the log above to tell which.

Check These 4 Things Before You Scan

Manifest file location
Check that requirements.txt / pyproject.toml sits at the top level. Bury it in a subfolder like src/ and the tool won't find it — you'll get zero.
Pinned versions
Check versions are pinned with ==, like flask==3.0.0. Leave them unpinned and the tool shows "whatever version installs right now," which can differ from the version actually on your machine.
Scan type
Check the run log shows Mode: SOURCE. A different mode gives a different result even for the same project.
Under version control
Check the manifest file is actually committed to Git. If it's only on your machine because .gitignore excludes it, it'll be missing from the submission archive or repository.

Checking just these four things heads off most zero-result false alarms.

4 / 8

Let's Generate One

A Flask-Based Example API Managed With requirements.txtToday's scan target

The 39 components and 19 vulnerabilities you've seen on earlier slides are the result of scanning this exact code.

01
Pick a folder
This project's folder
02
Name and version
Gets attached to the result files
03
Run
The log streams out
ReferenceSample code repository github.com/sktelecom/bomlens/tree/main/examples/python

Running ItDemo

Scan progress screen

One scan produces 4 artifacts

Result of a single scan

For external submission
SBOMCycloneDX / SPDX, must include transitive dependencies
Notice fileGoes into the distributed product
For internal review
Security reportVulnerabilities and remediation deadlines
Risk analysis reportLicense classification and risk
ReferenceOutput reference sktelecom.github.io/bomlens/reference/artifacts/ Supplier submission requirements sktelecom.github.io/guide/supply-chain/for-suppliers/requirements/
5 / 8

Reading the Results

The first thing to check when you open the results: 3 numbers

39
Components
Should be higher than the 9 lines you wrote yourself
19
Vulnerabilities
5 of them are High
9
License types
The number of distinct terms you'll need to check

These three numbers alone tell you whether the scan actually worked.

The Results Screen Answers 3 Questions

Components "What version is this?"
Component list
Dependencies "Why did this get pulled in?"
Dependency graph
Source tree "What did it actually scan?"
Source tree

Name, version, license, and origin all show on one row of the components screen. We'll come back to why the version matters shortly.

Working Through One ItemReal data from today's scan

urllib3 2.1.0 · a direct dependency listed in requirements.txt, also pulled in by requests
HIGH · 4MEDIUM · 2 6 vulnerabilities
Current version
2.1.0
upgrade to
Fixes all 6
2.7.0
License: MIT — permissive, no conditions
This item is flagged for security, not for its license. We record the decision as "needs upgrade" and move to the next section.

When you see an item like this in your own project, work it the same way — check the license, cross-check the version, record the conclusion.

Every License Category Carries a Different ObligationKey point

Simple example  39 items
3 items need review
Real research project  113 items
57 items need review
Permissive Weak copyleft Unclassified · needs a human look
Permissive
Put the name and full license text in the notice file
That's all it takes
Weak copyleft
Disclose only the source of what you changed in that library
Mandatory when you redistribute
Unclassified
The obligation itself is still unknown
Until you check, you can't call it compliant
ReferenceCellpose repository github.com/MouseLand/cellpose

Vulnerabilities Come With the Fixed Version Attached

Vulnerability list
Recommended remediation deadline
Critical within 7 days · High within 30 days. Severity names appear in English on screen.
You get the fix, not just the problem. In this example, 5 of the 19 findings were High.

CVSS, CVE, and fixed versions come from the ecosystem security databases Trivy cross-checks; EPSS is a live lookup against FIRST.org. On an air-gapped network only EPSS is skipped — everything else still shows.

6 / 8

AI Models and Datasets

Using a public model means checking 3 things

CodeThe repository's LICENSE fileLicense A
Model (weights)However the model distributor labeled itLicense B
Training dataSometimes only written in the README bodyLicense C
One deliverable = you must satisfy A + B + C, all of them

These three can each be different. It's easy to check the code license and call it done.

ReferenceAI model SBOM guide sktelecom.github.io/bomlens/guides/ai-model/

Real Cases for Code, Model, and Data — Each OneCase

LayerCaseOutcome
CodeThe BusyBox GPL lawsuits (2009)14 companies sued, including Samsung and Best Buy; Westinghouse was ordered to pay over $100,000 in damages and stop distribution
ModelGetty Images v. Stability AI (2025)The copyright claim against the model itself was dismissed, but a watermark left in outputs was found to infringe trademark
Training dataBartz v. Anthropic (2025)Training on pirated books came to light, leading to a $1.5 billion settlement — the largest copyright settlement on record

Once it becomes litigation, this is the scale of damages you're looking at.

Reference BusyBox GPL lawsuit softwarefreedom.org/news/2009/dec/14/busybox-gpl-lawsuit Getty Images v. Stability AI clearygottlieb.com/.../getty-images-v-stability-ai Anthropic authors' settlement npr.org/2025/09/05/...anthropic-authors-settlement

Scanning a Real Cell-Imaging Analysis ToolDemo

LayerTargetFinding
Codegithub.com/MouseLand/cellpose113 components · 4 weak-copyleft
Modelhuggingface.co/mouseland/cellpose-samBSD-3-Clause
Training datacellpose.org/datasetOut of the tool's reach
One deliverable = you must satisfy all 3

The code and model are checked. But the training data is outside what the tool can reach — is it still safe to use as-is?

ReferenceCode repository github.com/MouseLand/cellpose Model weights huggingface.co/mouseland/cellpose-sam Training dataset cellpose.org/dataset

Even When You Go Looking, the Model Card Has No Training-Data Terms

cellpose-sam model / dataset screen. Both the dataset and training-data-usage-terms fields are empty (—), and the disclosed-information panel's training-data and training-process fields are blank
The original model card has no field describing the training data
This indicator only shows whether the model card documents that field — it doesn't judge whether the model is actually open or closed. For cellpose-sam, license and file security both read "no constraint signal," but both the dataset and training-data-usage-terms fields are empty (—). In the disclosed-information panel below, only weights and architecture are filled in; training data and training process are blank.

The model card alone can't tell you — someone has to go find the original page.

ReferenceAI model SBOM guide sktelecom.github.io/bomlens/guides/ai-model/

Go Look, and Here's What You FindCase

# Page visited
cellpose.org/dataset
"non-commercial, educational, research and personal use only"
This is HHMI's (Howard Hughes Medical Institute) own custom terms of use. It explicitly bars commercial use and redistribution ("strictly prohibited"). Since it's the site's own terms rather than Creative Commons, there's no standard license identifier for it.

So the verdict is non-commercial, no-redistribution terms — something only a person reading the original text could have found, not the tool.

Referencecellpose.org/dataset terms of use cellpose.org/dataset

Intended Use Changes the License Verdict

The non-commercial terms on cellpose.org we just found carry different weight depending on how you intend to use it.

Bundled into a product
Caution
The non-commercial terms apply as-is
change the intended use
Internal review / research
Conditional use
Applies less strictly
Ranked from most to least severe. Going by name alone, it's easy to mistake the order.
Caution
Most severe
Review needed
Conditional use
No constraint signal
Least severe
Only the license judgment moves
Vulnerability (CVE) severity stays the same regardless of intended use. License terms and security risk are separate axes.
7 / 8

Where Automated Checking Stops

4 things the tool leaves unanswered, on purpose

When there's no basis to decide, the tool doesn't guess — it leaves the state as-is.

01
Items with no license
The distributor never declared one
02
Items with ambiguous labeling
A name attached that isn't a standard identifier
03
Items you don't actually use
Consider excluding anything used only in tests
04
Code you wrote yourself
Not something to classify — declare it and it becomes the baseline for comparison
ReferenceChecking open source licenses sktelecom.github.io/guide/use/check/

3 Things That Leave Evidence Behind the Results

01
Same input,
same SBOM
The --byte-stable flag guarantees reproducibility — no drift across audits or resubmissions
02
Run the finished SBOM
through validation
Validates an SBOM produced by any other tool against the same standard
03
Record the
human judgment
This is the one thing no tool can stand in for
The conformance screen has four states
Met, actionable, needs human review, and not applicable. Items with nothing to measure fall under "not applicable" — don't count those as unmet.
ReferenceSupplier SBOM validation guide sktelecom.github.io/bomlens/guides/supplier-sbom/

Keep the Record in a Single Table

For anything the tool only flagged as "needs review," record the project owner's decision and the reasoning like this.

ItemDispositionRationaleDate · Owner
ModelicaLicense confirmed GitHub repository license detection confirmed BSD-3-Clause09-06 · J. Doe
BuildingsNeeds review No standard LICENSE file on GitHub — must check the repository docs directly09-06 · J. Doe
analysis_core.pyIn-house code Written internally, no external code referenced09-06 · J. Doe

Keep it in the same folder as the SBOM output. Whoever inherits the project should be able to answer why it was handled that way.

When Should You Rescan?

There are two triggers for rescanning — something changed, or time has passed.

When something changes
Adding a library or
bumping a version
Right before you ship externallyAlways rerun it
Rescan
When time passes
On a cadence, e.g. quarterlyBecause new vulnerabilities keep getting disclosed

Run it once and stop, and all you have is a snapshot of that one moment. If the submitted list and what actually shipped diverge, the notice itself becomes wrong.

ReferenceCI/CD integration sktelecom.github.io/bomlens/guides/ci-cd/

Do These 3 Things After You Scan

Whatever's left on the results screen doesn't resolve itself. Work through it in this order.

01
Set a remediation plan
for vulnerabilities
Recommended deadlines: 7 days for critical, 30 for high
02
Decide on unclassified
licenses and record it
Check the labeling and source, then record the outcome in a table
03
Keep the notice file
with the SBOM
Both must ship together with your distribution
The risk analysis report already lays this out
01 and 03 come straight from the report's closing "Next steps" section; 02 comes from the same report's license classification table (Uncategorized).
8 / 8

Wrap-Up

Here's How to Get Started

No complicated onboarding — just follow these steps.

01
See it without
installing
Demo page
02
Install it
Pick the installer for your OS
03
Scan your
own project
Start by checking the manifest location
ReferenceBomLens demo sktelecom.github.io/bomlens/demo/ BomLens documentation sktelecom.github.io/bomlens/ GitHub repository github.com/sktelecom/bomlens

Managing Many Projects Over Time Needs an SCA Platform

SCA (Software Composition Analysis) is the automated discovery of open source components, licenses, and vulnerabilities. BomLens is one such tool.

BomLens
One scan = one result set
The generation tool we covered today
used together
TRUSCATRUSCA
Ongoing management across projects
An Apache-2.0 open source SCA portal
TRUSCA — a Trusted SCA, open-sourced
It manages CVEs, licenses, and SBOMs for multiple projects on one screen, and offers a CI/CD gate that blocks a build on a critical CVE or a banned license. It ingests the SBOM (CycloneDX) BomLens produces directly.
Reference TRUSCA repository github.com/trustedoss/trusca TRUSCA demo trusca-demo.duckdns.org

Thank You

That covers everything for today.

Questions about the tool or your scan
Haksung Jang (OSPO Manager) · haksung@sk.com
Send your scan log along with your question and we'll take a look.

The tool only goes as far as finding what needs review — deciding whether something is safe to use still needs its own review.