Abusing Github Actions
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Na ovoj stranici ćete pronać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, deo o tehnikama post-eksploatacije za zloupotrebu akcije iznutra (uzrokovanje pomenutih uticaja)
Za uvod o Github Actions proverite osnovne informacije.
Ako možete izvršiti proizvoljni kod u GitHub Actions unutar repozitorijuma, možda ćete moći da:
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 izmeniti konačni proizvod, omogućavajući napad na lanac snabdevanja.
Izvršite kod u prilagođenim radnicima da zloupotrebite računske resurse i pivotirate na druge sisteme.
Prepišete kod repozitorijuma, u zavisnosti od dozvola povezanih sa GITHUB_TOKEN
.
Ova "tajna" (koja dolazi iz ${{ secrets.GITHUB_TOKEN }}
i ${{ github.token }}
) se daje kada administrator 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
Github bi trebao da objavi tok koji omogućava međurepozitorijumski pristup unutar GitHub-a, tako da repozitorijum 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
Napomena da token isteče nakon što je posao završen.
Ovi tokeni izgledaju ovako: ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7
Neke zanimljive stvari koje možete uraditi sa ovim tokenom:
Imajte na umu da ćete u nekoliko slučajeva moći da pronađete github korisničke tokene unutar Github Actions okruženja ili u tajnama. Ovi tokeni vam mogu dati više privilegija nad repozitorijumom i organizacijom.
Moguće je proveriti dozvole date Github Token-u u repozitorijumima drugih korisnika proveravanjem logova akcija:
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 prava pisanja nad repozitorijumom.
Ako ste u ovom scenariju, možete samo proveriti Post Exploitation techniques.
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.
Ako možete kreirati novu granu u repozitorijumu koji već sadrži konfigurisan Github Action, možete ga modifikovati, 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).
Možete napraviti modifikovanu akciju izvršnom ručno, kada se kreira PR ili kada se neki kod otpremi (u zavisnosti od toga koliko želite da budete uočljivi):
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.
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:
Pošto je podrazumevano ograničenje za prvake u doprinosima, mogli biste doprineti ispravljanjem važeće greške/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.
Pored toga, prema zadatku sprečava pisane dozvole i pristup tajnama ciljanom repozitorijumu kao što je pomenuto u dokumentaciji:
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.
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.
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!
Pošto napadač takođe kontroliše kod koji se izvršava, čak i ako nema tajni ili pisanih dozvola na GITHUB_TOKEN
, napadač bi mogao, na primer, da otpremi zlonamerne artefakte.
pull_request_target
Okidač radnog toka pull_request_target
ima pisane dozvole za ciljani repozitorijum i pristup tajnama (i ne traži dozvolu).
Napomena: okidač radnog toka pull_request_target
izvršava se 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.
Pored toga, za više informacija o ovoj specifičnoj opasnoj upotrebi proverite ovaj github blog post.
Može izgledati 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.
A ovaj će imati pristup tajnama.
workflow_run
Okidač workflow_run omogućava pokretanje radnog toka iz drugog kada je završen
, tražen
ili u_procesu
.
U ovom primeru, radni tok je konfiguran da se izvrši nakon što se završi odvojeni "Pokreni testove" radni tok:
Moreover, according to the docs: Workflow pokrenut događajem workflow_run
može pristupiti tajnama i pisati tokene, č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. 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 artifact-a iz nepouzdanog koda u workflow_run
workflow i korišćenja sadržaja ovog artifact-a na način koji ga čini ranjivim na RCE.
workflow_call
TODO
TODO: Proveriti da li kada se izvršava iz pull_request-a korišćeni/preuzeti kod dolazi iz originala ili iz fork-ovanog PR-a
Pomenuli smo sve načine na koje spoljašnji napadač može uspeti da pokrene github workflow, sada hajde da pogledamo kako ova izvršavanja, ako su loše konfigurisana, mogu biti zloupotrebljena:
U slučaju pull_request
, workflow će biti izvršen u kontekstu PR-a (tako da će izvršiti maliciozni kod PR-a), ali neko mora prvo da odobri i biće izvršen sa nekim ograničenjima.
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.
Međutim, ako akcija ima eksplicitni PR checkout koji će uzeti kod iz PR-a (a ne iz osnove), koristiće napadačev kontrolisani kod. Na primer (proverite liniju 12 gde se preuzima PR kod):
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.
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).
Napomena da postoje određeni github konteksti č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:
Gh Actions - Context Script InjectionsIz dokumenata: 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.
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.
Na primer (ovo i ovo), zamislite workflow koji veruje da je uploadovani artifact siguran da čuva svoj sadržaj unutar GITHUB_ENV
env promenljive. Napadač bi mogao da uploaduje nešto poput ovoga da bi ga kompromitovao:
Kao što je pomenuto u ovom blog postu, ova Github Akcija omogućava pristup artifact-ima iz različitih workflow-a i čak repozitorijuma.
Problem je u tome što ako path
parametar nije postavljen, artifact se ekstrahuje u trenutni direktorijum i može prepisati datoteke koje bi kasnije mogle biti korišćene ili čak izvršene u workflow-u. Stoga, ako je Artifact ranjiv, napadač bi mogao da zloupotrebi ovo da kompromituje druge workflow-e koji veruju Artifact-u.
Primer ranjivog workflow-a:
Ovo bi moglo biti napadnuto ovim radnim tokom:
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.
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.
Ako su drugi repozitorijumi koristili zavisnosti iz ovih korisničkih repozitorijuma, napadač će moći da ih otme. Ovde imate potpunije objašnjenje: https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/
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).
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.
GH Actions - Cache PoisoningRadni 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:
Gh Actions - Artifact PoisoningProverite sledeće stranice:
AWS - Federation AbuseGCP - Federation AbuseAko ubacujete sadržaj u skriptu, zanimljivo je znati kako možete pristupiti tajnama:
Ako je tajna ili token postavljen na promenljivu okruženja, može se direktno pristupiti kroz okruženje koristeći printenv
.
Ako se tajna koristi direktno u izrazu, generisani shell skript se čuva na disku i može se pristupiti.
cat /home/runner/work/_temp/*
Za prilagođenu akciju, rizik može varirati u zavisnosti od toga kako program koristi tajnu koju je dobio iz argumenta:
Način da se pronađe koje Github akcije se izvršavaju u ne-github infrastrukturi je da se pretraži za runs-on: self-hosted
u konfiguraciji Github akcije yaml.
Samostalno hostovani izvršioci mogu imati pristup dodatnim osetljivim informacijama, drugim mrežnim sistemima (ranjivi krajnji tački u mreži? servis za metapodatke?) 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 druge.
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 njegove memorije:
Proverite ovaj post za više informacija.
Moguće je napraviti Github akcije koje će izgraditi i sačuvati Docker sliku unutar Githuba. Primer se može naći u sledećem proširivom:
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)