You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add --vexhub: mark findings a vendor has already published a statement for
vexscan re-litigates CVEs that the image's own vendor has already triaged.
--vexhub points at a VEX Repository (rancher/vexhub and friends) and lifts the
findings a published statement already answers into their own section, so
attention goes to the rows nobody has spoken to.
A statement never rewrites status. A --vexhub run and a plain run agree on every
verdict and on the JSON's status field; only the grouping and the affected count
change. Only not_affected and fixed move a row -- a vendor confirming a finding
must not make it quieter.
Two product kinds are looked up: the scanned image (pkg:oci/...) and each Go
binary's own main module (pkg:golang/...), which is how a hub actually files Go
statements. index.json is fetched once and only the documents for products
present in the scan are pulled; the spec's transport is a ~30 MB tarball and
this reads two files out of it.
Three things real data forced:
- Subcomponents match on purl type and name only. The hub writes
pkg:rpm/suse/libgcrypt20 where vexscan emits
pkg:rpm/sles/libgcrypt20@...?arch=x86_64, and statements are pinned to the
version the vendor scanned. Every disagreement the tolerance swallowed is
written into the evidence line and shown under --details as "matched loosely".
- Findings are expanded through their OSV aliases before matching. Without it
the first live run matched zero: vexscan's 13 advisories on
rancher/hardened-kubernetes are GHSA-/GO- ids, the hub's 133 are almost all
CVE-, and the two sets do not literally intersect. With it, 3 match.
- An unreachable hub warns and does not fail the run, unlike an ecosystem that
could not be read. An unreadable package database makes the report claim a
clean image it never examined; an unreachable hub only leaves rows in AFFECTED
that a vendor had already answered. The first under-reports, which is the way
this tool must never be wrong.
Verified against rancher/hardened-kubernetes (3 vexed of 70),
longhornio/longhorn-manager and longhorn-instance-manager, with debian:12 as the
control that prints no ALREADY VEXED section at all. The OCI path resolves and
matches on all three Rancher images across the suse/sles spelling gap; no live
OS finding was covered only because each image's one OS advisory is newer than
the hub's document.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`granularity`, `stripped`) are still emitted for Go findings, mirrored from the
865
949
neutral fields so they cannot drift.
@@ -910,6 +994,7 @@ be read, or part of the tree could not be read, `2` the command line was wrong.
910
994
|`--go-version`|*(auto)*| Pin the Go toolchain for `--repo`, e.g. `1.24.0` (useful with `golang:stdlib`) |
911
995
|`--osv-ecosystem`|*(auto)*| Override the OSV ecosystem derived from os-release, e.g. `Debian:12`|
912
996
|`--roots`|| Extra entrypoints for the closures — shared libraries and language imports; repeatable |
997
+
|`--vexhub`|| VEX Repository to check findings against, e.g. `https://github.com/rancher/vexhub` (also a raw base URL or a local directory); repeatable, earliest wins — see [VEX hubs](#vex-hubs---vexhub)|
913
998
|`--dlopen-policy`|`taint`|`taint` (block conclusions) or `assume-none`|
914
999
|`--dynamic-import-policy`|`taint`| The same knob for a language import graph's computed imports. These are far more common than `dlopen`, so `assume-none` discards much more |
915
1000
|`--trust-import-absence`|`false`| Let a missing dynamic import conclude `not_in_execute_path` (weaker than it looks) |
0 commit comments