AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Questo vettore di attacco si presenta quando un workflow PR esposto pubblicamente è collegato a un progetto CodeBuild privilegiato con controlli webhook deboli.
Se un attacker esterno riesce a far eseguire a CodeBuild la loro pull request, di solito può ottenere lâesecuzione di codice arbitrario allâinterno della build (script di build, hook delle dipendenze, script di test, ecc.), e poi pivotare verso secrets, credenziali IAM o credenziali del provider di sorgente.
Why this is dangerous
I filtro webhook di CodeBuild sono valutati con pattern regex (per i filtri diversi da EVENT). Nel filtro ACTOR_ACCOUNT_ID, questo significa che un pattern debole può corrispondere a piÚ utenti del previsto.
Se PR non attendibili vengono costruite in un progetto che ha permessi role AWS privilegiati o credenziali GitHub, questo può diventare una compromissione completa della supply-chain.
Wiz ha mostrato una catena pratica dove:
- Una allowlist di actor del webhook usava una regex non ancorata.
- Un attacker ha registrato un ID GitHub che corrispondeva come superstringa di un ID trusted.
- Una PR malevola ha triggerato CodeBuild.
- Lâesecuzione del codice nella build è stata usata per dumpare memoria e recuperare credenziali/token del provider di sorgente.
Misconfigurations that allow external PR code execution
Di seguito gli errori ad alto rischio e come gli attacker abusano di ciascuno:
EVENTfilters allow untrusted triggers
- Eventi comunemente rischiosi:
PULL_REQUEST_CREATED,PULL_REQUEST_UPDATED,PULL_REQUEST_REOPENED. - Altri eventi che possono diventare pericolosi se collegati a build privilegiate:
PUSH,PULL_REQUEST_CLOSED,PULL_REQUEST_MERGED,RELEASED,PRERELEASED,WORKFLOW_JOB_QUEUED. - Pericoloso:
EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"in un progetto privilegiato. - Consigliato: usare approvazione tramite commento su PR e minimizzare gli eventi di trigger per i progetti privilegiati.
- Abuso: lâattacker apre/aggiorna una PR o push su un branch che controlla, e il proprio codice viene eseguito in CodeBuild.
ACTOR_ACCOUNT_IDregex is weak
- Pericoloso: pattern non ancorati come
123456|7890123. - Consigliato: ancorare con corrispondenza esatta
^(123456|7890123)$. - Abuso: lâover-match della regex permette a ID GitHub non autorizzati di passare le allowlist.
- Other regex filters are weak or missing
HEAD_REF- Pericoloso:
refs/heads/.* - Consigliato:
^refs/heads/main$(o una lista esplicita di branch trusted)
- Pericoloso:
BASE_REF- Pericoloso:
.* - Consigliato:
^refs/heads/main$
- Pericoloso:
FILE_PATH- Pericoloso: nessuna restrizione sui percorsi
- Consigliato: escludere file rischiosi come
^buildspec\\.yml$,^\\.github/workflows/.*,(^|/)package(-lock)?\\.json$
COMMIT_MESSAGE- Pericoloso: fidarsi di un marcatore nel commit con match permissivo come
trusted - Consigliato: non usare il commit message come confine di trust per lâesecuzione delle PR
- Pericoloso: fidarsi di un marcatore nel commit con match permissivo come
REPOSITORY_NAME/ORGANIZATION_NAME- Pericoloso:
.*in webhook a livello org/globale - Consigliato: corrispondenze esatte solo per repo/org
- Pericoloso:
WORKFLOW_NAME- Pericoloso:
.* - Consigliato: corrispondenze esatte del nome del workflow (o evitare di usare questo come meccanismo di trust)
- Pericoloso:
- Abuso: lâattacker costruisce ref/path/message/context del repo in modo da soddisfare una regex permissiva e triggerare le build.
excludeMatchedPatternis misused
- Impostare questo flag in modo errato può invertire la logica desiderata.
- Pericoloso:
FILE_PATH '^buildspec\\.yml$'conexcludeMatchedPattern=falsequando lâintento era bloccare modifiche a buildspec. - Consigliato: stesso pattern con
excludeMatchedPattern=trueper negare build che toccanobuildspec.yml. - Abuso: i defender pensano di negare eventi/percorsi/actor rischiosi, ma in realtĂ li consentono.
- Multiple
filterGroupscreate accidental bypasses
- CodeBuild valuta i gruppi come OR (basta che un gruppo passi).
- Pericoloso: un gruppo rigido + un gruppo fallback permissivo (es., solo
EVENT=PULL_REQUEST_UPDATED). - Consigliato: rimuovere gruppi fallback che non applicano vincoli su actor/ref/path.
- Abuso: lâattacker ha bisogno solo di soddisfare il gruppo piĂš debole.
- Comment approval gate disabled or too permissive
pullRequestBuildPolicy.requiresCommentApproval=DISABLEDè il meno sicuro.- Ruoli approvatori troppo estesi riducono il controllo.
- Pericoloso:
requiresCommentApproval=DISABLED. - Consigliato:
ALL_PULL_REQUESTSoFORK_PULL_REQUESTScon ruoli approvatori ristretti. - Abuso: PR da fork/drive-by eseguono automaticamente senza approvazione di maintainer trusted.
- No restrictive branch/path strategy for PR builds
- Mancanza di defense-in-depth con
HEAD_REF+BASE_REF+FILE_PATH. - Pericoloso: solo
EVENT+ACTOR_ACCOUNT_ID, senza controlli su ref/path. - Consigliato: combinare
ACTOR_ACCOUNT_IDesatto +BASE_REF+HEAD_REF+ restrizioniFILE_PATH. - Abuso: lâattacker modifica input di build (buildspec/CI/dipendenze) e ottiene esecuzione di comandi arbitrari.
- Public visibility + status URL exposure
- URL di build/check pubblici facilitano il ricon e i test iterativi dellâattacker.
- Pericoloso:
projectVisibility=PUBLIC_READcon log/config sensibili in build pubbliche. - Consigliato: mantenere i progetti privati a meno di forti necessitĂ business, e sanitizzare log/artifact.
- Abuso: lâattacker scopre pattern/comportamento del progetto e poi affina payload e tentativi di bypass.
Token leakage from memory
La write-up di Wiz spiega che le credenziali del provider di sorgente sono presenti nel contesto di runtime della build e possono essere rubate dopo una compromissione della build (per esempio tramite memory dumping), permettendo il takeover del repository se gli scope sono ampi.
AWS ha introdotto hardening dopo la disclosure, ma la lezione principale rimane: non eseguire codice di PR non attendibili in contesti di build privilegiati e assumere che codice controllato dallâattacker tenterĂ di rubare credenziali.
Per tecniche aggiuntive di credential theft in CodeBuild, consulta anche:
Finding CodeBuild URLs in GitHub PRs
Se CodeBuild riporta lo stato back a GitHub, lâURL della build di CodeBuild di solito appare in:
- PR page -> Checks tab (o la linea di stato in Conversation/Commits).
- Commit page -> sezione status/checks -> link Details.
- PR commits list -> cliccare il contesto di check allegato a un commit.
Per progetti pubblici, questo link può esporre metadata/configurazione della build ad utenti non autenticati.
Script: rileva URL CodeBuild in una PR e verifica se appaiono pubblici
```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â
Testato con:
```bash
bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1
Checklist rapida di audit
# 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
Controlla ogni progetto per:
webhook.filterGroupscontaining PR events.ACTOR_ACCOUNT_IDpatterns that are not anchored with^...$.pullRequestBuildPolicy.requiresCommentApprovalequal toDISABLED.- Assenza di restrizioni su branch/percorso.
serviceRolead alto privilegio.- Ambito e riuso rischiosi delle source credentials.
Linee guida di hardening
- Richiedi approvazione via commento per le build PR (
ALL_PULL_REQUESTSoFORK_PULL_REQUESTS). - Se usi allowlist di actor, ancora le regex e mantienile esatte.
- Aggiungi restrizioni
FILE_PATHper evitare modifiche non attendibili abuildspec.ymle script CI. - Separa le build di release affidabili dalle build PR non affidabili in progetti/ruoli separati.
- Usa token del source-provider a granularitĂ fine e con privilegi minimi (preferisci identitĂ dedicate a basso privilegio).
- Monitora continuamente i filtri webhook e lâuso delle credenziali sorgenti.
Riferimenti
- 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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
HackTricks Cloud

