diff --git a/src/pentesting-ci-cd/gitblit-security/README.md b/src/pentesting-ci-cd/gitblit-security/README.md new file mode 100644 index 000000000..482570981 --- /dev/null +++ b/src/pentesting-ci-cd/gitblit-security/README.md @@ -0,0 +1,21 @@ +# Gitblit Ασφάλεια + +{{#include ../../banners/hacktricks-training.md}} + +## Τι είναι το Gitblit + +Το Gitblit είναι ένας αυτο-φιλοξενούμενος διακομιστής Git γραμμένος σε Java. Μπορεί να τρέξει ως αυτόνομο JAR ή σε servlet containers και παρέχει ενσωματωμένη υπηρεσία SSH (Apache MINA SSHD) για Git over SSH. + +## Θέματα + +- Gitblit Embedded SSH Auth Bypass (CVE-2024-28080) + +{{#ref}} +gitblit-embedded-ssh-auth-bypass-cve-2024-28080.md +{{#endref}} + +## Αναφορές + +- [Gitblit project](https://gitblit.com/) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-ci-cd/gitblit-security/gitblit-embedded-ssh-auth-bypass-cve-2024-28080.md b/src/pentesting-ci-cd/gitblit-security/gitblit-embedded-ssh-auth-bypass-cve-2024-28080.md new file mode 100644 index 000000000..3bf859b83 --- /dev/null +++ b/src/pentesting-ci-cd/gitblit-security/gitblit-embedded-ssh-auth-bypass-cve-2024-28080.md @@ -0,0 +1,107 @@ +# Gitblit Embedded SSH Auth Bypass (CVE-2024-28080) + +{{#include ../../banners/hacktricks-training.md}} + +## Περίληψη + +CVE-2024-28080 είναι ένα authentication bypass στην ενσωματωμένη υπηρεσία SSH του Gitblit λόγω λανθασμένης διαχείρισης της κατάστασης session κατά την ενσωμάτωση με Apache MINA SSHD. Εάν ένας λογαριασμός χρήστη έχει τουλάχιστον ένα SSH public key καταχωρημένο, ένας επιτιθέμενος που γνωρίζει το username και οποιοδήποτε από τα public keys αυτού του χρήστη μπορεί να πραγματοποιήσει authentication χωρίς το private key και χωρίς το password. + +- Affected: Gitblit < 1.10.0 (observed on 1.9.3) +- Fixed: 1.10.0 +- Requirements to exploit: +- Git over SSH enabled on the instance +- Victim account has at least one SSH public key registered in Gitblit +- Attacker knows victim username and one of their public keys (often discoverable, e.g., https://github.com/.keys) + +## Αιτία ρίζας (state leaks between SSH methods) + +Στο RFC 4252, η public‑key authentication προχωρά σε δύο φάσεις: ο server πρώτα ελέγχει αν ένα παρεχόμενο public key είναι αποδεκτό για ένα username, και μόνο μετά από ένα challenge/response με υπογραφή authenticate τον χρήστη. Στο MINA SSHD, ο PublickeyAuthenticator καλείται δύο φορές: κατά την αποδοχή του key (no signature yet) και αργότερα αφού ο client επιστρέψει μια υπογραφή. + +Ο PublickeyAuthenticator του Gitblit τροποποίησε το session context στην πρώτη, προ‑υπογραφής κλήση δεσμεύοντας το authenticated UserModel στο session και επιστρέφοντας true ("key acceptable"). Όταν αργότερα η authentication έπεσε πίσω στο password, ο PasswordAuthenticator εμπιστεύτηκε την τροποποιημένη αυτή κατάσταση session και διέκοψε τη ροή, επιστρέφοντας true χωρίς να επικυρώσει το password. Ως αποτέλεσμα, οποιοδήποτε password (συμπεριλαμβανομένου και του κενού) γινόταν αποδεκτό μετά από προηγούμενη public‑key "acceptance" για τον ίδιο χρήστη. + +Υψηλού επιπέδου ελαττωματική ροή: + +1) Client προσφέρει username + public key (no signature yet) +2) Server αναγνωρίζει ότι το key ανήκει στον χρήστη και πρόωρα επισυνάπτει τον χρήστη στο session, επιστρέφοντας true ("acceptable") +3) Client δεν μπορεί να υπογράψει (no private key), οπότε η auth πέφτει πίσω στο password +4) Η password auth βλέπει έναν χρήστη ήδη παρόν στο session και άνευ όρων επιστρέφει επιτυχία + +## Βήμα‑προς‑βήμα exploitation + +- Συλλέξτε το victim username και ένα από τα public keys τους: +- GitHub εκθέτει public keys στο https://github.com/.keys +- Public servers συχνά εκθέτουν authorized_keys +- Διαμορφώστε το OpenSSH ώστε να παρουσιάζει μόνο το public half ώστε η δημιουργία υπογραφής να αποτύχει, αναγκάζοντας fallback στο password ενώ εξακολουθεί να ενεργοποιεί την public‑key acceptance διαδρομή στον server. + +Example SSH client config (no private key available): +```sshconfig +# ~/.ssh/config +Host gitblit-target +HostName +User +PubkeyAuthentication yes +PreferredAuthentications publickey,password +IdentitiesOnly yes +IdentityFile ~/.ssh/victim.pub # public half only (no private key present) +``` +Συνδεθείτε και πατήστε Enter στην προτροπή κωδικού πρόσβασης (ή πληκτρολογήστε οποιαδήποτε συμβολοσειρά): +```bash +ssh gitblit-target +# or Git over SSH +GIT_SSH_COMMAND="ssh -F ~/.ssh/config" git ls-remote ssh://@/ +``` +Η αυθεντικοποίηση επιτυγχάνει επειδή το προηγούμενο στάδιο public‑key μετέβαλε τη συνεδρία σε authenticated χρήστη, και η password auth εμπιστεύεται εσφαλμένα αυτήν την κατάσταση. + +Σημείωση: Αν το ControlMaster multiplexing είναι ενεργοποιημένο στο SSH config σας, οι επόμενες εντολές Git μπορεί να επαναχρησιμοποιήσουν τη συνδεδεμένη σύνδεση, αυξάνοντας τον αντίκτυπο. + +## Αντίκτυπο + +- Πλήρης προσποίηση οποιουδήποτε χρήστη Gitblit που έχει τουλάχιστον ένα καταχωρημένο SSH public key +- Δικαιώματα ανάγνωσης/εγγραφής στα repositories σύμφωνα με τα permissions του θύματος (source exfiltration, unauthorized pushes, supply‑chain risks) +- Πιθανός διοικητικός αντίκτυπος αν στοχευθεί χρήστης admin +- Καθαρό network exploit· δεν απαιτείται brute force ή private key + +## Ιδέες ανίχνευσης + +- Ελέγξτε τα SSH logs για ακολουθίες όπου μια προσπάθεια publickey ακολουθείται από επιτυχή password authentication με κενό ή πολύ μικρό password +- Αναζητήστε ροές: μέθοδος publickey που προσφέρει μη υποστηριζόμενο/μη ταιριαστό key material και ακολουθείται αμέσως από επιτυχία password για το ίδιο username + +## Αντιμετώπιση + +- Αναβαθμίστε σε Gitblit v1.10.0+ +- Μέχρι την αναβάθμιση: +- Απενεργοποιήστε το Git over SSH στο Gitblit, ή +- Περιορίστε την πρόσβαση δικτύου στην υπηρεσία SSH, και +- Παρακολουθήστε για ύποπτα πρότυπα που περιγράφονται παραπάνω +- Αλλάξτε τα credentials των επηρεασμένων χρηστών εάν υποπτευθείτε συμβιβασμό + +## Γενικά: abusing SSH auth method state‑leakage (MINA/OpenSSH‑based services) + +Πρότυπο: Εάν ο public‑key authenticator ενός server μεταβάλλει την κατάσταση χρήστη/συνεδρίας κατά τη φάση προ‑υπογραφής "key acceptable" και άλλοι authenticators (π.χ. password) εμπιστεύονται αυτή την κατάσταση, μπορείτε να παρακάμψετε την authentication ως εξής: + +- Παρουσιάζοντας ένα νόμιμο public key για τον στοχευόμενο χρήστη (χωρίς private key) +- Εξαναγκάζοντας τον client να αποτύχει στην υπογραφή ώστε ο server να επιστρέψει σε password +- Παρέχοντας οποιοδήποτε password ενώ ο password authenticator κάνει short‑circuit λόγω leaked state + +Πρακτικές συμβουλές: + +- Συλλογή public keys σε μεγάλη κλίμακα: τραβήξτε public keys από κοινές πηγές όπως https://github.com/.keys, organizational directories, team pages, leaked authorized_keys +- Εξαναγκασμός αποτυχίας υπογραφής (client‑side): ορίστε το IdentityFile μόνο στο .pub, βάλτε IdentitiesOnly yes, διατηρήστε το PreferredAuthentications ώστε να περιλαμβάνει publickey και μετά password +- Παγίδες ενσωμάτωσης MINA SSHD: +- PublickeyAuthenticator.authenticate(...) δεν πρέπει να επισυνάπτει κατάσταση χρήστη/συνεδρίας μέχρι η post‑signature verification διαδρομή να επιβεβαιώσει την υπογραφή +- PasswordAuthenticator.authenticate(...) δεν πρέπει να συμπεραίνει επιτυχία από οποιαδήποτε κατάσταση μεταβλήθηκε κατά τη διάρκεια προηγούμενης, ατελούς μεθόδου authentication + +Σχετικές σημειώσεις πρωτοκόλλου/σχεδιασμού και βιβλιογραφία: +- SSH userauth protocol: RFC 4252 (publickey method is a two‑stage process) +- Ιστορικές συζητήσεις για early acceptance oracles και auth races, π.χ. CVE‑2016‑20012 disputes γύρω από το OpenSSH behavior + +## Αναφορές + +- [Gitblit CVE-2024-28080: SSH public‑key fallback to password authentication bypass (Silent Signal blog)](https://blog.silentsignal.eu/2025/06/14/gitblit-cve-CVE-2024-28080/) +- [Gitblit v1.10.0 release notes](https://github.com/gitblit-org/gitblit/releases/tag/v1.10.0) +- [Apache MINA SSHD project](https://mina.apache.org/sshd-project/) +- [PublickeyAuthenticator API](https://svn.apache.org/repos/infra/websites/production/mina/content/sshd-project/apidocs/org/apache/sshd/server/auth/pubkey/PublickeyAuthenticator.html) +- [RFC 4252: The Secure Shell (SSH) Authentication Protocol](https://datatracker.ietf.org/doc/html/rfc4252) + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md b/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md index 9ac7186a4..79e4888f3 100644 --- a/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md +++ b/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md @@ -1,4 +1,4 @@ -# Pentesting CI/CD Methodology +# Pentesting CI/CD Μεθοδολογία {{#include ../banners/hacktricks-training.md}} @@ -6,99 +6,102 @@ ## VCS -VCS σημαίνει **Σύστημα Ελέγχου Έκδοσης**, αυτό το σύστημα επιτρέπει στους προγραμματιστές να **διαχειρίζονται τον πηγαίο κώδικα** τους. Το πιο κοινό είναι το **git** και συνήθως θα βρείτε εταιρείες να το χρησιμοποιούν σε μία από τις παρακάτω **πλατφόρμες**: +VCS σημαίνει **Version Control System**, αυτό το σύστημα επιτρέπει στους προγραμματιστές να **διαχειρίζονται τον source code τους**. Το πιο κοινό είναι το **git** και συνήθως θα βρείτε εταιρείες να το χρησιμοποιούν σε μία από τις παρακάτω **platforms**: - Github - Gitlab - Bitbucket - Gitea -- Παρόχους Cloud (προσφέρουν τις δικές τους πλατφόρμες VCS) +- Gitblit +- Cloud providers (they offer their own VCS platforms) + ## CI/CD Pipelines -Οι CI/CD pipelines επιτρέπουν στους προγραμματιστές να **αυτοματοποιούν την εκτέλεση του κώδικα** για διάφορους σκοπούς, συμπεριλαμβανομένης της κατασκευής, της δοκιμής και της ανάπτυξης εφαρμογών. Αυτές οι αυτοματοποιημένες ροές εργασίας **ενεργοποιούνται από συγκεκριμένες ενέργειες**, όπως οι μεταφορές κώδικα, τα pull requests ή οι προγραμματισμένες εργασίες. Είναι χρήσιμες για την απλοποίηση της διαδικασίας από την ανάπτυξη στην παραγωγή. +Τα CI/CD pipelines επιτρέπουν στους developers να **αυτοματοποιήσουν την εκτέλεση κώδικα** για διάφορους σκοπούς, όπως build, test και deploy εφαρμογών. Αυτά τα αυτοματοποιημένα workflows **trigger-άρονται από συγκεκριμένες ενέργειες**, όπως code pushes, pull requests ή scheduled tasks. Είναι χρήσιμα για να απλοποιηθεί η ροή από development προς production. -Ωστόσο, αυτά τα συστήματα πρέπει να **εκτελούνται κάπου** και συνήθως με **προνομιακά διαπιστευτήρια για την ανάπτυξη κώδικα ή την πρόσβαση σε ευαίσθητες πληροφορίες**. +Ωστόσο, αυτά τα συστήματα πρέπει να **τρέξουν κάπου** και συνήθως χρειάζονται **προνομιακά credentials για να κάνουν deploy code ή να έχουν πρόσβαση σε ευαίσθητες πληροφορίες**. ## VCS Pentesting Methodology > [!NOTE] -> Ακόμα και αν ορισμένες πλατφόρμες VCS επιτρέπουν τη δημιουργία pipelines, σε αυτή την ενότητα θα αναλύσουμε μόνο τις πιθανές επιθέσεις στον έλεγχο του πηγαίου κώδικα. +> Ακόμα κι αν κάποιες πλατφόρμες VCS επιτρέπουν τη δημιουργία pipelines, σε αυτή την ενότητα θα αναλύσουμε μόνο πιθανές επιθέσεις που στοχεύουν τον έλεγχο του source code. -Οι πλατφόρμες που περιέχουν τον πηγαίο κώδικα του έργου σας περιέχουν ευαίσθητες πληροφορίες και οι άνθρωποι πρέπει να είναι πολύ προσεκτικοί με τα δικαιώματα που παραχωρούνται μέσα σε αυτή την πλατφόρμα. Αυτά είναι μερικά κοινά προβλήματα σε πλατφόρμες VCS που θα μπορούσε να εκμεταλλευτεί ένας επιτιθέμενος: +Οι πλατφόρμες που περιέχουν τον source code του project σας έχουν ευαίσθητες πληροφορίες και πρέπει να δοθεί μεγάλη προσοχή στα permissions που απονέμονται μέσα σε αυτήν την πλατφόρμα. Αυτά είναι μερικά κοινά προβλήματα σε VCS πλατφόρμες που ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί: -- **Leaks**: Αν ο κώδικάς σας περιέχει leaks στις μεταφορές και ο επιτιθέμενος μπορεί να έχει πρόσβαση στο repo (επειδή είναι δημόσιο ή επειδή έχει πρόσβαση), θα μπορούσε να ανακαλύψει τα leaks. -- **Access**: Αν ένας επιτιθέμενος μπορεί να **πρόσβαση σε έναν λογαριασμό μέσα στην πλατφόρμα VCS**, θα μπορούσε να αποκτήσει **περισσότερη ορατότητα και δικαιώματα**. -- **Register**: Ορισμένες πλατφόρμες θα επιτρέψουν απλώς σε εξωτερικούς χρήστες να δημιουργήσουν έναν λογαριασμό. -- **SSO**: Ορισμένες πλατφόρμες δεν θα επιτρέψουν στους χρήστες να εγγραφούν, αλλά θα επιτρέψουν σε οποιονδήποτε να έχει πρόσβαση με ένα έγκυρο SSO (έτσι ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει τον λογαριασμό του github για να εισέλθει, για παράδειγμα). -- **Credentials**: Όνομα χρήστη + Κωδικός, προσωπικοί τόκεν, ssh κλειδιά, Oauth τόκεν, cookies... υπάρχουν διάφοροι τύποι τόκεν που θα μπορούσε να κλέψει ένας χρήστης για να αποκτήσει πρόσβαση με κάποιο τρόπο σε ένα repo. -- **Webhooks**: Οι πλατφόρμες VCS επιτρέπουν τη δημιουργία webhooks. Αν δεν είναι **προστατευμένα** με μη ορατά μυστικά, ένας **επιτιθέμενος θα μπορούσε να τα εκμεταλλευτεί**. -- Αν δεν υπάρχει μυστικό, ο επιτιθέμενος θα μπορούσε να εκμεταλλευτεί το webhook της τρίτης πλατφόρμας -- Αν το μυστικό είναι στη διεύθυνση URL, το ίδιο συμβαίνει και ο επιτιθέμενος έχει επίσης το μυστικό -- **Code compromise:** Αν ένας κακόβουλος παράγοντας έχει κάποιο είδος **write** πρόσβασης στα repos, θα μπορούσε να προσπαθήσει να **εισάγει κακόβουλο κώδικα**. Για να είναι επιτυχής, μπορεί να χρειαστεί να **παρακάμψει τις προστασίες κλάδου**. Αυτές οι ενέργειες μπορούν να εκτελούνται με διαφορετικούς στόχους στο μυαλό: -- Να συμβιβάσει τον κύριο κλάδο για να **συμβιβάσει την παραγωγή**. -- Να συμβιβάσει τον κύριο (ή άλλους κλάδους) για να **συμβιβάσει τις μηχανές των προγραμματιστών** (καθώς συνήθως εκτελούν δοκιμές, terraform ή άλλα πράγματα μέσα στο repo στις μηχανές τους). -- **Compromise the pipeline** (δείτε την επόμενη ενότητα) +- **Leaks**: Αν ο κώδικάς σας περιέχει leaks στα commits και ο επιτιθέμενος μπορεί να έχει πρόσβαση στο repo (επειδή είναι public ή γιατί έχει access), θα μπορούσε να ανακαλύψει τα leaks. +- **Access**: Αν ένας επιτιθέμενος μπορεί να **πρόσβαση σε έναν λογαριασμό μέσα στην VCS πλατφόρμα** θα μπορούσε να αποκτήσει **μεγαλύτερη ορατότητα και δικαιώματα**. +- **Register**: Κάποιες πλατφόρμες απλά επιτρέπουν σε εξωτερικούς χρήστες να δημιουργήσουν account. +- **SSO**: Κάποιες πλατφόρμες δεν επιτρέπουν εγγραφή χρηστών, αλλά επιτρέπουν σε οποιονδήποτε να κάνει login με ένα έγκυρο SSO (έτσι ένας επιτιθέμενος θα μπορούσε για παράδειγμα να χρησιμοποιήσει τον github account του για είσοδο). +- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... υπάρχουν διάφοροι τύποι tokens που ένας χρήστης θα μπορούσε να κλέψει για να αποκτήσει με κάποιο τρόπο πρόσβαση σε ένα repo. +- **Webhooks**: Οι VCS πλατφόρμες επιτρέπουν τη δημιουργία webhooks. Αν δεν προστατεύονται με μη ορατά secrets, ένας επιτιθέμενος θα μπορούσε να τα εκμεταλλευτεί. + - Αν δεν υπάρχει κάποιο secret, ο επιτιθέμενος μπορεί να εκμεταλλευτεί το webhook της τρίτης πλατφόρμας. + - Αν το secret βρίσκεται στο URL, ισχύει το ίδιο και ο επιτιθέμενος έχει επίσης το secret. +- **Code compromise:** Αν ένας κακόβουλος παράγοντας έχει κάποια μορφή **write** πρόσβασης στα repos, μπορεί να προσπαθήσει να **inject malicious code**. Για να το πετύχει πιθανόν να χρειαστεί να **bypass branch protections**. Αυτές οι ενέργειες μπορούν να έχουν διάφορους στόχους: + - Compromise το main branch για να **compromise production**. + - Compromise το main (ή άλλα branches) για να **compromise τα machines των developers** (καθώς συνήθως εκτελούν tests, terraform ή άλλα πράγματα μέσα στο repo στους δικούς τους υπολογιστές). + - **Compromise the pipeline** (βλέπε επόμενη ενότητα) ## Pipelines Pentesting Methodology -Ο πιο κοινός τρόπος για να ορίσετε μια pipeline είναι χρησιμοποιώντας ένα **αρχείο διαμόρφωσης CI που φιλοξενείται στο αποθετήριο** που κατασκευάζει η pipeline. Αυτό το αρχείο περιγράφει τη σειρά εκτέλεσης των εργασιών, τις συνθήκες που επηρεάζουν τη ροή και τις ρυθμίσεις του περιβάλλοντος κατασκευής.\ -Αυτά τα αρχεία συνήθως έχουν ένα συνεπές όνομα και μορφή, για παράδειγμα — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI), και τα YAML αρχεία GitHub Actions που βρίσκονται κάτω από .github/workflows. Όταν ενεργοποιηθεί, η εργασία της pipeline **τραβά τον κώδικα** από την επιλεγμένη πηγή (π.χ. commit / branch), και **εκτελεί τις εντολές που καθορίζονται στο αρχείο διαμόρφωσης CI** σε αυτόν τον κώδικα. +Ο πιο κοινός τρόπος για να ορίσετε ένα pipeline είναι με χρήση ενός **CI configuration file που φιλοξενείται στο repository** που το pipeline build-άρει. Αυτό το αρχείο περιγράφει τη σειρά των jobs που εκτελούνται, τις συνθήκες που επηρεάζουν τη ροή και τις ρυθμίσεις του build environment.\ +Αυτά τα αρχεία συνήθως έχουν συνεπή ονόματα και format, για παράδειγμα — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI), και τα GitHub Actions YAML αρχεία κάτω από .github/workflows. Όταν trigger-άρεται, το pipeline job **τραβάει τον κώδικα** από την επιλεγμένη πηγή (π.χ. commit / branch) και **εκτελεί τις εντολές που ορίζονται στο CI configuration file** πάνω σε αυτόν τον κώδικα. -Επομένως, ο τελικός στόχος του επιτιθέμενου είναι να **συμβιβάσει με κάποιο τρόπο αυτά τα αρχεία διαμόρφωσης** ή τις **εντολές που εκτελούν**. +Άρα ο τελικός στόχος του επιτιθέμενου είναι με κάποιο τρόπο να **compromise αυτά τα configuration files** ή τις **εντολές που εκτελούν**. ### PPE - Poisoned Pipeline Execution -Η διαδρομή Poisoned Pipeline Execution (PPE) εκμεταλλεύεται τα δικαιώματα σε ένα αποθετήριο SCM για να χειριστεί μια CI pipeline και να εκτελέσει επιβλαβείς εντολές. Χρήστες με τα απαραίτητα δικαιώματα μπορούν να τροποποιήσουν τα αρχεία διαμόρφωσης CI ή άλλα αρχεία που χρησιμοποιούνται από την εργασία της pipeline για να συμπεριλάβουν κακόβουλες εντολές. Αυτό "δηλητηριάζει" την CI pipeline, οδηγώντας στην εκτέλεση αυτών των κακόβουλων εντολών. +Το Poisoned Pipeline Execution (PPE) path εκμεταλλεύεται permissions σε ένα SCM repository για να χειραγωγήσει ένα CI pipeline και να εκτελέσει επιβλαβείς εντολές. Χρήστες με τα κατάλληλα permissions μπορούν να τροποποιήσουν CI configuration files ή άλλα αρχεία που χρησιμοποιεί το pipeline job ώστε να περιλάβουν κακόβουλες εντολές. Αυτό "δηλητηριάζει" το CI pipeline, οδηγώντας στην εκτέλεση αυτών των κακόβουλων εντολών. -Για να είναι επιτυχής ένας κακόβουλος παράγοντας στην εκτέλεση μιας επίθεσης PPE, πρέπει να είναι σε θέση να: +Για να είναι επιτυχής ένας κακόβουλος παράγοντας σε μια PPE επίθεση χρειάζεται να: -- Έχει **write access στην πλατφόρμα VCS**, καθώς συνήθως οι pipelines ενεργοποιούνται όταν γίνεται μια μεταφορά ή ένα pull request. (Δείτε τη μεθοδολογία pentesting VCS για μια σύνοψη τρόπων πρόσβασης). -- Σημειώστε ότι μερικές φορές μια **εξωτερική PR μετράει ως "write access"**. -- Ακόμα και αν έχει δικαιώματα εγγραφής, πρέπει να είναι σίγουρος ότι μπορεί να **τροποποιήσει το αρχείο διαμόρφωσης CI ή άλλα αρχεία στα οποία βασίζεται η διαμόρφωση**. -- Για αυτό, μπορεί να χρειαστεί να είναι σε θέση να **παρακάμψει τις προστασίες κλάδου**. +- Έχει **write access στο VCS**, καθώς συνήθως τα pipelines trigger-άρονται όταν γίνεται push ή pull request. (Δες τη VCS pentesting methodology για σύνοψη τρόπων απόκτησης access). +- Σημειώστε ότι μερικές φορές ένα **external PR μετράει ως "write access"**. +- Ακόμα κι αν έχει write permissions, πρέπει να βεβαιωθεί ότι μπορεί να **τροποποιήσει το CI config file ή άλλα αρχεία από τα οποία εξαρτάται το config**. +- Γι' αυτό ίσως χρειαστεί να μπορέσει να **bypass branch protections**. -Υπάρχουν 3 γεύσεις PPE: +Υπάρχουν 3 flavours του PPE: -- **D-PPE**: Μια **Άμεση PPE** επίθεση συμβαίνει όταν ο παράγοντας **τροποποιεί το αρχείο διαμόρφωσης CI** που πρόκειται να εκτελεστεί. -- **I-DDE**: Μια **Έμμεση PPE** επίθεση συμβαίνει όταν ο παράγοντας **τροποποιεί** ένα **αρχείο** στο οποίο το αρχείο διαμόρφωσης CI που πρόκειται να εκτελεστεί **βασίζεται** (όπως ένα make file ή μια διαμόρφωση terraform). -- **Public PPE ή 3PE**: Σε ορισμένες περιπτώσεις, οι pipelines μπορούν να **ενεργοποιηθούν από χρήστες που δεν έχουν δικαιώματα εγγραφής στο repo** (και που μπορεί να μην είναι καν μέρος της οργάνωσης) επειδή μπορούν να στείλουν μια PR. -- **3PE Command Injection**: Συνήθως, οι CI/CD pipelines θα **ορίσουν μεταβλητές περιβάλλοντος** με **πληροφορίες σχετικά με την PR**. Αν αυτή η τιμή μπορεί να ελεγχθεί από έναν επιτιθέμενο (όπως ο τίτλος της PR) και χρησιμοποιείται σε **επικίνδυνο μέρος** (όπως η εκτέλεση **sh commands**), ένας επιτιθέμενος μπορεί να **εισάγει εντολές εκεί**. +- **D-PPE**: Μια **Direct PPE** επίθεση συμβαίνει όταν ο παράγοντας **τροποποιεί απευθείας το CI config** που πρόκειται να εκτελεστεί. +- **I-DDE**: Μια **Indirect PPE** επίθεση συμβαίνει όταν ο παράγοντας **τροποποιεί** κάποιο **file** πάνω στο οποίο το CI config βασίζεται (π.χ. make file ή terraform config). +- **Public PPE or 3PE**: Σε ορισμένες περιπτώσεις τα pipelines μπορούν να **trigger-αριστούν από χρήστες που δεν έχουν write access στο repo** (και που ίσως δεν είναι καν μέλη της οργάνωσης) επειδή μπορούν να στείλουν ένα PR. +- **3PE Command Injection**: Συνήθως, τα CI/CD pipelines θα **ορίζουν env variables** με **πληροφορίες για το PR**. Αν αυτή η τιμή μπορεί να ελεγχθεί από έναν επιτιθέμενο (π.χ. ο τίτλος του PR) και **χρησιμοποιείται** σε ένα **επικίνδυνο σημείο** (όπως η εκτέλεση sh εντολών), ένας επιτιθέμενος μπορεί να **εγχύσει εντολές εκεί μέσα**. ### Exploitation Benefits -Γνωρίζοντας τις 3 γεύσεις για να δηλητηριάσετε μια pipeline, ας δούμε τι θα μπορούσε να αποκτήσει ένας επιτιθέμενος μετά από μια επιτυχημένη εκμετάλλευση: +Γνωρίζοντας τα 3 flavours για να δηλητηριάσετε ένα pipeline, ας δούμε τι μπορεί να αποκτήσει ένας επιτιθέμενος μετά από επιτυχή εκμετάλλευση: -- **Secrets**: Όπως αναφέρθηκε προηγουμένως, οι pipelines απαιτούν **προνόμια** για τις εργασίες τους (να ανακτούν τον κώδικα, να τον κατασκευάζουν, να τον αναπτύσσουν...) και αυτά τα προνόμια συνήθως **παρέχονται σε μυστικά**. Αυτά τα μυστικά είναι συνήθως προσβάσιμα μέσω **μεταβλητών env ή αρχείων μέσα στο σύστημα**. Επομένως, ένας επιτιθέμενος θα προσπαθήσει πάντα να εξάγει όσο το δυνατόν περισσότερα μυστικά. -- Ανάλογα με την πλατφόρμα της pipeline, ο επιτιθέμενος **μπορεί να χρειαστεί να καθορίσει τα μυστικά στη διαμόρφωση**. Αυτό σημαίνει ότι αν ο επιτιθέμενος δεν μπορεί να τροποποιήσει την pipeline διαμόρφωσης CI (**I-PPE** για παράδειγμα), θα μπορούσε **μόνο να εξάγει τα μυστικά που έχει αυτή η pipeline**. -- **Computation**: Ο κώδικας εκτελείται κάπου, ανάλογα με το πού εκτελείται, ένας επιτιθέμενος μπορεί να είναι σε θέση να προχωρήσει περαιτέρω. -- **On-Premises**: Αν οι pipelines εκτελούνται τοπικά, ένας επιτιθέμενος μπορεί να καταλήξει σε ένα **εσωτερικό δίκτυο με πρόσβαση σε περισσότερους πόρους**. -- **Cloud**: Ο επιτιθέμενος θα μπορούσε να έχει πρόσβαση σε **άλλες μηχανές στο cloud** αλλά θα μπορούσε επίσης να **εξάγει** IAM ρόλους/λογαριασμούς υπηρεσιών **tokens** από αυτό για να αποκτήσει **περαιτέρω πρόσβαση μέσα στο cloud**. -- **Platforms machine**: Μερικές φορές οι εργασίες θα εκτελούνται μέσα στις **μηχανές της πλατφόρμας pipelines**, οι οποίες συνήθως βρίσκονται μέσα σε ένα cloud με **κανένα άλλο πρόσβαση**. -- **Select it:** Μερικές φορές η **πλατφόρμα pipelines θα έχει ρυθμίσει πολλές μηχανές** και αν μπορείτε να **τροποποιήσετε το αρχείο διαμόρφωσης CI**, μπορείτε να **υποδείξετε πού θέλετε να εκτελέσετε τον κακόβουλο κώδικα**. Σε αυτή την περίπτωση, ένας επιτιθέμενος θα προσπαθήσει πιθανώς να εκτελέσει ένα reverse shell σε κάθε δυνατή μηχανή για να προσπαθήσει να το εκμεταλλευτεί περαιτέρω. -- **Compromise production**: Αν είστε μέσα στην pipeline και η τελική έκδοση κατασκευάζεται και αναπτύσσεται από αυτή, θα μπορούσατε να **συμβιβάσετε τον κώδικα που πρόκειται να τρέξει στην παραγωγή**. +- **Secrets**: Όπως αναφέρθηκε νωρίτερα, τα pipelines απαιτούν **privileges** για τα jobs τους (τραβούν τον κώδικα, κάνουν build, deploy κ.λπ.) και αυτά τα privileges συνήθως **αποθηκεύονται σε secrets**. Αυτά τα secrets είναι συνήθως προσβάσιμα μέσω **env variables ή αρχείων μέσα στο σύστημα**. Επομένως ένας επιτιθέμενος θα προσπαθήσει πάντα να εξαγάγει όσο το δυνατόν περισσότερα secrets. +- Ανάλογα με την πλατφόρμα pipeline, ο επιτιθέμενος **μπορεί να χρειαστεί να δηλώσει τα secrets στο config**. Αυτό σημαίνει ότι αν ο επιτιθέμενος δεν μπορεί να τροποποιήσει το CI configuration pipeline (**I-PPE** για παράδειγμα), θα μπορούσε **μόνο να εξαγάγει τα secrets που ήδη έχει το pipeline**. +- **Computation**: Ο κώδικας εκτελείται κάπου· ανάλογα με το που εκτελείται, ένας επιτιθέμενος μπορεί να μπορέσει να κάνει pivot παραπέρα. +- **On-Premises**: Αν τα pipelines τρέχουν on-premises, ένας επιτιθέμενος μπορεί να βρεθεί σε ένα **εσωτερικό δίκτυο με πρόσβαση σε περισσότερους πόρους**. +- **Cloud**: Ο επιτιθέμενος μπορεί να αποκτήσει πρόσβαση σε **άλλες μηχανές στο cloud** αλλά και να **εξαγάγει** IAM roles/service accounts **tokens** για να αποκτήσει περαιτέρω πρόσβαση μέσα στο cloud. +- **Platforms machine**: Μερικές φορές τα jobs εκτελούνται μέσα στις μηχανές της pipelines πλατφόρμας, που συνήθως είναι μέσα σε ένα cloud και δεν έχουν περισσότερο access. +- **Select it:** Μερικές φορές η **πλατφόρμα pipelines έχει διαμορφώσει πολλές μηχανές** και αν μπορείτε να **τροποποιήσετε το CI configuration file** μπορείτε να **υποδείξετε πού θέλετε να τρέξει ο κακόβουλος κώδικας**. Σε αυτή την περίπτωση, ένας επιτιθέμενος πιθανώς θα τρέξει ένα reverse shell σε κάθε διαθέσιμη μηχανή για να προσπαθήσει να το εκμεταλλευτεί περαιτέρω. +- **Compromise production**: Αν βρίσκεστε μέσα στο pipeline και η τελική έκδοση build-άρεται και deploy-άρεται από αυτό, μπορείτε να **compromise τον κώδικα που θα τρέξει στην production**. -## More relevant info +## Περισσότερες σχετικές πληροφορίες ### Tools & CIS Benchmark -- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) είναι ένα εργαλείο ανοιχτού κώδικα για την επιθεώρηση της στοίβας προμήθειας λογισμικού σας για συμμόρφωση ασφαλείας με βάση ένα νέο [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). Η επιθεώρηση επικεντρώνεται σε ολόκληρη τη διαδικασία SDLC, όπου μπορεί να αποκαλύψει κινδύνους από τον χρόνο κώδικα έως τον χρόνο ανάπτυξης. +- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) είναι ένα open-source εργαλείο για auditing του software supply chain stack για security compliance βάσει ενός νέου [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). Το auditing εστιάζει σε όλη τη διαδικασία SDLC, όπου μπορεί να αποκαλύψει κινδύνους από το code μέχρι το deploy. ### Top 10 CI/CD Security Risk -Δείτε αυτό το ενδιαφέρον άρθρο σχετικά με τους 10 κορυφαίους κινδύνους CI/CD σύμφωνα με την Cider: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/) +Δείτε αυτό το ενδιαφέρον άρθρο σχετικά με τα top 10 CI/CD risks σύμφωνα με την Cider: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/) ### Labs -- Σε κάθε πλατφόρμα που μπορείτε να εκτελέσετε τοπικά θα βρείτε πώς να την εκκινήσετε τοπικά ώστε να μπορείτε να την ρυθμίσετε όπως θέλετε για να τη δοκιμάσετε +- Σε κάθε πλατφόρμα που μπορείτε να τρέξετε τοπικά θα βρείτε οδηγίες για το πώς να την launch-άρετε τοπικά ώστε να την διαμορφώσετε όπως θέλετε για testing. - Gitea + Jenkins lab: [https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat) ### Automatic Tools -- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** είναι ένα εργαλείο στατικής ανάλυσης κώδικα για υποδομή ως κώδικα. +- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** είναι ένα static code analysis εργαλείο για infrastructure-as-code. -## References +## Αναφορές - [https://www.cidersecurity.io/blog/research/ppe-poisoned-pipeline-execution/?utm_source=github\&utm_medium=github_page\&utm_campaign=ci%2fcd%20goat_060422](https://www.cidersecurity.io/blog/research/ppe-poisoned-pipeline-execution/?utm_source=github&utm_medium=github_page&utm_campaign=ci%2fcd%20goat_060422) + {{#include ../banners/hacktricks-training.md}}