AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.
Este vetor de ataque aparece quando um fluxo de trabalho de PR pĂșblico estĂĄ ligado a um projeto CodeBuild privilegiado com controles de webhook fracos.
Se um atacante externo conseguir fazer o CodeBuild executar o seu pull request, normalmente ele pode obter arbitrary code execution inside the build (build scripts, dependency hooks, test scripts, etc.), e entĂŁo pivotar para secrets, IAM credentials, ou source-provider credentials.
Por que isto Ă© perigoso
CodeBuild webhook filters são avaliados com padrÔes regex (para filtros não-EVENT). No filtro ACTOR_ACCOUNT_ID, isso significa que um padrão fraco pode corresponder a mais usuårios do que o pretendido.
Se PRs não confiåveis forem buildados em um projeto que tem permissÔes de role AWS privilegiadas ou credenciais do GitHub, isso pode se tornar um comprometimento completo da cadeia de suprimentos.
Wiz mostrou uma cadeia prĂĄtica onde:
- Uma allowlist de atores do webhook usava um regex sem ancoração.
- Um atacante registrou um GitHub ID que correspondia como superstring de um ID confiĂĄvel.
- Um PR malicioso acionou o CodeBuild.
- A execução do código no build foi usada para despejar memória e recuperar source-provider credentials/tokens.
MisconfiguraçÔes that allow external PR code execution
A seguir estĂŁo erros de alto risco e como atacantes abusam de cada um:
EVENTfilters allow untrusted triggers
- Eventos comuns e arriscados:
PULL_REQUEST_CREATED,PULL_REQUEST_UPDATED,PULL_REQUEST_REOPENED. - Outros eventos que também podem se tornar perigosos se ligados a builds privilegiados:
PUSH,PULL_REQUEST_CLOSED,PULL_REQUEST_MERGED,RELEASED,PRERELEASED,WORKFLOW_JOB_QUEUED. - Bad:
EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"em um projeto privilegiado. - Better: use PR comment approval e minimize trigger events para projetos privilegiados.
- Abuse: atacante abre/atualiza PR ou faz push para uma branch que controla, e seu cĂłdigo Ă© executado no CodeBuild.
ACTOR_ACCOUNT_IDregex is weak
- Bad: padrÔes sem ancoração como
123456|7890123. - Better: ancorar para correspondĂȘncia exata
^(123456|7890123)$. - Abuse: regex que faz over-match permite que GitHub IDs nĂŁo autorizados passem pelas allowlists.
- Other regex filters are weak or missing
HEAD_REF- Bad:
refs/heads/.* - Better:
^refs/heads/main$(ou uma lista explĂcita de branches confiĂĄveis)
- Bad:
BASE_REF- Bad:
.* - Better:
^refs/heads/main$
- Bad:
FILE_PATH- Bad: sem restriçÔes de path
- Better: excluir arquivos arriscados como
^buildspec\\.yml$,^\\.github/workflows/.*,(^|/)package(-lock)?\\.json$
COMMIT_MESSAGE- Bad: marcador de confiança com correspondĂȘncia frouxa como
trusted - Better: não use mensagem de commit como boundary de confiança para execução de PR
- Bad: marcador de confiança com correspondĂȘncia frouxa como
REPOSITORY_NAME/ORGANIZATION_NAME- Bad:
.*em webhooks de org/global - Better: corresponder apenas a repo/org exatos
- Bad:
WORKFLOW_NAME- Bad:
.* - Better: corresponder ao nome exato do workflow (ou evitar isso como controle de confiança)
- Bad:
- Abuse: atacante cria ref/path/message/repo contexto para satisfazer regex permissivas e acionar builds.
excludeMatchedPatternis misused
- Configurar essa flag incorretamente pode inverter a lĂłgica pretendida.
- Bad:
FILE_PATH '^buildspec\\.yml$'comexcludeMatchedPattern=falsequando a intenção era bloquear ediçÔes de buildspec. - Better: mesmo padrão com
excludeMatchedPattern=truepara negar builds que mexem embuildspec.yml. - Abuse: defensores acham que negam eventos/paths/atores arriscados, mas na verdade os permitem.
- Multiple
filterGroupscreate accidental bypasses
- CodeBuild avalia grupos como OR (um grupo passando Ă© suficiente).
- Bad: um grupo estrito + um grupo permissivo de fallback (ex.: apenas
EVENT=PULL_REQUEST_UPDATED). - Better: remova grupos de fallback que não apliquem restriçÔes de actor/ref/path.
- Abuse: atacante sĂł precisa satisfazer o grupo mais fraco.
- Comment approval gate disabled or too permissive
pullRequestBuildPolicy.requiresCommentApproval=DISABLEDé o menos seguro.- Papéis de aprovadores excessivamente amplos reduzem o controle.
- Bad:
requiresCommentApproval=DISABLED. - Better:
ALL_PULL_REQUESTSouFORK_PULL_REQUESTScom papĂ©is de aprovador mĂnimos. - Abuse: PRs de forks/drive-by rodam automaticamente sem aprovação de mantenedor confiĂĄvel.
- No restrictive branch/path strategy for PR builds
- Falta de defesa em profundidade com
HEAD_REF+BASE_REF+FILE_PATH. - Bad: somente
EVENT+ACTOR_ACCOUNT_ID, sem controles de ref/path. - Better: combine
ACTOR_ACCOUNT_IDexato +BASE_REF+HEAD_REF+ restriçÔes deFILE_PATH. - Abuse: atacante modifica inputs do build (buildspec/CI/dependencies) e obtém execução arbitråria de comandos.
- Public visibility + status URL exposure
- URLs de build/check pĂșblicos melhoram o reconhecimento e testes iterativos do atacante.
- Bad:
projectVisibility=PUBLIC_READcom logs/config sensĂveis em builds pĂșblicos. - Better: mantenha projetos privados a menos que haja forte necessidade de negĂłcio e sanitize logs/artifacts.
- Abuse: atacante descobre padrÔes/comportamento do projeto e afina payloads e tentativas de bypass.
Token leakage from memory
O write-up da Wiz explica que source-provider credentials estĂŁo presentes no contexto de runtime do build e podem ser roubadas apĂłs o comprometimento do build (por exemplo, via memory dumping), permitindo takeover do repositĂłrio se os escopos forem amplos.
A AWS introduziu hardening após a divulgação, mas a lição central permanece: never execute untrusted PR code in privileged build contexts e presuma que código controlado pelo atacante no build tentarå credential theft.
For additional credential theft techniques in CodeBuild, also check:
Encontrando CodeBuild URLs em PRs do GitHub
Se o CodeBuild reporta status de commit de volta para o GitHub, a URL do build do CodeBuild geralmente aparece em:
- PR page -> Checks tab (or the status line in Conversation/Commits).
- Commit page -> status/checks section -> Details link.
- PR commits list -> click the check context attached to a commit.
Para projetos pĂșblicos, esse link pode expor metadata/configuração do build para usuĂĄrios nĂŁo autenticados.
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â
Testado e funcionando com:
```bash
bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1
Lista råpida de verificação de auditoria
# 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
Revise cada projeto para:
webhook.filterGroupscontendo eventos de PR.- PadrÔes de
ACTOR_ACCOUNT_IDque não são ancorados com^...$. pullRequestBuildPolicy.requiresCommentApprovaligual aDISABLED.- RestriçÔes de branch/path ausentes.
serviceRolede privilégio elevado.- Escopo arriscado e reuso de credenciais de origem.
OrientaçÔes de hardening
- Exigir aprovação por comentårio para builds de PR (
ALL_PULL_REQUESTSouFORK_PULL_REQUESTS). - Se estiver usando allowlists de actor, ancore as regexes e mantenha-as exatas.
- Adicione restriçÔes
FILE_PATHpara evitar ediçÔes não confiåveis embuildspec.ymle scripts de CI. - Separe builds de release confiåveis dos builds de PR não confiåveis em projetos/funçÔes diferentes.
- Use tokens de source-provider com granularidade fina e menor privilégio (prefira identidades dedicadas de baixo privilégio).
- Audite continuamente os filtros de webhook e o uso de credenciais de origem.
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
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.
HackTricks Cloud

