Detection rules › Panther

Azure Storage Immutability Policy Deleted

Severity
high
Log types
Azure.MonitorActivity
Tags
Defense Evasion, Impair Defenses, Inhibit System Recovery, Data Destruction, Ransomware, Storm-0501, WORM
Reference
https://www.microsoft.com/en-us/security/blog/2025/08/27/storm-0501s-evolving-techniques-lead-to-cloud-based-ransomware/
Source
github.com/panther-labs/panther-analysis

Detects deletion of Azure Storage immutability policies that provide WORM protection. Storm-0501 ransomware operators delete these policies before encrypting data, as WORM-protected blobs cannot be modified even by administrators. Critical pre-ransomware indicator.

MITRE ATT&CK coverage

Rule body yaml

AnalysisType: rule
Filename: azure_storage_immutability_policy_deleted.py
RuleID: "Azure.MonitorActivity.Storage.ImmutabilityPolicyDeleted"
DisplayName: "Azure Storage Immutability Policy Deleted"
Enabled: true
LogTypes:
  - Azure.MonitorActivity
Severity: High
Description: >
  Detects deletion of Azure Storage immutability policies that provide WORM protection.
  Storm-0501 ransomware operators delete these policies before encrypting data, as
  WORM-protected blobs cannot be modified even by administrators. Critical pre-ransomware indicator.
Reports:
  MITRE ATT&CK:
    - TA0005:T1562 # Defense Evasion: Impair Defenses
    - TA0005:T1562.001 # Defense Evasion: Disable or Modify Tools
    - TA0040:T1490 # Impact: Inhibit System Recovery
    - TA0040:T1485 # Impact: Data Destruction
Reference: https://www.microsoft.com/en-us/security/blog/2025/08/27/storm-0501s-evolving-techniques-lead-to-cloud-based-ransomware/
Tags:
  - Defense Evasion
  - Impair Defenses
  - Inhibit System Recovery
  - Data Destruction
  - Ransomware
  - Storm-0501
  - WORM
Runbook: |
  1. Query Azure Monitor Activity logs for all immutability policy deletions by the callerIpAddress and caller identity in the past 6 hours to calculate the total number of containers affected
  2. Search for resource lock deletions on the same storage account by the same caller in the 2 hours before this policy deletion to identify the Storm-0501 attack pattern
  3. Find all destructive operations on the affected storage account (DeleteBlob, PutBlob with CPK encryption, storage account deletion) in the 2 hours after policy deletion to assess if data destruction has begun
  4. Check if the storage account has been accessed from external IPs or if bulk GetBlob operations occurred after policy deletion to identify potential data exfiltration
  5. Review Azure.Audit logs for authentication events from the callerIpAddress in the 48 hours before to identify credential compromise indicators (unusual locations, failed MFA, privilege escalations)
  6. Search for other immutability policy or backup-related alerts triggered by the same callerIpAddress across all storage accounts in the past 7 days to determine attack scope
SummaryAttributes:
  - resourceId
  - callerIpAddress
  - correlationId
Tests:
  - Name: Immutability Policy Deleted Successfully
    ExpectedResult: true
    Log:
      {
        "time": "2025-01-27T14:45:00.0000000Z",
        "resourceId": "/subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/data-rg/providers/Microsoft.Storage/storageAccounts/criticaldata001/blobServices/default/containers/backups/immutabilityPolicies/default",
        "operationName": "MICROSOFT.STORAGE/STORAGEACCOUNTS/BLOBSERVICES/CONTAINERS/IMMUTABILITYPOLICIES/DELETE",
        "operationVersion": "2021-09-01",
        "category": "Administrative",
        "resultType": "Success",
        "resultSignature": "200",
        "callerIpAddress": "203.0.113.42",
        "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "level": "Informational",
        "location": "eastus",
        "tenantId": "87654321-4321-4321-4321-111111111111",
        "identity": {
          "claims": {
            "name": "attacker@example.com",
            "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn": "attacker@example.com"
          }
        }
      }
  - Name: Immutability Policy Deleted Case Insensitive
    ExpectedResult: true
    Log:
      {
        "time": "2025-01-27T15:20:00.0000000Z",
        "resourceId": "/subscriptions/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/resourceGroups/compliance-rg/providers/Microsoft.Storage/storageAccounts/compliancedata/blobServices/default/containers/audit-logs/immutabilityPolicies/default",
        "operationName": "microsoft.storage/storageaccounts/blobservices/containers/immutabilitypolicies/delete",
        "category": "Administrative",
        "resultType": "Succeeded",
        "callerIpAddress": "198.51.100.50",
        "correlationId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
        "level": "Information",
        "location": "westus2",
        "tenantId": "11111111-1111-1111-1111-111111111111"
      }
  - Name: Multiple Containers Immutability Deleted - Ransomware Pattern
    ExpectedResult: true
    Log:
      {
        "time": "2025-01-27T16:00:00.0000000Z",
        "resourceId": "/subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/prod-rg/providers/Microsoft.Storage/storageAccounts/proddata/blobServices/default/containers/financial-records/immutabilityPolicies/default",
        "operationName": "Microsoft.Storage/storageAccounts/blobServices/containers/immutabilityPolicies/delete",
        "category": "Administrative",
        "resultType": "Success",
        "callerIpAddress": "192.0.2.100",
        "correlationId": "c3d4e5f6-a7b8-9012-cdef-345678901234",
        "tenantId": "22222222-2222-2222-2222-222222222222"
      }
  - Name: Failed Immutability Policy Deletion
    ExpectedResult: false
    Log:
      {
        "time": "2025-01-27T17:00:00.0000000Z",
        "resourceId": "/subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/locked-rg/providers/Microsoft.Storage/storageAccounts/protecteddata/blobServices/default/containers/legal-hold/immutabilityPolicies/default",
        "operationName": "MICROSOFT.STORAGE/STORAGEACCOUNTS/BLOBSERVICES/CONTAINERS/IMMUTABILITYPOLICIES/DELETE",
        "category": "Administrative",
        "resultType": "Failed",
        "resultSignature": "409",
        "callerIpAddress": "198.18.0.50",
        "correlationId": "d4e5f6a7-b8c9-0123-def0-456789012345",
        "tenantId": "33333333-3333-3333-3333-333333333333"
      }
  - Name: Different Operation - Immutability Policy Extended
    ExpectedResult: false
    Log:
      {
        "time": "2025-01-27T18:00:00.0000000Z",
        "resourceId": "/subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/data-rg/providers/Microsoft.Storage/storageAccounts/storageacct/blobServices/default/containers/archives/immutabilityPolicies/default",
        "operationName": "MICROSOFT.STORAGE/STORAGEACCOUNTS/BLOBSERVICES/CONTAINERS/IMMUTABILITYPOLICIES/EXTEND",
        "category": "Administrative",
        "resultType": "Success",
        "callerIpAddress": "203.0.113.10",
        "correlationId": "e5f6a7b8-c9d0-1234-ef01-567890123456",
        "tenantId": "44444444-4444-4444-4444-444444444444"
      }

Detection logic

Condition

operationName eq "MICROSOFT.STORAGE/STORAGEACCOUNTS/BLOBSERVICES/CONTAINERS/IMMUTABILITYPOLICIES/DELETE"
resultType in ["Success", "Succeeded"]

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
operationNameeq
  • MICROSOFT.STORAGE/STORAGEACCOUNTS/BLOBSERVICES/CONTAINERS/IMMUTABILITYPOLICIES/DELETE
resultTypein
  • Succeeded
  • Success