Back to Checks
aws

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 Cloud
Run
prowler aws --checks ecr_repositories_not_publicly_accessible

Recommendation

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