VEX Consensus and Issuer Trust

This document consolidates the VEX concepts Stella Ops relies on: ingesting upstream VEX without rewriting it, correlating evidence across sources, and producing a deterministic, explainable “effective” status for a component-vulnerability pair. It is for operators, security managers, and auditors who need to understand how VEX evidence flows into a release verdict.

Scope

This is not an API reference; module dossiers define concrete schemas and endpoints.

Vocabulary (Minimal)

Observation Model (Link, Not Merge)

Stella Ops treats upstream VEX as append-only evidence.

An observation records:

An observation is never mutated. If upstream publishes a revision, Stella Ops stores a new observation and records a supersedes relationship.

Linksets (Correlation Without Consensus)

Linksets exist to make multi-source evidence explainable without collapsing it:

Linksets do not invent consensus; they only align evidence so downstream layers (Policy/Console/Exports) can explain what is known and what disagrees.

Consensus (Effective Status)

The effective VEX status is computed by policy evaluation using:

Key properties:

Aggregation-Only Guardrails (AOC)

To avoid hidden rewriting of upstream data, the platform enforces:

Issuer Directory and Trust

Issuer trust is a first-class input:

Console Integration

The Console uses these concepts to keep VEX explainable:

See docs/UI_GUIDE.md for the operator workflow perspective.

Anchor-Aware Mode (v1.1)

Anchor-aware mode enforces cryptographic attestation requirements on VEX proofs used for allow decisions.

VexProofGate Options

OptionTypeDefaultStrict Mode
AnchorAwareModeboolfalsetrue
RequireVexAnchoringboolfalsetrue
RequireRekorVerificationboolfalsetrue
RequireSignedStatementsboolfalsetrue
RequireProofForFixedboolfalsetrue
MaxAllowedConflictsint50
MaxProofAgeHoursint16872

Strict Anchor-Aware Preset

For production environments requiring maximum security:

var options = VexProofGateOptions.StrictAnchorAware;
// Enables: RequireVexAnchoring, RequireRekorVerification,
//          RequireSignedStatements, RequireProofForFixed
// Sets: MinimumConfidenceTier=high, MaxAllowedConflicts=0, MaxProofAgeHours=72

Metadata Keys

When passing VEX proof context through policy evaluation:

KeyTypeDescription
vex_proof_anchoredboolWhether proof has DSSE anchoring
vex_proof_envelope_digeststringDSSE envelope sha256 digest
vex_proof_rekor_verifiedboolWhether Rekor transparency verified
vex_proof_rekor_log_indexlongRekor log index if verified

Failure Reasons

ReasonDescription
vex_not_anchoredVEX proof requires DSSE anchoring but is not anchored
rekor_verification_missingVEX proof requires Rekor verification but not verified

VEX Change Events

Excititor emits deterministic events when VEX statements change, enabling policy reanalysis.

Event Types

EventDescriptionPolicy Trigger
vex.statement.addedNew statement ingestedImmediate reanalysis
vex.statement.supersededStatement replacedImmediate reanalysis
vex.statement.conflictStatus disagreement detectedQueue for review
vex.status.changedEffective status changedImmediate reanalysis

Conflict Detection

Conflicts are detected when multiple providers report different statuses for the same vulnerability-product pair:

Conflict TypeDescription
status_mismatchDifferent status values (e.g., affected vs not_affected)
trust_tieEqual trust scores with different recommendations
supersession_conflictDisagreement on which statement supersedes

Event Ordering

Events follow deterministic ordering:

  1. Ordered by timestamp (ascending)
  2. Conflict events after related statement events
  3. Same-timestamp events sorted by provider ID

Integration with Policy

Subscribe to VEX events for automatic reanalysis:

subscriptions:
  - event: vex.statement.*
    action: reanalyze
    filter:
      trustScore: { $gte: 0.7 }

See Excititor Architecture for full event schemas.

Offline / Air-Gap Operation

Grey Queue and Unknown Mapping

When VEX correlation produces inconclusive results, observations are routed to the Grey Queue for monitoring or manual adjudication.

Mapping to OpenVEX Status

Uncertain observations preserve OpenVEX spec alignment:

Internal StateOpenVEX StatusDescription
PendingDeterminizationunder_investigationEvidence incomplete; monitoring active
Disputedunder_investigationConflicting evidence from multiple sources
GuardedPassunder_investigationAllowed with runtime guardrails

VEX Conflict Types

The Grey Queue surfaces VEX-specific conflicts:

ConflictExampleResolution Path
Status mismatchVendor says not_affected, distro says affectedTrust-weighted consensus or manual
Justification gapStatus not_affected but no justification providedRequest clarification or manual
Version range conflictOverlapping but different affected rangesManual analysis
Supersession disputeMultiple statements claim to supersedeTimestamp and trust resolution

Deterministic Conflict Detection

Conflicts are detected via structured comparison:

  1. Same vulnerability, same product, different statusVexStatusConflict
  2. VEX not_affected + confirmed reachabilityVexReachabilityContradiction
  3. Multiple issuers, equal trust, opposite conclusionsTrustTie

Console Behavior for Grey Queue

When displaying Grey Queue items:

Offline Grey Queue

In offline/air-gap mode: