AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Αυτό το διάνυσμα επίθεσης εμφανίζεται όταν μια δημόσια PR workflow είναι συνδεδεμένη με ένα προνομιούχο CodeBuild project με αδύναμους ελέγχους webhook.
Αν ένας εξωτερικός επιτιθέμενος μπορεί να κάνει το CodeBuild να εκτελέσει το pull request του, συνήθως μπορεί να αποκτήσει αυθαίρετη εκτέλεση κώδικα μέσα στο build (build scripts, dependency hooks, test scripts, κ.λπ.), και στη συνέχεια να μεταβεί σε μυστικά, IAM credentials, ή διαπιστευτήρια παρόχου πηγής.
Why this is dangerous
Οι φίλτροι webhook του CodeBuild αξιολογούνται με μοτίβα regex (για φίλτρα εκτός EVENT). Στο φίλτρο ACTOR_ACCOUNT_ID, αυτό σημαίνει ότι ένα αδύναμο μοτίβο μπορεί να ταιριάξει περισσότερους χρήστες από όσους προβλεπόταν.
Αν μη αξιόπιστα PRs χτίζονται σε ένα project που έχει προνομιούχες AWS role άδειες ή GitHub credentials, αυτό μπορεί να μετατραπεί σε πλήρη συμβιβασμό της supply-chain.
Η Wiz έδειξε ένα πρακτικό σενάριο όπου:
- Μια allowlist actor του webhook χρησιμοποίησε ένα μη-αγκυρωμένο regex.
- Ένας επιτιθέμενος εγγράφηκε με ένα GitHub ID που ταίριαζε ως superstring ενός αξιόπιστου ID.
- Ένα κακόβουλο PR προκάλεσε το CodeBuild.
- Η εκτέλεση κώδικα στο build χρησιμοποιήθηκε για dump μνήμης και ανάκτηση source-provider διαπιστευτηρίων/tokens.
Misconfigurations that allow external PR code execution
Τα ακόλουθα είναι λάθη υψηλού κινδύνου και πώς οι επιτιθέμενοι τα εκμεταλλεύονται:
EVENTfilters allow untrusted triggers
- Κοινά επικίνδυνα events:
PULL_REQUEST_CREATED,PULL_REQUEST_UPDATED,PULL_REQUEST_REOPENED. - Άλλα events που μπορούν επίσης να γίνουν επικίνδυνα αν συνδεθούν με προνομιούχα builds:
PUSH,PULL_REQUEST_CLOSED,PULL_REQUEST_MERGED,RELEASED,PRERELEASED,WORKFLOW_JOB_QUEUED. - Bad:
EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"σε ένα privileged project. - Better: χρησιμοποιήστε έγκριση σχολίου PR και ελαχιστοποιήστε τα trigger events για προνομιούχα projects.
- Abuse: ο επιτιθέμενος ανοίγει/ενημερώνει PR ή κάνει push σε ένα branch που ελέγχει, και ο κώδικάς του εκτελείται στο CodeBuild.
ACTOR_ACCOUNT_IDregex is weak
- Bad: μη-αγκυρωμένα μοτίβα όπως
123456|7890123. - Better: ακριβής αντιστοίχιση με αγκύρωση
^(123456|7890123)$. - Abuse: το υπερ-ταίριασμα regex επιτρέπει σε μη εξουσιοδοτημένα GitHub IDs να περάσουν τις allowlists.
- Other regex filters are weak or missing
HEAD_REF- Bad:
refs/heads/.* - Better:
^refs/heads/main$(ή ρητή λίστα αξιόπιστων)
- Bad:
BASE_REF- Bad:
.* - Better:
^refs/heads/main$
- Bad:
FILE_PATH- Bad: έλλειψη περιορισμών διαδρομών
- Better: αποκλείστε επικίνδυνα αρχεία όπως
^buildspec\\.yml$,^\\.github/workflows/.*,(^|/)package(-lock)?\\.json$
COMMIT_MESSAGE- Bad: εμπιστοσύνη σε δείκτη με χαλαρό ταίριασμα όπως
trusted - Better: μη χρησιμοποιείτε το commit message ως όριο εμπιστοσύνης για την εκτέλεση PR
- Bad: εμπιστοσύνη σε δείκτη με χαλαρό ταίριασμα όπως
REPOSITORY_NAME/ORGANIZATION_NAME- Bad:
.*σε org/global webhooks - Better: μόνο ακριβείς matches για repo/org
- Bad:
WORKFLOW_NAME- Bad:
.* - Better: μόνο ακριβή matches ονόματος workflow (ή αποφύγετε αυτό ως έλεγχο εμπιστοσύνης)
- Bad:
- Abuse: ο επιτιθέμενος διαμορφώνει ref/path/message/repo context ώστε να ικανοποιήσει το επιτρεπτικό regex και να ενεργοποιήσει builds.
excludeMatchedPatternis misused
- Η λανθασμένη ρύθμιση αυτής της σημαίας μπορεί να αντιστρέψει την επιδιωκόμενη λογική.
- Bad:
FILE_PATH '^buildspec\\.yml$'μεexcludeMatchedPattern=falseόταν η πρόθεση ήταν να μπλοκαριστούν αλλαγές στο buildspec. - Better: ίδιο μοτίβο με
excludeMatchedPattern=trueγια να απορριφθούν τα builds που αγγίζουν τοbuildspec.yml. - Abuse: οι υπεύθυνοι πιστεύουν ότι απορρίπτουν επικίνδυνα events/paths/actors, αλλά στην πραγματικότητα τα επιτρέπουν.
- Multiple
filterGroupscreate accidental bypasses
- Το CodeBuild αξιολογεί ομάδες ως OR (ένα περασμένο group είναι αρκετό).
- Bad: μια αυστηρή ομάδα + μια επιεικής fallback ομάδα (π.χ., μόνο
EVENT=PULL_REQUEST_UPDATED). - Better: αφαιρέστε fallback groups που δεν επιβάλλουν περιορισμούς actor/ref/path.
- Abuse: ο επιτιθέμενος χρειάζεται μόνο να ικανοποιήσει την ασθενέστερη ομάδα.
- Comment approval gate disabled or too permissive
pullRequestBuildPolicy.requiresCommentApproval=DISABLEDείναι η λιγότερο ασφαλής επιλογή.- Πολύ ευρείς ρόλοι εγκρίνοντων μειώνουν τον έλεγχο.
- Bad:
requiresCommentApproval=DISABLED. - Better:
ALL_PULL_REQUESTSήFORK_PULL_REQUESTSμε ελάχιστους ρόλους εγκρίνοντων. - Abuse: fork/drive-by PRs τρέχουν αυτόματα χωρίς έγκριση αξιόπιστου maintainer.
- No restrictive branch/path strategy for PR builds
- Έλλειψη defense-in-depth με
HEAD_REF+BASE_REF+FILE_PATH. - Bad: μόνο
EVENT+ACTOR_ACCOUNT_ID, χωρίς έλεγχο ref/path. - Better: συνδυάστε ακριβείς
ACTOR_ACCOUNT_ID+BASE_REF+HEAD_REF+FILE_PATHπεριορισμούς. - Abuse: ο επιτιθέμενος τροποποιεί εισόδους build (buildspec/CI/dependencies) και αποκτά αυθαίρετη εκτέλεση εντολών.
- Public visibility + status URL exposure
- Δημόσια URLs build/check βελτιώνουν την αναγνώριση και τη διαδοχική δοκιμή από τον επιτιθέμενο.
- Bad:
projectVisibility=PUBLIC_READμε ευαίσθητα logs/config σε δημόσια builds. - Better: κρατήστε τα projects ιδιωτικά εκτός αν υπάρχει ισχυρός επιχειρηματικός λόγος, και κάντε sanitize logs/artifacts.
- Abuse: ο επιτιθέμενος ανακαλύπτει μοτίβα/συμπεριφορές project και στη συνέχεια βελτιώνει payloads και προσπάθειες bypass.
Token leakage from memory
Το write-up της Wiz εξηγεί ότι τα διαπιστευτήρια παρόχου πηγής υπάρχουν στο runtime context του build και μπορούν να κλαπούν μετά από συμβιβασμό του build (π.χ. μέσω memory dumping), επιτρέποντας takeover του αποθετηρίου αν τα scopes είναι ευρεία.
Η AWS εισήγαγε hardening μετά την αποκάλυψη, αλλά το βασικό μάθημα παραμένει: ποτέ μην εκτελείτε μη αξιόπιστο κώδικα PR σε προνομιούχα build contexts και θεωρήστε ότι ο κώδικας που ελέγχεται από επιτιθέμενο θα προσπαθήσει να κλέψει διαπιστευτήρια.
Για πρόσθετες τεχνικές κλοπής διαπιστευτηρίων στο CodeBuild, δείτε επίσης:
Finding CodeBuild URLs in GitHub PRs
Αν το CodeBuild αναφέρει το status ενός commit πίσω στο GitHub, το CodeBuild build URL συνήθως εμφανίζεται σε:
- PR page -> Checks tab (ή η γραμμή κατάστασης στην Conversation/Commits).
- Commit page -> status/checks section -> Details link.
- PR commits list -> κάντε κλικ στο check context που είναι επισυναπτόμενο σε ένα commit.
Για δημόσια projects, αυτό το link μπορεί να αποκαλύψει μεταδεδομένα/διαμόρφωση του build σε μη αυθεντικοποιημένους χρήστες.
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”
Δοκιμάστηκε και λειτουργεί με:
```bash
bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1
Σύντομη λίστα ελέγχου
# 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
Ελέγξτε κάθε έργο για:
webhook.filterGroupsπου περιέχουν PR events.ACTOR_ACCOUNT_IDπρότυπα που δεν είναι αγκυρωμένα με^...$.pullRequestBuildPolicy.requiresCommentApprovalμε τιμήDISABLED.- Έλλειψη περιορισμών branch/path.
serviceRoleυψηλών προνομίων.- Επικίνδυνη εμβέλεια και επαναχρησιμοποίηση των source credentials.
Οδηγίες θωράκισης
- Απαιτήστε έγκριση σχολίου για PR builds (
ALL_PULL_REQUESTSήFORK_PULL_REQUESTS). - Εάν χρησιμοποιείτε allowlists για actors, αγκυρώστε τα regex και κρατήστε τα ακριβή.
- Προσθέστε περιορισμούς
FILE_PATHγια να αποφύγετε μη αξιόπιστες τροποποιήσεις τουbuildspec.ymlκαι των CI scripts. - Διαχωρίστε τα αξιόπιστα release builds από τα μη αξιόπιστα PR builds σε ξεχωριστά projects/roles.
- Χρησιμοποιήστε λεπτομερή, με ελάχιστα προνόμια source-provider tokens (προτιμήστε αφιερωμένες low-privilege ταυτότητες).
- Επιθεωρείτε συνεχώς τα webhook filters και τη χρήση των source credentials.
Αναφορές
- 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
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

