Abusing Github Actions
Taarifa Msingi
Kwenye ukurasa huu utapata:
Muhtasari wa athari zote za mshambuliaji kufanikiwa kupata ufikiaji wa Github Action
Njia tofauti za kupata ufikiaji wa hatua:
Kuwa na ruhusa ya kuunda hatua
Kutumia vichocheo vinavyohusiana na ombi la kuchukua
Kutumia njia zingine za ufikiaji wa nje
Kupindua kutoka kwenye repo iliyoshambuliwa tayari
Hatimaye, sehemu kuhusu njia za baada ya kudukua kudhuru hatua kutoka ndani (kutokana na athari zilizotajwa)
Muhtasari wa Athari
Kwa maelezo zaidi kuhusu Github Actions angalia taarifa msingi.
Kwa kesi unaweza kutekeleza hatua za Github za kiholela/kuingiza nambari kwenye repo, unaweza:
Kudukua siri kutoka kwenye repo/ shirika hilo.
Ikiwa unaweza tu kuingiza, unaweza kudukua chochote kilichopo tayari kwenye mchakato.
Kutumia ruhusa za repo kupata ufikiaji wa majukwaa mengine kama AWS na GCP.
Kutekeleza nambari kwenye wafanyikazi wa desturi (ikiwa wafanyikazi wa desturi wanatumika) na kujaribu kupindua kutoka hapo.
Kubadilisha nambari ya repo.
Hii inategemea ruhusa za
GITHUB_TOKEN
(ikiwa zipo).Kudhoofisha mipangilio na artifakts nyingine.
Ikiwa nambari inadeploy au kuhifadhi kitu unaweza kubadilisha hilo na kupata ufikiaji zaidi.
GITHUB_TOKEN
Hii "siri" (inayotoka kwa ${{ secrets.GITHUB_TOKEN }}
na ${{ github.token }}
) inatolewa wakati msimamizi anapowezesha chaguo hili:
Nambari hii ni ile ile ambayo Programu ya Github itatumia, hivyo inaweza kupata ufikiaji wa vituo sawa: https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps
Github inapaswa kutolea mtiririko unaoruhusu ufikiaji wa kuvuka-repo ndani ya GitHub, hivyo repo inaweza kupata ufikiaji wa repos nyingine za ndani kwa kutumia GITHUB_TOKEN
.
Unaweza kuona ruhusa zinazowezekana za nambari hii katika: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
Tambua kuwa nambari hii inaisha baada ya kazi kukamilika.
Nambari hizi zinaonekana kama hivi: ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7
Baadhi ya mambo ya kuvutia unayoweza kufanya na nambari hii:
Tafadhali kumbuka kwamba mara nyingi unaweza kupata vitufe vya mtumiaji wa github ndani ya mazingira ya Github Actions au katika siri. Vitufe hivi vinaweza kukupa mamlaka zaidi juu ya hazina na shirika.
Inawezekana kuchunguza ruhusa zilizotolewa kwa Token ya Github katika mabwawa ya watumiaji wengine kwa kuchunguza kumbukumbu za vitendo:
Utekelezaji Ulioruhusiwa
Hii ingekuwa njia rahisi ya kudhoofisha vitendo vya Github, kwani kesi hii inahitaji kwamba una ufikiaji wa kuunda bwawa jipya katika shirika, au una ruhusa za kuandika juu ya bwawa.
Ikiwa uko katika hali hii unaweza tu kuchunguza Mbinu za Baada ya Kudhoofishwa.
Utekelezaji kutoka kwa Uundaji wa Bwawa
Kwa wanachama wa shirika kuweza kuunda mabwawa mapya na wewe unaweza kutekeleza vitendo vya github, unaweza kuunda bwawa jipya na kuiba siri zilizowekwa kiwango cha shirika.
Utekelezaji kutoka kwa Tawi Jipya
Ikiwa unaweza kuunda tawi jipya katika bwawa ambalo tayari lina Github Action iliyosanidiwa, unaweza kuibadilisha, kuiweka yaliyomo, na kisha kutekeleza kitendo hicho kutoka kwa tawi jipya. Kwa njia hii unaweza kuchota siri za kiwango cha bwawa na shirika (lakini unahitaji kujua jinsi wanavyoitwa).
Unaweza kufanya kitendo kilichobadilishwa kiweze kutekelezwa kwa mikono, wakati PR inapoanzishwa au wakati baadhi ya nambari inapopakiwa (kulingana na kelele unayotaka kuwa nayo):
Utekelezaji wa Kuforkiwa
Kuna vichocheo tofauti vinavyoweza kuruhusu mshambuliaji kutekeleza Hatua ya Github ya repo nyingine. Ikiwa hatua hizo zinazoweza kuchochewa zimeboreshwa vibaya, mshambuliaji anaweza kuweza kuziteka.
pull_request
pull_request
Kichocheo cha mfumo wa pull_request
kitatekeleza mfumo kila wakati ombi la kuvuta linapopokelewa na baadhi ya ubaguzi: kwa chaguo-msingi ikiwa ni mara ya kwanza unashirikiana, baadhi ya wahifadhi watahitaji kuidhinisha utekelezaji wa mfumo:
Kwa kuwa kizuizi cha chaguo-msingi ni kwa wachangiaji wa mara ya kwanza, unaweza kuchangia kurekebisha mdudu/kipande cha maandishi kilicho sahihi na kisha kutuma PR zingine kudhuru haki zako mpya za pull_request
.
Nilijaribu hili na halifanyi kazi: Chaguo lingine lingekuwa kuanzisha akaunti yenye jina la mtu aliyechangia kwenye mradi na kufuta akaunti yake.
Zaidi ya hayo, kwa chaguo-msingi inazuia ruhusa za kuandika na upatikanaji wa siri kwenye repo ya lengo kama ilivyotajwa katika nyaraka:
Isipokuwa
GITHUB_TOKEN
, siri hazipitishwi kwa mtumiaji wakati mfumo unapochochewa kutoka kwa repo iliyoforkiwa.GITHUB_TOKEN
ina ruhusa za kusoma tu katika maombi ya kuvuta kutoka kwa repo zilizoforkiwa.
Mshambuliaji anaweza kubadilisha ufafanuzi wa Hatua ya Github ili kutekeleza mambo ya kiholela na kuongeza hatua za kiholela. Hata hivyo, hataweza kuiba siri au kubadilisha repo kwa sababu ya vikwazo vilivyotajwa.
Ndio, ikiwa mshambuliaji anabadilisha kwenye PR hatua ya github itakayochochewa, Hatua yake ya Github itatumika badala ya ile kutoka kwa repo ya asili!
Kwa kuwa mshambuliaji pia ana udhibiti wa namna ya kutekelezwa kwa namna ya kiholela, hata kama hakuna siri au ruhusa za kuandika kwenye GITHUB_TOKEN
mshambuliaji anaweza kwa mfano kutuma vitu vichafu.
pull_request_target
pull_request_target
Kichocheo cha mfumo cha pull_request_target
kina ruhusa za kuandika kwenye repo ya lengo na upatikanaji wa siri (na haitoi idhini).
Tafadhali kumbuka kuwa kichocheo cha mfumo cha pull_request_target
hutekeleza katika muktadha wa msingi na sio katika ule uliotolewa na PR (ili isitekeleze nambari isiyosadikika). Kwa habari zaidi kuhusu pull_request_target
angalia nyaraka.
Zaidi ya hayo, kwa habari zaidi kuhusu matumizi hatari haya maalum angalia hii chapisho la blogi ya github.
Inaweza kuonekana kwa sababu utekelezaji wa mfumo ni ule uliofafanuliwa katika msingi na sio katika PR ni salama kutumia pull_request_target
, lakini kuna hali chache ambapo sio hivyo.
Na hii itakuwa na upatikanaji wa siri.
workflow_run
workflow_run
Kichocheo cha workflow_run kuruhusu kutekeleza mfumo kutoka kwa mwingine wakati wa kumalizika
, ombiwa
au inaendelea
.
Katika mfano huu, mfumo umewekwa kutekelezwa baada ya mfumo tofauti wa "Run Tests" kukamilika:
Zaidi, kulingana na nyaraka: Kazi iliyozinduliwa na tukio la workflow_run
inaweza kupata siri na kuandika vitufe, hata kama kazi ya awali haikuwa.
Aina hii ya kazi inaweza kushambuliwa ikiwa ina tegemea kwenye kazi ambayo inaweza kuzinduliwa na mtumiaji wa nje kupitia pull_request
au pull_request_target
. Mifano michache ya hatari inaweza kupatikana kwenye blogi hii. Ya kwanza inahusiana na kazi iliyozinduliwa na workflow_run
kupakua msimbo wa mshambuliaji: ${{ github.event.pull_request.head.sha }}
Ya pili inahusiana na kupitisha artifakiti kutoka kwa msimbo usioaminika kwenda kwa kazi ya workflow_run
na kutumia maudhui ya artifakiti hii kwa njia inayofanya iwe hatari kwa RCE.
workflow_call
workflow_call
TODO
TODO: Angalia ikiwa inapotekelezwa kutoka kwa pull\_request
msimbo uliotumiwa/uliohifadhiwa ikiwa ni wa asili au kutoka kwa PR iliyochukuliwa
Kutumia Utekelezaji Ulioforkiwa
Tumetaja njia zote ambazo mshambuliaji wa nje anaweza kutumia ili kufanya kazi ya github kutekelezwa, sasa hebu tuangalie jinsi utekelezaji huu, ikiwa umewekwa vibaya, unaweza kutumiwa vibaya:
Utekelezaji wa kucheki bila kuaminika
Katika kesi ya pull_request
, kazi itatekelezwa katika muktadha wa PR (kwa hivyo itatekeleza msimbo wa PR mbaya), lakini mtu anahitaji kuidhinisha kwanza na itatekelezwa na vizuizi fulani.
Katika kesi ya kazi inayotumia pull_request_target
au workflow_run
ambayo inategemea kazi ambayo inaweza kuzinduliwa kutoka kwa pull_request_target
au pull_request
msimbo kutoka kwa repo ya asili utatekelezwa, kwa hivyo mshambuliaji hawezi kudhibiti msimbo uliotekelezwa.
Hata hivyo, ikiwa hatua ina ucheki wa PR ulio wazi ambao utapata msimbo kutoka kwa PR (na sio kutoka kwa msingi), itatumia msimbo uliodhibitiwa na mshambuliaji. Kwa mfano (angalia mstari wa 12 ambapo msimbo wa PR unapakuliwa):
Msimbo usioaminika unatekelezwa wakati wa npm install
au npm build
kwani hatua za kujenga na pakiti zilizotajwa zinaudhibitiwa na mwandishi wa PR.
Dork ya github kutafuta hatua zenye hatari ni: event.pull_request pull_request_target extension:yml
hata hivyo, kuna njia tofauti za kusanidi kazi zitekelezwe kwa usalama hata ikiwa hatua imepangwa kwa njia isiyo salama (kama kutumia masharti kuhusu ni nani anayezalisha PR).
Uingizaji wa Skripti za Muktadha
Tafadhali kumbuka kuwa kuna muktadha wa github ambao thamani zake zinadhibitiwa na mtumiaji anayeanzisha PR. Ikiwa hatua ya github inatumia data hiyo kutekeleza chochote, inaweza kusababisha utekelezaji wa msimbo wa aina yoyote:
pageGh Actions - Context Script InjectionsUingizaji wa Skripti za GITHUB_ENV
Kulingana na nyaraka: Unaweza kufanya mazingira ya mazingira ipatikane kwa hatua zifuatazo katika kazi ya mchakato kwa kufafanua au kusasisha mazingira ya mazingira na kuandika hii kwa faili ya mazingira ya GITHUB_ENV
.
Ikiwa mshambuliaji anaweza kuingiza thamani yoyote ndani ya hii mazingira ya mazingira, anaweza kuingiza mazingira ya mazingira ambayo yanaweza kutekeleza msimbo katika hatua zifuatazo kama LD_PRELOAD au NODE_OPTIONS.
Kwa mfano (hii na hii), fikiria kazi ambayo inaamini artifakiti iliyopakiwa kuhifadhi maudhui yake ndani ya mazingira ya mazingira ya GITHUB_ENV
. Mshambuliaji anaweza kupakia kitu kama hiki kuhatarisha:
Hatua za Tatu za Github Zisizo Salama
Kama ilivyotajwa katika chapisho hili la blogi, Hatua hii ya Github inaruhusu kupata artifakiti kutoka kwa kazi tofauti na hata makusanyo.
Shida ni kwamba ikiwa parameter ya path
haijawekwa, artifakiti inachimbuliwa kwenye saraka ya sasa na inaweza kubadilisha faili ambazo zinaweza kutumiwa baadaye au hata kutekelezwa kwenye kazi. Kwa hivyo, ikiwa Artifakiti ni hatari, mshambuliaji anaweza kutumia hii kuhatarisha kazi zingine zinazoamini Artifakiti.
Mfano wa kazi hatari:
Hii inaweza kushambuliwa na mtiririko huu wa kazi:
Upatikanaji Mwingine wa Nje
Utekaji wa Repo ya Jina la Kufutwa
Ikiwa akaunti inabadilisha jina lake, mtumiaji mwingine anaweza kujiandikisha akaunti hiyo baada ya muda fulani. Ikiwa repo ilikuwa na nyota chini ya 100 kabla ya mabadiliko ya jina, Github itaruhusu mtumiaji mpya aliyejiandikisha na jina sawa kuunda repo yenye jina sawa na ile iliyofutwa.
Kwa hivyo, ikiwa hatua inatumia repo kutoka kwa akaunti isiyopo, bado inawezekana kwamba mshambuliaji anaweza kuunda akaunti hiyo na kuhatarisha hatua hiyo.
Ikiwa repos zingine zilikuwa zikitumia tegemezi kutoka kwa repos za mtumiaji huyu, mshambuliaji ataweza kuziteka. Hapa kuna maelezo kamili zaidi: https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/
Ugeuzaji wa Repo
Katika sehemu hii tutazungumzia mbinu ambazo zingeweza kuruhusu ugeuzaji kutoka repo moja hadi nyingine ikizingatiwa tuna aina fulani ya ufikiaji kwenye ya kwanza (angalia sehemu iliyopita).
Kuharibu Cache
Cache inahifadhiwa kati ya mbio za wokflow kwenye tawi moja. Hii inamaanisha kwamba ikiwa mshambuliaji anahatarisha pakiti ambayo kisha huhifadhiwa kwenye cache na kupakuliwa na kutekelezwa na wokflow yenye mamlaka zaidi ataweza kuhatarisha pia wokflow hiyo.
pageGH Actions - Cache PoisoningKuharibu Kipande
Wokflow inaweza kutumia vipande kutoka kwa wokflow nyingine na hata repos, ikiwa mshambuliaji anafanikiwa kuhatarisha Github Action ambayo inaleta kipande ambacho baadaye hutumiwa na wokflow nyingine anaweza kuhatarisha wokflow nyingine:
pageGh Actions - Artifact PoisoningBaada ya Utekaji kutoka kwa Hatua
Kupata AWS na GCP kupitia OIDC
Angalia kurasa zifuatazo:
pageAWS - Federation AbusepageGCP - Federation AbuseKupata siri
Ikiwa unainjekta maudhui kwenye script ni muhimu kujua jinsi unaweza kupata siri:
Ikiwa siri au token imewekwa kama mazingira ya mazingira, inaweza kupatikana moja kwa moja kupitia mazingira kwa kutumia
printenv
.
Ikiwa siri inatumika moja kwa moja katika kielezo, script ya shell iliyoundwa inahifadhiwa kwenye diski na inapatikana.
cat /home/runner/work/_temp/*
Kwa hatua ya desturi, hatari inaweza kutofautiana kulingana na jinsi programu inavyotumia siri iliyopatikana kutoka kwa hoja:
Kutumia Wafanyaji wa Huduma za Kibinafsi
Njia ya kugundua ni Github Actions zipi zinaendeshwa kwenye miundombinu isiyo ya github ni kutafuta runs-on: self-hosted
katika konfigurisheni ya yaml ya Github Action.
Wafanyaji wa huduma za kibinafsi wanaweza kuwa na ufikivu wa habari nyeti zaidi, kwa mifumo mingine ya mtandao (miisho inayoweza kudhurika kwenye mtandao? huduma ya metadata?) au, hata kama ni kizazi na kuharibiwa, hatua zaidi ya moja inaweza kutekelezwa wakati huo huo na ile inayoweza kuwa mbaya inaweza kuiba siri ya nyingine.
Kwenye wafanyaji wa huduma za kibinafsi pia ni rahisi kupata siri kutoka kwa mchakato wa _Runner.Listener_** ambao utaleta siri zote za mifumo ya kazi katika hatua yoyote kwa kudondosha kumbukumbu yake:
Angalia chapisho hili kwa maelezo zaidi.
Github Docker Images Registry
Inawezekana kuunda Github actions ambazo zitajenga na kuhifadhi picha ya Docker ndani ya Github. Mfano unaweza kupatikana katika sehemu ifuatayo inayoweza kufunguliwa:
Last updated