Azure Storage Anonymous Blob Access to Unusual Resource
editAzure Storage Anonymous Blob Access to Unusual Resource
editIdentifies the first time an Azure Storage resource receives an anonymous data-plane read (GetBlob and related Get or List operations). Anonymous requests are used to probe public containers and to test stolen blob URLs before a SAS is appended. First-seen resource ID keeps volume down while still covering WireServer-related probes of status or extension blobs.
Rule type: new_terms
Rule indices:
- logs-azure.platformlogs-*
Severity: medium
Risk score: 47
Runs every: 5m
Searches indices from: now-9m (Date Math format, see also Additional look-back time)
Maximum alerts per execution: 100
References:
- https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables/storagebloblogs
- https://learn.microsoft.com/en-us/azure/storage/blobs/anonymous-read-access-prevent
- https://cybercx.com.au/blog/azure-ssrf-metadata/
- https://www.netspi.com/blog/technical-blog/cloud-pentesting/decrypting-vm-extension-settings-with-azure-wireserver/
Tags:
- Domain: Cloud
- Data Source: Azure
- Data Source: Azure Platform Logs
- Platform: Azure
- Service: Azure Storage
- Use Case: Threat Detection
- Tactic: Discovery
- Tactic: Collection
- Resources: Investigation Guide
Version: 1
Rule authors:
- Elastic
Rule license: Elastic License v2
Investigation guide
editTriage and analysis
Investigating Azure Storage Anonymous Blob Access to Unusual Resource
StorageRead platform logs record AuthenticationType as Anonymous when no SAS, OAuth, or account key is presented.
A first-seen azure.resource.id (typically the blob service
/subscriptions/.../storageAccounts/<account>/blobServices/default) means this resource has not had anonymous Get or
List traffic in the history window.
WireServer SAS-replay chains often start with an anonymous GetBlob (HTTP 409/403) against the same object, then a SAS 200. This rule does not require guest-agent path strings; those lab container names are not production observables.
source.ip is often empty. Use source.address (ip:port).
Possible investigation steps
-
Review
event.action,azure.platformlogs.statusCode, andazure.platformlogs.uri. - HTTP 200 with Anonymous means the container or blob is publicly readable. HTTP 409/403 is a probe.
-
Identify the account from
azure.resource.id/azure.resource.nameand check whether public access is intended. - Search for SAS-authenticated GetBlob to the same account from the same source shortly after.
-
If the URI contains
/$system/ormd-hdd-, correlate with WireServer access on VMs in the subscription.
False positive analysis
-
Public blob websites and CDN origins. Exclude the
azure.resource.idfor approved public accounts. - New accounts that enable StorageRead for the first time will alert on the first scanner hit.
Response and remediation
- Disable anonymous public access on accounts that should be private.
- If a follow-on SAS read exists, revoke that SAS and review how the URL was obtained.
- Keep StorageRead diagnostic logs enabled on storage accounts of interest.
Setup
editRequired Azure Storage Diagnostic Logs
Enable StorageRead diagnostic logs on Azure Storage Accounts and stream them to the Event Hub used by the Azure
integration. Anonymous vs SAS is azure.platformlogs.identity.type.
Rule query
editdata_stream.dataset: azure.platformlogs and
azure.platformlogs.identity.type: Anonymous and
event.action: (
GetBlob or GetBlobMetadata or GetBlobProperties or GetBlockList or
GetPageRanges or QueryBlobContents or ListBlobs or
GetContainerProperties or GetContainerMetadata or GetContainerAcl
)
Framework: MITRE ATT&CKTM
-
Tactic:
- Name: Discovery
- ID: TA0007
- Reference URL: https://attack.mitre.org/tactics/TA0007/
-
Technique:
- Name: Cloud Infrastructure Discovery
- ID: T1580
- Reference URL: https://attack.mitre.org/techniques/T1580/
-
Tactic:
- Name: Collection
- ID: TA0009
- Reference URL: https://attack.mitre.org/tactics/TA0009/
-
Technique:
- Name: Data from Cloud Storage
- ID: T1530
- Reference URL: https://attack.mitre.org/techniques/T1530/