Skip to content
Vector String

Vector String

The CRIT vector string is a CVSS-style compact encoding of a record’s classification + identity fields. It is deterministic — given the same structured fields, the encoder always produces the same string and the parser is the inverse.

Format

CRITv<semver>/<metric>:<value>[/...]#<vuln_id>:<service>:<resource_type>

Sample:

CRITv0.3.0/CP:AW/VS:FX/FP:RR/SR:SH/RL:SM/EV:T/PP:1719792000/SA:1514764800#CVE-2024-21626:eks:cluster

Metric keys

The eight registered keys, in canonical order:

KeyField
CPprovider
VSvex_status
FPfix_propagation
SRshared_responsibility
RLresource_lifecycle
EVexisting_deployments_remain_vulnerable
PPvuln_published_date (epoch seconds)
SAservice_available_date (epoch seconds)

After the #: three positional colon-separated values — vuln_id, service, resource_type — exactly mirroring the record’s natural key.

Code → value tables

CP — provider

CodeProvider
AWaws
MAazure (Microsoft Azure)
GCgcp
CFcloudflare
OCoracle (Oracle Cloud)
SFsalesforce
SPsap
SNservicenow
IBibm
VMvmware
ADadobe
AKakamai
ALalibaba
ATatlassian
DOdigitalocean
ELelastic
FAfastly
GLgitlab
HChashicorp
HEhetzner
LIlinode
MOmongodb
OVovh
SOsnowflake
TStailscale
TCtencent
TWtwilio
VCvercel
VLvultr
ZMzoom

VS — vex_status

CodeValueMeaning
AFaffectedThe product is known to be affected by the CVE; no fix is yet available or applicable.
FXfixedA fix is available; temporal.provider_fix_date MUST be set.
NAnot_affectedThe product is confirmed unaffected (typically because the vulnerable code path is unreachable or the resource type doesn’t expose it).
UIunder_investigationThe producer has not yet determined affectedness.

FP — fix_propagation

CodeValueMeaning
AUautomaticProvider deploys the fix; customer takes no action.
CCconfig_changeCustomer applies a configuration change (toggle, policy edit, IAM update) without redeploying compute.
OIopt_inProvider has shipped the fix but customers must explicitly opt in (e.g. enable a feature flag, switch channel).
VUversion_updateCustomer upgrades the resource to a fixed version (kernel, agent, runtime, image tag).
RDredeployCustomer redeploys the resource without a version change (e.g. restart to pick up rotated keys).
RRrebuild_and_redeployCustomer rebuilds the resource from a fresh image / template AND redeploys.
DCdestroy_recreateCustomer destroys the resource and recreates it (state-impacting).
RLrolling_replaceProvider or customer performs a rolling replacement across instances/nodes.
NFno_fix_availableNo fix exists; mitigation only.

SR — shared_responsibility

CodeValueMeaning
POprovider_onlyProvider owns the fix entirely; customer has nothing to do.
CAcustomer_action_requiredCustomer must take action; the provider may have shipped the fix but customer-side adoption is required.
COcustomer_onlyProvider has no role; the fix is entirely customer-owned (e.g. customer-installed software on a generic compute resource).
SHsharedBoth provider and customer must act. Common for managed-Kubernetes node pools, agent-based services, etc.

RL — resource_lifecycle

CodeValueMeaning
EPephemeralResources are short-lived (function invocations, container tasks, build runs); fixed-by-replacement on next launch.
SMstateful_managedLong-lived resources whose lifecycle the provider manages (managed databases, managed Kubernetes clusters); customer state survives provider-driven upgrades.
SCstateful_customerLong-lived resources the customer manages directly (VMs, dedicated servers, on-prem clusters); upgrades require customer action.
CFconfig_onlyThe “resource” is a configuration object (DNS zone, WAF policy) with no compute backing; fix is a config edit.
GCglobal_control_planeProvider-wide control planes (IAM, KMS, billing, monitoring); fix lands once for everyone.

EV — existing_deployments_remain_vulnerable

CodeBooleanMeaning
TtrueExisting deployments stay vulnerable until the customer takes the remediation action.
FfalseThe fix lands transparently and existing deployments are immediately covered.

PP, SA — temporal epochs

Both are int64 Unix-epoch seconds (UTC). Encoded as the integer literal in the metric segment.

Vector fieldRecord field
PPtemporal.vuln_published_date (parsed YYYY-MM-DD → epoch)
SAtemporal.service_available_date (parsed YYYY-MM-DD → epoch)

A producer that lacks one of these dates SHOULD encode 0; the parser surfaces a temporal_*_zero warning so reviewers can backfill.

Round-trip rule

Every record’s vectorString MUST be byte-equal to ComputeVector(parsed_fields). The validator runs this check by parsing the vector, recomputing it from the structured fields, and comparing strings. A mismatch is a reject-at-publish-time hard failure.

Why bother with a vector?

  • Compact wire format — fits in CVE.org adp.metrics, in a Slack paste, in a header.
  • Signable — short enough for a human to verify a hash; useful for chain-of-custody on advisories.
  • GreppableCRITv0.3.0/CP:AW/.../#CVE-2024- is a stable token for log/feed pipelines.
  • VersionedCRITv<semver> lets parsers reject vectors from a spec version they don’t understand.

Implementations

  • Go: github.com/Vulnetix/ietf-crit-spec.ComputeVector / ParseVector / ValidateVectorRoundTrip.
  • JavaScript: bundled in this site’s validator — port of the Go reference. No deps.