Back to Checks
ECR repository is not publicly accessible
ecr_repositories_not_publicly_accessible
Service: ecrSeverity: critical
OfficialBuilt-inVerified
Categories:internet-exposedcontainer-security
Resource Type:AwsEcrRepository
Amazon ECR repositories are evaluated for public exposure via repository policies that allow anonymous principals (e.g., Principal: "*") to access the repo, including image listing, pulling, or modification.
Risk
Public access to ECR repositories weakens confidentiality and integrity.
Anyone can pull images, exposing proprietary code or embedded secrets; if pushes are allowed, attackers can poison images, enabling supply-chain compromise. Uncontrolled pulls can raise egress costs and leak repository metadata.
Run this check with Prowler
Run in Prowler CloudRun
prowler aws --checks ecr_repositories_not_publicly_accessibleRecommendation
Apply least privilege to repository policies:
- Avoid
Principal:"*"and block anonymous access - Grant minimal actions to specific accounts/roles
- Require authenticated pulls/pushes via IAM
- Use private connectivity (e.g., VPC endpoints)
- Add defense in depth with image scanning and signing
Remediation
CLI
aws ecr delete-repository-policy --repository-name <example_resource_name>Terraform
resource "aws_ecr_repository_policy" "<example_resource_name>" {
repository = "<example_resource_name>"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { AWS = "arn:aws:iam::<example_resource_id>:root" } # Critical: restricts access to a specific AWS principal; removes public (*) access
Action = "ecr:*"
}]
})
}NativeIaC
Resources:
<example_resource_name>:
Type: AWS::ECR::Repository
Properties:
RepositoryPolicyText:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS: "arn:aws:iam::<example_resource_id>:root" # Critical: restricts access to a specific AWS account; removes public (*) access
Action: "ecr:*"Other
1In the AWS Console, go to Amazon ECR > Repositories
2Select the repository
3Open the Permissions tab and click Edit
4Remove any statement with Principal set to "*", or replace it with specific AWS ARN(s) (e.g., arn:aws:iam::<example_resource_id>:root)
5Save changes
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.ecr.ecr_client import ecr_client
from prowler.providers.aws.services.iam.lib.policy import is_policy_public
class ecr_repositories_not_publicly_accessible(Check):
def execute(self):
findings = []
for registry in ecr_client.registries.values():
for repository in registry.repositories:
if repository.policy is None:
continue
report = Check_Report_AWS(metadata=self.metadata(), resource=repository)
report.status = "PASS"
report.status_extended = (
f"Repository {repository.name} is not publicly accessible."
)
if repository.policy:
if is_policy_public(repository.policy, ecr_client.audited_account):
report.status = "FAIL"
report.status_extended = (
f"Repository {repository.name} is publicly accessible."
)
findings.append(report)
return findings