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

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:

  1. Webhook actor allowlist je koristio ne-anchored regex.
  2. Napadač je registrovao GitHub ID koji se poklapao kao superstring trusted ID-a.
  3. Zlonamerni PR je pokrenuo CodeBuild.
  4. 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:

  1. EVENT filters 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.
  1. ACTOR_ACCOUNT_ID regex 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.
  1. 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.
  1. excludeMatchedPattern is misused
  • Podešavanje ovog flag-a pogrešno može invertovati nameravanu logiku.
  • Loše: FILE_PATH '^buildspec\\.yml$' sa excludeMatchedPattern=false kada je namera bila da se blokiraju izmene buildspec-a.
  • Bolje: isti pattern sa excludeMatchedPattern=true da se zabrani build koji dira buildspec.yml.
  • Zloupotreba: branitelji misle da zabranjuju rizične evente/putanje/aktore, ali zapravo ih dopuštaju.
  1. Multiple filterGroups create 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.
  1. Comment approval gate disabled or too permissive
  • pullRequestBuildPolicy.requiresCommentApproval=DISABLED je najmanje sigurno.
  • Previše široke role odobravaoca smanjuju kontrolu.
  • Loše: requiresCommentApproval=DISABLED.
  • Bolje: ALL_PULL_REQUESTS ili FORK_PULL_REQUESTS sa minimalnim rolama odobravaoca.
  • Zloupotreba: fork/drive-by PR-ovi se automatski izvršavaju bez odobrenja trusted maintenara.
  1. 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_PATH restrikcije.
  • Zloupotreba: napadač menja build inpute (buildspec/CI/dependencies) i dobija arbitrary command execution.
  1. Public visibility + status URL exposure
  • Javne build/check URL-ove poboljšavaju attacker recon i iterativno testiranje.
  • Loše: projectVisibility=PUBLIC_READ sa 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:

AWS Codebuild - Token Leakage

Finding CodeBuild URLs in GitHub PRs

Ako CodeBuild prijavljuje commit status nazad na GitHub, CodeBuild build URL se obično pojavljuje u:

  1. PR page -> Checks tab (ili status linija u Conversation/Commits).
  2. Commit page -> status/checks sekcija -> Details link.
  3. 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 pipefail

Usage:

./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.filterGroups koji sadrže PR događaje.
  • obrasci ACTOR_ACCOUNT_ID koji nemaju početne i krajnje oznake ^...$.
  • pullRequestBuildPolicy.requiresCommentApproval podešen na DISABLED.
  • Nedostatka ograničenja grana/putanja.
  • serviceRole visokih privilegija.
  • Rizičnog opsega i ponovne upotrebe kredencijala izvora.

Smernice za pojačanje bezbednosti

  1. Zahtevajte odobrenje komentara za PR buildove (ALL_PULL_REQUESTS ili FORK_PULL_REQUESTS).
  2. Ako koristite allow-liste za actore, uokvirite regex-e (koristite ^ i $) i držite ih preciznim.
  3. Dodajte FILE_PATH ograničenja da sprečite nepouzdane izmene buildspec.yml i CI skripti.
  4. Odvojite pouzdane release buildove od nepouzdanih PR buildova u različite projekte/role.
  5. Koristite fine-grained, najmanje privilegovane tokene provajdera izvora (poželjno koristiti posvećene niskoprivilegovane identitete).
  6. Kontinuirano proveravajte webhook filtere i korišćenje kredencijala izvora.

References

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