Ευπάθεια σε cdnjs που επέτρεπε την εκτέλεση κώδικα σε διακομιστές Cloudflare

Εντοπίστηκε μια κρίσιμη ευπάθεια στο δίκτυο παράδοσης περιεχομένου cdnjs του Cloudflare, το οποίο έχει σχεδιαστεί για να επιταχύνει την παράδοση βιβλιοθηκών JavaScript, επιτρέποντας την αυθαίρετη εκτέλεση κώδικα σε διακομιστές CDN. Ο κίνδυνος του προβλήματος επιδεινώνεται από το γεγονός ότι περίπου το 12.7% όλων των τοποθεσιών στο Διαδίκτυο χρησιμοποιούν την υπηρεσία για τη λήψη βιβλιοθηκών JavaScript και η παραβίαση της υποδομής καθιστά δυνατή την αντικατάσταση των βιβλιοθηκών που παρέχονται από οποιονδήποτε από αυτούς τους ιστότοπους.

Η υπηρεσία cdnjs κατεβάζει πακέτα από το Git ή από ένα αποθετήριο NPM, μετά το οποίο επιτρέπει σε οποιονδήποτε ιστότοπο να χρησιμοποιεί το δίκτυο παράδοσης περιεχομένου Cloudflare δωρεάν για να επιταχύνει τη φόρτωση των βιβλιοθηκών JavaScript. Κατά τη μελέτη του κώδικα των στοιχείων cdnjs που δημοσιεύτηκαν στο GitHub, αποκαλύφθηκε ότι για την αποσυσκευασία πακέτων NPM σε αρχεία tgz, χρησιμοποιείται η τυπική ενότητα αρχειοθέτησης/tar στη γλώσσα Go, η οποία παράγει μια λίστα αρχείων ως έχει, χωρίς να ομαλοποιεί τις διαδρομές . Στην περίπτωση που το σενάριο αποσυμπιέζει τα περιεχόμενα με βάση τη δεδομένη λίστα, η παρουσία στο αρχείο αρχείων όπως "../../../../../../../tmp/test" μπορεί να οδηγούν σε αντικατάσταση αυθαίρετων αρχείων στο σύστημα, εφόσον το επιτρέπουν τα δικαιώματα πρόσβασης.

Προτάθηκε ότι ένας εισβολέας θα μπορούσε να υποβάλει αίτηση για να προσθέσει τη βιβλιοθήκη του σε cdnjs και να ανεβάσει ένα ειδικά σχεδιασμένο αρχείο που περιέχει αρχεία με χαρακτήρες "../" στη διαδρομή προς το αποθετήριο NPM. Σε διακομιστές cdnjs, εκτελείται περιοδικά μια λειτουργία "αυτόματη ενημέρωση", κατά την οποία ο χειριστής κατεβάζει νέες εκδόσεις της προτεινόμενης βιβλιοθήκης και αποσυσκευάζει τα περιεχόμενα. Χρησιμοποιώντας αρχεία με διαδρομές "../", ένας εισβολέας μπορεί να αντικαταστήσει αρχεία με σενάρια υπηρεσίας και να εκτελέσει τον κώδικά τους στον διακομιστή στον οποίο πραγματοποιήθηκε η αποσυσκευασία.

Στην περίπτωση λήψης ενημερώσεων από το Git, ανακαλύφθηκε ότι ο χειριστής που κατέβαζε τις ενημερώσεις δεν έλαβε υπόψη συμβολικούς συνδέσμους κατά την αντιγραφή αρχείων από το Git. Αυτή η δυνατότητα κατέστησε δυνατή την οργάνωση της ανάγνωσης οποιωνδήποτε αρχείων από τον διακομιστή προσθέτοντας συμβολικούς συνδέσμους στο Git.

Αποφασίστηκε να ξεκινήσουμε πειράματα με μια επίδειξη hacking cdnj για να λάβουμε ένα βραβείο στο HackerOne δοκιμάζοντας την υπόθεση σχετικά με την ανάγνωση αρχείων. Ένας συμβολικός σύνδεσμος test.js έχει προστεθεί στο αποθετήριο Git της βιβλιοθήκης JavaScript που εξυπηρετείται μέσω CDN, δείχνοντας το αρχείο /proc/self/maps. Μετά τη δημοσίευση μιας νέας έκδοσης της βιβλιοθήκης, ο χειριστής ενημέρωσης επεξεργάστηκε αυτό το αποθετήριο και δημοσίευσε το καθορισμένο αρχείο σε cdnjs (το test.js δημιουργήθηκε ως συμβολικός σύνδεσμος και όταν ζητήθηκε αυτό το αρχείο, τα περιεχόμενα του /proc/self/maps επιστράφηκαν ).

Αντικαθιστώντας έναν συμβολικό σύνδεσμο στο αρχείο /proc/self/environ, ο συγγραφέας της μελέτης παρατήρησε ότι τα δεδομένα που περιείχαν τις τιμές των μεταβλητών περιβάλλοντος GITHUB_REPO_API_KEY και WORKERS_KV_API_TOKEN. Η πρώτη μεταβλητή αποθήκευσε το κλειδί API για πρόσβαση εγγραφής στο αποθετήριο robocdnjs στο GitHub. Η δεύτερη μεταβλητή αποθήκευσε το διακριτικό στην αποθήκευση KV σε cdnjs. Χρησιμοποιώντας τις πληροφορίες που έλαβε, ο εισβολέας θα μπορούσε να κάνει αλλαγές στα cdnj και να υπονομεύσει πλήρως την υποδομή.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο