- Introduced a blueprint for explainable quiet alerts, detailing phases for SBOM, VEX readiness, and attestations. - Developed a roadmap for deterministic diff-aware rescans, enhancing scanner speed and efficiency. - Implemented a hash-based SBOM layer cache to optimize container scans by reusing previous results. - Created a multi-runtime reachability corpus to validate function-level reachability across various programming languages. - Proposed a stable SBOM model using SPDX 3.0.1 for persistence and CycloneDX 1.6 for interchange. - Established a validation plan for quiet scans, focusing on provenance and CI integration. - Documented guidelines for the Findings Ledger module, outlining roles, execution rules, and testing protocols.
4.3 KiB
Here’s a tight idea I think you’ll like: make every VEX “non‑affected” verdict explain itself with provable, symbol‑level evidence—not just “package X isn’t reachable,” but “function Foo::bar() (the vulnerable sink) is never called in any admissible execution of image Y,” backed by cryptographic provenance.
Why this matters (quickly)
- Trust: Auditors and customers can verify why you suppressed a CVE.
- Quiet scanner: Fewer false alarms because decisions cite concrete call‑paths (or their absence).
- Moat: Competitors stop at file/package reachability; you show function‑level proof tied to in‑toto attestations.
Core concept (plain)
Blend two things:
- Deterministic symbol reachability (per language): build minimal call graphs and mark whether the vulnerable symbol is callable from your app’s entrypoints.
- in‑toto‑anchored provenance: sign the inputs and reasoning (rules, SBOM slice, call‑graph hash, evidence artifacts), so the verdict can be independently re‑verified.
Result: each VEX decision is a verifiable mini‑proof.
What the evidence looks like (per CVE/component)
-
Symbol set: canonical IDs of vulnerable functions (e.g.,
pkg@ver#Type::Method(sig)). -
Call‑graph digest: hash of pruned call graph from app entrypoints to those symbols.
-
Evidence:
- Static: “No path from any entrypoint → {vuln symbols} (k=0).”
- Optional runtime: sampled traces (EventPipe/JFR/eBPF) show 0 hits to symbols/guards.
-
Context: build inputs (SBOM, lockfiles, compile units), framework models used, versions.
-
Attestation: in‑toto/DSSE signed bundle with reproducible scan manifest.
Minimal prototype this week (Scanner reachability scorer)
-
Symbol mappers (MVP)
- .NET: read PDB + IL to enumerate
MethodDefsymbols; map NuGet pkg → assembly → methods. - JVM: JAR index + method table (from ASM); map Maven coords → classes → methods.
- .NET: read PDB + IL to enumerate
-
Entrypoint discovery
- Docker CMD/ENTRYPOINT → process launch → managed main(s) (ASP.NET Program.Main, Spring Boot main).
-
Shallow call‑graph (no fancy points‑to yet):
- Direct calls + common framework handoffs (ASP.NET routing → controller; Spring @RequestMapping → handler).
-
Vuln ↔ symbol alignment
- Heuristics: match GHSA/OSV “affected functions” or patch diff to infer symbol names; fallback to package‑scope verdict with a flag “symbol‑inferred: false”.
-
Decision object
ReachabilityDecision.jsonwith: entrypoints, symbol set, path_count, notes, hashes.
-
Attest
- Emit
reachability.intoto.jsonl(subject = image digest + SBOM component + symbol digest). Cosign with your test key.
- Emit
-
VEX output
- OpenVEX statement reason:
component_not_presentorvulnerable_code_not_in_execute_pathwithjustification_url→ small HTML report (signed).
- OpenVEX statement reason:
Data & schemas to add
-
Scanner.Reachability/SymbolIndex(pkg → assemblies/classes/methods)EntryPoints(per image, normalized)CallGraphPruned(edges + hash)Decision(path_count, evidence, versions)
-
Authority- Key management for DSSE; policy to require reachability evidence for “non‑affected”.
Language roadmap (fast win → harder)
- Week 1–2: .NET + JVM shallow graphs + ASP.NET/Spring models.
- Week 3–4: Node/TS (TS compiler API), Go (SSA), Python (import graph + common web frameworks).
- Stretch: Rust/Swift (MIR/SIL summaries), native (symbols + coarse edges), Shell (exec chain).
Where to surface it (UX)
- VEX details panel: “Non‑affected (0 call paths)” → expand → show entrypoints, collapsed edge list, trace hit‑counts, and “Verify attestation” button.
- CLI:
stella scan --explain CVE-XYZ --verify-attestation.
Guardrails
- If symbol mapping is uncertain, do not claim “non‑affected”; downgrade to “under review” with rationale.
- Cache symbol indexes per package version; keep the call‑graph pruned to entrypoint cones for speed.
- Everything reproducible: the scan manifest (feeds, rule versions, hashes) must recreate the same decision bit‑for‑bit.
If you want, I can draft the exact C# namespaces, interfaces, and the OpenVEX + in‑toto payloads you can drop into Scanner.Reachability and Authority.Attest.