From b73eec810ceae38585cb7be49ad0bd4dc44cd70c Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 25 Jun 2025 00:23:36 +0000 Subject: [PATCH] Translated ['src/pentesting-ci-cd/github-security/abusing-github-actions --- src/images/CH_logo_ads.png | Bin 0 -> 27107 bytes .../abusing-github-actions/README.md | 181 +++++++++++------- 2 files changed, 111 insertions(+), 70 deletions(-) create mode 100644 src/images/CH_logo_ads.png diff --git a/src/images/CH_logo_ads.png b/src/images/CH_logo_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..b407c8929d67e14a8e254ad9bc76ac1e9f8525f7 GIT binary patch literal 27107 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
Token hii ni sawa na ile ambayo **Github Application itatumia**, hivyo inaweza kufikia mwisho sawa: [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 inapaswa kutoa [**mchakato**](https://github.com/github/roadmap/issues/74) ambao **unaruhusu ufikiaji wa kuvuka-repo** ndani ya GitHub, ili repo iweze kufikia repo nyingine za ndani kwa kutumia `GITHUB_TOKEN`. +> Github inapaswa kutoa [**mchakato**](https://github.com/github/roadmap/issues/74) ambao **unaruhusu ufikiaji wa kuvuka-repo** ndani ya GitHub, ili repo iweze kufikia repos nyingine za ndani kwa kutumia `GITHUB_TOKEN`. Unaweza kuona **idhini** zinazowezekana za token hii katika: [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) -Kumbuka kwamba token **inaisha baada ya kazi kukamilika**.\ +Kumbuka kwamba token **inaisha muda baada ya kazi kukamilika**.\ Token hizi zinaonekana kama hii: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7` Mambo kadhaa ya kuvutia unayoweza kufanya na token hii: @@ -141,19 +151,19 @@ Inawezekana kuangalia ruhusa zilizotolewa kwa Github Token katika hifadhi za wat ## Utekelezaji Ulioidhinishwa > [!NOTE] -> Hii ingekuwa njia rahisi zaidi ya kuathiri vitendo vya Github, kwani kesi hii inadhani kuwa una ufikiaji wa **kuunda hifadhi mpya katika shirika**, au una **haki za kuandika juu ya hifadhi**. +> Hii ingekuwa njia rahisi zaidi ya kuathiri vitendo vya Github, kwani kesi hii inadhani kuwa una uf access **kuunda hifadhi mpya katika shirika**, au una **haki za kuandika juu ya hifadhi**. > > Ikiwa uko katika hali hii unaweza tu kuangalia [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action). -### Utekelezaji kutoka kwa Uundaji wa Hifadhi +### Utekelezaji Kutoka kwa Uundaji wa Hifadhi Katika kesi ambapo wanachama wa shirika wanaweza **kuunda hifadhi mpya** na unaweza kutekeleza vitendo vya github, unaweza **kuunda hifadhi mpya na kuiba siri zilizowekwa katika kiwango cha shirika**. -### Utekelezaji kutoka kwa Tawi Jipya +### Utekelezaji Kutoka kwa Tawi Jipya -Ikiwa unaweza **kuunda tawi jipya katika hifadhi ambayo tayari ina Github Action** iliyowekwa, unaweza **kubadilisha** hiyo, **kupakia** maudhui, na kisha **kutekeleza kitendo hicho kutoka kwa tawi jipya**. Kwa njia hii unaweza **kuondoa siri za hifadhi na kiwango cha shirika** (lakini unahitaji kujua zinaitwaje). +Ikiwa unaweza **kuunda tawi jipya katika hifadhi ambayo tayari ina Github Action** iliyowekwa, unaweza **kubadilisha** hiyo, **kupakia** maudhui, na kisha **kutekeleza kitendo hicho kutoka kwa tawi jipya**. Kwa njia hii unaweza **kuondoa siri za hifadhi na shirika** (lakini unahitaji kujua zinaitwaje). -Unaweza kufanya kitendo kilichobadilishwa kiweze kutekelezwa **kwa mikono,** wakati **PR inaundwa** au wakati **kodi fulani inasukumwa** (kulingana na jinsi unavyotaka kuwa na kelele): +Unaweza kufanya kitendo kilichobadilishwa kiwe na uwezo wa kutekelezwa **kwa mikono,** wakati **PR inaundwa** au wakati **kodi fulani inasukumwa** (kulingana na jinsi unavyotaka kuwa na kelele): ```yaml on: workflow_dispatch: # Launch manually @@ -179,13 +189,13 @@ Vichocheo vya kazi **`pull_request`** vitatekeleza kazi kila wakati ombi la kuvu
> [!NOTE] -> Kwa kuwa **kikomo cha kawaida** ni kwa **watoaji wa mara ya kwanza**, unaweza kuchangia **kurekebisha hitilafu halali/typo** na kisha kutuma **PR nyingine ili kutumia haki zako mpya za `pull_request`**. +> Kwa kuwa **kikomo cha kawaida** ni kwa **watoaji wa mara ya kwanza**, unaweza kuchangia **kurekebisha hitilafu/typo halali** na kisha kutuma **PR nyingine ili kutumia haki zako mpya za `pull_request`**. > -> **Nilijaribu hii na haifanyi kazi**: ~~Chaguo lingine lingekuwa kuunda akaunti kwa jina la mtu ambaye alichangia kwenye mradi na kufuta akaunti yake.~~ +> **Nimejaribu hii na haifanyi kazi**: ~~Chaguo lingine lingekuwa kuunda akaunti kwa jina la mtu ambaye alichangia kwenye mradi na kufuta akaunti yake.~~ -Zaidi ya hayo, kwa kawaida **inazuia ruhusa za kuandika** na **ufikiaji wa siri** kwa hifadhi lengwa kama ilivyoelezwa katika [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories): +Zaidi ya hayo, kwa kawaida **inazuia ruhusa za kuandika** na **ufikiaji wa siri** kwa hifadhi lengwa kama ilivyotajwa katika [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories): -> Kwa kutengwa kwa `GITHUB_TOKEN`, **siri hazipitishwi kwa mchezaji** wakati kazi inachochewa kutoka hifadhi **iliyoforked**. **`GITHUB_TOKEN` ina ruhusa za kusoma tu** katika ombi la kuvuta **kutoka hifadhi zilizoforked**. +> Kwa kuzingatia `GITHUB_TOKEN`, **siri hazipitishwi kwa mchezaji** wakati kazi inachochewa kutoka hifadhi **iliyoforked**. **`GITHUB_TOKEN` ina ruhusa za kusoma tu** katika maombi ya kuvuta **kutoka hifadhi zilizoforked**. Mshambuliaji anaweza kubadilisha ufafanuzi wa Github Action ili kutekeleza mambo yasiyo na mipaka na kuongeza vitendo vya kiholela. Hata hivyo, hataweza kuiba siri au kufuta repo kwa sababu ya vikwazo vilivyotajwa. @@ -196,18 +206,18 @@ Kwa kuwa mshambuliaji pia anadhibiti msimbo unaotekelezwa, hata kama hakuna siri ### **`pull_request_target`** -Vichocheo vya kazi **`pull_request_target`** vina **ruhusa za kuandika** kwa hifadhi lengwa na **ufikiaji wa siri** (na havitaki ruhusa). +Vichocheo vya kazi **`pull_request_target`** vina **ruhusa za kuandika** kwa hifadhi lengwa na **ufikiaji wa siri** (na havihitaji ruhusa). -Kumbuka kwamba vichocheo vya kazi **`pull_request_target`** **vinakimbia katika muktadha wa msingi** na si katika ile iliyotolewa na PR (ili **kutoendesha msimbo usioaminika**). Kwa maelezo zaidi kuhusu `pull_request_target` [**angalia docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ +Kumbuka kwamba vichocheo vya kazi **`pull_request_target`** **vinakimbia katika muktadha wa msingi** na si katika ile inayotolewa na PR (ili **kutoendesha msimbo usioaminika**). Kwa maelezo zaidi kuhusu `pull_request_target` [**angalia docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ Zaidi ya hayo, kwa maelezo zaidi kuhusu matumizi haya hatari maalum angalia hii [**blogu ya github**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). -Inaweza kuonekana kuwa kwa sababu **kazi inayotekelezwa** ni ile iliyofafanuliwa katika **msingi** na **siyo katika PR** ni **salama** kutumia **`pull_request_target`**, lakini kuna **mifano michache ambapo si salama**. +Inaweza kuonekana kwamba kwa kuwa **kazi inayotekelezwa** ni ile iliyofafanuliwa katika **msingi** na **siyo katika PR** ni **salama** kutumia **`pull_request_target`**, lakini kuna **mambo machache ambapo si salama**. Na hii itakuwa na **ufikiaji wa siri**. ### `workflow_run` -Vichocheo vya [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) vinaruhusu kuendesha kazi kutoka nyingine wakati imekamilika, imeombwa au inaendelea. +Vichocheo vya [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) vinaruhusu kuendesha kazi kutoka nyingine wakati inakamilika, inahitajika au inaendelea. Katika mfano huu, kazi imewekwa ili kuendesha baada ya kazi tofauti "Run Tests" kukamilika: ```yaml @@ -217,31 +227,31 @@ workflows: [Run Tests] types: - completed ``` -Moreover, according to the docs: The workflow started by the `workflow_run` event is able to **access secrets and write tokens, even if the previous workflow was not**. +Zaidi ya hayo, kulingana na nyaraka: Mchakato ulioanzishwa na tukio la `workflow_run` unaweza **kupata siri na kuandika tokeni, hata kama mchakato wa awali haukuwa**. -This kind of workflow could be attacked if it's **depending** on a **workflow** that can be **triggered** by an external user via **`pull_request`** or **`pull_request_target`**. A couple of vulnerable examples can be [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** The first one consist on the **`workflow_run`** triggered workflow downloading out the attackers code: `${{ github.event.pull_request.head.sha }}`\ -The second one consist on **passing** an **artifact** from the **untrusted** code to the **`workflow_run`** workflow and using the content of this artifact in a way that makes it **vulnerable to RCE**. +Aina hii ya mchakato inaweza kushambuliwa ikiwa inategemea **mchakato** ambao unaweza **kuanzishwa** na mtumiaji wa nje kupitia **`pull_request`** au **`pull_request_target`**. Mfano kadhaa wa hatari unaweza [**kupatikana kwenye blogu hii**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Wa kwanza unajumuisha **`workflow_run`** ulioanzishwa mchakato wa kupakua msimbo wa washambuliaji: `${{ github.event.pull_request.head.sha }}`\ +Wa pili unajumuisha **kupitisha** **artifact** kutoka kwa msimbo **usioaminika** hadi kwenye mchakato wa **`workflow_run`** na kutumia maudhui ya artifact hii kwa njia inayofanya iwe **hatari kwa RCE**. ### `workflow_call` TODO -TODO: Check if when executed from a pull_request the used/downloaded code if the one from the origin or from the forked PR +TODO: Angalia ikiwa wakati inatekelezwa kutoka kwa pull_request msimbo uliotumika/kupakuliwa ni ule kutoka kwa asili au kutoka kwa PR iliyofanywa. -## Abusing Forked Execution +## Kutumia Utekelezaji wa Forked -Tumezungumzia njia zote ambazo mshambuliaji wa nje anaweza kuweza kufanya workflow ya github ifanye kazi, sasa hebu tuangalie jinsi utekelezaji huu, ikiwa umewekwa vibaya, unaweza kutumiwa vibaya: +Tumetaja njia zote ambazo mshambuliaji wa nje anaweza kufanikiwa kufanya mchakato wa github utekelezwe, sasa hebu tuangalie jinsi utekelezaji huu, ikiwa umewekwa vibaya, unaweza kutumiwa vibaya: -### Untrusted checkout execution +### Utekelezaji wa checkout usioaminika -Katika kesi ya **`pull_request`,** workflow itatekelezwa katika **muktadha wa PR** (hivyo itatekeleza **msimbo wa PR mbaya**), lakini mtu anahitaji **kuidhinisha kwanza** na itatekelezwa kwa baadhi ya [mipaka](#pull_request). +Katika kesi ya **`pull_request`,** mchakato utaanzishwa katika **muktadha wa PR** (hivyo utaanzisha **msimbo wa PR mbaya**), lakini mtu anahitaji **kuidhinisha kwanza** na utaendesha kwa baadhi ya [mipaka](#pull_request). -Katika kesi ya workflow inayotumia **`pull_request_target` au `workflow_run`** inayotegemea workflow ambayo inaweza kuanzishwa kutoka **`pull_request_target` au `pull_request`** msimbo kutoka kwa repo ya asili utafanikiwa, hivyo **mshambuliaji cannot control the executed code**. +Katika kesi ya mchakato unaotumia **`pull_request_target` au `workflow_run`** inayotegemea mchakato ambao unaweza kuanzishwa kutoka **`pull_request_target` au `pull_request`** msimbo kutoka kwa repo ya asili utaanzishwa, hivyo **mshambuliaji hawezi kudhibiti msimbo unaotekelezwa**. > [!CAUTION] -> Hata hivyo, ikiwa **action** ina **kuangalia PR wazi** ambayo itachukua **msimbo kutoka PR** (na sio kutoka msingi), itatumia msimbo ulio chini ya udhibiti wa mshambuliaji. Kwa mfano (angalia mstari wa 12 ambapo msimbo wa PR unashushwa): +> Hata hivyo, ikiwa **action** ina **kuangalia PR wazi** ambayo itachukua **msimbo kutoka kwa PR** (na sio kutoka msingi), itatumia msimbo ulio chini ya udhibiti wa mshambuliaji. Kwa mfano (angalia mstari wa 12 ambapo msimbo wa PR unapakuliwa): -
# INSECURE. Provided as an example only.
+
# INSECURE. Imepatikana kama mfano tu.
 on:
 pull_request_target
 
@@ -269,38 +279,78 @@ message: |
 Thank you!
 
-Msimbo unaoweza kuwa **usioaminika unatekelezwa wakati wa `npm install` au `npm build`** kwani skripti za kujenga na **pakiti zinazohusishwa zinadhibitiwa na mwandishi wa PR**. +Msimbo unaoweza kuwa **usioaminika unatekelezwa wakati wa `npm install` au `npm build`** kwani skripti za kujenga na **pakiti zinazorejelewa zinadhibitiwa na mwandishi wa PR**. > [!WARNING] -> Dork ya github kutafuta vitendo vya hatari ni: `event.pull_request pull_request_target extension:yml` hata hivyo, kuna njia tofauti za kuweka kazi zinazoweza kutekelezwa kwa usalama hata kama hatua imewekwa kwa njia isiyo salama (kama kutumia masharti kuhusu nani ni mchezaji anayezalisha PR). +> Dork ya github kutafuta vitendo vyenye hatari ni: `event.pull_request pull_request_target extension:yml` hata hivyo, kuna njia tofauti za kuunda kazi zinazoweza kutekelezwa kwa usalama hata kama action imewekwa kwa njia isiyo salama (kama kutumia masharti kuhusu nani ni mchezaji anayezalisha PR). -### Context Script Injections +### Makinika ya Muktadha ya Skripti -Kumbuka kuwa kuna baadhi ya [**muktadha wa github**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) ambao thamani zao zina **dhibitiwa** na **mtumiaji** anayezalisha PR. Ikiwa hatua ya github inatumia hiyo **data kutekeleza chochote**, inaweza kusababisha **utekelezaji wa msimbo wa kiholela:** +Kumbuka kuwa kuna baadhi ya [**muktadha ya github**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) ambao thamani zao zina **dhibitiwa** na **mtumiaji** anayezalisha PR. Ikiwa action ya github inatumia **data hiyo kutekeleza chochote**, inaweza kusababisha **utekelezaji wa msimbo wa kiholela:** {{#ref}} gh-actions-context-script-injections.md {{#endref}} -### **GITHUB_ENV Script Injection** +### **GITHUB_ENV Utekelezaji wa Skripti** -Kutoka kwenye nyaraka: Unaweza kufanya **kigezo cha mazingira kiweze kupatikana kwa hatua zozote zinazofuata** katika kazi ya workflow kwa kufafanua au kuboresha kigezo cha mazingira na kuandika hii kwenye **`GITHUB_ENV`** faili ya mazingira. +Kutoka kwenye nyaraka: Unaweza kufanya **kigezo cha mazingira kiweze kupatikana kwa hatua zozote zinazofuata** katika kazi ya mchakato kwa kufafanua au kuboresha kigezo cha mazingira na kuandika hii kwenye **faili ya mazingira ya `GITHUB_ENV`**. -Ikiwa mshambuliaji anaweza **kuchanganya thamani yoyote** ndani ya hii **env** kigezo, anaweza kuchanganya vigezo vya mazingira ambavyo vinaweza kutekeleza msimbo katika hatua zinazofuata kama **LD_PRELOAD** au **NODE_OPTIONS**. +Ikiwa mshambuliaji anaweza **kuingiza thamani yoyote** ndani ya **kigezo** hiki, anaweza kuingiza vigezo vya mazingira ambavyo vinaweza kutekeleza msimbo katika hatua zinazofuata kama **LD_PRELOAD** au **NODE_OPTIONS**. -Kwa mfano ([**hii**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) na [**hii**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), fikiria workflow ambayo inategemea artifact iliyopakiwa kuhifadhi maudhui yake ndani ya **`GITHUB_ENV`** kigezo cha mazingira. Mshambuliaji anaweza kupakia kitu kama hiki ili kukiathiri: +Kwa mfano ([**hii**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) na [**hii**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), fikiria mchakato ambao unategemea artifact iliyopakiwa kuhifadhi maudhui yake ndani ya **kigezo cha `GITHUB_ENV`**. Mshambuliaji anaweza kupakia kitu kama hiki ili kukiharibu:
-### Vulnerable Third Party Github Actions +### Dependabot na bots wengine wa kuaminika + +Kama ilivyoonyeshwa katika [**hiki kipande cha blogu**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), mashirika kadhaa yana Action ya Github inayounganisha PR yoyote kutoka `dependabot[bot]` kama ilivyo: +```yaml +on: pull_request_target +jobs: +auto-merge: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: gh pr merge $ -d -m +``` +Ni tatizo kwa sababu uwanja wa `github.actor` unajumuisha mtumiaji aliyeleta tukio la hivi karibuni lililosababisha mchakato wa kazi. Na kuna njia kadhaa za kumfanya mtumiaji `dependabot[bot]` kubadilisha PR. Kwa mfano: + +- Fork hifadhi ya mwathirika +- Ongeza mzigo mbaya kwenye nakala yako +- Wezesha Dependabot kwenye fork yako kwa kuongeza utegemezi wa zamani. Dependabot itaunda tawi linalosahihisha utegemezi huo kwa msimbo mbaya. +- Fungua Pull Request kwa hifadhi ya mwathirika kutoka tawi hilo (PR itaundwa na mtumiaji hivyo hakuna kitu kitakachotokea bado) +- Kisha, mshambuliaji anarudi kwenye PR ya awali ambayo Dependabot ilifungua kwenye fork yake na anatekeleza `@dependabot recreate` +- Kisha, Dependabot inatekeleza hatua kadhaa katika tawi hilo, ambazo zilibadilisha PR juu ya hifadhi ya mwathirika, ambayo inafanya `dependabot[bot]` kuwa mtendaji wa tukio la hivi karibuni lililosababisha mchakato wa kazi (na kwa hivyo, mchakato wa kazi unakimbia). + +Tukihamia mbele, je, ni nini kitatokea badala ya kuunganisha ikiwa Github Action ingekuwa na uingizaji wa amri kama katika: +```yaml +on: pull_request_target +jobs: +just-printing-stuff: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: echo ${ { github.event.pull_request.head.ref }} +``` +Vizuri, blogu ya asili inapendekeza chaguzi mbili za kutumia tabia hii, ambapo ya pili ni: + +- Fork repo ya mwathirika na kuwezesha Dependabot na utegemezi fulani wa zamani. +- Unda tawi jipya lenye msimbo wa kuingilia wa shell mbaya. +- Badilisha tawi la chaguo-msingi la repo kuwa hilo. +- Unda PR kutoka tawi hili kwenda repo ya mwathirika. +- Endesha `@dependabot merge` katika PR ambayo Dependabot ilifungua katika fork yake. +- Dependabot atachanganya mabadiliko yake katika tawi la chaguo-msingi la repo yako iliyofork, akisasisha PR katika repo ya mwathirika na kufanya sasa `dependabot[bot]` kuwa muigizaji wa tukio la hivi karibuni lililosababisha workflow na kutumia jina la tawi la uhalifu. + +### Github Actions za Tatu Zenye Uthibitisho #### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) -Kama ilivyotajwa katika [**hiki blogu**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), hatua hii ya Github inaruhusu kufikia artifacts kutoka kwa workflows tofauti na hata hifadhi. +Kama ilivyotajwa katika [**blogu hii**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), Github Action hii inaruhusu kufikia artifacts kutoka workflows tofauti na hata repositories. -Tatizo kubwa ni kwamba ikiwa **`path`** parameter haijawekwa, artifact inachukuliwa katika saraka ya sasa na inaweza kubadilisha faili ambazo zinaweza kutumika baadaye au hata kutekelezwa katika workflow. Kwa hivyo, ikiwa Artifact ina hatari, mshambuliaji anaweza kutumia hii kuathiri workflows zingine zinazotegemea Artifact. +Tatizo ni kwamba ikiwa **`path`** haijakamilishwa, artifact inachukuliwa katika directory ya sasa na inaweza kubadilisha faili ambazo zinaweza kutumika baadaye au hata kutekelezwa katika workflow. Hivyo, ikiwa Artifact ina udhaifu, mshambuliaji anaweza kutumia hii kuathiri workflows zingine zinazotegemea Artifact. -Mfano wa workflow hatari: +Mfano wa workflow yenye udhaifu: ```yaml on: workflow_run: @@ -340,27 +390,27 @@ path: ./script.py ``` --- -## Mipango Mingine ya Nje +## Mtu Mwingine wa Nje ### Utekaji wa Repo ya Namespace Iliyofutwa -Ikiwa akaunti inabadilisha jina lake, mtumiaji mwingine anaweza kujiandikisha kwa akaunti hiyo baada ya muda fulani. Ikiwa hazina ilikuwa na **nyota chini ya 100 kabla ya kubadilisha jina**, Github itaruhusu mtumiaji mpya aliyejiandikisha kwa jina hilo kuunda **hazina yenye jina sawa** na ile iliyofutwa. +Ikiwa akaunti inabadilisha jina lake, mtumiaji mwingine anaweza kujiandikisha na akaunti hiyo baada ya muda fulani. Ikiwa repo ilikuwa na **nyota chini ya 100 kabla ya kubadilisha jina**, Github itaruhusu mtumiaji mpya aliyejiandikisha kwa jina hilo kuunda **repo yenye jina sawa** na ile iliyofutwa. > [!CAUTION] -> Hivyo basi ikiwa hatua inatumia hazina kutoka kwa akaunti isiyopo, bado inawezekana kwamba mshambuliaji anaweza kuunda akaunti hiyo na kuathiri hatua hiyo. +> Hivyo basi, ikiwa hatua inatumia repo kutoka kwa akaunti isiyokuwepo, bado inawezekana kwamba mshambuliaji anaweza kuunda akaunti hiyo na kuathiri hatua hiyo. -Ikiwa hazina nyingine zilikuwa zikitumika **kutegemea kutoka kwa hazina za mtumiaji huyu**, mshambuliaji ataweza kuzikamata. Hapa kuna maelezo kamili zaidi: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) +Ikiwa repo nyingine zilikuwa zikitumika **kutegemea kutoka kwa repo za mtumiaji huyu**, mshambuliaji ataweza kuzikamata. Hapa kuna maelezo kamili zaidi: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) --- -## Mabadiliko ya Repo +## Repo Pivoting > [!NOTE] -> Katika sehemu hii tutazungumzia mbinu ambazo zitaruhusu **kubadilisha kutoka repo moja hadi nyingine** tukidhani tuna aina fulani ya ufikiaji kwenye ya kwanza (angalia sehemu iliyopita). +> Katika sehemu hii tutazungumzia mbinu ambazo zitaruhusu **kuhamasisha kutoka repo moja hadi nyingine** tukidhani tuna aina fulani ya ufikiaji kwenye ya kwanza (angalia sehemu iliyopita). ### Upoison wa Cache -Cache inahifadhiwa kati ya **mifumo ya kazi katika tawi moja**. Hii ina maana kwamba ikiwa mshambuliaji **ataathiri** **kifurushi** ambacho kisha kinahifadhiwa kwenye cache na **kupakuliwa** na kutekelezwa na **mifumo ya kazi yenye mamlaka zaidi**, ataweza pia **kuathiri** mfumo huo wa kazi. +Cache inahifadhiwa kati ya **mchakato wa kazi katika tawi moja**. Hii ina maana kwamba ikiwa mshambuliaji **ataathiri** **pakiti** ambayo kisha inahifadhiwa kwenye cache na **kupakuliwa** na kutekelezwa na **mchakato wa kazi wenye mamlaka zaidi**, ataweza pia **kuathiri** mchakato huo wa kazi. {{#ref}} gh-actions-cache-poisoning.md @@ -368,7 +418,7 @@ gh-actions-cache-poisoning.md ### Upoison wa Kazi -Mifumo ya kazi inaweza kutumia **kazi kutoka mifumo mingine ya kazi na hata hazina**, ikiwa mshambuliaji anafanikiwa **kuathiri** Github Action inayopakia **kazi** ambayo baadaye inatumika na mfumo mwingine wa kazi, anaweza **kuathiri mifumo mingine ya kazi**: +Mchakato wa kazi unaweza kutumia **kazi kutoka kwa mchakato mwingine na hata repo**, ikiwa mshambuliaji anafanikiwa **kuathiri** Github Action ambayo **inaweka kazi** ambayo baadaye inatumika na mchakato mwingine wa kazi, anaweza **kuathiri mchakato mwingine wa kazi**: {{#ref}} gh-actions-artifact-poisoning.md @@ -392,7 +442,7 @@ Angalia kurasa zifuatazo: ### Kufikia siri -Ikiwa unachoma maudhui kwenye skripti, ni muhimu kujua jinsi unavyoweza kufikia siri: +Ikiwa unachanganya maudhui kwenye script, ni muhimu kujua jinsi ya kufikia siri: - Ikiwa siri au token imewekwa kwenye **kigezo cha mazingira**, inaweza kufikiwa moja kwa moja kupitia mazingira kwa kutumia **`printenv`**. @@ -464,13 +514,13 @@ with: key: ${{ secrets.PUBLISH_KEY }} ``` -### Kutumia Runners Zilizojitegemea +### Kutumia waendeshaji wa kujitegemea -Njia ya kutafuta ni zipi **Github Actions zinazotekelezwa katika miundombinu isiyo ya github** ni kutafuta **`runs-on: self-hosted`** katika usanidi wa yaml wa Github Action. +Njia ya kutafuta ni zipi **Github Actions zinafanywa katika miundombinu isiyo ya github** ni kutafuta **`runs-on: self-hosted`** katika usanidi wa yaml wa Github Action. -**Runners zilizojitegemea** zinaweza kuwa na ufikiaji wa **habari nyeti zaidi**, kwa mifumo mingine ya **mtandao** (nukta dhaifu katika mtandao? huduma ya metadata?) au, hata kama imejitengea na kuharibiwa, **hatua zaidi ya moja zinaweza kufanywa kwa wakati mmoja** na ile mbaya inaweza **kuiba siri** za nyingine. +**Waendeshaji wa kujitegemea** wanaweza kuwa na ufikiaji wa **habari nyeti zaidi**, kwa mifumo mingine ya **mtandao** (nukta dhaifu katika mtandao? huduma ya metadata?) au, hata kama imejitengea na kuharibiwa, **hatua zaidi ya moja zinaweza kufanywa kwa wakati mmoja** na ile mbaya inaweza **kuiba siri** za nyingine. -Katika runners zilizojitegemea pia inawezekana kupata **siri kutoka kwa \_Runner.Listener**\_\*\* mchakato\*\* ambao utakuwa na siri zote za kazi katika hatua yoyote kwa kutupa kumbukumbu yake: +Katika waendeshaji wa kujitegemea pia inawezekana kupata **siri kutoka kwa \_Runner.Listener**\_\*\* mchakato\*\* ambao utakuwa na siri zote za kazi katika hatua yoyote kwa kutupa kumbukumbu yake: ```bash sudo apt-get install -y gdb sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')" @@ -530,7 +580,7 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens ### Taarifa nyeti katika kumbukumbu za Github Actions -Hata kama **Github** inajaribu **kubaini thamani za siri** katika kumbukumbu za hatua na **kuepuka kuonyesha** hizo, **data nyeti nyingine** ambazo zinaweza kuwa zimezalishwa katika utekelezaji wa hatua hiyo hazitafichwa. Kwa mfano, JWT iliyosainiwa kwa thamani ya siri haitafichwa isipokuwa [imewekwa maalum](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). +Hata kama **Github** inajaribu **kubaini thamani za siri** katika kumbukumbu za hatua na **kuepuka kuonyesha** hizo, **data nyeti nyingine** ambazo zinaweza kuwa zimeundwa katika utekelezaji wa hatua hiyo hazitafichwa. Kwa mfano, JWT iliyosainiwa kwa thamani ya siri haitafichwa isipokuwa [imewekwa maalum](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). ## Kufunika Nyayo Zako @@ -541,13 +591,4 @@ Shirika katika GitHub lina ufanisi mkubwa katika kuripoti akaunti kwa GitHub. Un > [!WARNING] > Njia pekee kwa shirika kugundua kuwa wamekuwa wakilengwa ni kuangalia kumbukumbu za GitHub kutoka SIEM kwani kutoka UI ya GitHub PR itafutwa. -## Zana - -Zana zifuatazo ni muhimu kutafuta michakato ya Github Action na hata kupata zile zenye udhaifu: - -- [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) - {{#include ../../../banners/hacktricks-training.md}}