AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Ovaj vektor napada se javljа kada je javni PR workflow povezan sa privilegovanim CodeBuild projektom koji ima slabe kontrole webhook-a.
Ako eksterni napadač uspe da natera CodeBuild da izvrši njihov PR, obično može dobiti arbitrary code execution unutar build-a (build scripts, dependency hooks, test scripts, itd.), a zatim pivot-ovati ka tajnama, IAM credential-ima, ili source-provider credentials.
Zašto je ovo opasno
CodeBuild webhook filteri se evaluiraju pomoću regex pattern-a (za filtre koji nisu EVENT). U ACTOR_ACCOUNT_ID filteru to znači da slab pattern može poklopiti više korisnika nego što je namera.
Ako se nepoverljivi PR-ovi build-uju u projektu koji ima privilegovane AWS role ili GitHub credential-e, to može postati potpuna supply-chain kompromitacija.
Wiz je pokazao praktičan lanac gde:
- Webhook actor allowlist je koristio ne-anchored regex.
- Napadač je registrovao GitHub ID koji se poklapao kao superstring trusted ID-a.
- Zlonamerni PR je pokrenuo CodeBuild.
- Izvršenje koda u buildu je iskorišćeno za dump-ovanje memorije i vraćanje source-provider credential-a/tokena.
Misconfigurations koje omogućavaju izvršavanje eksternog PR koda
Ispod su high-risk greške i kako ih napadači zloupotrebljavaju:
EVENTfilters allow untrusted triggers
- Uobičajeni rizični eventi:
PULL_REQUEST_CREATED,PULL_REQUEST_UPDATED,PULL_REQUEST_REOPENED. - Drugi eventi koji takođe mogu postati opasni ako su vezani za privilegovane build-ove:
PUSH,PULL_REQUEST_CLOSED,PULL_REQUEST_MERGED,RELEASED,PRERELEASED,WORKFLOW_JOB_QUEUED. - Loše:
EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"u privilegovanom projektu. - Bolje: koristite PR comment approval i minimizirajte trigger evente za privilegovane projekte.
- Zloupotreba: napadač otvori/azurira PR ili push-uje na branch koji kontroliše, i njihov kod se izvršava u CodeBuild-u.
ACTOR_ACCOUNT_IDregex is weak
- Loše: unanchored pattern-i kao
123456|7890123. - Bolje: exact-match anchoring
^(123456|7890123)$. - Zloupotreba: regex over-match dozvoljava neautorizovanim GitHub ID-evima da prođu kroz allowlist.
- Other regex filters are weak or missing
HEAD_REF- Loše:
refs/heads/.* - Bolje:
^refs/heads/main$(ili eksplicitna lista trusted grana) BASE_REF- Loše:
.* - Bolje:
^refs/heads/main$ FILE_PATH- Loše: nema ograničenja na putanje
- Bolje: isključiti rizične fajlove kao
^buildspec\\.yml$,^\\.github/workflows/.*,(^|/)package(-lock)?\\.json$ COMMIT_MESSAGE- Loše: trust marker sa labavim match-om kao
trusted - Bolje: ne koristiti commit poruku kao trust boundary za izvršenje PR-a
REPOSITORY_NAME/ORGANIZATION_NAME- Loše:
.*u org/global webhooks - Bolje: samo tačna repo/org poklapanja
WORKFLOW_NAME- Loše:
.* - Bolje: tačno ime workflow-a (ili izbegavati ovo kao trust kontrolu)
- Zloupotreba: napadač pažljivo gradi ref/path/message/repo kontekst da zadovolji permisivni regex i okine build.
excludeMatchedPatternis misused
- Podešavanje ovog flag-a pogrešno može invertovati nameravanu logiku.
- Loše:
FILE_PATH '^buildspec\\.yml$'saexcludeMatchedPattern=falsekada je namera bila da se blokiraju izmene buildspec-a. - Bolje: isti pattern sa
excludeMatchedPattern=trueda se zabrani build koji dirabuildspec.yml. - Zloupotreba: branitelji misle da zabranjuju rizične evente/putanje/aktore, ali zapravo ih dopuštaju.
- Multiple
filterGroupscreate accidental bypasses
- CodeBuild evaluira grupe kao OR (jedna prolazna grupa je dovoljna).
- Loše: jedna stroga grupa + jedna permisivna fallback grupa (npr. samo
EVENT=PULL_REQUEST_UPDATED). - Bolje: ukloniti fallback grupe koje ne nameću actor/ref/path ograničenja.
- Zloupotreba: napadač treba da zadovolji samo najslabiju grupu.
- Comment approval gate disabled or too permissive
pullRequestBuildPolicy.requiresCommentApproval=DISABLEDje najmanje sigurno.- Previše široke role odobravaoca smanjuju kontrolu.
- Loše:
requiresCommentApproval=DISABLED. - Bolje:
ALL_PULL_REQUESTSiliFORK_PULL_REQUESTSsa minimalnim rolama odobravaoca. - Zloupotreba: fork/drive-by PR-ovi se automatski izvršavaju bez odobrenja trusted maintenara.
- No restrictive branch/path strategy for PR builds
- Nedostatak defense-in-depth sa
HEAD_REF+BASE_REF+FILE_PATH. - Loše: samo
EVENT+ACTOR_ACCOUNT_ID, bez ref/path kontrola. - Bolje: kombinovati tačan
ACTOR_ACCOUNT_ID+BASE_REF+HEAD_REF+FILE_PATHrestrikcije. - Zloupotreba: napadač menja build inpute (buildspec/CI/dependencies) i dobija arbitrary command execution.
- Public visibility + status URL exposure
- Javne build/check URL-ove poboljšavaju attacker recon i iterativno testiranje.
- Loše:
projectVisibility=PUBLIC_READsa osetljivim logovima/configom u javnim build-ovima. - Bolje: čuvati projekte privatnim osim ako postoji jak business razlog, i sanitizovati logove/artifakte.
- Zloupotreba: napadač otkriva pattern-e/projekta ponašanje, pa podešava payload-e i pokušaje bypass-a.
Token leakage from memory
Wiz-ov write-up objašnjava da su source-provider credential-i prisutni u runtime kontekstu build-a i mogu biti ukradeni nakon kompromitovanja build-a (na primer, kroz memory dumping), omogućavajući takeover repozitorijuma ako su scope-ovi široki.
AWS je uveo hardening nakon otkrića, ali osnovna lekcija ostaje: nikada ne izvršavajte untrusted PR kod u privilegovanim build kontekstima i pretpostavite da će napadač-kontrolisani build pokušati theft of credential-a.
Za dodatne tehnike krađe credential-a u CodeBuild, pogledajte takođe:
Finding CodeBuild URLs in GitHub PRs
Ako CodeBuild prijavljuje commit status nazad na GitHub, CodeBuild build URL se obično pojavljuje u:
- PR page -> Checks tab (ili status linija u Conversation/Commits).
- Commit page -> status/checks sekcija -> Details link.
- PR commits list -> kliknite na check context priključen za commit.
Za javne projekte, ovaj link može otkriti build metadata/configuration neautentifikovanim korisnicima.
Script: detect CodeBuild URLs in a PR and test if they look public
```bash #!/usr/bin/env bash set -euo pipefailUsage:
./check_pr_codebuild_urls.sh <pr_number>
Requirements: gh, jq, curl
OWNER=“${1:?owner}” REPO=“${2:?repo}” PR=“${3:?pr_number}”
for bin in gh jq curl timeout; do command -v “$bin” >/dev/null || { echo “[!] Missing dependency: $bin” >&2; exit 1; } done
tmp_commits=“$(mktemp)” tmp_urls=“$(mktemp)” trap ‘rm -f “$tmp_commits” “$tmp_urls”’ EXIT
gh_api() { timeout 20s gh api “$@” 2>/dev/null || true }
Get all commit SHAs in the PR (bounded call to avoid hangs)
gh_api “repos/${OWNER}/${REPO}/pulls/${PR}/commits” –paginate –jq ‘.[].sha’ > “$tmp_commits” if [ ! -s “$tmp_commits” ]; then echo “[!] No commits found (or API call timed out/failed).” >&2 exit 1 fi
echo “[*] PR commits:” cat “$tmp_commits” echo
echo “[*] Searching commit statuses/check-runs for CodeBuild URLs…”
while IFS= read -r sha; do [ -z “$sha” ] && continue
Classic commit statuses (target_url)
gh_api “repos/${OWNER}/${REPO}/commits/${sha}/status”
–jq ‘.statuses[]? | .target_url // empty’ 2>/dev/null || true
GitHub Checks API (details_url)
gh_api “repos/${OWNER}/${REPO}/commits/${sha}/check-runs”
–jq ‘.check_runs[]? | .details_url // empty’ 2>/dev/null || true
done < “$tmp_commits” | sort -u > “$tmp_urls”
grep -Ei ‘codebuild|codebuild.aws.amazon.com|console.aws.amazon.com/.*/codebuild’ “$tmp_urls” || true
echo echo “[*] Public-access heuristic:” echo “ - If URL redirects to signin.aws.amazon.com -> likely not public“ echo “ - If URL is directly reachable (HTTP 200) without auth redirect -> potentially public“ echo
cb_urls=“$(grep -Ei ‘codebuild|codebuild.aws.amazon.com|console.aws.amazon.com/./codebuild’ “$tmp_urls” || true)“ if [ -z “$cb_urls” ]; then echo “[] No CodeBuild URLs found in PR statuses/check-runs.” exit 0 fi
while IFS= read -r url; do [ -z “$url” ] && continue final_url=“$(timeout 20s curl -4 -sS -L –connect-timeout 5 –max-time 20 -o /dev/null -w ‘%{url_effective}’ “$url” || true)“ code=“$(timeout 20s curl -4 -sS -L –connect-timeout 5 –max-time 20 -o /dev/null -w ‘%{http_code}’ “$url” || true)“
if echo “$final_url” | grep -qi ‘signin.aws.amazon.com’; then verdict=“NOT_PUBLIC_OR_AUTH_REQUIRED” elif [ “$code” = “200” ]; then verdict=“POTENTIALLY_PUBLIC” else verdict=“UNKNOWN_CHECK_MANUALLY” fi
printf ‘%s\t%s\t%s\n’ “$verdict” “$code” “$url” done <<< “$cb_urls”
Testirano sa:
```bash
bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1
Brzi kontrolni spisak za reviziju
# Enumerate projects
aws codebuild list-projects
# Inspect source/webhook configuration
aws codebuild batch-get-projects --names <project-name>
# Inspect global source credentials configured in account
aws codebuild list-source-credentials
Pregledajte svaki projekat zbog:
webhook.filterGroupskoji sadrže PR događaje.- obrasci
ACTOR_ACCOUNT_IDkoji nemaju početne i krajnje oznake^...$. pullRequestBuildPolicy.requiresCommentApprovalpodešen naDISABLED.- Nedostatka ograničenja grana/putanja.
serviceRolevisokih privilegija.- Rizičnog opsega i ponovne upotrebe kredencijala izvora.
Smernice za pojačanje bezbednosti
- Zahtevajte odobrenje komentara za PR buildove (
ALL_PULL_REQUESTSiliFORK_PULL_REQUESTS). - Ako koristite allow-liste za actore, uokvirite regex-e (koristite ^ i $) i držite ih preciznim.
- Dodajte
FILE_PATHograničenja da sprečite nepouzdane izmenebuildspec.ymli CI skripti. - Odvojite pouzdane release buildove od nepouzdanih PR buildova u različite projekte/role.
- Koristite fine-grained, najmanje privilegovane tokene provajdera izvora (poželjno koristiti posvećene niskoprivilegovane identitete).
- Kontinuirano proveravajte webhook filtere i korišćenje kredencijala izvora.
References
- Wiz: CodeBreach - AWS CodeBuild ACTOR_ID regex bypass and token theft
- AWS CodeBuild API - WebhookFilter
- AWS CLI - codebuild create-webhook
- AWS CodeBuild User Guide - Best practices for webhooks
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks Cloud

