Check ID:
Provider: AWS
Service:
Severity: HIGH
Categories:
Resource type:
s3_bucket_cross_account_accessProvider: AWS
Service:
s3Severity: HIGH
Categories:
identity-access, trust-boundariesResource type:
AwsS3BucketWhat this check verifies
Amazon S3 bucket policies are analyzed for statements that grant cross-account access. Any policy that names principals outside the owning account (other account IDs orPrincipal: "*") is treated as cross-account; absence of a policy implies no cross-account grants.
Risk
Cross-account grants can let external principals read, write, or administer the bucket, impacting:- Confidentiality: unauthorized object access/exfiltration
- Integrity: object tampering, policy or encryption changes
- Availability: deletions, versioning changes, or lockouts causing data loss and downtime
Recommendation
Enforce least privilege: limit bucket policyPrincipal to your account or approved org IDs with fixed values; avoid wildcards.
Use role-based cross-account access with scoped permissions when needed. Add defense-in-depth conditions (private networks, TLS), and periodically review for unintended external access.
Remediation
- CLI
- Terraform
- Native IaC
- Dashboard steps
aws s3api delete-bucket-policy —bucket <example_resource_name>
References
- https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-6
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html
Where this check fires
This check runs on every scheduled scan against your AWS account. Findings appear at Cloud Security → Findings filterable byCheck ID = s3_bucket_cross_account_access. To re-evaluate after a fix, hit Run now on the account’s schedule under Cloud Security → Schedules — the next scan re-checks this control and marks the finding fixed or keeps it persistent.
← Back to AWS checks