Files
git.stella-ops.org/docs/product-advisories/22-Dec-2026 - UI Patterns for Triage and Replay.md
StellaOps Bot 634233dfed feat: Implement distro-native version comparison for RPM, Debian, and Alpine packages
- Add RpmVersionComparer for RPM version comparison with epoch, version, and release handling.
- Introduce DebianVersion for parsing Debian EVR (Epoch:Version-Release) strings.
- Create ApkVersion for parsing Alpine APK version strings with suffix support.
- Define IVersionComparator interface for version comparison with proof-line generation.
- Implement VersionComparisonResult struct to encapsulate comparison results and proof lines.
- Add tests for Debian and RPM version comparers to ensure correct functionality and edge case handling.
- Create project files for the version comparison library and its tests.
2025-12-22 09:50:12 +02:00

5.8 KiB
Raw Blame History

Heres a tight, firsttimefriendly blueprint for two StellaOps UX pillars—Triage & Exceptions and Knowledge Snapshots & Merge Semantics—with just enough background plus concrete specs your PMs/devs can ship.


Triage & Exceptions (quietbydesign)

Why it matters (plain English): Most scanners drown users in alerts. “Quietbydesign” shows only provable, reachable risks and lets you create auditable exceptions (temporary waivers) that autofeed compliance packs.

User flow

  1. Inbox grouped by exploit path

    • Group key = (artifact → package → vulnerable symbol → runtime path).
    • Each group shows: risk score, blast radius (count of dependents), EPSS/CVSS, and a “Proof” button.
  2. Open a path → Proof bundle

    • Reach subgraph (who calls what).
    • Symbol map (function/offsets; source or binary map).
    • VEX claims (vendor/distro/internal) with trust score + signatures.
  3. Raise Exception (timeboxed)

    • Required fields: attested reason (dropdown + free text), expiry date, recheck policy (e.g., “fail build if new reachable path appears”, “fail if EPSS > X”).
    • Attestation: DSSEsigned exception object, OCIattached to artifact digest.
    • Autolands in Audit Pack (PDF/JSON bundle) and Timeline.

Data model (C# POCO sketch)

record ExploitPathId(string ArtifactDigest, string PackagePurl, string CveId, string Symbol, string EntryPathHash);

record ExceptionObj(
    string Id, ExploitPathId Path, string ReasonCode, string ReasonText,
    DateTimeOffset IssuedAt, DateTimeOffset ExpiresAt,
    RecheckPolicy Policy, EvidenceRef[] Evidence, AttestationMeta Att);

RecheckPolicy (examples)

  • ReachGraphChange=Block
  • EPSSAbove=0.5
  • EnvScope=prod-only
  • UnknownsAbove=N → Block

UI essentials

  • Inbox: 3pane (List • Details • Proof).
  • Proof drawer: collapsible reach subgraph; oneclick JSON export.
  • Exception modal: expiry presets (7/30/90 days), reason templates (backport, featureflagoff, compensating control).

APIs (REST-ish)

  • GET /triage/inbox?scope=env:prod&quiet=true
  • GET /triage/path/{id}/proof
  • POST /exceptions (body = ExceptionObj sans AttestationMeta; server returns DSSE envelope)
  • GET /audit-packs/{releaseDigest}

Guardrails

  • Exceptions must never outlive a release line by default (force renewal).
  • Creating an exception requires evidence hooks (see below).
  • Build gates read exceptions; if proof no longer holds (reach diff changed), gate fails.

Knowledge Snapshots & Merge Semantics

Plain English: Take a sealed “photo” of everything you know at a point in time—SBOM, VEX, attestations, policies—so audits and incident reviews can be replayed exactly.

Lifecycle: Snapshot → Seal → Export

  1. Snapshot

    • Capture: SBOM (CycloneDX 1.6 + SPDX 3.0.1), VEX docs, reach subgraphs, exception objects, policies, trust scores, feed versions, rules hashes.
  2. Seal

    • Compute Manifest of Manifests (Merkle root) + DSSE signature (with PQ option).
    • Store to Authority (Postgres) and attach to image digest (OCI ref).
  3. Export

    • Produce a single Replay Bundle (.stella-replay.tgz): data + REPLAY.yaml (inputs, versions, lattice rules).
    • Offlineready.

Policy pane with merge semantics

  • Default preview: vendor ⊕ distro ⊕ internal (not “vendor > distro > internal”).

  • Lattice rules define resolution (e.g., NOT_AFFECTED ⊕ AFFECTED → AFFECTED unless Evidence(feature_flag_off)).

  • Evidence hooks (required):

    • “Not affected because feature X off” → must include featureflag attestation (envscoped, signed).
    • “Backported patch” → must include patchindex mapping (fixedsymbols, commit OIDs).
    • “Compensating control” → must include control attestation (control ID, monitoring link, SLO).

UI essentials

  • Snapshot panel: shows inputs (feed versions, rules hash), diff vs last snapshot, “Seal & Export” button.
  • Policy pane: interactive merge preview; failed hooks highlighted with “Add evidence” CTA.
  • Replay check: “Verify determinism” runs local reeval; shows PASS/FAIL badge.

APIs

  • POST /snapshots → returns SnapshotId + content hashes
  • POST /snapshots/{id}/seal → returns DSSE + Merkle root
  • GET /snapshots/{id}/export → stream bundle
  • POST /policy/preview (inputs: sources+claims) → resolved verdict + missing-evidence list

Storage

  • Postgres = system of record (immutable rows for sealed snapshots).
  • Valkey (optional) = cache (diffs, precomputed subgraphs).
  • OCI = distribution of attestations & snapshots alongside images.

PM & Dev acceptance checklist (short)

  • Triage Inbox

    • Groups by exploit path, not by CVE alone.
    • Proof bundle includes reach subgraph + symbol map + VEX claims.
    • Exception modal enforces reason + expiry + recheck policy + evidence.
    • Exceptions are DSSEsigned and appear in Audit Pack.
  • Knowledge Snapshot

    • Snapshot records all inputs (feeds, rules, versions, hashes).
    • Seal produces a verifiable Merkle root + DSSE.
    • Export bundle replays deterministically offline.
    • Policy pane supports lattice merges + evidence hooks with blocking states.

Tiny implementation notes (.NET 10)

  • Use record structs for small immutable IDs; keep hash fields as ReadOnlyMemory<byte>.
  • Attest with intoto/DSSE; provide PQ toggle (Dilithium/Falcon) at keypolicy level.
  • Graphs: store reach subgraph as compressed adjacency lists; index by (digest, symbol).

If you want, I can turn this into: (a) Swagger stubs, (b) EF Core schema + migrations, or (c) a Figmaready UI spec with screen flows and copy.