From 92592eb806dc0bb4d24a7fcfa268e05feb8040e5 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 25 Jun 2025 00:23:06 +0000 Subject: [PATCH] Translated ['src/pentesting-ci-cd/github-security/abusing-github-actions --- src/images/CH_logo_ads.png | Bin 0 -> 27107 bytes .../abusing-github-actions/README.md | 151 +++++++++++------- 2 files changed, 96 insertions(+), 55 deletions(-) create mode 100644 src/images/CH_logo_ads.png diff --git a/src/images/CH_logo_ads.png b/src/images/CH_logo_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..b407c8929d67e14a8e254ad9bc76ac1e9f8525f7 GIT binary patch literal 27107 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
Dieses Token ist dasselbe, das eine **Github-Anwendung verwenden wird**, sodass es auf dieselben Endpunkte zugreifen kann: [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 sollte einen [**Flow**](https://github.com/github/roadmap/issues/74) veröffentlichen, der **den Zugriff über Repositories hinweg** innerhalb von GitHub ermöglicht, sodass ein Repo auf andere interne Repos mit dem `GITHUB_TOKEN` zugreifen kann. +> Github sollte einen [**Flow**](https://github.com/github/roadmap/issues/74) veröffentlichen, der **cross-repository**-Zugriff innerhalb von GitHub ermöglicht, sodass ein Repo auf andere interne Repos mit dem `GITHUB_TOKEN` zugreifen kann. -Sie können die möglichen **Berechtigungen** dieses Tokens hier einsehen: [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) +Sie können die möglichen **Berechtigungen** dieses Tokens unter: [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) einsehen. Beachten Sie, dass das Token **nach Abschluss des Jobs abläuft**.\ Diese Tokens sehen so aus: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7` @@ -56,7 +66,7 @@ https://api.github.com/repos///pulls//merge \ -d "{\"commit_title\":\"commit_title\"}" ``` {{#endtab }} -{{#tab name="PR genehmigen" }} +{{#tab name="Approve PR" }} ```bash # Approve a PR curl -X POST \ @@ -67,7 +77,7 @@ https://api.github.com/repos///pulls//reviews \ -d '{"event":"APPROVE"}' ``` {{#endtab }} -{{#tab name="Create PR" }} +{{#tab name="PR erstellen" }} ```bash # Create a PR curl -X POST \ @@ -81,11 +91,11 @@ https://api.github.com/repos///pulls \ {{#endtabs }} > [!CAUTION] -> Beachten Sie, dass Sie in mehreren Fällen **Github-Benutzertokens in den Umgebungsvariablen von Github Actions oder in den Secrets** finden können. Diese Tokens können Ihnen mehr Berechtigungen über das Repository und die Organisation geben. +> Beachten Sie, dass Sie in mehreren Fällen **Github-Benutzertokens in den Umgebungen von Github Actions oder in den Geheimnissen** finden können. Diese Tokens können Ihnen mehr Berechtigungen über das Repository und die Organisation geben.
-Liste der Secrets im Github Action-Ausgabe +Liste der Geheimnisse im Github Action-Ausgang ```yaml name: list_env on: @@ -145,13 +155,13 @@ Es ist möglich, die Berechtigungen, die einem Github-Token in den Repositories > > Wenn Sie sich in diesem Szenario befinden, können Sie einfach die [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action) überprüfen. -### Ausführung aus der Repo-Erstellung +### Ausführung bei Repo-Erstellung Falls Mitglieder einer Organisation **neue Repos erstellen** können und Sie Github-Aktionen ausführen können, können Sie **ein neues Repo erstellen und die auf Organisationsebene festgelegten Geheimnisse stehlen**. -### Ausführung aus einem neuen Branch +### Ausführung von einem neuen Branch -Wenn Sie **einen neuen Branch in einem Repository erstellen können, das bereits eine konfigurierte Github-Aktion enthält**, können Sie diese **modifizieren**, den Inhalt **hochladen** und dann **diese Aktion aus dem neuen Branch ausführen**. Auf diese Weise können Sie **Geheimnisse auf Repository- und Organisationsebene exfiltrieren** (aber Sie müssen wissen, wie sie genannt werden). +Wenn Sie **einen neuen Branch in einem Repository erstellen können, das bereits eine konfigurierte Github-Aktion enthält**, können Sie diese **modifizieren**, den Inhalt **hochladen** und dann **diese Aktion vom neuen Branch ausführen**. Auf diese Weise können Sie **Geheimnisse auf Repository- und Organisationsebene exfiltrieren** (aber Sie müssen wissen, wie sie genannt werden). Sie können die modifizierte Aktion **manuell** ausführbar machen, wenn ein **PR erstellt wird** oder wenn **einige Codes gepusht werden** (je nachdem, wie auffällig Sie sein möchten): ```yaml @@ -170,27 +180,27 @@ branches: ## Forked Execution > [!NOTE] -> Es gibt verschiedene Trigger, die es einem Angreifer ermöglichen könnten, eine **Github Action eines anderen Repositories** auszuführen. Wenn diese auslösbaren Aktionen schlecht konfiguriert sind, könnte ein Angreifer in der Lage sein, sie zu kompromittieren. +> Es gibt verschiedene Trigger, die es einem Angreifer ermöglichen könnten, eine **Github Action eines anderen Repositories** **auszuführen**. Wenn diese auslösbaren Aktionen schlecht konfiguriert sind, könnte ein Angreifer in der Lage sein, sie zu kompromittieren. ### `pull_request` -Der Workflow-Trigger **`pull_request`** wird jedes Mal den Workflow ausführen, wenn ein Pull-Request empfangen wird, mit einigen Ausnahmen: standardmäßig, wenn es das **erste Mal** ist, dass Sie **mitarbeiten**, muss ein **Maintainer** den **Lauf** des Workflows **genehmigen**: +Der Workflow-Trigger **`pull_request`** wird den Workflow jedes Mal ausführen, wenn ein Pull-Request empfangen wird, mit einigen Ausnahmen: standardmäßig, wenn es das **erste Mal** ist, dass Sie **mitarbeiten**, muss ein **Maintainer** den **Lauf** des Workflows **genehmigen**:
> [!NOTE] -> Da die **Standardbeschränkung** für **Erstbeitragsleistende** gilt, könnten Sie **einen gültigen Bug/Tippfehler beheben** und dann **andere PRs senden, um Ihre neuen `pull_request`-Befugnisse auszunutzen**. +> Da die **Standardbeschränkung** für **Erstbeiträge** gilt, könnten Sie **einen gültigen Bug/Tippfehler beheben** und dann **andere PRs senden, um Ihre neuen `pull_request`-Befugnisse auszunutzen**. > > **Ich habe das getestet und es funktioniert nicht**: ~~Eine andere Möglichkeit wäre, ein Konto mit dem Namen von jemandem zu erstellen, der zum Projekt beigetragen hat und dessen Konto gelöscht wurde.~~ -Darüber hinaus **verhindert standardmäßig Schreibberechtigungen** und **Zugriff auf Geheimnisse** auf das Ziel-Repository, wie in den [**Docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories) erwähnt: +Darüber hinaus **verhindert standardmäßig Schreibberechtigungen** und **Zugriff auf Geheimnisse** für das Ziel-Repository, wie in den [**Docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories) erwähnt: > Mit Ausnahme von `GITHUB_TOKEN` werden **Geheimnisse nicht an den Runner übergeben**, wenn ein Workflow von einem **forked** Repository ausgelöst wird. Das **`GITHUB_TOKEN` hat nur Lesezugriff** in Pull-Requests **von geforkten Repositories**. Ein Angreifer könnte die Definition der Github Action ändern, um beliebige Dinge auszuführen und beliebige Aktionen anzuhängen. Er wird jedoch nicht in der Lage sein, Geheimnisse zu stehlen oder das Repo zu überschreiben, aufgrund der genannten Einschränkungen. > [!CAUTION] -> **Ja, wenn der Angreifer im PR die Github Action ändert, die ausgelöst wird, wird seine Github Action verwendet und nicht die aus dem ursprünglichen Repo!** +> **Ja, wenn der Angreifer im PR die Github Action ändert, die ausgelöst wird, wird seine Github Action verwendet und nicht die aus dem Ursprungsrepo!** Da der Angreifer auch den ausgeführten Code kontrolliert, könnte er beispielsweise **bösartige Artefakte hochladen**, selbst wenn es keine Geheimnisse oder Schreibberechtigungen für das `GITHUB_TOKEN` gibt. @@ -198,7 +208,7 @@ Da der Angreifer auch den ausgeführten Code kontrolliert, könnte er beispielsw Der Workflow-Trigger **`pull_request_target`** hat **Schreibberechtigungen** für das Ziel-Repository und **Zugriff auf Geheimnisse** (und fragt nicht nach Erlaubnis). -Beachten Sie, dass der Workflow-Trigger **`pull_request_target`** **im Basis-Kontext** und nicht im durch den PR gegebenen Kontext ausgeführt wird (um **nicht untrusted code auszuführen**). Für weitere Informationen zu `pull_request_target` [**überprüfen Sie die Docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ +Beachten Sie, dass der Workflow-Trigger **`pull_request_target`** **im Basis-Kontext** und nicht im durch den PR gegebenen Kontext ausgeführt wird (um **nicht vertrauenswürdigen Code auszuführen**). Für weitere Informationen zu `pull_request_target` [**überprüfen Sie die Docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ Darüber hinaus finden Sie weitere Informationen zu dieser spezifischen gefährlichen Verwendung in diesem [**Github-Blogbeitrag**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). Es könnte so aussehen, als wäre der **ausgeführte Workflow** der, der im **Basis** definiert ist und **nicht im PR**, was es **sicher** macht, **`pull_request_target`** zu verwenden, aber es gibt **einige Fälle, in denen dies nicht der Fall ist**. @@ -217,29 +227,29 @@ workflows: [Run Tests] types: - completed ``` -Außerdem, laut den Dokumenten: Der durch das `workflow_run`-Ereignis gestartete Workflow kann **Geheimnisse und Token schreiben, selbst wenn der vorherige Workflow nicht**. +Außerdem, laut den Dokumenten: Der durch das `workflow_run`-Ereignis gestartete Workflow kann **Geheimnisse abrufen und Token schreiben, auch wenn der vorherige Workflow dies nicht konnte**. -Dieser Art von Workflow könnte angegriffen werden, wenn er **von einem Workflow abhängt**, der von einem externen Benutzer über **`pull_request`** oder **`pull_request_target`** **ausgelöst** werden kann. Einige anfällige Beispiele können [**in diesem Blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)** gefunden werden.** Der erste besteht darin, dass der durch `workflow_run` ausgelöste Workflow den Code des Angreifers herunterlädt: `${{ github.event.pull_request.head.sha }}`\ -Der zweite besteht darin, ein **Artifact** vom **nicht vertrauenswürdigen** Code an den **`workflow_run`** Workflow zu übergeben und den Inhalt dieses Artifacts auf eine Weise zu verwenden, die **anfällig für RCE** ist. +Diese Art von Workflow könnte angegriffen werden, wenn sie **von** einem **Workflow** abhängt, der von einem externen Benutzer über **`pull_request`** oder **`pull_request_target`** **ausgelöst** werden kann. Einige anfällige Beispiele können [**in diesem Blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)** gefunden werden.** Der erste besteht darin, dass der durch **`workflow_run`** ausgelöste Workflow den Code des Angreifers herunterlädt: `${{ github.event.pull_request.head.sha }}`\ +Der zweite besteht darin, ein **Artifact** vom **nicht vertrauenswürdigen** Code an den **`workflow_run`**-Workflow zu **übergeben** und den Inhalt dieses Artifacts auf eine Weise zu verwenden, die **anfällig für RCE** ist. ### `workflow_call` TODO -TODO: Überprüfen, ob der verwendete/heruntergeladene Code, wenn er von einem pull_request ausgeführt wird, der aus dem Ursprung oder vom geforkten PR stammt. +TODO: Überprüfen, ob der verwendete/heruntergeladene Code bei der Ausführung von einem pull_request der aus dem Ursprung oder vom geforkten PR stammt ## Missbrauch von geforkter Ausführung -Wir haben alle Möglichkeiten erwähnt, wie ein externer Angreifer einen GitHub-Workflow ausführen könnte. Schauen wir uns nun an, wie diese Ausführungen, wenn sie schlecht konfiguriert sind, missbraucht werden könnten: +Wir haben alle Möglichkeiten erwähnt, wie ein externer Angreifer einen GitHub-Workflow zur Ausführung bringen könnte. Schauen wir uns nun an, wie diese Ausführungen, wenn sie schlecht konfiguriert sind, missbraucht werden könnten: -### Nicht vertrauenswürdige Checkout-Ausführung +### Unsichere Checkout-Ausführung Im Fall von **`pull_request`** wird der Workflow im **Kontext des PR** ausgeführt (er wird also den **bösartigen PR-Code** ausführen), aber jemand muss ihn **zuerst autorisieren**, und er wird mit einigen [Einschränkungen](#pull_request) ausgeführt. -Im Fall eines Workflows, der **`pull_request_target` oder `workflow_run`** verwendet und von einem Workflow abhängt, der von **`pull_request_target` oder `pull_request`** ausgelöst werden kann, wird der Code aus dem ursprünglichen Repo ausgeführt, sodass der **Angreifer den ausgeführten Code nicht kontrollieren kann**. +Im Fall eines Workflows, der **`pull_request_target` oder `workflow_run`** verwendet und von einem Workflow abhängt, der von **`pull_request_target` oder `pull_request`** ausgelöst werden kann, wird der Code aus dem ursprünglichen Repository ausgeführt, sodass der **Angreifer den ausgeführten Code nicht kontrollieren kann**. > [!CAUTION] -> Wenn die **Aktion** jedoch einen **expliziten PR-Checkout** hat, der **den Code vom PR** (und nicht von der Basis) **holt**, wird der vom Angreifer kontrollierte Code verwendet. Zum Beispiel (siehe Zeile 12, wo der PR-Code heruntergeladen wird): +> Wenn jedoch die **Aktion** einen **expliziten PR-Checkout** hat, der **den Code vom PR** (und nicht von der Basis) **holt**, wird der vom Angreifer kontrollierte Code verwendet. Zum Beispiel (siehe Zeile 12, wo der PR-Code heruntergeladen wird):
# UNSICHER. Nur als Beispiel bereitgestellt.
 on:
@@ -269,7 +279,7 @@ message: |
 Danke!
 
-Der potenziell **nicht vertrauenswürdige Code wird während `npm install` oder `npm build`** ausgeführt, da die Build-Skripte und referenzierten **Pakete vom Autor des PR** kontrolliert werden. +Der potenziell **nicht vertrauenswürdige Code wird während `npm install` oder `npm build`** ausgeführt, da die Build-Skripte und die referenzierten **Pakete vom Autor des PR** kontrolliert werden. > [!WARNING] > Ein GitHub-Dork, um nach anfälligen Aktionen zu suchen, ist: `event.pull_request pull_request_target extension:yml`, jedoch gibt es verschiedene Möglichkeiten, die Jobs sicher auszuführen, selbst wenn die Aktion unsicher konfiguriert ist (wie die Verwendung von Bedingungen darüber, wer der Akteur ist, der den PR generiert). @@ -286,21 +296,61 @@ gh-actions-context-script-injections.md Laut den Dokumenten: Sie können eine **Umgebungsvariable für alle nachfolgenden Schritte** in einem Workflow-Job verfügbar machen, indem Sie die Umgebungsvariable definieren oder aktualisieren und dies in die **`GITHUB_ENV`**-Umgebungsdatei schreiben. -Wenn ein Angreifer **irgendeinen Wert** in diese **env**-Variable **einschleusen** könnte, könnte er Umgebungsvariablen injizieren, die in nachfolgenden Schritten Code ausführen könnten, wie **LD_PRELOAD** oder **NODE_OPTIONS**. +Wenn ein Angreifer **irgend einen Wert** in diese **env**-Variable **einschleusen** könnte, könnte er Umgebungsvariablen injizieren, die in nachfolgenden Schritten Code ausführen könnten, wie **LD_PRELOAD** oder **NODE_OPTIONS**. -Zum Beispiel ([**dies**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) und [**dies**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), stellen Sie sich einen Workflow vor, der einem hochgeladenen Artifact vertraut, um seinen Inhalt in der **`GITHUB_ENV`**-Umgebungsvariable zu speichern. Ein Angreifer könnte etwas wie dies hochladen, um es zu kompromittieren: +Zum Beispiel ([**dies**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) und [**dies**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), stellen Sie sich einen Workflow vor, der ein hochgeladenes Artifact vertraut, um seinen Inhalt in der **`GITHUB_ENV`**-Umgebungsvariable zu speichern. Ein Angreifer könnte etwas wie dies hochladen, um es zu kompromittieren:
-### Anfällige Drittanbieter-GitHub-Aktionen +### Dependabot und andere vertrauenswürdige Bots + +Wie in [**diesem Blogbeitrag**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest) angegeben, haben mehrere Organisationen eine GitHub-Aktion, die jeden PR von `dependabot[bot]` zusammenführt, wie in: +```yaml +on: pull_request_target +jobs: +auto-merge: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: gh pr merge $ -d -m +``` +Welches ein Problem darstellt, da das Feld `github.actor` den Benutzer enthält, der das letzte Ereignis verursacht hat, das den Workflow ausgelöst hat. Und es gibt mehrere Möglichkeiten, den Benutzer `dependabot[bot]` dazu zu bringen, einen PR zu ändern. Zum Beispiel: + +- Forken Sie das Opfer-Repository +- Fügen Sie die bösartige Payload zu Ihrer Kopie hinzu +- Aktivieren Sie Dependabot in Ihrem Fork, indem Sie eine veraltete Abhängigkeit hinzufügen. Dependabot wird einen Branch erstellen, der die Abhängigkeit mit bösartigem Code behebt. +- Öffnen Sie einen Pull Request zum Opfer-Repository von diesem Branch (der PR wird vom Benutzer erstellt, also wird noch nichts passieren) +- Dann geht der Angreifer zurück zu dem ursprünglichen PR, den Dependabot in seinem Fork geöffnet hat, und führt `@dependabot recreate` aus +- Dann führt Dependabot einige Aktionen in diesem Branch aus, die den PR im Opfer-Repo modifizieren, wodurch `dependabot[bot]` der Akteur des letzten Ereignisses wird, das den Workflow ausgelöst hat (und daher der Workflow ausgeführt wird). + +Kommen wir nun dazu, was wäre, wenn anstelle des Zusammenführens die Github Action eine Befehlsinjektion hätte wie in: +```yaml +on: pull_request_target +jobs: +just-printing-stuff: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: echo ${ { github.event.pull_request.head.ref }} +``` +Nun, der ursprüngliche Blogbeitrag schlägt zwei Optionen vor, um dieses Verhalten auszunutzen, wobei die zweite ist: + +- Forken Sie das Opfer-Repository und aktivieren Sie Dependabot mit einer veralteten Abhängigkeit. +- Erstellen Sie einen neuen Branch mit dem bösartigen Shell-Injektionscode. +- Ändern Sie den Standardbranch des Repos auf diesen. +- Erstellen Sie einen PR von diesem Branch zum Opfer-Repository. +- Führen Sie `@dependabot merge` im PR aus, den Dependabot in seinem Fork geöffnet hat. +- Dependabot wird seine Änderungen im Standardbranch Ihres geforkten Repositories zusammenführen und den PR im Opfer-Repository aktualisieren, wodurch `dependabot[bot]` der Akteur des letzten Ereignisses wird, das den Workflow ausgelöst hat, und einen bösartigen Branch-Namen verwendet. + +### Verwundbare Drittanbieter Github Actions #### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) -Wie in [**diesem Blogbeitrag**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks) erwähnt, ermöglicht diese GitHub-Aktion den Zugriff auf Artefakte aus verschiedenen Workflows und sogar Repositories. +Wie in [**diesem Blogbeitrag**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks) erwähnt, ermöglicht diese Github Action den Zugriff auf Artefakte aus verschiedenen Workflows und sogar Repositories. -Das Problem ist, dass, wenn der **`path`**-Parameter nicht gesetzt ist, das Artifact im aktuellen Verzeichnis extrahiert wird und Dateien überschreiben kann, die später im Workflow verwendet oder sogar ausgeführt werden könnten. Daher könnte ein Angreifer, wenn das Artifact anfällig ist, dies ausnutzen, um andere Workflows zu kompromittieren, die dem Artifact vertrauen. +Das Problem ist, dass, wenn der **`path`** Parameter nicht gesetzt ist, das Artefakt im aktuellen Verzeichnis extrahiert wird und Dateien überschreiben kann, die später im Workflow verwendet oder sogar ausgeführt werden könnten. Daher könnte ein Angreifer, wenn das Artefakt verwundbar ist, dies ausnutzen, um andere Workflows zu kompromittieren, die dem Artefakt vertrauen. -Beispiel eines anfälligen Workflows: +Beispiel für einen verwundbaren Workflow: ```yaml on: workflow_run: @@ -344,12 +394,12 @@ path: ./script.py ### Gelöschte Namespace-Repo-Hijacking -Wenn ein Konto seinen Namen ändert, könnte ein anderer Benutzer nach einiger Zeit ein Konto mit diesem Namen registrieren. Wenn ein Repository **weniger als 100 Sterne vor der Namensänderung hatte**, erlaubt Github dem neu registrierten Benutzer mit demselben Namen, ein **Repository mit demselben Namen** wie das gelöschte zu erstellen. +Wenn ein Konto seinen Namen ändert, könnte ein anderer Benutzer nach einiger Zeit ein Konto mit diesem Namen registrieren. Wenn ein Repository **weniger als 100 Sterne vor der Namensänderung hatte**, erlaubt Github dem neuen registrierten Benutzer mit demselben Namen, ein **Repository mit demselben Namen** wie das gelöschte zu erstellen. > [!CAUTION] -> Wenn eine Aktion also ein Repo von einem nicht existierenden Konto verwendet, ist es immer noch möglich, dass ein Angreifer dieses Konto erstellen und die Aktion kompromittieren könnte. +> Wenn eine Aktion ein Repo von einem nicht existierenden Konto verwendet, ist es immer noch möglich, dass ein Angreifer dieses Konto erstellen und die Aktion kompromittieren könnte. -Wenn andere Repositories **Abhängigkeiten von diesen Benutzer-Repos** verwendet haben, wird ein Angreifer in der Lage sein, sie zu übernehmen. Hier haben Sie eine umfassendere Erklärung: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) +Wenn andere Repositories **Abhängigkeiten von diesen Benutzer-Repos** verwendet haben, wird ein Angreifer in der Lage sein, sie zu hijacken. Hier haben Sie eine umfassendere Erklärung: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) --- @@ -360,7 +410,7 @@ Wenn andere Repositories **Abhängigkeiten von diesen Benutzer-Repos** verwendet ### Cache-Poisoning -Ein Cache wird zwischen **Workflow-Ausführungen im selben Branch** aufrechterhalten. Das bedeutet, dass, wenn ein Angreifer ein **Paket** **kompromittiert**, das dann im Cache gespeichert und von einem **privilegierteren** Workflow **heruntergeladen** und ausgeführt wird, er auch diesen Workflow **kompromittieren** kann. +Ein Cache wird zwischen **Workflow-Ausführungen im selben Branch** aufrechterhalten. Das bedeutet, dass, wenn ein Angreifer ein **Paket** kompromittiert, das dann im Cache gespeichert und von einem **privilegierteren** Workflow **heruntergeladen** und ausgeführt wird, er auch diesen Workflow **kompromittieren** kann. {{#ref}} gh-actions-cache-poisoning.md @@ -368,7 +418,7 @@ gh-actions-cache-poisoning.md ### Artifact-Poisoning -Workflows könnten **Artefakte von anderen Workflows und sogar Repos** verwenden. Wenn es einem Angreifer gelingt, die Github Action, die ein **Artefakt hochlädt**, das später von einem anderen Workflow verwendet wird, zu **kompromittieren**, könnte er **die anderen Workflows kompromittieren**: +Workflows könnten **Artefakte von anderen Workflows und sogar Repos** verwenden. Wenn es einem Angreifer gelingt, die Github Action zu **kompromittieren**, die ein **Artefakt hochlädt**, das später von einem anderen Workflow verwendet wird, könnte er **die anderen Workflows kompromittieren**: {{#ref}} gh-actions-artifact-poisoning.md @@ -466,11 +516,11 @@ key: ${{ secrets.PUBLISH_KEY }} ### Missbrauch von selbstgehosteten Runnern -Der Weg, um herauszufinden, welche **Github Actions in nicht-Github-Infrastrukturen** ausgeführt werden, besteht darin, nach **`runs-on: self-hosted`** in der Github Action-Konfigurations-YAML zu suchen. +Der Weg, um herauszufinden, welche **Github Actions in nicht-Github-Infrastrukturen ausgeführt werden**, besteht darin, nach **`runs-on: self-hosted`** in der Github Action-Konfigurations-YAML zu suchen. **Selbstgehostete** Runner könnten Zugang zu **extra sensiblen Informationen**, zu anderen **Netzwerksystemen** (anfällige Endpunkte im Netzwerk? Metadatenservice?) haben oder, selbst wenn sie isoliert und zerstört sind, **könnten mehr als eine Aktion gleichzeitig ausgeführt werden** und die bösartige könnte die **Geheimnisse** der anderen stehlen. -Bei selbstgehosteten Runnern ist es auch möglich, die **Geheimnisse aus dem \_Runner.Listener**\_\*\* Prozess\*\* zu erhalten, der alle Geheimnisse der Workflows zu jedem Zeitpunkt enthält, indem man seinen Speicher dumpet: +Bei selbstgehosteten Runnern ist es auch möglich, die **Geheimnisse aus dem \_Runner.Listener**\_\*\* Prozess\*\* zu erhalten, der alle Geheimnisse der Workflows zu jedem Zeitpunkt enthält, indem man seinen Speicher ausliest: ```bash sudo apt-get install -y gdb sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')" @@ -530,24 +580,15 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens ### Sensible Informationen in Github Actions-Protokollen -Selbst wenn **Github** versucht, **Geheimwerte** in den Aktionsprotokollen zu **erkennen** und **zu vermeiden**, dass sie angezeigt werden, werden **andere sensible Daten**, die während der Ausführung der Aktion generiert wurden, nicht verborgen. Zum Beispiel wird ein mit einem Geheimwert signiertes JWT nicht verborgen, es sei denn, es ist [speziell konfiguriert](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). +Selbst wenn **Github** versucht, **Geheimwerte** in den Aktionsprotokollen zu **erkennen** und **zu vermeiden**, dass sie angezeigt werden, werden **andere sensible Daten**, die während der Ausführung der Aktion generiert wurden, nicht verborgen. Zum Beispiel wird ein JWT, das mit einem Geheimwert signiert ist, nicht verborgen, es sei denn, es ist [speziell konfiguriert](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). ## Spuren verwischen -(Technik von [**hier**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Zunächst einmal ist jeder PR, der erstellt wird, für die Öffentlichkeit in Github und für das Ziel-GitHub-Konto deutlich sichtbar. In GitHub können wir standardmäßig **einen PR aus dem Internet nicht löschen**, aber es gibt einen Haken. Für GitHub-Konten, die von Github **suspendiert** wurden, werden alle ihre **PRs automatisch gelöscht** und aus dem Internet entfernt. Um also Ihre Aktivitäten zu verbergen, müssen Sie entweder Ihr **GitHub-Konto suspendiert bekommen oder Ihr Konto als verdächtig markieren lassen**. Dies würde **alle Ihre Aktivitäten** auf GitHub aus dem Internet verbergen (im Grunde alle Ihre Exploit-PRs entfernen). +(Technik von [**hier**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Zunächst einmal ist jeder PR, der erstellt wird, für die Öffentlichkeit in Github und für das Ziel-GitHub-Konto deutlich sichtbar. In GitHub können wir standardmäßig **einen PR aus dem Internet nicht löschen**, aber es gibt einen Haken. Für GitHub-Konten, die von Github **suspendiert** werden, werden alle ihre **PRs automatisch gelöscht** und aus dem Internet entfernt. Um also Ihre Aktivitäten zu verbergen, müssen Sie entweder Ihr **GitHub-Konto suspendiert bekommen oder Ihr Konto als verdächtig markieren lassen**. Dies würde **alle Ihre Aktivitäten** auf GitHub aus dem Internet verbergen (im Grunde alle Ihre Exploit-PRs entfernen). Eine Organisation in GitHub ist sehr proaktiv darin, Konten an GitHub zu melden. Alles, was Sie tun müssen, ist, „einige Dinge“ in einem Issue zu teilen, und sie werden sicherstellen, dass Ihr Konto in 12 Stunden suspendiert wird :p und da haben Sie es, Ihr Exploit ist auf GitHub unsichtbar gemacht. > [!WARNING] > Der einzige Weg für eine Organisation herauszufinden, dass sie ins Visier genommen wurde, besteht darin, die GitHub-Protokolle von SIEM zu überprüfen, da der PR aus der GitHub-Benutzeroberfläche entfernt würde. -## Werkzeuge - -Die folgenden Werkzeuge sind nützlich, um Github Action-Workflows zu finden und sogar verwundbare zu finden: - -- [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven) -- [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato) -- [https://github.com/AdnaneKhan/Gato-X](https://github.com/AdnaneKhan/Gato-X) -- [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda) - {{#include ../../../banners/hacktricks-training.md}}