Abusing Github Actions
Βασικές Πληροφορίες
Σε αυτήν τη σελίδα θα βρείτε:
Ένα σύνοψη όλων των επιπτώσεων ενός επιτιθέμενου που καταφέρνει να έχει πρόσβαση σε μια ενέργεια του Github
Διαφορετικούς τρόπους για να αποκτήσετε πρόσβαση σε μια ενέργεια:
Έχοντας δικαιώματα για τη δημιουργία της ενέργειας
Κατάχρηση σχετικών ενεργοποιητών αιτήσεων ενσωμάτωσης (pull request)
Κατάχρηση άλλων εξωτερικών τεχνικών πρόσβασης
Εναλλαγή από ένα ήδη χειρισμένο αποθετήριο
Τέλος, μια ενότητα για τεχνικές μετά-εκμετάλλευσης για την κατάχρηση μιας ενέργειας από μέσα (λόγω των αναφερθέντων επιπτώσεων)
Σύνοψη Επιπτώσεων
Για μια εισαγωγή σχετικά με τις Ενέργειες του Github ελέγξτε τις βασικές πληροφορίες.
Σε περίπτωση που μπορείτε να εκτελέσετε αυθαίρετες ενέργειες του Github/να ενσωματώσετε κώδικα σε ένα αποθετήριο, θα μπορούσατε να:
Κλέψετε τα μυστικά από αυτό το αποθετήριο/οργανισμό.
Αν μπορείτε μόνο να ενσωματώσετε, μπορείτε να κλέψετε οτιδήποτε είναι ήδη παρόν στη ροή εργασίας.
Κατάχρηση των δικαιωμάτων του αποθετηρίου για πρόσβαση σε άλλες πλατφόρμες όπως AWS και GCP.
Εκτέλεση κώδικα σε προσαρμοσμένους εργαζομένους (εάν χρησιμοποιούνται προσαρμοσμένοι εργαζόμενοι) και προσπαθήστε να εναλλάξετε από εκεί.
Αντικατάσταση κώδικα αποθετηρίου.
Αυτό εξαρτάται από τα δικαιώματα του
GITHUB_TOKEN
(εάν υπάρχουν).Θέτετε σε κίνδυνο αναπτύξεις και άλλα αντικείμενα.
Αν ο κώδικας αναπτύσσει ή αποθηκεύει κάτι μπορείτε να το τροποποιήσετε και να αποκτήσετε περαιτέρω πρόσβαση.
GITHUB_TOKEN
Αυτό το "μυστικό" (προέρχεται από ${{ secrets.GITHUB_TOKEN }}
και ${{ github.token }}
) δίνεται όταν ο διαχειριστής ενεργοποιεί αυτήν την επιλογή:
Αυτό το τοκέν είναι το ίδιο με αυτό που θα χρησιμοποιήσει μια Εφαρμογή του Github, έτσι μπορεί να έχει πρόσβαση στα ίδια σημεία: https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps
Το Github θα πρέπει να κυκλοφορήσει ένα ροή που επιτρέπει τη διασταύρωση αποθετηρίων εντός του GitHub, έτσι ένα αποθετήριο μπορεί να έχει πρόσβαση σε άλλα εσωτερικά αποθετήρια χρησιμοποιώντας το GITHUB_TOKEN
.
Μπορείτε να δείτε τα πιθανά δικαιώματα αυτού του τοκέν στο: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
Σημειώστε ότι το τοκέν λήγει μετά την ολοκλήρωση της εργασίας.
Αυτά τα τοκέν μοιάζουν με αυτό: ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7
Κάποια ενδιαφέροντα πράγματα που μπορείτε να κάνετε με αυτό το τοκέν:
Σημειώστε ότι σε πολλές περιπτώσεις μπορείτε να βρείτε tokens χρήστη του Github μέσα στα περιβάλλοντα των Github Actions ή στα μυστικά. Αυτά τα tokens μπορεί να σας δώσουν περισσότερα προνόμια στο αποθετήριο και τον οργανισμό.
Είναι δυνατόν να ελέγξετε τα δικαιώματα που δίνονται σε ένα Github Token σε αποθετήρια άλλων χρηστών ελέγχοντας τα logs των ενεργειών:
Επιτρεπόμενη Εκτέλεση
Αυτό θα ήταν ο ευκολότερος τρόπος να διακινδυνεύσετε τις ενέργειες του Github, καθώς σε αυτήν την περίπτωση υποθέτουμε ότι έχετε πρόσβαση για δημιουργία ενός νέου αποθετηρίου στον οργανισμό, ή έχετε δικαιώματα εγγραφής σε ένα αποθετήριο.
Αν βρίσκεστε σε αυτό το σενάριο, μπορείτε απλά να ελέγξετε τις τεχνικές μετά-εκμετάλλευσης.
Εκτέλεση από Δημιουργία Αποθετηρίου
Στην περίπτωση που τα μέλη ενός οργανισμού μπορούν να δημιουργήσουν νέα αποθετήρια και μπορείτε να εκτελέσετε ενέργειες στο Github, μπορείτε να δημιουργήσετε ένα νέο αποθετήριο και να κλέψετε τα μυστικά που έχουν οριστεί σε επίπεδο οργανισμού.
Εκτέλεση από Νέο Branch
Αν μπορείτε να δημιουργήσετε ένα νέο branch σε ένα αποθετήριο που ήδη περιέχει μια ενέργεια του Github Action που έχει διαμορφωθεί, μπορείτε να την τροποποιήσετε, να ανεβάσετε το περιεχόμενο, και στη συνέχεια να εκτελέσετε αυτήν την ενέργεια από το νέο branch. Με αυτόν τον τρόπο μπορείτε να εξαγάγετε μυστικά από το αποθετήριο και τον οργανισμό (αλλά πρέπει να γνωρίζετε πώς ονομάζονται).
Μπορείτε να κάνετε την τροποποιημένη ενέργεια εκτελέσιμη χειροκίνητα, όταν δημιουργείται μια Αίτηση Σύγχρονης Ενημέρωσης (PR) ή όταν κάποιος κώδικας πιέζεται (ανάλογα με το πόσο θορυβώδες θέλετε να είστε):
Εκτέλεση Forked
Υπάρχουν διαφορετικά triggers που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να εκτελέσει μια Δράση Github από ένα άλλο αποθετήριο. Εάν αυτές οι ενεργοποιήσιμες δράσεις είναι κακά διαμορφωμένες, ένας επιτιθέμενος θα μπορούσε να τις διακινδυνεύσει.
pull_request
pull_request
Το trigger του ροής εργασίας pull_request
θα εκτελέσει τη ροή εργασίας κάθε φορά που λαμβάνεται ένα αίτημα ενσωμάτωσης με κάποιες εξαιρέσεις: από προεπιλογή, αν είναι η πρώτη φορά που συνεργάζεστε, κάποιος διαχειριστής θα πρέπει να εγκρίνει τη εκτέλεση της ροής εργασίας:
Καθώς ο προεπιλεγμένος περιορισμός είναι για συνεισφέροντες πρώτη φορά, θα μπορούσατε να συνεισφέρετε διορθώνοντας ένα έγκυρο σφάλμα/τυπογραφικό λάθος και στη συνέχεια να στείλετε άλλα PRs για να καταχραστείτε τα νέα σας προνόμια pull_request
.
Το δοκίμασα και δεν λειτουργεί: Μια άλλη επιλογή θα ήταν να δημιουργήσετε ένα λογαριασμό με το όνομα κάποιου που συνεισφέρει στο έργο και διέγραψε τον λογαριασμό του.
Επιπλέον, από προεπιλογή αποτρέπει τις άδειες εγγραφής και την πρόσβαση σε μυστικά στον στόχο αποθετήριο, όπως αναφέρεται στα έγγραφα :
Με εξαίρεση του
GITHUB_TOKEN
, τα μυστικά δεν περνούν στον εκτελητή όταν μια ροή εργασίας ενεργοποιείται από ένα διακλαδωμένο αποθετήριο. ΤοGITHUB_TOKEN
έχει δικαιώματα μόνο για ανάγνωση σε αιτήσεις ενσωμάτωσης από διακλαδωμένα αποθετήρια.
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τον ορισμό της Δράσης του Github για να εκτελέσει αυθαίρετα πράγματα και να προσθέσει αυθαίρετες ενέργειες. Ωστόσο, δεν θα μπορούσε να κλέψει μυστικά ή να αντικαταστήσει το αποθετήριο λόγω των αναφερθέντων περιορισμών.
Ναι, αν ο επιτιθέμενος αλλάξει στο PR τη δράση του github που θα ενεργοποιηθεί, η Δράση του Github που θα χρησιμοποιηθεί θα είναι αυτή που δημιούργησε ο επιτιθέμενος και όχι αυτή από το αρχικό αποθετήριο!
Καθώς ο επιτιθέμενος ελέγχει επίσης τον κώδικα που εκτελείται, ακόμη κι αν δεν υπάρχουν μυστικά ή άδειες εγγραφής στο GITHUB_TOKEN
, ένας επιτιθέμενος θα μπορούσε, για παράδειγμα, να ανεβάσει κακόβουλα αρχεία.
pull_request_target
pull_request_target
Το trigger της ροής εργασίας pull_request_target
έχει άδειες εγγραφής στον στόχο αποθετήριο και πρόσβαση σε μυστικά (και δεν ζητά άδεια).
Σημειώστε ότι το trigger της ροής εργασίας pull_request_target
τρέχει στο βασικό πλαίσιο και όχι στο πλαίσιο που δίνεται από το PR (για να μην εκτελεί μη αξιόπιστο κώδικα). Για περισσότερες πληροφορίες σχετικά με το pull_request_target
ελέγξτε τα έγγραφα.
Επιπλέον, για περισσότερες πληροφορίες σχετικά με αυτήν τη συγκεκριμένα επικίνδυνη χρήση, ελέγξτε αυτήν την ανάρτηση στο blog του github.
Μπορεί να φαίνεται ότι επειδή η εκτελούμενη ροή είναι αυτή που ορίζεται στο βασικό και όχι στο PR, είναι ασφαλές να χρησιμοποιείτε το pull_request_target
, αλλά υπάρχουν μερικές περιπτώσεις όπου δεν είναι.
Και αυτός θα έχει πρόσβαση σε μυστικά.
workflow_run
workflow_run
Το trigger workflow_run επιτρέπει την εκτέλεση μιας ροής εργασίας από μια διαφορετική όταν είναι ολοκληρωμένη
, ζητημένη
ή σε εξέλιξη
.
Σε αυτό το παράδειγμα, μια ροή εργασίας έχει διαμορφωθεί να τρέξει μετά την ολοκλήρωση της ξεχωριστής ροής "Εκτέλεση Δοκιμών":
Επιπλέον, σύμφωνα με τα έγγραφα: Η ροή εργασίας που ξεκινά από το συμβάν workflow_run
μπορεί να έχει πρόσβαση σε μυστικά και να γράψει τα εισιτήρια, ακόμη κι αν η προηγούμενη ροή εργασίας δεν ήταν.
Αυτού του είδους ροή εργασίας θα μπορούσε να δέχεται επίθεση αν εξαρτάται από μια ροή εργασίας που μπορεί να ενεργοποιηθεί από έναν εξωτερικό χρήστη μέσω pull_request
ή pull_request_target
. Μερικά ευάλωτα παραδείγματα μπορεί να βρεθούν σε αυτό το blog. Το πρώτο αποτελείται από τη ροή εργασίας που ενεργοποιείται από το workflow_run
να κατεβάζει τον κώδικα του επιτιθέμενου: ${{ github.event.pull_request.head.sha }}
.
Το δεύτερο αποτελείται από τη μετάδοση ενός αντικειμένου από τον μη αξιόπιστο κώδικα στη ροή εργασίας workflow_run
και τη χρήση του περιεχομένου αυτού του αντικειμένου με έναν τρόπο που το καθιστά ευάλωτο στην RCE.
workflow_call
workflow_call
TODO
TODO: Ελέγξτε αν κατά την εκτέλεση από ένα pull_request ο κώδικας που χρησιμοποιείται/κατεβάζεται είναι αυτός από την προέλευση ή από το forked PR
Κατάχρηση Εκτέλεσης Forked
Έχουμε αναφέρει όλους τους τρόπους με τους οποίους ένας εξωτερικός επιτιθέμενος θα μπορούσε να καταφέρει να εκτελέσει μια ροή εργασίας στο github, ας δούμε τώρα πώς αυτές οι εκτελέσεις, αν δεν έχουν καλή ρύθμιση, θα μπορούσαν να καταχραστούνται:
Εκτέλεση μη αξιόπιστου checkout
Στην περίπτωση του pull_request
, η ροή εργασίας θα εκτελείται στο πλαίσιο του PR (έτσι θα εκτελεί τον κακόβουλο κώδικα των PRs), αλλά κάποιος πρέπει να το εξουσιοδοτήσει πρώτα και θα τρέξει με κάποιους περιορισμούς.
Σε περίπτωση μιας ροής εργασίας που χρησιμοποιεί pull_request_target
ή workflow_run
και εξαρτάται από μια ροή εργασίας που μπορεί να ενεργοποιηθεί από pull_request_target
ή pull_request
, ο κώδικας από το αρχικό αποθετήριο θα εκτελεστεί, έτσι ο επιτιθέμενος δεν μπορεί να ελέγξει τον εκτελούμενο κώδικα.
Ωστόσο, αν η ενέργεια έχει ένα συγκεκριμένο checkout PR που θα πάρει τον κώδικα από το PR (και όχι από τη βάση), θα χρησιμοποιήσει τον κώδικα που ελέγχεται από τον επιτιθέμενο. Για παράδειγμα (ελέγξτε τη γραμμή 12 όπου ο κώδικας του PR κατεβαίνει):
Ο πιθανά μη αξιόπιστος κώδικας εκτελείται κατά τη διάρκεια του npm install
ή npm build
καθώς οι σενάριο κατασκευής και τα αναφερόμενα πακέτα ελέγχονται από τον συγγραφέα του PR.
Ένα github dork για την αναζήτηση ευάλωτων ενεργειών είναι: event.pull_request pull_request_target extension:yml
ωστόσο, υπάρχουν διαφορετικοί τρόποι να ρυθμιστούν οι εργασίες για να εκτελούνται με ασφάλεια ακόμη κι αν η ενέργεια έχει ρυθμιστεί με ευπάθεια (όπως η χρήση συνθηκών σχετικά με τον χρήστη που δημιουργεί το PR).
Ενσωμάτωση Σεναρίων Πλαισίου
Σημειώστε ότι υπάρχουν ορισμένα πλαίσια github των οποίων οι τιμές ελέγχονται από τον χρήστη που δημιουργεί το PR. Αν η ενέργεια του github χρησιμοποιεί αυτά τα δεδομένα για να εκτελέσει οτιδήποτε, μπορεί να οδηγήσει σε αυθαίρετη εκτέλεση κώδικα:
Gh Actions - Context Script InjectionsΕνσωμάτωση Σεναρίων GITHUB_ENV
Από τα έγγραφα: Μπορείτε να κάνετε ένα μεταβλητή περιβάλλοντος διαθέσιμη σε οποιαδήποτε επόμενη βήματα σε μια εργασία ροής εργασίας καθορίζοντας ή ενημερώνοντας τη μεταβλητή περιβάλλοντος και γράφοντας αυτό στο αρχείο περιβάλλοντος GITHUB_ENV
.
Αν ένας επιτιθέμενος μπορούσε να ενθάρρυνει οποιαδήποτε τιμή μέσα σε αυτή τη μεταβλητή env, θα μπορούσε να ενθάρρυνει μεταβλητές env που θα μπορούσαν να εκτελέσουν κώδικα σε επόμενα βήματα όπως LD_PRELOAD ή NODE_OPTIONS.
Για παράδειγμα (αυτό και αυτό), φανταστείτε μια ροή εργασίας που εμπιστεύεται ένα ανεβασμένο αντικείμενο για να αποθηκεύσει το περιεχόμενό του μέσα στη μεταβλητή περιβάλλοντος GITHUB_ENV
. Ένας επιτιθέμενος θα μπορούσε να ανεβάσει κάτι τέτοιο για να το διακινδυνεύσει:
Ευάλωτες Ενέργειες Τρίτων Μερών στο Github
Όπως αναφέρεται σε αυτή την ανάρτηση στο blog, αυτή η Ενέργεια του Github επιτρέπει την πρόσβαση σε αντικείμενα από διαφορετικές ροές εργασίας και ακόμη και αποθετήρια.
Το πρόβλημα είναι ότι αν η παράμετρος path
δεν έχει οριστεί, το αντικείμενο εξάγεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που θα μπορούσαν να χρησιμοποιηθούν αργότερα ή ακόμη και να εκτελεστούν στη ροή εργασίας. Επομένως, αν το Αντικείμενο είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτό για να διακινδυνεύσει άλλες ροές εργασίας που εμπιστεύονται το Αντικείμενο.
Παράδειγμα ευάλωτης ροής εργασίας:
Αυτό θα μπορούσε να επιτεθεί με αυτήν τη ροή εργασίας:
Άλλη Εξωτερική Πρόσβαση
Εκμετάλλευση Διαγραφής Αποθετηρίου Ονομάτων
Εάν ένα λογαριασμός αλλάξει το όνομά του, ένας άλλος χρήστης μπορεί να εγγραφεί με αυτό το όνομα αργότερα. Εάν ένα αποθετήριο είχε λιγότερα από 100 αστέρια πριν από την αλλαγή ονόματος, το Github θα επιτρέψει στο νέο εγγεγραμμένο χρήστη με το ίδιο όνομα να δημιουργήσει ένα αποθετήριο με το ίδιο όνομα με αυτό που διαγράφηκε.
Έτσι, εάν μια ενέργεια χρησιμοποιεί ένα αποθετήριο από έναν μη υπάρχοντα λογαριασμό, είναι ακόμα δυνατόν ένας επιτιθέμενος να δημιουργήσει αυτόν τον λογαριασμό και να διακινδυνεύσει την ενέργεια.
Εάν άλλα αποθετήρια χρησιμοποιούσαν εξαρτήσεις από αυτά τα αποθετήρια χρήστη, ένας επιτιθέμενος θα μπορούσε να τα αρπάξει. Εδώ έχετε μια πιο λεπτομερή εξήγηση: https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/
Ανακατεύθυνση Αποθετηρίου
Σε αυτήν την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέπουν την ανακατεύθυνση από ένα αποθετήριο σε ένα άλλο υποθέτοντας ότι έχουμε κάποιο είδος πρόσβασης στο πρώτο (ελέγξτε την προηγούμενη ενότητα).
Δηλητηρίαση Προσωρινής Μνήμης
Μια προσωρινή μνήμη διατηρείται μεταξύ εκτελέσεων ροών στον ίδιο κλαδί. Αυτό σημαίνει ότι εάν ένας επιτιθέμενος διακινδυνεύει ένα πακέτο που στη συνέχεια αποθηκεύεται στην προσωρινή μνήμη και κατεβάζεται και εκτελείται από μια πιο προνομιούχα ροή εργασίας, θα μπορεί να διακινδυνεύσει επίσης αυτήν τη ροή εργασίας.
GH Actions - Cache PoisoningΔηλητηρίαση Αντικειμένου
Οι ροές εργασίας θα μπορούσαν να χρησιμοποιούν αντικείμενα από άλλες ροές εργασίας και ακόμα και αποθετήρια, εάν ένας επιτιθέμενος καταφέρει να διακινδυνεύσει τη Δράση του Github που ανεβάζει ένα αντικείμενο που χρησιμοποιείται αργότερα από μια άλλη ροή εργασίας, θα μπορούσε να διακινδυνεύσει τις άλλες ροές εργασίας:
Gh Actions - Artifact PoisoningΜετά την Εκμετάλλευση από μια Ενέργεια
Πρόσβαση σε AWS και GCP μέσω OIDC
Ελέγξτε τις παρακάτω σελίδες:
AWS - Federation AbuseGCP - Federation AbuseΠρόσβαση σε μυστικά
Εάν ενθέτετε περιεχόμενο σε ένα σενάριο, είναι ενδιαφέρον να γνωρίζετε πώς μπορείτε να έχετε πρόσβαση σε μυστικά:
Εάν το μυστικό ή το τοκενικό είναι ορισμένο σε μια μεταβλητή περιβάλλοντος, μπορεί να αποκτηθεί απευθείας μέσω του περιβάλλοντος χρησιμοποιώντας το
printenv
.
Εάν το μυστικό χρησιμοποιείται άμεσα σε μια έκφραση, το δημιουργημένο shell script αποθηκεύεται στον δίσκο και είναι προσβάσιμο.
cat /home/runner/work/_temp/*
Για μια προσαρμοσμένη ενέργεια, ο κίνδυνος μπορεί να ποικίλει ανάλογα με το πώς ένα πρόγραμμα χρησιμοποιεί το μυστικό που έλαβε από το όρισμα:
Κατάχρηση Ιδιοκτητών Runners
Ο τρόπος για να βρείτε ποιες Ενέργειες Github εκτελούνται σε μη-υποδομές της Github είναι να αναζητήσετε το runs-on: self-hosted
στη διαμόρφωση yaml της Ενέργειας του Github.
Οι ιδιοκτητοί runners μπορεί να έχουν πρόσβαση σε επιπλέον ευαίσθητες πληροφορίες, σε άλλα δίκτυα (ευάλωτα σημεία στο δίκτυο; υπηρεσία μεταδεδομένων;) ή, ακόμη κι αν είναι απομονωμένο και καταστρέφεται, περισσότερες από μία ενέργειες μπορεί να εκτελούνται ταυτόχρονα και η κακόβουλη μπορεί να κλέψει τα μυστικά της άλλης.
Στους ιδιοκτητούς runners είναι επίσης δυνατόν να αποκτηθούν τα μυστικά από τη διεργασία _Runner.Listener_** η οποία θα περιέχει όλα τα μυστικά των ροών εργασίας σε οποιοδήποτε στάδιο με την απόρριψη της μνήμης της:
Ελέγξτε αυτήν την ανάρτηση για περισσότερες πληροφορίες.
Καταχώριση Εικόνων Docker του Github
Είναι δυνατόν να δημιουργήσετε Github actions που θα κατασκευάζουν και αποθηκεύουν μια εικόνα Docker μέσα στο Github. Ένα παράδειγμα μπορεί να βρεθεί στο παρακάτω αναπτυσσόμενο:
Last updated