← Back to SOC feed Coverage →

Azure Storage Mass File Deletion

kql MEDIUM Azure-Sentinel
T1485
huntingmicrosoftofficial
This rule was pulled from an open-source repository and enriched with AI. Validate in a test environment before deploying to production.
View original rule at Azure-Sentinel →
Retrieved: 2026-04-23T09:00:00Z · Confidence: medium

Hunt Hypothesis

Adversaries may delete a large number of files within a short time window to exfiltrate data or erase evidence. SOC teams should proactively hunt for this behavior in Azure Sentinel to identify potential data exfiltration or sabotage activities early.

KQL Query


let deleteThreshold = 3;
let deleteWindow = 10m;
union
StorageFileLogs,
StorageBlobLogs
| where StatusText =~ "Success"
| where OperationName =~ "DeleteBlob" or OperationName =~ "DeleteFile"
| extend CallerIpAddress = tostring(split(CallerIpAddress, ":", 0)[0])
| summarize dcount(Uri) by bin(TimeGenerated, deleteWindow), CallerIpAddress, UserAgentHeader, AccountName
| where dcount_Uri >= deleteThreshold
| project TimeGenerated, IPCustomEntity=CallerIpAddress, UserAgentHeader, FilesDeleted=dcount_Uri, AccountName

Analytic Rule Definition

id: 85e16874-72aa-4ebe-b36e-e45f8ba50f79
name: Azure Storage Mass File Deletion
description: |
  'Detect mass file deletion events within Azure File and Blob storage. deleteWindow controls
  the period of time the deletions must occur in, whilst the deleteThreshold controls how many files
  must be deleted within that threshold. Query works on a per-IP address basis, so will only detect a single
  IP deleting multiple files.'
requiredDataConnectors: []
tactics:
  - Impact
relevantTechniques:
  - T1485
tags:
  - Ignite2021
query: |

  let deleteThreshold = 3;
  let deleteWindow = 10m;
  union
  StorageFileLogs,
  StorageBlobLogs
  | where StatusText =~ "Success"
  | where OperationName =~ "DeleteBlob" or OperationName =~ "DeleteFile"
  | extend CallerIpAddress = tostring(split(CallerIpAddress, ":", 0)[0])
  | summarize dcount(Uri) by bin(TimeGenerated, deleteWindow), CallerIpAddress, UserAgentHeader, AccountName
  | where dcount_Uri >= deleteThreshold
  | project TimeGenerated, IPCustomEntity=CallerIpAddress, UserAgentHeader, FilesDeleted=dcount_Uri, AccountName
entityMappings:
  - entityType: IP
    fieldMappings:
      - identifier: Address
        columnName: IPCustomEntity

MITRE ATT&CK Context

References

False Positive Guidance

Original source: https://github.com/Azure/Azure-Sentinel/blob/main/Hunting Queries/AzureStorage/AzureStorageMassDeletion.yaml