Azure Key Vault Multi-Vault Secret Retrieval Burst by Application
Description
Identifies a burst of successful Azure Key Vault secret retrievals by the same principal and application across multiple vaults. Adversaries with compromised application credentials may collect stored secrets at scale to access additional services or move laterally.
Query · esql
from logs-azure.platformlogs-* metadata _id, _index
| where data_stream.dataset == "azure.platformlogs"
and event.action == "SecretGet"
and azure.platformlogs.identity.claim.iss is not null and azure.platformlogs.identity.claim.iss != ""
and azure.platformlogs.identity.claim.oid is not null and azure.platformlogs.identity.claim.oid != ""
and azure.platformlogs.identity.claim.appid is not null and azure.platformlogs.identity.claim.appid != ""
and azure.resource.id is not null and azure.resource.id != ""
and KQL("azure.platformlogs.properties.httpStatusCode:200")
| eval Esql.time_window = date_trunc(15 minutes, @timestamp)
| stats
Esql.secret_read_count = count(*),
Esql.vault_count = count_distinct(azure.resource.id),
Esql.vaults = values(azure.resource.id),
Esql.source_ips = values(source.ip),
Esql.first_seen = min(@timestamp),
Esql.last_seen = max(@timestamp)
by Esql.time_window, azure.platformlogs.identity.claim.iss, azure.platformlogs.identity.claim.oid,
azure.platformlogs.identity.claim.appid
| where Esql.secret_read_count >= 20 and Esql.vault_count >= 3
| keep azure.platformlogs.identity.claim.iss, azure.platformlogs.identity.claim.oid,
azure.platformlogs.identity.claim.appid, Esql.*
Investigation fields
Pivot points the source recommends for triage.
azure.platformlogs.identity.claim.issazure.platformlogs.identity.claim.oidazure.platformlogs.identity.claim.appidEsql.secret_read_countEsql.vault_countEsql.vaultsEsql.time_window
Implementation guide
Enable AuditEvent diagnostic logging for the relevant Key Vaults and ingest it through the Azure integration's
platform logs data stream into logs-azure.platformlogs-*. Retain the token issuer, object ID, application ID,
vault resource ID, and HTTP status in the original events. The HTTP status is a subfield of the flattened
azure.platformlogs.properties field and is selected with KQL. Events missing the required identity or vault
fields are excluded. A user principal name is not required.
The rule evaluates a 30-minute ingestion lookback every five minutes and groups requests into fixed 15-minute event-time windows. Requests split across window boundaries or ingested more than 30 minutes apart may not be combined. Review delivery latency and repeated aggregate alerts when tuning the schedule.
Known false positives
- Authorized inventory jobs, secret migration tools, and multi-vault deployment pipelines may retrieve many secrets across several vaults within 15 minutes.
Analyst notes
Investigating Azure Key Vault Multi-Vault Secret Retrieval Burst by Application
Azure Key Vault stores credentials that applications use to access other services. A compromised identity can use its existing vault permissions to collect these credentials and extend access to additional resources. This rule matches the Storm-0940 hunting pattern: at least 20 successful SecretGet requests by one principal and application across at least three vaults in a 15-minute window. Single-vault application startup and refresh traffic is outside this threshold. Repeated reads of the same secret still count toward the volume.
Possible investigation steps
- Identify the principal and application using
azure.platformlogs.identity.claim.oidandazure.platformlogs.identity.claim.appid. Useazure.platformlogs.identity.claim.issto establish the issuing tenant, and resolve the object against the tenant's identity inventory. - Review
Esql.time_window,Esql.secret_read_count,Esql.vault_count,Esql.vaults, andEsql.source_ipsto establish the access volume, affected vaults, and request sources. - Review the original events and the
azure.platformlogs.properties.requestUriandazure.platformlogs.properties.idvalues to identify the secrets accessed. Confirm successful retrieval usingazure.platformlogs.properties.httpStatusCode; the normalized event outcome alone may not distinguish reads from denials. - Determine whether the principal is an application, managed identity, or user acting through an application. Application and object claims can also appear in delegated tokens, and an absent user principal name does not establish app-only authentication.
- Correlate the activity with service-principal or managed-identity sign-ins, recent credential additions, permission changes, and access to services that use the retrieved secrets.
- Check whether the application owner expected a multi-vault inventory, migration, or deployment during the alert window.
False positive analysis
- Authorized inventory, migration, and multi-vault deployment pipelines can produce this pattern. Compare the vault set and sources with the application's normal activity and change records.
- Scope any justified exception to the issuer, principal, application, and expected vault set, and reassess it when ownership or permissions change.
Response and remediation
- If compromise is confirmed, restrict the principal's access to the affected vaults and remove compromised application credentials according to the incident response process.
- Determine which secrets were exposed and rotate them, including credentials for downstream services where necessary.
- Review and remove unauthorized permissions or credentials associated with the principal. Verify that access is denied after containment; removing an application credential alone does not immediately invalidate every issued access token.
- Preserve the relevant Key Vault, sign-in, and audit events for investigation.