Research & Analysis · Software engineering · 17 min read
Does the Vulnerable Component in Your SBOM Affect Your Service?
Sources checked against the cited passages; awaiting my final read before this is indexed.
A component match warrants investigation; it doesn't establish that your deployed service is exploitable. I would connect the finding to the actual artifact, establish whether its component contains the affected code, examine the vulnerability's necessary execution conditions, and reconcile any supplier VEX statement with that deployment. If one of those links remains unknown, the conclusion stays qualified. An empty result or an unsupported “not affected” label doesn't close the gap.
That answer is deliberately narrower than “is the software safe?” A software bill of materials can help answer what went into a product. Vulnerability applicability asks whether a particular defect bears on a particular product or service state. Response prioritization adds consequences, threat activity and operational constraints. These decisions interact, but collapsing them into one scanner color makes errors difficult to find.
This paper develops an evidence method for security engineers, software owners and leaders who need to decide what to do with a dependency alert. It synthesizes twelve original specifications, guidance documents and producer-maintained technical references. It reports no experiment, customer assessment or measured improvement. The method and examples are my analytical proposals, with explicit conditions under which they should be challenged.
Define the object before judging the finding
I would begin with a tuple: vulnerability identifier, component identity, delivered artifact, deployed instance or cohort, relevant configuration, and observation time. This is a proposed record structure, not an additional SBOM format. Each element prevents a different substitution: another vulnerability, similarly named software, an older build, a different installation, an untested configuration, or a conclusion carried forward after its evidence expired.
Consider a product version deployed across two environments. One uses a vendor image unchanged; another adds a plugin and replaces a system library during startup. A statement covering the original image may still be accurate while failing to settle the second deployment. The immediate task is to locate the changed relationship, not accuse the supplier of issuing a false statement. Product-level knowledge and deployment-level knowledge belong to different parties.
The 2026 joint SBOM minimum-elements guidance replaces the 2021 baseline and adds explicit generation context, tool/version information and component hash fields, among other changes. It also distinguishes the SBOM author from the component producer (Cybersecurity and Infrastructure Security Agency et al., 2026). I would use those distinctions to ask who observed what, at which stage. An inventory author can accurately describe an artifact without knowing every environment in which it later runs.
For a live finding, record the candidate population before analysis becomes elaborate. Which services might contain the artifact? Which deployments cannot yet be identified? Keep that unknown population visible. A precise conclusion for three inspected instances is useful, but it cannot silently become a conclusion for every instance carrying the same application name.
Reconcile what was planned, built, installed and observed
Different SBOM generation methods observe different objects. The community's Types of Software Bill of Material Documents distinguishes design, source, build, analyzed, deployed and runtime inventories. Its tables describe limits: a source inventory can include components compiled out of a product; build inventories can miss or misidentify runtime dependencies; runtime observations may require exercising functionality before relevant components appear (Types of Software Bill of Material, 2023).
That means disagreement between inventories can be informative. A source dependency missing from the delivered artifact might have been removed correctly. A runtime dependency absent from the build inventory might have arrived through a plugin or deployment step. I would reconcile the specific difference using build outputs, installation records and approved runtime inspection. Automatically choosing whichever inventory produces fewer findings defeats the investigation.
Absence requires a bounded claim. “This tool didn't identify the component in this image” is weaker than “the relevant component is absent from every inspected file in this identified artifact under a method capable of recognizing it.” Neither statement covers a library downloaded later. The evidence record should state the observation boundary and exclusions, especially where packaged archives, generated code or external services fall outside inspection.
I would also separate bytes stored in an image from code available in the running filesystem and code actually loaded by a process. These are useful analytical layers, not interchangeable definitions of exposure. A dormant copy may be irrelevant to today's execution path yet become relevant through rollback or maintenance. Record why it is excluded from the present decision and which operational action would make that exclusion invalid.
Preserve component identity through the vulnerability join
A finding depends on joining an inventory record to an advisory record. Before debating severity, inspect that join. A display name alone can conceal namespace, ecosystem, distribution or packaging differences. ECMA-427 defines the Package-URL structure, including type, namespace, name, version, qualifiers and subpath; it describes the version component as an opaque string (Ecma International, 2025, §§5–5.6). An identifier gives the consumer structure, not permission to invent universal version-ordering rules.
I would retain the original identifier and any normalization used to match it. If a tool strips a namespace, translates a distribution package to an upstream project, or guesses a product from a filename, that transformation is part of the evidence. The investigation should be able to distinguish an exact supported mapping from a candidate match. Otherwise, a convenient normalization becomes an invisible assertion about software identity.
CPE applicability has a different role. NIST's version 2.3 specification permits logical combinations of product names and referenced checks, including conjunction, disjunction and negation (Waltermire et al., 2011, §§1, 5.3). My implication is that an affected-platform expression should be evaluated as an expression. Extracting one recognizable name and discarding the surrounding conditions can change its meaning. This is a claim about the named specification, not a statement that every contemporary scanner implements its semantics correctly.
When identifiers disagree, do not resolve the conflict through majority vote. Three tools may inherit the same package mapping. Ask which source establishes the relationship between the installed component and the affected product. Where the relationship remains ambiguous, preserve both candidates and acquire discriminating evidence. The uncertainty is in the join; increasing the precision of the vulnerability score cannot repair it.
Read affected ranges and backports as technical evidence
Version interpretation deserves its own review. The Open Source Vulnerability format distinguishes Git, semantic-version and ecosystem-specific ranges. Its event model separates introduced, fixed, last-known-affected and limiting boundaries, and warns that a last-affected boundary can produce false negatives above the recorded ceiling (Chang & Cox, 2026). A consumer must respect the range type and event semantics; lexical sorting of version strings is not an adequate substitute.
For a disputed match, I would preserve the advisory revision, affected range, package ecosystem and the actual installed package identity. Then reproduce the matching decision using the producer's documented rules. Ask whether the finding reflects an affected interval, an explicitly enumerated version, an upstream commit range, or a local mapping from one naming system to another. Those mechanisms can fail in different ways and should not share one unexplained confidence label.
Backports make the distinction concrete. Red Hat explains that it can apply a security fix to an older distributed package without adopting the newer upstream version, and provides advisory and machine-readable information to identify those fixes (Red Hat, n.d.). That supports checking distribution-specific evidence. It does not support assuming that every old-looking package is patched, or that another vendor applied the same correction.
Suppose the upstream fix first appears in version 4.2, while the deployment carries a vendor build labeled 4.0 with an additional release identifier. Both numbers are fictional. I would seek the vendor's affected/fixed package record and confirm that the installed build matches it. If the local image was rebuilt or repackaged, the vendor statement may no longer establish its contents. Keep “vendor reports a fixed build,” “that build is installed,” and “the repaired code is active” as separately supportable claims.
Check every relevant copy, not just the preferred one
A service-level conclusion needs a rule for combining component-instance findings. I would model the relevant component copies as a set and retain the location and dependency path of each copy. For the limited claim “this service contains no affected instance of this component,” one unresolved member prevents a supported universal conclusion. One demonstrably affected member refutes that claim. Several fixed copies do not cancel an affected copy elsewhere in the set.
Suppose, hypothetically, the main application uses a repaired library while a bundled worker retains an older affected copy. Deduplicating records by package name could conceal the distinction. Deduplicating by name and version still loses context if two copies load under different configurations or belong to different artifacts. Preserve the instance relationships needed for the decision, even if the interface groups them for readability. This is my proposed aggregation rule, not a claim that every SBOM implementation discards those relationships.
The rule has an important boundary: the set itself must be credible. A correct evaluation of all recorded members cannot establish completeness of the membership. Keep “all identified copies checked” separate from “all relevant copies identified.” A useful closure record explains both the population search and the individual dispositions. If inspection later discovers an embedded copy, reopen the population-level conclusion before arguing about whether its original ticket was already closed.
Bind the evidence to the artifact you actually operate
An authentic inventory for the wrong artifact is still the wrong evidence. SLSA's version 1.2 verification guidance includes signature verification, artifact-digest matching, trusted builder information and comparison with expected build parameters (SLSA, n.d.). Those checks establish specified identity and provenance properties. They do not establish that the resulting component list is exhaustive or that the application lacks a particular defect.
I would preserve the release artifact identifier alongside the inventory and advisory decision. For mutable deployments, also record what changed after installation. A signed artifact can be followed by an unrecorded update, injected plugin or altered dependency. Conversely, a service may continue running an older artifact after the release system has published a repaired one. The release catalog and the deployed population need an explicit reconciliation.
Signatures answer an attribution and integrity question. The 2026 guidance describes an SBOM author signature as assurance about the signatory and whether signed information changed afterward (Cybersecurity and Infrastructure Security Agency et al., 2026, p. 8). My conclusion is that a valid signature cannot make an inaccurate assertion true. Trusting a producer's signing identity and trusting its component-discovery method are related but distinct judgments.
The broader release-governance question belongs in the release-evidence assessment. Here, the acceptance boundary is narrower: can another reviewer trace this applicability conclusion to the exact software and relevant deployment conditions? If the trace breaks, retain the finding as unresolved rather than borrowing assurance from a neighboring release.
Use reachability evidence without overstating it
A dependency can contain affected code without your application calling that code. A call path can exist without satisfying every condition required for exploitation. Those are different propositions. I would identify the vulnerable behavior and its prerequisites before deciding what a reachability result contributes. The useful question is what the analysis actually established for the code and configuration under review.
GitHub's current public-preview documentation illustrates the distinction. Its reachability analysis uses static analysis and affected-function information; an unreachable verdict means the completed analysis did not find a call, while unavailable can mean unsupported analysis or a failed scan. GitHub explicitly advises against closing an alert solely on its reachability verdict and distinguishes reachability from exploitability (GitHub, n.d.). This is a documented example, not a benchmark of all tools or a guarantee about another product.
For a negative result, I would inspect the entry points, language support, analysis completion, dependency resolution and exclusions. Determine whether reflective calls, generated code, alternate workers or runtime-loaded components fall within the analyzer's model. These are proposed review questions, not claims that the cited product necessarily misses each mechanism. A scope gap should remain visible rather than be converted into an “unreachable” conclusion.
For a positive result, examine what the caller can control and which prerequisites remain. A path to a parser is not automatically a path by which an attacker can provide the triggering input. Equally, an internal caller is not automatically trustworthy merely because it sits behind another service. Follow the relevant trust boundary and record unresolved conditions. The goal is sufficient evidence for an action, not an unsafe production exploit demonstration.
Runtime observation adds a different kind of evidence. Seeing a function execute establishes that it ran under observed conditions; failing to see it execute establishes much less about unexercised behavior. I would use targeted, authorized testing where it can distinguish plausible states, while keeping static and runtime coverage separate. Combining their outputs is useful only when their different assumptions remain inspectable.
Make VEX a scoped statement, not a universal waiver
Vulnerability Exploitability eXchange conveys a product's status relative to a vulnerability. The 2023 minimum-requirements document defines affected, not affected, fixed and under investigation; it establishes no unstated default status. For not affected, a justification is recommended, and an impact statement is required when no justification is supplied. Affected requires an action statement (Minimum Requirements, 2023, §§2.0, 2.7). Silence therefore cannot be interpreted as a declaration that the software is unaffected.
Before consuming a statement, I would establish its author, product identifiers, vulnerability identifier, issue/revision time, status and scope. Then compare its product definition with the local artifact. A statement about a supplier's appliance is not automatically a statement about a separately installed upstream library, even when both mention the same vulnerability. The product may contain the component yet lack the vulnerable behavior under the supplier's supported conditions.
The status justifications also differ technically. The 2022 guidance separates absent component, absent vulnerable code, code outside the execution path, lack of adversary control and built-in mitigation. Its inline-mitigation definition requires protections that users cannot disable and attackers cannot subvert under the stated model; its execution-path discussion warns against assuming a single path (Vulnerability Exploitability eXchange, 2022, §§3.3–3.7).
A locally configurable firewall rule should therefore not be casually translated into a supplier's built-in-mitigation assertion. It may still be a worthwhile operational treatment, but it has different ownership and failure conditions. Preserve the supplier's product status and your environment-specific response separately. “Affected with a verified local restriction” can be a more accurate record than an unqualified “not affected.”
If two statements conflict, first test whether they concern the same product, version and vulnerability interpretation. An upstream component can be affected while a containing product is not affected for a documented reason. If the scope truly matches and the conclusions contradict, retain the conflict, ask for the underlying evidence and apply a temporary response appropriate to consequence. A newer timestamp alone doesn't establish that the later statement has a stronger technical basis.
Treat completeness as a property with a boundary
A well-formed document is not necessarily complete for your question. CycloneDX's version 1.6 schema provides composition states including complete, incomplete, unknown and not specified. Its composition references do not automatically cascade to child parts or transitive dependencies (OWASP Foundation, n.d.). A consumer that treats a completeness statement about one relationship as a statement about the whole service can overstate what the document says.
I would map inventory coverage against the deployment boundary before using “no matching component” to close a finding. Which language packages, operating-system components, plugins and external dependencies were examined? Which were excluded or unavailable? A missing relationship should produce a question about visibility. It should not silently become an assertion that the relationship does not exist.
The denominator matters when reporting progress. If a service has twelve potentially relevant deployment variants and only nine have usable inventories, “no match in nine inspected variants” is a bounded result. The other three remain unknown. Those numbers are illustrative, not a proposed acceptable coverage threshold. Whether uncertainty warrants immediate restriction depends on the possible consequence and the time needed to resolve it.
Incomplete evidence does not require paralysis. You may choose a supported update that removes the suspected issue while investigation continues. Or a proportionate temporary restriction may be warranted while the artifact identity is established. Record the decision and its rationale without retrospectively pretending that applicability was known. Taking a prudent action under uncertainty is different from proving the underlying technical proposition.
A worked service decision with four deployment cohorts
The following case is entirely fictional. A document-processing service has a component alert for invented vulnerability VULN-X. The example does not identify a real package or provide exploitation instructions. Its purpose is to show why one SBOM match can lead to different, defensible actions when deployment evidence differs.
| Cohort | Evidence available in the fictional case | Bounded conclusion and action |
|---|---|---|
| A: unchanged vendor image | Exact image matches a supplier statement; reviewed build evidence establishes the vulnerable function was excluded | Not affected for this vulnerability and image; retain the exclusion evidence and rebuild trigger |
| B: image with local plugin | Component and affected code present; plugin introduces a path receiving untrusted documents | Applicable exposure requires treatment; restrict the affected workflow while preparing and verifying repair |
| C: older distribution build | Scanner used an upstream version rule; vendor advisory identifies the exact installed package release as fixed | Resolve the version-matching dispute using vendor evidence; verify active processes before closing remediation |
| D: unidentified worker variant | No usable artifact inventory; supplier statement covers a different variant | Applicability unresolved; identify the worker and apply a consequence-based interim decision |
A's conclusion depends on the exclusion evidence and exact artifact match. If a later build restores the function, its previous disposition expires. B's scenario establishes a relevant exposure for this hypothetical decision; it does not claim that every reachable function is exploitable. C needs active-state verification because a package replacement and a running process are different objects. D has a visibility problem, not a negative vulnerability result.
The exercise also exposes an aggregation error. Reporting “three of four cohorts resolved” would be premature: B needs treatment, C needs runtime verification, and D lacks identity evidence. Even when a cohort is resolved, its size and service consequence may differ from the others. I would report the disposition and remaining action by cohort, with an explicit population, instead of manufacturing a reassuring completion percentage.
Preserve the decision as its supporting facts change
I would record the conclusion with four supporting elements: evidence references, assumptions, accountable action and invalidation triggers. For this task, useful triggers include a new artifact, dependency update, newly enabled feature, changed supplier advisory, revised affected-function mapping, removed restriction or previously excluded deployment variant. These are proposed operating rules. They are not a universal expiration schedule specified by the sources.
Separate three clocks. The inventory has an observation time; the advisory has an information revision; the deployment has a change time. A fresh advisory matched against an obsolete inventory is not a fresh applicability assessment. A new inventory with an old vulnerability database has the opposite limitation. Preserve enough versioned evidence to reconstruct what was known when the conclusion was reached.
Evidence also needs to be obtainable during response. SBOM Sharing Roles and Considerations distinguishes authors, consumers and distributors, and separates discovery, access and transport. It explicitly does not establish the accuracy or completeness of the exchanged inventory (SBOM Sharing Roles, 2024). My operational implication is to test the information path as well as the parser: can the responsible team find and retrieve the correct inventory and its updates when the supplier portal or usual contact is unavailable?
I would retain minimal, access-controlled records sufficient for reconstruction, avoiding unnecessary customer data or secrets. Where a supplier cannot disclose source code, ask for evidence appropriate to the disputed claim: exact product scope, a technically meaningful justification, supported configuration constraints and an escalation path. Lack of source access limits independent verification; it does not justify either automatic distrust or automatic acceptance.
Spend investigation effort where it can change the action
The strongest objection to this method is economic: it can take longer to prove a dependency irrelevant than to deploy a routine, well-tested update. I agree. Use deeper applicability analysis where it can change an important decision, such as an emergency outage, an unsupported appliance, a disputed supplier statement or a critical service with uncertain identity. Ordinary updates do not need a bespoke dissertation before every deployment.
The opposite objection is that contextual analysis supplies endless excuses to defer repair. The answer is bounded investigation with an owner, a decision time and an interim response. Ask what missing fact could change the action and how it will be obtained. If every plausible outcome already requires the same urgent restriction, additional classification should not delay that restriction. Record uncertainty honestly while acting on the consequence.
Once applicability is established sufficiently for action, the next task is prioritizing the response when vulnerability signals disagree. That decision considers threat activity, consequence and change constraints. This article deliberately does not derive patch deadlines, expected loss or compromise probability from inventory and reachability records. Nor does a verified repair establish that no compromise occurred before the repair.
The combined method has limits. Its sources specify information models and recommended practices rather than validate this workflow's effectiveness. Producer documentation describes particular tools, including a preview feature whose behavior can change. Inventory extraction, supplier analysis and local configuration evidence can all be wrong. Several feeds may reproduce one error, and no finite review establishes the absence of every unknown vulnerability or attack chain.
I would evaluate the process with a bounded set of authorized historical cases, retaining the evidence available at each decision time. Ask whether reviewers can reproduce the component match, distinguish unknown from absent, identify the decisive prerequisite and reopen a conclusion when a supporting fact changes. Track unsupported closures and unresolved deployment variants alongside investigation effort. These are proposed evaluation measures, not reported findings or promised incident reductions.
If your team collects SBOMs but still cannot explain whether a component alert affects a critical service, request a software vulnerability applicability assessment. Start with one sanitized inventory, one disputed advisory and a deployment outline. I can help scope the review, trace where identity or evidence breaks, and define acceptance criteria for a decision your engineering and security teams can both defend.
References
- Chang, O., & Cox, R. (2026, October 13). Open Source Vulnerability format (Version 1.9.2). Open Source Security Foundation. https://ossf.github.io/osv-schema/
- Cybersecurity and Infrastructure Security Agency, National Security Agency, Federal Bureau of Investigation, Australian Signals Directorate’s Australian Cyber Security Centre, Canadian Centre for Cyber Security, Czech National Cyber and Information Security Agency, French Cybersecurity Agency, Germany’s Federal Office for Information Security, Indian Computer Emergency Response Team, Italy’s National Cybersecurity Agency, Japan’s Ministry of Economy, Trade and Industry, Japan’s National Cybersecurity Office, Republic of Korea’s National Intelligence Service/National Cyber Security Center, Korea Internet and Security Agency, Netherlands’ National Cyber Security Centre, New Zealand’s National Cyber Security Centre, Poland’s Research and Academic Computer Network, & Slovakia’s National Security Authority. (2026, July 29). 2026 minimum elements for a software bill of materials (SBOM) (Version 2.1). https://www.cyber.gov.au/sites/default/files/2026-07/2026_minimum_elements_for_a_software_bill_of_materials_sbom.pdf
- Ecma International. (2025, December). Package-URL (PURL) specification (ECMA-427, 1st ed.). https://ecma-international.org/wp-content/uploads/ECMA-427_1st_edition_december_2025.pdf
- GitHub. (n.d.). About reachability analysis for Dependabot alerts. Retrieved October 29, 2026, from https://docs.github.com/en/code-security/concepts/supply-chain-security/about-reachability-analysis-for-dependabot-alerts
- Minimum requirements for Vulnerability Exploitability eXchange (VEX). (2023, April). Cybersecurity and Infrastructure Security Agency. https://www.cisa.gov/sites/default/files/2023-04/minimum-requirements-for-vex-508c.pdf
- OWASP Foundation. (n.d.). CycloneDX JSON schema (Version 1.6) [JSON Schema]. https://raw.githubusercontent.com/CycloneDX/specification/1.6/schema/bom-1.6.schema.json
- Red Hat. (n.d.). Security backporting practice. Retrieved October 29, 2026, from https://access.redhat.com/security/updates/backporting
- SBOM sharing roles and considerations. (2024). Cybersecurity and Infrastructure Security Agency. https://www.cisa.gov/sites/default/files/2024-03/SBOM%20Sharing%20Roles%20and%20Considerations.pdf
- SLSA. (n.d.). Build: Verifying artifacts (Specification version 1.2). Retrieved October 29, 2026, from https://slsa.dev/spec/v1.2/verifying-artifacts
- Types of software bill of material (SBOM) documents. (2023, April). Cybersecurity and Infrastructure Security Agency. https://www.cisa.gov/sites/default/files/2023-04/sbom-types-document-508c.pdf
- Vulnerability Exploitability eXchange (VEX)—Status justifications. (2022, June). Cybersecurity and Infrastructure Security Agency. https://www.cisa.gov/sites/default/files/publications/VEX_Status_Justification_Jun22.pdf
- Waltermire, D., Cichonski, P., & Scarfone, K. (2011, August). Common Platform Enumeration: Applicability language specification version 2.3 (NIST Interagency Report 7698). National Institute of Standards and Technology. https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir7698.pdf