Skip to content
Detections

Detections

detections[] is an array of phase-tagged queries a consumer can deploy to find affected resources, exploitation attempts, or configuration drift. Detection metadata is normative — detection_phase in particular tells consumers when a query becomes applicable and whether to retire it after remediation.

Detection object

{
  "provider": "aws",
  "service": "eks",
  "query_language": "cwli",
  "query": "fields @timestamp, @message | filter eventName = \"...\"",
  "detection_phase": "pre_fix",
  "description": "Detects EKS clusters running platform versions older than the runc-fix release.",
  "pending_reason": ""
}
FieldRequiredNotes
provider, serviceyesMatch the record’s natural key.
query_languageyesEmpty string allowed when pending_reason is set.
queryyesEmpty string allowed when pending_reason is set.
detection_phaseyesOne of pre_fix, exploitation, post_fix, misconfiguration.
descriptionyesHuman-readable explanation of what the query catches.
pending_reasonnoRequired when query is empty.

Detection phase

The phase tells the consumer when the query is applicable and whether to retire it after remediation.

PhaseDetectsRetention
pre_fixThe vulnerable condition itself.Deactivate or suppress per-resource after remediation is confirmed. May produce misleading results post-fix.
exploitationActive exploitation attempts (regardless of fix status).MUST remain active permanently.
post_fixExploitation attempts that remain possible after apparent remediation (e.g. credential reuse from before the rotation).Activate at provider_fix_date; retain permanently.
misconfigurationDrift back to a vulnerable state after remediation. A confirmed match is a window-reopening event (Exposure Window).MUST remain active indefinitely after any opt_in or config_change remediation.

When detections are mandatory

A record where fix_propagation is opt_in or config_change MUST include at least one misconfiguration-phase detection. This is non-negotiable: those propagation modes require the consumer to keep watching for drift, and the spec carries the detection forward as part of the record so consumers don’t have to re-author it.

A record with vex_status ∈ {affected, fixed} SHOULD include at least one detection (any phase).

Pending detections

When a producer can’t author a functional query at publication time — a detection-surface gap, query in development, awaiting provider telemetry — the spec MUST still include a detection entry. The query is empty, pending_reason carries the cause:

pending_reasonMeaning
query_in_developmentQuery is being authored or tested; future record update will replace it.
awaiting_provider_telemetryCloud provider doesn’t yet expose the data needed. Pending provider capability.
no_detection_surfaceNo provider service offers sufficient telemetry today. Permanent / long-term gap.
access_constraintRecord author lacks the provider environment access to develop the query.
pending_reviewCandidate query exists but is under security/accuracy review.

A consumer MUST NOT deploy a detection that has pending_reason set. A consumer SHOULD surface placeholders in operator-facing dashboards as detection coverage gaps, not “no detection needed”.

Query languages

ValueLanguage
cwliCloudWatch Logs Insights
cloudwatch_filterCloudWatch Metric Filter pattern syntax
kqlKusto Query Language (Azure Monitor + Sentinel)
gcp_logging_filterGCP Cloud Logging filter syntax
oci_logging_queryOCI Logging query syntax
luceneLucene query syntax (Cloudflare + SIEM)

Empty string is permitted when pending_reason is set.

Slot substitution in queries

If a query body contains {slot} placeholders, a consumer SHOULD substitute its named-variable values before deploying the query — same rules as template slot resolution. Hardcoded and empty slots in the query follow the same conventions as in templates.