ObjectStorage

S3/Blob/GCS bucket.

class: Storage

Realizing resources

aws aws

resourcescopeenumeraterequired permissions
aws:s3:bucket global s3:ListBuckets s3:ListAllMyBuckets

gcp gcp

resourcescopeenumeraterequired permissions
gcp:storage:bucket global storage.buckets.list storage.buckets.list

azure azure

resourcescopeenumeraterequired permissions
azure:storage:account global arg:microsoft.storage/storageaccounts Microsoft.Storage/storageaccounts/read

Rules that touch ObjectStorage 51

Write access to the S3 object that a stack's TemplateURL references: the next stack update will load and execute the attacker's template as the service role.
Write access to the pipeline's artifact store S3 bucket/prefix lets an attacker inject a malicious artifact that the next pipeline stage processes as the stage's action role - supply-chain code injection into the pipeline.
An EMR cluster whose instance profile has s3:GetObject on a data lake bucket can read all objects in that bucket.
Overwrite a component's S3-backed document (s3:PutObject on the component URI bucket/key) to inject malicious steps that execute on the next build as the build instance role.
A principal with query execution on a Redshift cluster can run UNLOAD using an attached IAM role that has s3:PutObject, exfiltrating warehouse data to an S3 location.
s3:PutBucketPublicAccessBlock + s3:PutBucketPolicy enables a two-step escalation to expose the bucket - attacker CAN expose the bucket but it is NOT currently exposed.
s3:ListBucket + s3:GetObject on a bucket enables enumeration and download of all objects - a complete bucket exfiltration.
s3:PutReplicationConfiguration sets up continuous S3 Replication to an external/attacker-controlled destination bucket, establishing a persistent data exfiltration channel.
s3:PutBucketNotification lets a principal reconfigure event notification targets (Lambda/SQS/SNS/EventBridge) for a bucket, redirecting all S3 events to attacker-controlled destinations.
s3:PutObject on a bucket that is a verified code-artifact deployment source (Lambda, CodePipeline, CloudFormation) for a compute workload equals modifying that workload's code.
s3:PutBucketPolicy lets a principal rewrite the bucket policy in full, self-granting any S3 permission including making the bucket public.
S3 bucket with a Principal:* bucket policy allowing s3:GetObject and Block Public Access disabled (RestrictPublicBuckets=false) is readable by any internet client.
s3:PutBucketAcl on a bucket with ObjectOwnership != BucketOwnerEnforced and Block Public Access IgnorePublicAcls=false enables ACL-based public exposure.
A principal that can read a bucket's data (CanReadData) and the bucket contains secrets (ContainsSecret) can read those secrets via s3:GetObject.
s3:GetObject on a bucket grants full data-plane read of stored objects (SSE-S3/no-encryption path - AWS-managed decryption, no caller kms:Decrypt needed).
s3:GetObject on a SSE-KMS bucket: read is CONDITIONAL on kms:Decrypt for the wrapping CMK. Cite credential-chains:decrypt-gates-secret-read to upgrade to ACTIVE.
S3 static website hosting publishes a public HTTP endpoint serving bucket objects, independent of the bucket policy's API access controls.
s3:PutObject on a bucket grants data-plane write, enabling object creation/overwrite - including code artifact poisoning.
Write access to the S3 object backing a Service Catalog product version's template (LoadTemplateFromURL): the next ProvisionProduct or UpdateProvisionedProduct loads the attacker's template and executes it as the launch role. cicd-chains propagates this CanModifyCode + ExecutesAs into CanExecuteAs.
ADLS Gen2 account with public blob access enabled and a public container exposes blob data to unauthenticated internet access.
Cluster init scripts run as root before user code; write access to the init-script URI + cluster edit = code injection on every node.
Write access to the CI-trigger branch of the pipeline's source repo lets a principal inject code that the pipeline will execute on the next triggered run.
A principal with read access to an Event Grid subscription's dead-letter destination (Storage blob container) can read all failed/expired event payloads, including any credential material they contain.
Storage Blob Data Contributor/Owner at account scope grants blob write access to all containers.
Storage Blob Data Contributor/Owner at container scope grants blob write access to that specific container.
Storage Blob Data Reader/Contributor/Owner at account scope grants data-plane read of all blob containers.
Storage Blob Data Reader/Contributor/Owner at container scope grants data-plane read of a specific blob container.
generateUserDelegationKey/action returns user-delegation key material (not a pre-formed SAS token) - the caller can sign arbitrary user-delegation SAS URLs offline within the key's validity window.
listAccountSas/action generates a pre-formed account-level SAS token, providing scoped but key-equivalent data-plane access.
listKeys/action returns storage account keys, bypassing all Azure RBAC and network controls for all sub-services (when SharedKey auth is enabled).
Storage account with public blob access enabled and a public container exposes blob data to unauthenticated internet access.
A Dataflow worker SA with storage.objects.create on an external GCS bucket can stream pipeline output (data records, query results) to that external location.
Writing to the GCS object that serves as a Dataflow Flex or Classic Template poisons the next job created from that template; the job runs the attacker-controlled pipeline code as the worker SA.
Write access to the Cloud Deploy pipeline's GCS source bucket allows injecting malicious skaffold.yaml into every render job.
storage.buckets.update allows a principal to modify bucket configuration: UBLA settings, CMEK default key, versioning, Pub/Sub notification configs, retention policy, and logging - enabling encryption ransomware, trigger hijacking, and configuration-based escalation.
storage.objects.get on the source bucket + storage.objects.create on a destination bucket (cross-project or attacker-controlled) constitute effective data exfiltration; achievable via storage.objects.copy (rewriteObject) which combines read+write permissions.
move · open · esc close