Abusing Github Actions
Basiese Inligting
Op hierdie bladsy sal jy vind:
'n Opsomming van al die impakte van 'n aanvaller wat toegang kry tot 'n Github-handeling
Verskillende maniere om toegang tot 'n handeling te kry:
Met toestemmings om die handeling te skep
Misbruik van pull-aanvraag verwante aansporings
Misbruik van ander eksterne toegang tegnieke
Pivot vanaf 'n reeds gekompromitteerde opslagplek
Laastens, 'n afdeling oor post-uitbuitingstegnieke om 'n handeling van binne af te misbruik (veroorsaak die genoemde impakte)
Opsomming van Impakte
Vir 'n inleiding oor Github-handelinge, sien die basiese inligting.
In die geval dat jy willekeurige Github-handelinge/injekteer kode kan uitvoer in 'n opslagplek, kan jy moontlik:
Steel die geheime van daardie opslagplek/organisasie.
As jy net kan injekteer, kan jy steel wat ook al reeds teenwoordig is in die werkstroom.
Misbruik opslagplek-privileges om toegang te verkry tot ander platforms soos AWS en GCP.
Voer kode uit in aangepaste werkers (indien aangepaste werkers gebruik word) en probeer van daar af te pivot.
Oorskryf opslagplek kode.
Dit hang af van die priviliges van die
GITHUB_TOKEN
(indien enige).Kompromitteer implementasies en ander artefakte.
As die kode iets implementeer of stoor, kan jy dit wysig en verdere toegang verkry.
GITHUB_TOKEN
Hierdie "geheim" (afkomstig van ${{ secrets.GITHUB_TOKEN }}
en ${{ github.token }}
) word gegee wanneer die admin hierdie opsie aktiveer:
Hierdie token is dieselfde een wat 'n Github-toepassing sal gebruik, sodat dit toegang kan verkry tot dieselfde eindpunte: https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps
Github behoort 'n vloei vry te stel wat kruis-opslagplek-toegang binne GitHub toelaat, sodat 'n opslagplek ander interne opslagplekke kan benader deur die GITHUB_TOKEN
te gebruik.
Jy kan die moontlike toestemmings van hierdie token sien in: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
Let daarop dat die token verval nadat die taak voltooi is.
Hierdie tokens lyk soos dit: ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7
Sommige interessante dinge wat jy met hierdie token kan doen:
Let daarop dat jy op verskeie geleenthede github-gebruikerstokens binne Github-handelinge-omgewings of in die geheime kan vind. Hierdie tokens kan jou meer regte oor die bewaarplek en organisasie gee.
Dit is moontlik om die toestemmings wat aan 'n Github-token gegee is in ander gebruikers se repositories te kontroleer deur die logs van die aksies te ondersoek:
Toegestane Uitvoering
Dit sou die maklikste manier wees om Github-aksies te kompromitteer, aangesien hierdie geval veronderstel dat jy toegang het om 'n nuwe repo in die organisasie te skep, of skryfregte oor 'n repository het.
As jy in hierdie scenario is, kan jy net die Post Exploitation-tegnieke nagaan.
Uitvoering vanaf Repo-skepping
In die geval dat lede van 'n organisasie nuwe repos kan skep en jy github-aksies kan uitvoer, kan jy 'n nuwe repo skep en die geheime wat op organisasievlak ingestel is, steel.
Uitvoering vanaf 'n Nuwe Tak
As jy 'n nuwe tak in 'n repository kan skep wat reeds 'n Github-aksie ingestel het, kan jy dit verander, die inhoud oplaai, en dan daardie aksie vanaf die nuwe tak uitvoer. Op hierdie manier kan jy repository- en organisasievlak-geheime uitlek (maar jy moet weet hoe hulle genoem word).
Jy kan die gewysigde aksie handmatig uitvoer, wanneer 'n PR geskep word of wanneer 'n bietjie kode gedruk word (afhangende van hoe luidrugig jy wil wees):
Gevorkte Uitvoering
Daar is verskillende aanwysers wat 'n aanvaller kan toelaat om 'n Github Aksie van 'n ander bewaarplek uit te voer. As daardie aanwysers swak gekonfigureer is, kan 'n aanvaller hulle moontlik kan bemagtig.
pull_request
pull_request
Die werkstroomaanwyser pull_request
sal die werkstroom elke keer uitvoer as 'n trekversoek ontvang word met 'n paar uitsonderings: standaard, as dit die eerste keer is wat jy saamwerk, sal 'n paar onderhouers die uitvoering van die werkstroom moet goedkeur:
Aangesien die standaard beperking vir eerste keer bydraers is, kan jy bydra deur 'n geldige fout/tikfout te regstel en dan ander trekversoeke stuur om jou nuwe pull_request
-voorregte te misbruik.
Ek het dit getoets en dit werk nie nie: 'n Ander opsie sou wees om 'n rekening te skep met die naam van iemand wat bygedra het tot die projek en sy rekening verwyder het.
Daarbenewens verhoed dit standaard skryfregte en toegang tot geheime tot die teikenbewaarplek soos genoem in die dokumentasie:
Met die uitsondering van
GITHUB_TOKEN
, word geheime nie aan die loper oorgedra wanneer 'n werkstroom van 'n gevorkte bewaarplek af geaktiveer word nie. DieGITHUB_TOKEN
het slegs leesregte in trekversoeke van gevorkte bewaarplekke.
'n Aanvaller kan die definisie van die Github Aksie wysig om arbitrêre dinge uit te voer en arbitrêre aksies by te voeg. Tog sal hy nie in staat wees om geheime te steel of die bewaarplek te oorskryf as gevolg van die genoemde beperkings nie.
Ja, as die aanvaller in die PR die github aksie wat geaktiveer sal word, verander, sal sy Github Aksie die een wees wat gebruik word en nie die een van die oorspronklike bewaarplek nie!
Aangesien die aanvaller ook die uitgevoerde kode beheer, selfs al is daar nie geheime of skryfregte op die GITHUB_TOKEN
nie, kan 'n aanvaller byvoorbeeld skadelike artefakte oplaai.
pull_request_target
pull_request_target
Die werkstroomaanwyser pull_request_target
het skryfregte tot die teikenbewaarplek en toegang tot geheime (en vra nie vir toestemming nie).
Let daarop dat die werkstroomaanwyser pull_request_target
in die basis konteks uitgevoer word en nie in dié wat deur die PR gegee is (om nie onbetroubare kode uit te voer nie). Vir meer inligting oor pull_request_target
kyk na die dokumentasie.
Daarbenewens, vir meer inligting oor hierdie spesifieke gevaarlike gebruik, kyk na hierdie github blog pos.
Dit mag voorkom dat omdat die uitgevoerde werkstroom die een is wat in die basis gedefinieer is en nie in die PR nie, dit veilig is om pull_request_target
te gebruik, maar daar is 'n paar gevalle waar dit nie is nie.
En hierdie een sal toegang tot geheime hê.
workflow_run
workflow_run
Die workflow_run aanwyser maak dit moontlik om 'n werkstroom van 'n ander een uit te voer wanneer dit voltooi
, aangevra
of in_progress
is.
In hierdie voorbeeld is 'n werkstroom gekonfigureer om na die aparte "Voer Toetse Uit" werkstroom voltooi word:
Verder, volgens die dokumente: Die werkstroom wat begin word deur die workflow_run
gebeurtenis is in staat om geheime te benader en tokens te skryf, selfs as die vorige werkstroom nie was nie.
Hierdie soort werkstroom kan aangeval word as dit afhanklik is van 'n werkstroom wat deur 'n eksterne gebruiker geaktiveer kan word via pull_request
of pull_request_target
. 'n Paar kwesbare voorbeelde kan gevind word in hierdie blog. Die eerste een behels die workflow_run
geaktiveerde werkstroom wat die aanvaller se kode aflaai: ${{ github.event.pull_request.head.sha }}
Die tweede een behels die oorhandiging van 'n artefak van die onbetroubare kode na die workflow_run
werkstroom en die inhoud van hierdie artefak op 'n manier gebruik wat dit kwesbaar vir RCE maak.
workflow_call
workflow_call
TODO
TODO: Kontroleer of wanneer uitgevoer vanaf 'n pull_request die gebruikte/aflaai kode die een van die oorsprong of van die gevorkte PR is
Misbruik van Gevorkte Uitvoering
Ons het al die maniere genoem waarop 'n eksterne aanvaller 'n GitHub-werkvloei kon laat uitvoer, laat ons nou kyk na hoe hierdie uitvoerings, indien sleg gekonfigureer, misbruik kan word:
Onbetroubare aflaai-uitvoering
In die geval van pull_request
, sal die werkvloei uitgevoer word in die konteks van die PR (dit sal dus die skadelike PR-kode uitvoer), maar iemand moet dit eerstens magtig en dit sal met 'n paar beperkings uitgevoer word.
In die geval van 'n werkvloei wat pull_request_target
of workflow_run
gebruik wat afhanklik is van 'n werkvloei wat geaktiveer kan word vanaf pull_request_target
of pull_request
sal die kode van die oorspronklike repo uitgevoer word, sodat die aanvaller nie die uitgevoerde kode kan beheer nie.
Nietemin, as die aksie 'n eksplisiete PR-aflaai het wat die kode van die PR sal kry (en nie van die basis nie), sal dit die aanvallersbeheerde kode gebruik. Byvoorbeeld (kyk na lyn 12 waar die PR-kode afgelaai word):
Die potensieel onbetroubare kode word uitgevoer tydens npm install
of npm build
aangesien die bou-skripte en verwysde pakketten beheer word deur die skrywer van die PR.
'n GitHub-dork om te soek na kwesbare aksies is: event.pull_request pull_request_target extension:yml
nietemin, daar is verskillende maniere om die take veilig uit te voer selfs as die aksie onveilig gekonfigureer is (soos die gebruik van voorwaardes oor wie die aktiewe PR genereer).
Konteks Skripsie-inspuitings
Merk op dat daar sekere github kontekste is waarvan die waardes deur die gebruiker wat die PR skep, beheer word. As die GitHub-aksie daardie data gebruik om iets uit te voer, kan dit lei tot arbitrêre kode-uitvoering:
Gh Actions - Context Script InjectionsGITHUB_ENV Skripsie-inspuiting
Volgens die dokumente: Jy kan 'n omgewingsveranderlike beskikbaar maak vir enige volgende stappe in 'n werkvloei-taak deur die omgewingsveranderlike te definieer of by te werk en dit na die GITHUB_ENV
omgewingslêer te skryf.
As 'n aanvaller enige waarde kon inspuit in hierdie omgewingsveranderlike, kon hy omgewingsveranderlikes inspuit wat kode in volgende stappe kan uitvoer soos LD_PRELOAD of NODE_OPTIONS.
Byvoorbeeld (hierdie en hierdie), stel jou 'n werkvloei voor wat 'n opgelaaide artefak vertrou om sy inhoud binne GITHUB_ENV
omgewingsveranderlike te stoor. 'n Aanvaller kon iets soos hierdie oplaai om dit te kompromitteer:
Kwesbare Derde Party Github Aksies
Soos genoem in hierdie blogpos, hierdie GitHub-aksie maak dit moontlik om artefakte van verskillende werkvloei en selfs repositories te benader.
Die probleem is dat as die path
parameter nie ingestel is nie, word die artefak in die huidige gids uitgepak en dit kan lêers oorskryf wat later gebruik kan word of selfs uitgevoer kan word in die werkvloei. Daarom, as die Artefak kwesbaar is, kan 'n aanvaller dit misbruik om ander werkvloei wat die Artefak vertrou, te kompromitteer.
Voorbeeld van 'n kwesbare werkvloei:
Dit kan aangeval word met hierdie werkstroom:
Ander Eksterne Toegang
Verwyderde Naamruimte Repo Kaping
As 'n rekening sy naam verander, kan 'n ander gebruiker 'n rekening met daardie naam registreer na 'n tydperk. As 'n argief minder as 100 sterre gehad het voor die verandering van naam, sal Github die nuwe geregistreerde gebruiker met dieselfde naam toelaat om 'n argief met dieselfde naam as die verwyderde een te skep.
Dus, as 'n aksie 'n argief van 'n nie-bestaande rekening gebruik, is dit steeds moontlik dat 'n aanvaller daardie rekening kan skep en die aksie kan kompromiteer.
As ander argiewe afhanklikhede van hierdie gebruikersargiewe gebruik het, sal 'n aanvaller hulle kan kap. Hier het jy 'n meer volledige verduideliking: https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/
Argief Pivoting
In hierdie afdeling sal ons praat oor tegnieke wat sou toelaat om te pivoteer van die een argief na die ander veronderstel ons het 'n soort toegang tot die eerste een (kyk na die vorige afdeling).
Kegelvergiftiging
'n Kegel word behou tussen werkstroomhardloop in dieselfde tak. Dit beteken dat as 'n aanvaller 'n pakket kompromiteer wat dan in die kegel gestoor word en deur 'n meer bevoorregte werkstroom afgelaai en uitgevoer word, sal hy ook daardie werkstroom kan kompromiteer.
GH Actions - Cache PoisoningArgiefvergiftiging
Werkstrome kan argiewe van ander werkstrome en selfs argiewe gebruik, as 'n aanvaller daarin slaag om die Github Aksie te kompromiteer wat 'n argief oplaai wat later deur 'n ander werkstroom gebruik word, kan hy die ander werkstrome kompromiteer:
Gh Actions - Artifact PoisoningNa-Exploitasie van 'n Aksie
Toegang tot AWS en GCP via OIDC
Kyk na die volgende bladsye:
AWS - Federation AbuseGCP - Federation AbuseToegang tot geheime
As jy inhoud in 'n skriffie inspuit, is dit interessant om te weet hoe jy geheime kan toegang:
As die geheim of token na 'n omgewingsveranderlike ingestel is, kan dit direk deur die omgewing benader word deur
printenv
te gebruik.
Indien die geheim direk in 'n uitdrukking gebruik word, word die gegenereerde skript op die skyf gestoor en is dit toeganklik.
cat /home/runner/work/_temp/*
Vir 'n aangepaste aksie kan die risiko wissel afhangende van hoe 'n program die geheim wat dit uit die argument verkry het, gebruik:
Misbruik van Self-gehoste runners
Die manier om te vind watter Github Aksies op nie-Github-infrastruktuur uitgevoer word, is om te soek na runs-on: self-hosted
in die Github Aksie konfigurasie yaml.
Self-gehoste runners mag toegang hê tot ekstra sensitiewe inligting, na ander netwerkstelsels (kwesbare eindpunte in die netwerk? metadata-diens?) of, selfs al is dit geïsoleer en vernietig, kan meer as een aksie gelyktydig uitgevoer word en die skadelike een kan die geheime van die ander steel.
Op self-gehoste runners is dit ook moontlik om die geheime van die _Runner.Listener_** proses** te verkry wat al die geheime van die werkstrome op enige stadium sal bevat deur sy geheue te dump:
Kyk na hierdie pos vir meer inligting.
Github Docker Beelderegister
Dit is moontlik om Github-aksies te maak wat 'n Docker-beeld binne Github sal bou en stoor. 'n Voorbeeld kan gevind word in die volgende uitvouende:
Last updated