Pentesting CI/CD Methodology
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
VCS σημαίνει Σύστημα Ελέγχου Έκδοσης, αυτό το σύστημα επιτρέπει στους προγραμματιστές να διαχειρίζονται τον πηγαίο κώδικα τους. Το πιο κοινό είναι το git και συνήθως θα βρείτε εταιρείες να το χρησιμοποιούν σε μία από τις παρακάτω πλατφόρμες:
Github
Gitlab
Bitbucket
Gitea
Παρόχους Cloud (προσφέρουν τις δικές τους πλατφόρμες VCS)
Οι CI/CD pipelines επιτρέπουν στους προγραμματιστές να αυτοματοποιούν την εκτέλεση του κώδικα για διάφορους σκοπούς, συμπεριλαμβανομένης της κατασκευής, της δοκιμής και της ανάπτυξης εφαρμογών. Αυτές οι αυτοματοποιημένες ροές εργασίας ενεργοποιούνται από συγκεκριμένες ενέργειες, όπως οι μεταφορές κώδικα, τα pull requests ή οι προγραμματισμένες εργασίες. Είναι χρήσιμες για την απλοποίηση της διαδικασίας από την ανάπτυξη στην παραγωγή.
Ωστόσο, αυτά τα συστήματα πρέπει να εκτελούνται κάπου και συνήθως με προνομιακά διαπιστευτήρια για την ανάπτυξη κώδικα ή την πρόσβαση σε ευαίσθητες πληροφορίες.
Ακόμα και αν ορισμένες πλατφόρμες VCS επιτρέπουν τη δημιουργία pipelines, σε αυτή την ενότητα θα αναλύσουμε μόνο τις πιθανές επιθέσεις στον έλεγχο του πηγαίου κώδικα.
Οι πλατφόρμες που περιέχουν τον πηγαίο κώδικα του έργου σας περιέχουν ευαίσθητες πληροφορίες και οι άνθρωποι πρέπει να είναι πολύ προσεκτικοί με τα δικαιώματα που παραχωρούνται μέσα σε αυτή την πλατφόρμα. Αυτά είναι μερικά κοινά προβλήματα σε πλατφόρμες 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 στις μηχανές τους).
Συμβιβασμός της pipeline (δείτε την επόμενη ενότητα)
Ο πιο κοινός τρόπος για να ορίσετε μια pipeline είναι χρησιμοποιώντας ένα αρχείο ρύθμισης CI που φιλοξενείται στο αποθετήριο που κατασκευάζει η pipeline. Αυτό το αρχείο περιγράφει τη σειρά εκτέλεσης των εργασιών, τις συνθήκες που επηρεάζουν τη ροή και τις ρυθμίσεις του περιβάλλοντος κατασκευής. Αυτά τα αρχεία συνήθως έχουν ένα συνεπές όνομα και μορφή, για παράδειγμα — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI), και τα YAML αρχεία GitHub Actions που βρίσκονται κάτω από .github/workflows. Όταν ενεργοποιηθεί, η εργασία της pipeline τραβά τον κώδικα από την επιλεγμένη πηγή (π.χ. commit / branch), και εκτελεί τις εντολές που καθορίζονται στο αρχείο ρύθμισης CI σε αυτόν τον κώδικα.
Επομένως, ο τελικός στόχος του επιτιθέμενου είναι με κάποιο τρόπο να συμβιβάσει αυτά τα αρχεία ρύθμισης ή τις εντολές που εκτελούν.
Η εκτέλεση μολυσμένης pipeline (PPE) εκμεταλλεύεται τα δικαιώματα σε ένα αποθετήριο SCM για να χειραγωγήσει μια CI pipeline και να εκτελέσει επιβλαβείς εντολές. Οι χρήστες με τα απαραίτητα δικαιώματα μπορούν να τροποποιήσουν τα αρχεία ρύθμισης CI ή άλλα αρχεία που χρησιμοποιούνται από την εργασία της pipeline για να συμπεριλάβουν κακόβουλες εντολές. Αυτό "μολύνει" την CI pipeline, οδηγώντας στην εκτέλεση αυτών των κακόβουλων εντολών.
Για να είναι επιτυχής ένας κακόβουλος παράγοντας στην εκτέλεση μιας επίθεσης PPE, πρέπει να είναι σε θέση να:
Έχει write πρόσβαση στην πλατφόρμα VCS, καθώς συνήθως οι pipelines ενεργοποιούνται όταν γίνεται μια μεταφορά ή ένα pull request. (Δείτε τη μεθοδολογία pentesting VCS για μια σύνοψη τρόπων πρόσβασης).
Σημειώστε ότι μερικές φορές μια εξωτερική PR μετράει ως "write πρόσβαση".
Ακόμα και αν έχει δικαιώματα εγγραφής, πρέπει να είναι σίγουρος ότι μπορεί να τροποποιήσει το αρχείο ρύθμισης CI ή άλλα αρχεία που εξαρτάται η ρύθμιση.
Για αυτό, μπορεί να χρειαστεί να είναι σε θέση να παρακάμψει τις προστασίες κλάδου.
Υπάρχουν 3 γεύσεις PPE:
D-PPE: Μια Άμεση επίθεση PPE συμβαίνει όταν ο παράγοντας τροποποιεί το αρχείο ρύθμισης CI που πρόκειται να εκτελεστεί.
I-DDE: Μια Έμμεση επίθεση PPE συμβαίνει όταν ο παράγοντας τροποποιεί ένα αρχείο που το αρχείο ρύθμισης CI που πρόκειται να εκτελεστεί στηρίζεται σε (όπως ένα make file ή μια ρύθμιση terraform).
Δημόσια PPE ή 3PE: Σε ορισμένες περιπτώσεις, οι pipelines μπορούν να ενεργοποιηθούν από χρήστες που δεν έχουν write πρόσβαση στο repo (και που μπορεί να μην είναι καν μέρος της οργάνωσης) επειδή μπορούν να στείλουν μια PR.
3PE Command Injection: Συνήθως, οι CI/CD pipelines θα ορίσουν μεταβλητές περιβάλλοντος με πληροφορίες σχετικά με την PR. Αν αυτή η τιμή μπορεί να ελεγχθεί από έναν επιτιθέμενο (όπως ο τίτλος της PR) και χρησιμοποιείται σε μια επικίνδυνη θέση (όπως η εκτέλεση sh εντολών), ένας επιτιθέμενος μπορεί να εισάγει εντολές εκεί.
Γνωρίζοντας τις 3 γεύσεις για να μολύνει μια pipeline, ας δούμε τι θα μπορούσε να αποκτήσει ένας επιτιθέμενος μετά από μια επιτυχημένη εκμετάλλευση:
Secrets: Όπως αναφέρθηκε προηγουμένως, οι pipelines απαιτούν προνόμια για τις εργασίες τους (να ανακτούν τον κώδικα, να τον κατασκευάζουν, να τον αναπτύσσουν...) και αυτά τα προνόμια συνήθως παρέχονται σε μυστικά. Αυτά τα μυστικά είναι συνήθως προσβάσιμα μέσω μεταβλητών env ή αρχείων μέσα στο σύστημα. Επομένως, ένας επιτιθέμενος θα προσπαθήσει πάντα να εξάγει όσο το δυνατόν περισσότερα μυστικά.
Ανάλογα με την πλατφόρμα της pipeline, ο επιτιθέμενος μπορεί να χρειαστεί να καθορίσει τα μυστικά στη ρύθμιση. Αυτό σημαίνει ότι αν ο επιτιθέμενος δεν μπορεί να τροποποιήσει την ρύθμιση της CI pipeline (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 και η τελική έκδοση κατασκευάζεται και αναπτύσσεται από αυτή, θα μπορούσατε να συμβιβάσετε τον κώδικα που πρόκειται να τρέξει στην παραγωγή.
Chain-bench είναι ένα εργαλείο ανοιχτού κώδικα για την επιθεώρηση της στοίβας της αλυσίδας εφοδιασμού λογισμικού σας για συμμόρφωση ασφαλείας με βάση ένα νέο CIS Software Supply Chain benchmark. Η επιθεώρηση επικεντρώνεται σε ολόκληρη τη διαδικασία SDLC, όπου μπορεί να αποκαλύψει κινδύνους από τον χρόνο κώδικα έως τον χρόνο ανάπτυξης.
Δείτε αυτό το ενδιαφέρον άρθρο σχετικά με τους 10 κορυφαίους κινδύνους CI/CD σύμφωνα με την Cider: https://www.cidersecurity.io/top-10-cicd-security-risks/
Σε κάθε πλατφόρμα που μπορείτε να εκτελέσετε τοπικά θα βρείτε πώς να την εκκινήσετε τοπικά ώστε να την ρυθμίσετε όπως θέλετε να τη δοκιμάσετε
Gitea + Jenkins lab: https://github.com/cider-security-research/cicd-goat
Checkov: Checkov είναι ένα εργαλείο στατικής ανάλυσης κώδικα για υποδομή ως κώδικα.
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)