Atlantis Security
Last updated
Last updated
Το Atlantis σας βοηθά να εκτελέσετε το terraform από τα Pull Requests από τον git server σας.
Πηγαίνετε στη σελίδα κυκλοφορίας του atlantis στο https://github.com/runatlantis/atlantis/releases και κατεβάστε αυτό που σας ταιριάζει.
Δημιουργήστε ένα προσωπικό token (με πρόσβαση στο αποθετήριο) του github χρήστη σας
Εκτελέστε ./atlantis testdrive
και θα δημιουργήσει ένα demo αποθετήριο που μπορείτε να χρησιμοποιήσετε για να επικοινωνήσετε με το atlantis
Μπορείτε να αποκτήσετε πρόσβαση στην ιστοσελίδα στη διεύθυνση 127.0.0.1:4141
Το Atlantis υποστηρίζει διάφορους git hosts, όπως το Github, το Gitlab, το Bitbucket και το Azure DevOps. Ωστόσο, για να έχει πρόσβαση στα αποθετήρια αυτών των πλατφορμών και να εκτελέσει ενέργειες, χρειάζεται να τους παραχωρηθεί κάποια προνομιούχα πρόσβαση (τουλάχιστον δικαιώματα εγγραφής). Τα έγγραφα προτείνουν τη δημιουργία ενός χρήστη σε αυτές τις πλατφόρμες ειδικά για το Atlantis, αλλά κάποιοι άνθρωποι μπορεί να χρησιμοποιούν προσωπικούς λογαριασμούς.
Σε κάθε περίπτωση, από την πλευρά ενός επιτιθέμενου, ο λογαριασμός Atlantis θα είναι πολύ ενδιαφέρον για να παραβιαστεί.
Το Atlantis χρησιμοποιεί προαιρετικά Webhook secrets για να επαληθεύσει ότι τα webhooks που λαμβάνει από τον Git host σας είναι νόμιμα.
Ένας τρόπος επαλήθευσης αυτού θα ήταν να επιτρέψετε μόνο αιτήσεις που προέρχονται από τις IP του Git host σας, αλλά ένας πιο εύκολος τρόπος είναι να χρησιμοποιήσετε ένα Webhook Secret.
Σημειώστε ότι εκτός εάν χρησιμοποιείτε έναν ιδιωτικό διακομιστή github ή bitbucket, θα χρειαστεί να αποκαλύψετε τα σημεία πρόσκλησης του webhook στο Διαδίκτυο.
Το Atlantis θα εκθέτει webhooks ώστε ο git server να μπορεί να του στέλνει πληροφορίες. Από την πλευρά ενός επιτιθέμενου, θα ήταν ενδιαφέρον να γνωρίζετε αν μπορείτε να του στείλετε μηνύματα.
Το Atlantis εκτελεί το Terraform απλά ε
Το Atlantis επιτρέπει να υποδείξετε εάν θέλετε το PR να είναι εγκεκριμένο
από κάποιον άλλο (ακόμα κι αν αυτό δεν έχει οριστεί στην προστασία του κλαδιού) και/ή να είναι συγχωνεύσιμο
(περάσανε οι προστασίες του κλαδιού) πριν την εκτέλεση της εφαρμογής. Από πλευράς ασφάλειας, συνιστάται να ορίσετε και τις δύο επιλογές.
Σε περίπτωση που το allowed_overrides
είναι True, αυτές οι ρυθμίσεις μπορούν να αντικατασταθούν σε κάθε έργο από το αρχείο /atlantis.yml
.
Η διαμόρφωση του αποθετηρίου μπορεί να καθορίσει σενάρια που θα εκτελούνται πριν (pre workflow hooks) και μετά (post workflow hooks) από την εκτέλεση ενός ροής εργασίας.
Δεν υπάρχει καμία επιλογή για να επιτρέπεται η καθορισμός αυτών των σεναρίων στο αρχείο /atlantis.yml
του αποθετηρίου.
Στη διαμόρφωση του αποθετηρίου (διαμόρφωση στην πλευρά του διακομιστή) μπορείτε να καθορίσετε μια νέα προεπιλεγμένη ροή εργασίας, ή δημιουργήσετε νέες προσαρμοσμένες ροές εργασίας. Μπορείτε επίσης να καθορίσετε ποια αποθετήρια μπορούν να έχουν πρόσβαση στις νέες που δημιουργήθηκαν. Στη συνέχεια, μπορείτε να επιτρέψετε στο αρχείο atlantis.yaml κάθε αποθετηρίου να καθορίσει τη ροή εργασίας που θα χρησιμοποιηθεί.
Εάν η σημαία server side config allow_custom_workflows
έχει οριστεί σε True, οι ροές εργασίας μπορούν να καθοριστούν στο αρχείο atlantis.yaml
κάθε αποθετηρίου. Είναι επίσης πιθανόν να χρειαστεί να οριστεί επίσης η allowed_overrides
για να αντικαταστήσει τη ροή εργασίας που θα χρησιμοποιηθεί.
Αυτό ουσιαστικά θα δώσει RCE στον διακομιστή Atlantis σε οποιονδήποτε χρήστη μπορεί να έχει πρόσβαση σε αυτό το αποθετήριο.
Το Atlantis υποστηρίζει την εκτέλεση server-side conftest πολιτικών εναντίον της εξόδου του σχεδίου. Οι κοινές περιπτώσεις χρήσης για τη χρήση αυτού του βήματος περιλαμβάνουν:
Απαγόρευση χρήσης μιας λίστας από ενότητες
Επιβεβαίωση των χαρακτηριστικών ενός πόρου κατά τη δημιουργία
Ανίχνευση ακούσιων διαγραφών πόρων
Πρόληψη κινδύνων ασφάλειας (π.χ. αποκάλυψη ασφαλών θυρών στο κοινό)
Μπορείτε να ελέγξετε πώς να το διαμορφώσετε στα έγγραφα.
Στα έγγραφα μπορείτε να βρείτε τις επιλογές που μπορείτε να χρησιμοποιήσετε για να εκτελέσετε το Atlantis:
Εάν κατά την εκμετάλλευση αντιμετωπίσετε αυτό το σφάλμα: Error: Error acquiring the state lock
Μπορείτε να το διορθώσετε εκτελώντας:
Εάν έχετε πρόσβαση εγγραφής σε ένα αποθετήριο, θα μπορείτε να δημιουργήσετε ένα νέο κλαδί σε αυτό και να δημιουργήσετε ένα PR. Εάν μπορείτε να εκτελέσετε την εντολή atlantis plan
(ή ίσως εκτελείται αυτόματα), θα μπορείτε να εκτελέσετε RCE μέσα στον διακομιστή Atlantis.
Μπορείτε να το κάνετε αυτό δημιουργώντας έναν εξωτερικό πηγή δεδομένων που φορτώνεται από το Atlantis. Απλά τοποθετήστε ένα payload όπως το παρακάτω στο αρχείο main.tf
:
Μπορείτε να εκτελέσετε αυτήν την επίθεση ακόμα και με μεγαλύτερη αόρατη δράση, ακολουθώντας αυτές τις συστάσεις:
Αντί να προσθέσετε απευθείας το αντίστροφο κέλυφος (rev shell) στο αρχείο terraform, μπορείτε να φορτώσετε έναν εξωτερικό πόρο που περιέχει το αντίστροφο κέλυφος:
Μπορείτε να βρείτε τον κώδικα του αντιστρόφου κελύφους στο https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules
Στο εξωτερικό πόρο, χρησιμοποιήστε το χαρακτηριστικό ref για να κρύψετε τον κώδικα του αντιστρόφου κελύφους του terraform σε ένα κλαδί μέσα στο αποθετήριο, κάτι σαν αυτό: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
Αντί να δημιουργήσετε ένα PR στο master για να ενεργοποιήσετε το Atlantis, δημιουργήστε 2 κλαδιά (test1 και test2) και δημιουργήστε ένα PR από το ένα στο άλλο. Όταν ολοκληρώσετε την επίθεση, απλά αφαιρέστε το PR και τα κλαδιά.
Μπορείτε να αποκτήσετε πρόσβαση σε μυστικά που χρησιμοποιούνται από το terraform εκτελώντας την εντολή atlantis plan
(terraform plan
) τοποθετώντας κάτι παρόμοιο στο αρχείο terraform:
Εάν έχετε πρόσβαση εγγραφής σε ένα αποθετήριο, θα μπορείτε να δημιουργήσετε ένα νέο κλαδί σε αυτό και να δημιουργήσετε ένα PR. Εάν μπορείτε να εκτελέσετε atlantis apply
, θα μπορείτε να εκτελέσετε RCE μέσα στον διακομιστή Atlantis.
Ωστόσο, συνήθως θα χρειαστεί να παρακάμψετε ορισμένες προστασίες:
Δυνατότητα συγχώνευσης: Εάν αυτή η προστασία έχει οριστεί στο Atlantis, μπορείτε να εκτελέσετε atlantis apply
μόνο εάν το PR είναι δυνατό να συγχωνευτεί (πράγμα που σημαίνει ότι η προστασία του κλαδιού πρέπει να παρακαμφθεί).
Ελέγξτε πιθανές παρακάμψεις προστασίας κλαδιού
Εγκεκριμένο: Εάν αυτή η προστασία έχει οριστεί στο Atlantis, κάποιος άλλος χρήστης πρέπει να εγκρίνει το PR πριν μπορέσετε να εκτελέσετε atlantis apply
Από προεπιλογή, μπορείτε να καταχραστείτε το token Gitbot για να παρακάμψετε αυτήν την προστασία
Εκτέλεση terraform apply
σε ένα κακόβουλο αρχείο Terraform με local-exec.
Απλά πρέπει να βεβαιωθείτε ότι ένα φορτίο όπως τα παρακάτω τελειώνει στο αρχείο main.tf
:
Ακολουθήστε τις προτάσεις από την προηγούμενη τεχνική για να εκτελέσετε αυτήν την επίθεση με έναν πιο αόρατο τρόπο.
Όταν εκτελείτε την εντολή atlantis plan
ή atlantis apply
, το terraform εκτελείται αυτόματα, μπορείτε να περάσετε εντολές στο terraform από το atlantis σχολιάζοντας κάτι όπως:
Κάτι που μπορείτε να περάσετε είναι μεταβλητές περιβάλλοντος που μπορεί να βοηθήσουν στην παράκαμψη ορισμένων προστασιών. Ελέγξτε τις μεταβλητές περιβάλλοντος του terraform στο https://www.terraform.io/cli/config/environment-variables
Εκτέλεση κακόβουλων προσαρμοσμένων εντολών κατασκευής που καθορίζονται σε ένα αρχείο atlantis.yaml
. Το Atlantis χρησιμοποιεί το αρχείο atlantis.yaml
από το κλαδί του αιτήματος ενσωμάτωσης (pull request), όχι από το master
.
Αυτή η δυνατότητα αναφέρθηκε σε προηγούμενη ενότητα:
Εάν η σημαία server side config allow_custom_workflows
έχει τεθεί σε True, οι ροές εργασίας μπορούν να καθοριστούν στο αρχείο atlantis.yaml
κάθε αποθετηρίου. Είναι επίσης πιθανόν να χρειάζεται να καθοριστεί επίσης η παράμετρος allowed_overrides
με την τιμή workflow
για να αντικαταστήσει τη ροή εργασίας που θα χρησιμοποιηθεί.
Αυτό ουσιαστικά θα παρέχει RCE (Remote Code Execution) στον διακομιστή Atlantis σε οποιονδήποτε χρήστη μπορεί να έχει πρόσβαση σε αυτό το αποθετήριο.
Εάν η σημαία server side config allowed_overrides
έχει ρυθμιστεί με apply_requirements
, είναι δυνατό για ένα αποθετήριο να τροποποιήσει τις προστασίες plan/apply για να τις παρακάμψει.
Εάν κάποιος στείλει σχόλια atlantis plan/apply
στα έγκυρα αιτήματα ενσωμάτωσής σας, θα προκαλέσει την εκτέλεση του terraform όταν δεν το επιθυμείτε.
Επιπλέον, εάν δεν έχετε ρυθμίσει στη προστασία κλαδιού να ζητείται επαναξιολόγηση για κάθε αίτημα ενσωμάτωσης όταν ανεβάζεται ένα νέο commit, κάποιος μπορεί να γράψει κακόβουλες ρυθμίσεις (ελέγξτε τα προηγούμενα σενάρια) στο αρχείο διαμόρφωσης του terraform, να εκτελέσει atlantis plan/apply
και να αποκτήσει RCE.
Αυτή είναι η ρύθμιση στις προστασίες κλαδιού του Github:
Εάν καταφέρετε να κλέψετε το μυστικό webhook που χρησιμοποιείται ή εάν δεν χρησιμοποιείται κανένα μυστικό webhook, μπορείτε να καλέσετε το webhook του Atlantis και να εκτελέσετε εντολές atlantis απευθείας.
Το Bitbucket Cloud δεν υποστηρίζει μυστικά webhook. Αυτό μπορεί να επιτρέψει σε επιτιθέμενους να πλαστογραφήσουν αιτήματα από το Bitbucket. Βεβαιωθείτε ότι επιτρέπετε μόνο τις διευθύνσεις IP του Bitbucket.
Αυτό σημαίνει ότι ένας επιτιθέμενος μπορεί να κάνει ψεύτικα αιτήματα στο Atlantis που φαίνεται ότι προέρχονται από το Bitbucket.
Εάν καθορίζετε --repo-allowlist
, τότε μπορούν να πλαστογραφήσουν μόνο αιτήματα που αφορούν αυτά τα αποθετήρια, οπότε ο μεγαλύτερος κίνδυνος που μπορούν να προκαλέσουν είναι να προγραμματίσουν/εφαρμόσουν στα δικά σας αποθετήρια.
Για να αποτρέψετε αυτό, προσθέστε στη λίστα επιτρεπόμενων διευθύνσεων IP του Bitbucket τις διευθύνσεις IP του Bitbucket (δείτε τις εξερχόμενες IPv4 διευθύνσεις).
Εάν καταφέρετε να αποκτήσετε πρόσβαση στον διακομιστή ή τουλάχιστον να έχετε LFI, υπάρχουν μερικά ενδιαφέροντα πράγματα που πρέπει να δοκιμάσετε να διαβάσετε:
/home/atlantis/.git-credentials
Περιέχει διαπιστευτήρια πρόσβασης στο VCS
/atlantis-data/atlantis.db
Περιέχει διαπιστευτήρια πρόσβασης στο VCS με περισσότερες πληροφορίες
/atlantis-data/repos/<org_name>
/
<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate
Αρχείο κατάστασης Terraform
Παράδειγμα: /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
/proc/1/environ
Μεταβλητές περιβάλλοντος
/proc/[2-20]/cmdline
Εντολή εκτέλεσης του atlantis server
(μπορεί να περιέχει ευαίσθητα δεδομένα)
Επειδή οποιοσδήποτε μπορεί να σχολιάσει σε δημόσια αιτήματα ενσωμάτωσης, ακόμα και με όλες τις διαθέσιμες αντιμετωπίσεις ασφαλείας, είναι επικίνδυνο να εκτελείτε το Atlantis σε δημόσια αποθετήρια χωρίς τη σωστή ρύθμιση των ρυθμίσεων ασφαλείας.
--allow-fork-prs
Ε