Detection rules › Kusto

Cyren Feed Outage Detection

This is a third-party alert feed, not a detection over modeled telemetry. The vendor product raised the finding; this rule forwards it into the SIEM. It is searchable for reference but is excluded from the detection-rule browse and the ATT&CK coverage matrix.

Status
available
Severity
medium
Time window
1d
Source
github.com/Azure/Azure-Sentinel

'Detects when the Cyren threat intelligence feed has not ingested any data for 6 or more hours. This may indicate a connectivity issue with the data connector, API authentication problems, or upstream service disruption.'

MITRE ATT&CK coverage

TacticTechniques
StealthT1562 Impair Defenses

Rule body kusto

id: 7f9a0d5c-3b4c-6d7e-1f2a-e3f4a5b6c7d8
name: Cyren Feed Outage Detection
description: |
  'Detects when the Cyren threat intelligence feed has not ingested any data for 6 or more hours.
  This may indicate a connectivity issue with the data connector, API authentication problems, or upstream service disruption.'
severity: Medium
status: Available
requiredDataConnectors:
  - connectorId: CyrenThreatIntel
    dataTypes:
      - Cyren_Indicators_CL
queryFrequency: 1h
queryPeriod: 1d
triggerOperator: gt
triggerThreshold: 0
tactics:
  - DefenseEvasion
relevantTechniques:
  - T1562
query: |
  Cyren_Indicators_CL
  | where TimeGenerated >= ago(24h)
  | summarize 
      Total = count(), 
      Latest = max(TimeGenerated)
  | extend HoursAgo = datetime_diff('hour', now(), Latest)
  | where isnotempty(Latest) and HoursAgo >= 6
  | project 
      LatestEventTime = Latest, 
      HoursSinceLastEvent = HoursAgo, 
      TotalEventsLast24h = Total,
      AlertMessage = strcat("Cyren feed has not received data for ", HoursAgo, " hours")
suppressionDuration: 1h
suppressionEnabled: false
incidentConfiguration:
  createIncident: true
  groupingConfiguration:
    enabled: false
    reopenClosedIncident: false
    lookbackDuration: 1d
    matchingMethod: Selected
eventGroupingSettings:
  aggregationKind: SingleAlert
customDetails:
  LatestEventTime: LatestEventTime
  HoursSinceLastEvent: HoursSinceLastEvent
  TotalEventsLast24h: TotalEventsLast24h
version: 1.0.0
kind: Scheduled

Stages and Predicates

Stage 1: source

Cyren_Indicators_CL

Stage 2: where

| where TimeGenerated >= ago(24h)

Stage 3: summarize

| summarize 
    Total = count(), 
    Latest = max(TimeGenerated)

Stage 4: extend

| extend HoursAgo = datetime_diff('hour', now(), Latest)

Stage 5: where

| where isnotempty(Latest) and HoursAgo >= 6

Stage 6: project

| project 
    LatestEventTime = Latest, 
    HoursSinceLastEvent = HoursAgo, 
    TotalEventsLast24h = Total,
    AlertMessage = strcat("Cyren feed has not received data for ", HoursAgo, " hours")

Indicators

Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.

FieldKindValues
HoursAgoge
  • 6 transforms: cased
Latestis_not_null
  • (no value, null check)

Output fields

Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.

FieldSource
AlertMessageproject
HoursSinceLastEventproject
LatestEventTimeproject
TotalEventsLast24hproject