The scanner found a component.
Fabian Kammel ran an SBOM scanner against a small Debian image with OpenSSH and reported 284 matches. He then narrowed one old OpenSSH issue by inspecting the effective daemon settings and PAM modules. In his example, PAM was enabled, keyboard-interactive authentication was disabled, and no OPIE module was configured.[1]
The finding was real inventory data. The exploit path depended on configuration that was not present. That difference is where triage starts.
A dependency match is a question. Suppression is an answer that needs its own evidence.
Reachability cuts noise, not responsibility.
The Go vulnerability system records affected packages and symbols. Its govulncheck tool analyzes a program's call graph and reports known vulnerabilities whose functions the program can reach transitively.[2] That is stronger than stopping at a module version.
Operating systems make the same question harder. A vulnerable route can depend on a service setting, a loaded module, an imperative change, or the running machine drifting away from its declaration. Source reachability and system configuration are different witnesses.
Make the exception conditional.
Kammel's NixOS example turns the triage reasoning into a condition. The generated VEX statement remains only while the package and service configuration satisfy that condition. He reports 272 scanner matches for the sample system. Applying one conditional statement moved one match into the ignored count.[1]
OpenVEX defines a small JSON-LD document for a vulnerability, one or more products, a status, and supporting metadata. The project calls its specification a draft. It also says VEX complements an SBOM by recording whether a finding applies to a product.[3]
The useful part is not the word not_affected. It is the machine-checkable reason and the route that removes the statement when that reason stops holding.
Do not confuse declared state with running state.
The nixos-vex repository makes this limit explicit. Its conditions inspect the NixOS configuration, not the running system. A service started by hand or a kernel module loaded outside that configuration can escape the check. The project also says its goal is zero untriaged findings, not zero vulnerabilities.[4]
That warning belongs in the interface. A triage card should show the component identity, vulnerable route, configuration condition, runtime probe, source date, reviewer, and invalidation rule. A green scanner badge cannot replace them.
The load bank below drafts that card. It does not inspect a host, generate a valid VEX document, or decide whether a vulnerability applies. Use it to expose missing evidence before a scanner exception enters policy.