Detection rules › Kusto

Critical or High Severity Detections by User

Status
available
Severity
high
Time window
1h
Group by
DstHostName, DstUserName, FileHash, FileName, Message, SrcIpAddr
Source
github.com/Azure/Azure-Sentinel

'Creates an incident when a large number of Critical or High severity CrowdStrike Falcon sensor detections is triggered by a single user within 1 hour. The rule uses the CrowdStrikeFalconEventStream table, filters for DetectionSummaryEvent records with Severity set to Critical or High, and alerts when detections for a single DstUserName exceed the configured threshold of 15. Review DstHostName, SrcIpAddr, FileName, FileHash, and Message for investigation context.'

MITRE ATT&CK coverage

TacticTechniques
StealthT1562 Impair Defenses
ImpactT1489 Service Stop

Rule body kusto

id: 4465ebde-b381-45f7-ad08-7d818070a11c
name: Critical or High Severity Detections by User
description: |
  'Creates an incident when a large number of Critical or High severity CrowdStrike Falcon sensor detections is triggered by a single user within 1 hour. The rule uses the CrowdStrikeFalconEventStream table, filters for DetectionSummaryEvent records with Severity set to Critical or High, and alerts when detections for a single DstUserName exceed the configured threshold of 15. Review DstHostName, SrcIpAddr, FileName, FileHash, and Message for investigation context.'
severity: High
status: Available
requiredDataConnectors:
  - connectorId: CefAma
    dataTypes:
      - CommonSecurityLog
queryFrequency: 1h
queryPeriod: 1h
triggerOperator: gt
triggerThreshold: 0
tactics: 
- Impact
- DefenseEvasion
relevantTechniques:
- T1489
- T1562
query: |
  let timeframe = 1h;
  let threshold = 15; // update threshold value based on organization's preference
  let NotableEvents = CrowdStrikeFalconEventStream
  | where TimeGenerated > ago(timeframe)
  | where EventType == "DetectionSummaryEvent"
  | where Severity in ("Critical", "High")
  | summarize StartTimeUtc = min(TimeGenerated), EndTimeUtc = max(TimeGenerated), Total = count() by DstUserName, DstHostName, SrcIpAddr, FileName, FileHash, Message
  | where Total > threshold;
  NotableEvents
  | extend timestamp = StartTimeUtc, AccountCustomEntity = DstUserName, HostCustomEntity = DstHostName, IPCustomEntity = SrcIpAddr, FileHashCustomEntity = FileHash, FileHashAlgo = "MD5"
  | project timestamp, StartTimeUtc, EndTimeUtc, DstUserName, DstHostName, SrcIpAddr, FileName, FileHash, FileHashAlgo, Message, Total, AccountCustomEntity, HostCustomEntity, IPCustomEntity, FileHashCustomEntity
entityMappings:
- entityType: Account
  fieldMappings:
  - identifier: FullName
    columnName: AccountCustomEntity
- entityType: Host
  fieldMappings:
  - identifier: FullName
    columnName: HostCustomEntity
- entityType: IP
  fieldMappings:
  - identifier: Address
    columnName: IPCustomEntity
- entityType: FileHash
  fieldMappings:
  - identifier: Algorithm
    columnName: FileHashAlgo
  - identifier: Value
    columnName: FileHashCustomEntity
alertDetailsOverride:
  alertDisplayNameFormat: 'CrowdStrike critical/high detections by user: {{DstUserName}}'
  alertDescriptionFormat: User {{DstUserName}} generated {{Total}} critical/high detections from host {{DstHostName}}.
customDetails:
  DstUserName: DstUserName
  DstHostName: DstHostName
  SrcIpAddr: SrcIpAddr
  FileName: FileName
  FileHash: FileHash
  Total: Total
version: 1.0.5
kind: Scheduled

Stages and Predicates

Parameters

let timeframe = 1h;
let threshold = 15;

The stages below define let NotableEvents (the rule's main pipeline source).

Stage 1: source

CrowdStrikeFalconEventStream

Stage 2: where

| where TimeGenerated > ago(timeframe)

Stage 3: where

| where EventType == "DetectionSummaryEvent"

Stage 4: where

| where Severity in ("Critical", "High")

Stage 5: summarize

| summarize StartTimeUtc = min(TimeGenerated), EndTimeUtc = max(TimeGenerated), Total = count() by DstUserName, DstHostName, SrcIpAddr, FileName, FileHash, Message
Threshold
gt 15

Stage 6: where

| where Total > threshold

The stages below run on NotableEvents (the outer pipeline).

Stage 7: extend

NotableEvents
| extend timestamp = StartTimeUtc, AccountCustomEntity = DstUserName, HostCustomEntity = DstHostName, IPCustomEntity = SrcIpAddr, FileHashCustomEntity = FileHash, FileHashAlgo = "MD5"

Stage 8: project

| project timestamp, StartTimeUtc, EndTimeUtc, DstUserName, DstHostName, SrcIpAddr, FileName, FileHash, FileHashAlgo, Message, Total, AccountCustomEntity, HostCustomEntity, IPCustomEntity, FileHashCustomEntity

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
EventTypeeq
  • DetectionSummaryEvent transforms: cased
Severityin
  • Critical transforms: cased
  • High transforms: cased
Totalgt
  • 15 transforms: cased

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
AccountCustomEntityproject
DstHostNameproject
DstUserNameproject
EndTimeUtcproject
FileHashproject
FileHashAlgoproject
FileHashCustomEntityproject
FileNameproject
HostCustomEntityproject
IPCustomEntityproject
Messageproject
SrcIpAddrproject
StartTimeUtcproject
Totalproject
timestampproject