An attacker holding a leaked cloud key usually lists your buckets and their contents before taking anything, and in most accounts that listing is never logged. MITRE ATT&CK T1619 Cloud Storage Object Discovery covers adversaries enumerating objects in cloud storage, using the same list APIs that applications call every minute: ListObjectsV2 in Amazon S3, List Blobs in Azure Storage and object listing in Google Cloud Storage. ATT&CK v20 places it in the Discovery tactic (TA0007) on the IaaS platform, with no sub-techniques. This guide covers what the listing looks like in each provider's logs, which logs are off by default, how to baseline the service principals and access keys that legitimately list storage, and how to test the detections. It is for cloud security engineers, detection engineers and SOC analysts, and is defensive only.
Key takeaways
- Listing is the step before theft. ATT&CK describes T1619 as the cloud equivalent of file and directory discovery: the result shapes which objects the adversary requests next under T1530 Data from Cloud Storage.
- Object listing is a data event, and data events are off by default. AWS CloudTrail, Google Cloud Data Access audit logs and Azure Storage resource logs all need to be switched on before object listing is recorded.
- The caller is usually a non-human identity. Leaked IAM user access keys, service account keys and SAS tokens are the common way in, so baselines should be per key and per workload, not per person.
- Volume and novelty beat signatures. A new principal, a new source network or a burst across many buckets in minutes is the signal; one ListObjects call never is.
- Least privilege on list permissions is the only ATT&CK mitigation. M1018 User Account Management: grant listing only to identities that need it, and scope it to named buckets and prefixes.
What T1619 covers
ATT&CK v20 says adversaries may enumerate objects stored in cloud infrastructure and use the result during automated discovery to shape follow-on behaviour, including requesting all or specific objects. It typically follows T1580 Cloud Infrastructure Discovery, which finds the storage services and buckets, and precedes T1530 collection. For the wider cloud discovery picture see the T1580 and T1619 Cloud Infrastructure and Storage Discovery Guide; this page goes deeper on object listing alone.
| Provider | Listing operations | Where it is logged | On by default? |
|---|---|---|---|
| Amazon S3 | ListBuckets (account level); ListObjects, ListObjectsV2, ListObjectVersions, ListParts (bucket level) | CloudTrail: ListBuckets is a bucket-level management event; object listing is a data event on AWS::S3::Object. S3 server access logs as a second source | Management events yes; data events no |
| Azure Blob Storage | ListContainers, ListBlobs, FindBlobsByTags; ADLS Gen2 ListFilesystems, ListFilesystemDir | Resource logs via a diagnostic setting (StorageRead category) into the StorageBlobLogs table | No: not collected until a diagnostic setting exists |
| Azure Files, Queues, Tables | ListShares, ListFiles, ListQueues, QueryTables, QueryEntities | Resource logs for each service | No |
| Google Cloud Storage | storage.buckets.list (ADMIN_READ), storage.objects.list (DATA_READ) | Cloud Audit Logs, Data Access logs | No: Data Access logs are disabled by default |
Two gaps matter. The AWS S3 CloudTrail page lists ListObjects, ListObjectVersions and ListParts as general purpose bucket data events, so check how your own trail records V2 calls before writing a rule on the event name. Google states that Cloud Audit Logs do not track access to resources made public through allUsers or allAuthenticatedUsers, even with Data Access logs on; usage logs are the source there.
How adversaries use it
ATT&CK v20 records four procedure examples. They show the technique is mostly carried out with stolen keys and ordinary tools, not custom malware.
| Actor or software | What ATT&CK records | Defensive lesson |
|---|---|---|
| ShinyHunters (G1057) | Used S3 Browser and WinSCP to access S3 objects | Legitimate desktop clients leave distinctive user agents and call patterns |
| Pacu (S1091) | Enumerates AWS storage services such as S3 buckets and EBS volumes | Cloud exploitation frameworks call many list APIs in a short window |
| Peirates (S0683) | Lists AWS S3 buckets from a Kubernetes foothold | Pod and node roles are callers too; baseline them |
| TruffleHog (S9009) | Enumerates AWS S3 and Google Cloud Storage buckets | A secrets scanner run by an attacker looks like one run by your own team, so know which scanners you run and from where |
Case: Bling Libra (ShinyHunters) in AWS
Unit 42 published an investigation in August 2024 into an intrusion it attributes to Bling Libra, which overlaps with ShinyHunters. The attackers took an IAM user's access key from a sensitive file exposed on the internet. The user had the AWS managed AmazonS3FullAccess policy. An IAM ListUsers call failed, then the attackers used the AWS CLI to call ListBuckets, browsed buckets with S3 Browser (which generated GetBucketLocation and GetBucketObjectLockConfiguration events) and used WinSCP, which generated ListBuckets. About a month later they deleted buckets, created many new ones by script and sent an extortion email. Because CloudTrail S3 data events and server access logging were off, the victim could not see object-level activity or prove what left. In lab tests Unit 42 found that S3 Browser issues ListObjects and other calls automatically, and that the user agent strings S3 Browser/, WinSCP/ and aws-cli/ help separate tool automation from operator actions. See the ShinyHunters Threat Actor Profile.
The exposure that makes T1619 possible is common. In the Football Australia AWS keys exposure, researchers reported that access keys left in public website code gave access to 127 storage buckets. No misuse beyond the researchers was reported, but any holder of those keys could have listed every bucket.
What to detect and where
ATT&CK v20 maps one detection strategy, DET0578, with analytic AN1594 for IaaS. It looks for enumeration through ListObjectsV2, List Blobs or GCP ListObjects and correlates it with the account's role, user context and prior authentication to find an unusual account, unexpected region or large-scale enumeration in a short window. The log sources it names are the data components Cloud Storage Enumeration (CloudTrail ListObjectsV2) and Cloud Storage Access (CloudTrail GetObject, CopyObject).
Turn the logs on first
- AWS: Add advanced event selectors for S3 data events on the buckets that hold sensitive data, or on all buckets if cost allows. Keep S3 server access logging for buckets where you need a second record. Enable GuardDuty S3 Protection, which reads S3 data events.
- Azure: Create a diagnostic setting on each storage account (the blob, file, queue and table sub-resources separately) sending StorageRead, StorageWrite and StorageDelete to Log Analytics. Enforce it with Azure Policy so new accounts are covered.
- Google Cloud: Enable Data Access audit logs for Cloud Storage (ADMIN_READ and DATA_READ) at organisation or folder level, with exemptions only for high-volume pipeline identities you have reviewed.
Detection logic
| Signal | Logic | Noise to expect |
|---|---|---|
| New lister | A principal (access key ID, managed identity, service account) lists objects for the first time in 30 days | New deployments; suppress with change tickets or deployment tags |
| Breadth burst | One principal lists more distinct buckets or containers in an hour than its 30-day maximum | Backup, inventory and data catalogue jobs; allow-list by identity and source |
| Wrong source | Listing by a workload identity from an IP or network outside its expected VPC, NAT ranges or region | Low if workloads use private endpoints |
| Unusual client | User agent for a desktop client or framework (S3 Browser, WinSCP, cloud attack tools) on a key normally used by an SDK | Administrators using GUI clients; record who does |
| Failed then succeeded | AccessDenied on IAM or other discovery calls followed by successful storage listing from the same key | Misconfigured new apps; low volume |
| List then bulk read | Listing followed within minutes by many GetObject or CopyObject calls on the listed prefixes | Sync tools; pair with source and identity checks |
Provider detections help but need the data logs. GuardDuty's Discovery:S3/AnomalousBehavior, Discovery:S3/MaliciousIPCaller and Discovery:S3/TorIPCaller findings are built on S3 data events. Microsoft Defender for Storage raises "Unusual data exploration in a storage account" (Storage.Blob_DataExplorationAnomaly), "Unusual access inspection in a storage account" and "Publicly accessible storage containers successfully discovered" for container guessing. Treat these as starting points and keep your own per-identity baselines. For hands-on CloudTrail work see How to Investigate CloudTrail for a Compromised Access Key.
Where identity fits
Almost every recorded case starts with a valid credential (T1078.004 Cloud Accounts), often a long-lived key found in code, files or a CI log (T1552.001 Credentials In Files). That makes the non-human identity the unit of detection and of response.
- Know every lister: Keep an inventory of which roles, service accounts, managed identities and keys hold
s3:ListBucket,s3:ListAllMyBuckets, Storage Blob Data Reader orstorage.objects.list, and which of them use it. - Prefer short-lived credentials: Workload identity federation and instance or pod roles remove the static keys that leak. See the Workload Identity Federation Guide.
- Treat SAS tokens as credentials: An account SAS with list permission is an unscoped lister; prefer user delegation SAS with short expiry.
- Respond per key: When a key lists unexpectedly, disable that key, then review everything it did. The Cloud Access Key Leak Playbook covers the steps.
Mitigations
| Control | Source | What to do |
|---|---|---|
| M1018 User Account Management | ATT&CK v20 | Restrict permissions to list cloud storage objects to accounts that need them |
| Scope list rights | NHI Mgmt Group recommendation | Grant listing on named buckets and prefixes, not *; avoid broad managed policies such as full-access storage policies on application identities |
| Guardrails | NHI Mgmt Group recommendation | Service control policies, permission boundaries or Azure Policy deny conditions so a leaked key cannot list outside its account or network (for example, conditions on VPC endpoint or source network) |
| Block public listing | NHI Mgmt Group recommendation | S3 Block Public Access, disabled anonymous blob access, no allUsers on buckets; anonymous listing is invisible to most audit logs |
| Remove static keys | NHI Mgmt Group recommendation | Replace IAM user keys and service account keys with federation; rotate and scan for any that remain |
| Data logging | NHI Mgmt Group recommendation | Enable data events or resource logs on sensitive stores so listing and reads are provable after the fact |
For bucket-level hardening see the Amazon S3 Security Guide and Azure Storage Security Guide.
How to test
- Confirm logging: In a test account, list a bucket with a test identity and confirm the event appears in CloudTrail Lake or your SIEM, in
StorageBlobLogsand in Cloud Logging, with identity, source IP and user agent populated. - Build the baseline: Run the queries in report-only mode for 30 days and record which identities list which stores, from where and how often.
- Emulate safely: With a dedicated test key on a test bucket, list from an unexpected network and with a GUI client user agent. Confirm the new-lister, wrong-source and unusual-client rules fire. Do not use production keys.
- Exercise response: Disable the test key from the alert, confirm the next call fails, and time the steps.
- Roll back noise: If a rule fires on a legitimate job, add a scoped exception by identity and source, never by bucket alone.
Measuring it
- Share of sensitive buckets and storage accounts with data-level logging on (target 100%).
- Number of identities holding list permissions on sensitive stores, and the share that used them in 90 days.
- Number of long-lived storage-capable keys remaining, trending down.
- Median time from an anomalous listing alert to key disabled.
- False positive rate per detection rule per month.
Common failure patterns
- No data events: As in the Bling Libra case, management logs show the bucket names touched but not what was listed or read, so scope of loss cannot be proved.
- Full-access policies on keys: A key used to upload to one bucket can list every bucket in the account.
- Alerting per call: Rules on single ListObjects calls drown the SOC and get disabled.
- Logging only new accounts: Diagnostic settings applied by hand miss storage accounts created later.
- Ignoring anonymous access: Public buckets can be listed without any identity appearing in audit logs.
Framework mapping
| Framework | Mapping |
|---|---|
| MITRE ATT&CK v20 | T1619 (TA0007 Discovery); related T1580, T1530, T1078.004, T1552.001; mitigation M1018; detection DET0578 / AN1594 |
| NIST SP 800-53 Rev. 5 | AC-6 Least Privilege, AC-2 Account Management, AU-2 Event Logging, AU-12 Audit Record Generation, SI-4 System Monitoring |
| NIST CSF 2.0 | PR.AA-05 access permissions managed; DE.CM-09 computing and data monitored; DE.AE-02 adverse events analysed |
| ISO/IEC 27001:2022 Annex A | 5.15 Access control, 8.15 Logging, 8.16 Monitoring activities |
Practitioner checklist
- Enable S3 data events, Azure Storage resource logs and GCS Data Access logs on sensitive stores.
- Enforce logging on new storage accounts and buckets with policy.
- Inventory every identity with list rights on sensitive storage.
- Scope list permissions to named buckets and prefixes.
- Replace long-lived storage keys with federated, short-lived credentials.
- Deploy new-lister, breadth-burst, wrong-source and unusual-client rules after a 30-day baseline.
- Turn on GuardDuty S3 Protection or Defender for Storage where you use those services.
- Test with a dedicated key on a test bucket and time the key-disable step.
Standards and references
- MITRE ATT&CK: Cloud Storage Object Discovery (T1619)
- AWS: Amazon S3 CloudTrail events
- AWS: GuardDuty S3 Protection finding types
- Microsoft Learn: Monitor Azure Blob Storage
- Microsoft Learn: Storage logged operations and status messages
- Microsoft Learn: Alerts for Azure Storage
- Google Cloud: Cloud Storage audit logging
- Palo Alto Networks Unit 42: Bling Libra (ShinyHunters) extortion in AWS
Related NHI Mgmt Group resources: T1530 Data from Cloud Storage Defensive Guide · AWS CloudTrail Guide · AWS Access Keys Security Guide · Public S3 Exposure Check