Engineers with a laptop at automation test rigs in a bright production hall

SBOM

AI-assisted SBOM and vulnerability triage for device firmware

Last updated:

AI-assisted SBOM and vulnerability triage turns a firmware image into a short, ordered list of vulnerabilities a device maker has to act on, checked against the CISA Known Exploited Vulnerabilities catalog, which held 1,779 entries in its 10 November 2026 release. The path has five steps: unpack the image, build an SBOM, match components to CVEs, prioritise with KEV and EPSS, and record "not affected" decisions as VEX. Code does the matching and scoring, AI explains the result in plain language, and an engineer makes every exploitability decision.

Key takeaways

  • AI-assisted triage means that software does the mechanical work of finding and ranking known vulnerabilities in a firmware image, and a language model turns the ranked result into readable, cited notes for an engineer.
  • To build an SBOM without source code, unpack the image with an extraction tool and run an SBOM generator over the extracted file systems.
  • CVE matching produces false positives on firmware because it compares names and version strings, and firmware breaks both.
  • Put CVEs in the CISA Known Exploited Vulnerabilities catalog first, then order the rest by the FIRST EPSS score, and use CVSS to break ties on impact.

What does AI-assisted vulnerability triage for firmware mean?

AI-assisted triage means that software does the mechanical work of finding and ranking known vulnerabilities in a firmware image, and a language model turns the ranked result into readable, cited notes for an engineer. The decisions stay with people: the model never sets a score and never declares a product safe.

A device maker usually receives firmware as a binary from an ODM or a chip vendor, often without the build tree. Triage then runs in a fixed order:

  1. Unpackthe image into its file systems and files.
  2. Build an SBOMthat lists every package and library with its version.
  3. Matcheach component against vulnerability records (CVE, vendor advisories).
  4. Remove false positivescaused by naming, backported fixes and configuration.
  5. Prioritisewhat is left with the CISA KEV catalog, FIRST EPSS and CVSS.
  6. Record decisionsas VEX: affected, not affected (with a justification), fixed, or under investigation.
  7. Reportto the product owner, the customer or a regulator.

Steps 1 to 3 and 5 are deterministic and should be reproducible from the same inputs. Steps 4 and 6 need product knowledge: which features are compiled in, which services listen on a port, which patches the vendor applied. That is where most of the engineering time goes, and where AI can save time by drafting, while the judgement stays with the engineer.

The regulatory pressure is concrete. The Cyber Resilience Act requires manufacturers to "identify and document vulnerabilities and components contained in products with digital elements, including by drawing up a software bill of materials" (Annex I, Part II, point 1), and products must be made available "without known exploitable vulnerabilities" (Annex I, Part I, point 2(a)).

How do you get an SBOM from a firmware image without source code?

To build an SBOM without source code, unpack the image with an extraction tool and run an SBOM generator over the extracted file systems. Open tools cover both steps, and the result should be written in CycloneDX or SPDX so other tools can read it.

Unpacking. A firmware image is a stack of containers: a vendor header, a compressed kernel, one or more file systems, sometimes encrypted blobs. unblob, maintained by ONEKEY on GitHub, parses "78+ archive, compression, and file-system formats", including SquashFS, JFFS2 and UBI/UBIFS, extracts them recursively, and carves out chunks it cannot identify. Binwalk-style tools do similar work. Encrypted or signed-and-compressed images may need the vendor's key or a device dump first.

Cataloguing. Syft, maintained by Anchore on GitHub, generates SBOMs from file systems and archives, supports package ecosystems such as Alpine (apk), Debian (dpkg) and RPM, and writes CycloneDX, SPDX and its own Syft JSON. On an embedded Linux root file system it finds what the package database records. It sees less in statically linked binaries, vendor SDK blobs and RTOS images, which carry no package metadata; those need binary identification or the build system's own manifest. When you control the build, generating the SBOM inside Yocto or Buildroot is more complete: see SBOMs from embedded Linux build systems.

Format Standard Current version (retrieved 13 November 2026)
CycloneDX (OWASP) ECMA-424 1.7, released 21 October 2025
SPDX (Linux Foundation) ISO/IEC 5962:2021 3.0

Sources: CycloneDX specification overview, SPDX specifications page.

Before matching, open the SBOM and look at it: missing versions, generic names and duplicate entries all become false positives or missed CVEs later. The free SBOM viewer opens a CycloneDX or SPDX JSON file in your browser and lists every component with its version. For the wider method, including what to do when no tool identifies a component, read the firmware SBOM guide.

Why does CVE matching on firmware produce false positives?

CVE matching produces false positives on firmware because it compares names and version strings, and firmware breaks both. A component can be named differently in the SBOM and in the vulnerability database, carry a fix that its version string does not show, or have the vulnerable feature compiled out.

Naming. NVD records which products a CVE affects with CPE names, and the CPE vendor and product often differ from the package name in the image. An OpenWrt package called dropbear is filed in NVD under the vendor dropbear_ssh_project; a shared library package such as libmbedtls12 belongs to Arm's mbed_tls. A matcher that guesses the vendor from the package name either misses those CVEs or hits an unrelated product. Package URLs (purl) identify packages more precisely, but most NVD applicability data is still expressed as CPE; see purl for SBOMs.

Backported fixes. Red Hat describes backporting as "taking a fix for a security flaw out of the most recent version of an upstream software package and applying that fix to an older version of the package we distribute." The version string stays old, so a scanner keeps reporting the CVE. Debian's security FAQ answers this exact complaint: "Instead of upgrading to a new release we backport security fixes to the version that was shipped in the stable release." Vendor SDKs can do the same, and their changelogs are not always public.

Configuration and reachability. Many embedded packages are built with features switched off. A CVE in a BusyBox applet that is not compiled into the binary, or in a TLS cipher suite the build excludes, matches by version but cannot be exploited.

Cause What it looks like How to resolve it
Wrong or missing CPE CVEs for an unrelated product, or none for a known component Map package names to the NVD vendor and product; keep the mapping table under review
Backported fix CVE reported against a version the vendor already patched Check the package changelog, distribution tracker or SDK release notes; keep the evidence
Feature compiled out CVE in code the build does not include Check the build configuration (kernel config, BusyBox config, recipe options)
Version string parsed wrongly Package revision suffixes read as part of the upstream version Normalise versions before comparing ranges
Duplicate components The same library counted twice through different catalogers Deduplicate by purl or by file hash

Every row ends with a fact an engineer can check. That fact is also what a VEX justification needs later.

How should KEV and EPSS order the remaining list?

Put CVEs in the CISA Known Exploited Vulnerabilities catalog first, then order the rest by the FIRST EPSS score, and use CVSS to break ties on impact. KEV records exploitation that has happened; EPSS estimates how likely it is to happen soon.

The KEV catalog data on GitHub listed 1,779 CVEs in catalog version 2026.11.10, released 10 November 2026, and 361 of those entries carry the value "Known" for use in ransomware campaigns. EPSS, published by FIRST, is a model that "estimates the probability that a published CVE will be exploited in the wild in the next 30 days" and publishes a score every day for every CVE. The EPSS data page shows that model version 5 has been published since 15 June 2026, so record the model version with each score you keep.

The two signals do not compete. FIRST's guidance on using EPSS puts it directly: "CISA KEV and EPSS answer different questions." A low EPSS score on a KEV entry does not lower its priority. The same guidance says that a vulnerability that is "not present, not reachable" or of low consequence is less urgent "regardless of the EPSS score itself", which is why false-positive removal comes before ranking.

Signal Meaning Typical action for a shipped device
In KEV Exploitation confirmed Fix or mitigate first; tell customers what to do
High EPSS, not in KEV Exploitation likely in the next 30 days Schedule in the next firmware release
Low EPSS, high CVSS Severe if exploited, unlikely soon Plan the fix; watch for a KEV listing
Low EPSS, low CVSS Low priority Batch with routine updates

Thresholds, worked examples and the CVSS side are covered in KEV and EPSS vulnerability prioritisation.

How does VEX record a "not affected" decision?

VEX is a machine-readable statement, made by the supplier, that says whether a product is affected by a vulnerability and why. The OASIS CSAF 2.0 standard defines a VEX profile whose "main purpose" is "to state that and why a certain product is, or is not, affected by a vulnerability."

A "not affected" status needs one of five justification labels. CSAF 2.0 defines them as follows:

Label Meaning (CSAF 2.0)
component_not_present The vulnerable component is not in the product
vulnerable_code_not_present The component is present, but the vulnerable code is not
vulnerable_code_cannot_be_controlled_by_adversary The vulnerable code is present, but an attacker cannot mount any anticipated attack
vulnerable_code_not_in_execute_path The affected code is not reachable when the product runs
inline_mitigations_already_exist Built-in controls prevent an attacker from using the vulnerability

These map closely onto the false-positive table above: a wrong CPE usually ends as component_not_present, a feature compiled out as vulnerable_code_not_present, and a backported fix as status "fixed" for that firmware version rather than "not affected". CycloneDX supports VEX as well, inside the SBOM or as a separate document. For format choice, product trees and publishing, see CSAF VEX for device makers and CycloneDX VEX.

Where does AI help in triage, and where must it not decide?

AI helps where the work is reading and writing: explaining findings, grouping them, and drafting text from evidence. It must not decide whether a product is affected, change a score, or state anything that no record supports.

A firmware scan can return hundreds of matches across dozens of components. A language model is good at turning that list into something a product owner can read: one paragraph per component, the CVEs grouped under it, each sentence pointing at the record it came from. It can also draft a VEX justification once an engineer has found the evidence, for example "the CONFIG option that builds this driver is disabled in the shipped kernel configuration", and suggest which of the five CSAF labels fits.

The limits follow from who carries the liability. A VEX "not affected" statement is the manufacturer's claim about its own product, and under the CRA the manufacturer answers for shipping known exploitable vulnerabilities. A model that has not read the build configuration cannot know whether code is compiled in, and a fluent sentence without a source is the most dangerous output in a security report.

Task AI may do it Decided by
Summarise matched CVEs per component Yes, each sentence citing a record Code supplies the records
Group duplicates and related advisories Yes Engineer confirms
Rank the list No Fixed rules: KEV, EPSS, CVSS, exposure
Draft a VEX justification text Yes, from evidence an engineer supplied Engineer approves and signs
Set "not affected" or "fixed" No Engineer
Fill in a missing component version No SBOM tooling or the build record

A practical test for any AI-assisted tool: delete the citation behind one sentence of its report and see whether the report still passes. If it does, the tool lets unsourced claims through.

Which steps does the device firmware security service automate?

SoftWSP automates unpacking, the SBOM, matching and scoring, and uses AI only to write the cited report; the triage decisions stay with your engineers. The device firmware security service runs these steps:

  • SBOM: the firmware is unpacked with unblob and catalogued with Syft, and the output is normalised into a CycloneDX 1.6 SBOM. A mapping table corrects embedded package names whose NVD vendor differs, such as dropbear and dnsmasq.
  • Matching: components are matched against NVD by CPE, and the observed version is checked against each CVE's affected range. The results are checked against the CISA KEV catalog, FIRST EPSS scores and CISA's CSAF advisories for industrial control systems.
  • Scoring: a fixed ruleset ranks every component: any KEV entry first, then EPSS, then CVSS, with a small, bounded adjustment for network exposure. The model has no say in the order.
  • Report: AI drafts one section per component, highest risk first. Every claim sentence must cite a matched record; a draft with an uncited sentence is rejected rather than saved. An engineer reviews the report before you receive it.

What it leaves to you, by design: SoftWSP does not detect backported fixes, does not decide that a CVE does not affect your product, and writes no VEX statements. Those calls need your build configuration and your vendor's patch history.

What does a triage pass per firmware release look like?

One pass per release candidate, with the evidence kept next to the SBOM. A workable routine:

  1. Generate the SBOM from the release image, not from an earlier build, and store it with the image hash. Compare it with the previous release: see firmware SBOM diff between releases.
  2. Review components without a version or identifier before matching.
  3. Match against current CVE, KEV and EPSS data, and record the date and EPSS model version used.
  4. Work through false positives with the cause table above, and keep the evidence for each closed item.
  5. Fix or mitigate KEV entries before release; schedule the rest by EPSS and impact.
  6. Write VEX statements for every "not affected" and "fixed" decision, approved by a named engineer.
  7. Repeat the matching after release, because KEV and EPSS change daily while the SBOM stays the same.

Put this guide to work

Frequently asked questions

Can AI decide that a CVE does not affect our firmware?

No. A "not affected" status in a VEX document is a statement the manufacturer makes about its own product, and the CSAF 2.0 standard ties it to one of five justifications, such as "vulnerable_code_not_in_execute_path", that need evidence from the build, the configuration or the code. AI can draft the justification text from evidence an engineer collected, but an engineer has to check it and sign it off.

Which SBOM format should a device maker use for firmware?

CycloneDX or SPDX. Both are open, machine-readable and widely supported: CycloneDX 1.7 was released on 21 October 2025 and is standardised as ECMA-424, and SPDX is the international standard ISO/IEC 5962:2021. Pick the one your customers and your vulnerability tools read; Syft, for example, writes both.

Why does a firmware scan report CVEs that are already fixed?

Usually because of backported fixes. Linux distributions, and some SDK vendors, apply a security patch to the old version they ship instead of moving to the new upstream version, so the version string still falls inside the CVE's affected range. Debian's security FAQ answers exactly this case: the version number can look vulnerable while the package already carries the fix. Check the package changelog or the vendor advisory before closing or escalating the finding.

Should we fix by CVSS, KEV or EPSS?

Use all three, in that order of evidence: a CVE in the CISA Known Exploited Vulnerabilities catalog has confirmed exploitation and goes first, the FIRST EPSS score estimates the probability of exploitation in the next 30 days and orders the rest, and CVSS describes impact. FIRST's own guidance says KEV and EPSS answer different questions, so a low EPSS score on a KEV entry does not lower its priority.

Does SoftWSP write VEX documents?

No. SoftWSP builds a CycloneDX SBOM from the firmware, matches it against NVD, CISA KEV, FIRST EPSS and CISA ICS advisories, scores each component with a fixed ruleset, and drafts a cited report for an engineer to review. The not-affected decisions and any VEX statement stay with your engineers.

Sources

  1. Anchore: Syft README, SBOM generator for container images and file systems (GitHub, retrieved 13 November 2026)
  2. ONEKEY: unblob README, extraction suite for binary blobs and firmware (GitHub, retrieved 13 November 2026)
  3. OWASP CycloneDX: specification overview, version 1.7 released 21 October 2025, ECMA-424 (retrieved 13 November 2026)
  4. OWASP CycloneDX: Vulnerability Exploitability eXchange (VEX) capability (retrieved 13 November 2026)
  5. SPDX: specifications, ISO/IEC 5962:2021 and SPDX 3.0 (retrieved 13 November 2026)
  6. OASIS: Common Security Advisory Framework Version 2.0, OASIS Standard (18 November 2022), section 4.5 profile VEX
  7. Debian: security FAQ, version numbers and backported fixes (retrieved 13 November 2026)
  8. Red Hat: Backporting Security Fixes (retrieved 13 November 2026)
  9. CISA: Known Exploited Vulnerabilities catalog data, catalog version 2026.11.10 (released 10 November 2026)
  10. FIRST: Exploit Prediction Scoring System (EPSS) (retrieved 13 November 2026)
  11. FIRST: Using EPSS (retrieved 13 November 2026)
  12. FIRST: EPSS data and model versions, EPSS v5 published from 15 June 2026 (retrieved 13 November 2026)
  13. Regulation (EU) 2024/2847 (Cyber Resilience Act), Official Journal of the EU, 20 November 2024
Was this guide helpful?

In this cluster

AI-assisted SBOM and vulnerability triage for device firmware