Ανίχνευση κακόβουλων πακέτων στο PyPI: Κακόβουλο πακέτο στο PyPI χρησιμοποιεί τεχνικές phishing για να κρύψει την κακόβουλη πρόθεσή του
Του Ori Abramovsky
Table of Contents
Highlights:
- Η CloudGuard Spectralops εντόπισε έναν κακόβουλο λογαριασμό phishing στο PyPI, το κορυφαίο ευρετήριο πακέτων Python.
- Οι χρήστες που εγκατέστησαν τα πακέτα του λογαριασμού εκτέθηκαν σε έναν κακόβουλο δράστη, πιθανότατα έναν κλέφτη PII.
- Με τον εντοπισμό τους ειδοποιήσαμε το PyPI σχετικά με αυτά τα πακέτα. Αμέσως μετά αυτά αφαιρέθηκαν από την ομάδα του PyPI.
Εισαγωγή
Το PyPI (Python Package Index) είναι το επίσημο αρχείο πακέτων λογισμικού για τη γλώσσα προγραμματισμού Python. Πρόκειται για μια κεντρική πλατφόρμα όπου οι προγραμματιστές της Python μπορούν να βρίσκουν, να εγκαθιστούν και να μοιράζονται πακέτα Python ανοικτού κώδικα. Το PyPI λειτουργεί από το Python Software Foundation (PSF) και είναι προσβάσιμο μέσω του προγράμματος εγκατάστασης πακέτων pip, το οποίο περιλαμβάνεται στις περισσότερες εγκαταστάσεις της Python. Οι χρήστες μπορούν να αναζητήσουν πακέτα με βάση το όνομα ή τη λέξη-κλειδί και μπορούν να κατεβάσουν και να εγκαταστήσουν πακέτα με μία μόνο εντολή.
Το PyPI φιλοξενεί χιλιάδες πακέτα Python ανοικτού κώδικα, που κυμαίνονται από βιβλιοθήκες για επιστημονικούς υπολογισμούς και ανάλυση δεδομένων, μέχρι πλαίσια για ανάπτυξη ιστοσελίδων και μηχανική μάθηση. Οποιοσδήποτε μπορεί να ανεβάσει ένα πακέτο στο PyPI, αρκεί να πληροί ορισμένες απαιτήσεις και κατευθυντήριες γραμμές που έχουν τεθεί από το PSF.
Το PyPI έχει γίνει ένα βασικό εργαλείο για την κοινότητα της Python, επιτρέποντας στους προγραμματιστές να ανακαλύπτουν και να χρησιμοποιούν εύκολα πακέτα τρίτων και ενθαρρύνει τη συνεργασία και την ανταλλαγή μεταξύ των προγραμματιστών Python παγκοσμίως. Πολλά δημοφιλή πλαίσια και εργαλεία Python, όπως το Django, το Flask και το Pandas, είναι διαθέσιμα στο PyPI, μαζί με ένα τεράστιο φάσμα άλλων πακέτων για διάφορους σκοπούς, καθιστώντας το έναν κρίσιμο πόρο για τους προγραμματιστές στο οικοσύστημα της Python.
Η Επίθεση
Είναι σημαντικό να σημειωθεί ότι οι κακόβουλοι δράστες δεν περιμένουν, και βλέπουμε συνεχώς νέες τεχνικές και στρατηγικές με τις οποίες προσπαθούν να κρύψουν την κακόβουλη πρόθεσή τους (από τη χρήση Στεγανογραφίας, μέχρι κρυπτο-πειρατές που καταλαμβάνουν το σύστημα εγκατάστασης για να εξορύξουν κρυπτογραφικό νόμισμα για το κέρδος τους). Τα κακόβουλα πακέτα που εντοπίσαμε καταδεικνύουν πως το phishing είναι ένα ακόμη εργαλείο που χρησιμοποιούν οι επιτιθέμενοι για να κρύψουν την πρόθεσή τους.
Χρησιμοποιώντας τα μοντέλα μηχανικής μάθησης που διαθέτουμε, καταφέραμε να εντοπίσουμε αυτά τα κακόβουλα πακέτα στο PyPI. Ενώ προσποιούνταν ότι είναι βοηθητικά προγράμματα που σχετίζονται με το async–io, αυτά τα πακέτα αποδείχθηκαν κακόβουλοι παράγοντες- κατέβαζαν και εκτελούσαν κρυφά συγκεκαλυμμένο κώδικα ως μέρος της διαδικασίας εγκατάστασής τους. Επιπλέον, ο επιτιθέμενος δημοσίευσε μερικές εκδόσεις του ίδιου πακέτου με μικρές τροποποιήσεις, πιθανώς επαναλαμβάνοντας προς μια έκδοση που θα είναι λιγότερο ορατή σε όσους κυνηγούν κακόβουλα πακέτα στο PyPI. Πολλές λεπτομέρειες για τα πακέτα που εντοπίστηκαν είναι μπροστά.
Η Επίθεση με λεπτομέρειες
Το πρώτο πακέτο που τράβηξε την προσοχή μας ήταν το aiotoolsbox; Ενώ φαινόταν καλοήθες με την πρώτη ματιά, αποδείχθηκε ότι ήταν ένα ακριβές αντίγραφο του νόμιμου πακέτου aiotools. Είναι σημαντικό να σημειωθεί ότι ενώ το typosquating (η χρήση ονομάτων πακέτων που μοιάζουν με δημοφιλή καλοήθη πακέτα προκειμένου να ξεγελάσουν τους χρήστες και να εγκαταστήσουν τα κακόβουλα) είναι μια αρκετά συνηθισμένη επίθεση στον κόσμο της εφοδιαστικής αλυσίδας, το ταυτόσημο αντίγραφο του καλοήθους πακέτου είναι μια λιγότερο συνηθισμένη πρακτική (για τις περισσότερες περιπτώσεις αρκεί η μίμηση του ονόματος του πακέτου) και είναι γενικά κάτι που βλέπουμε περισσότερο στον κόσμο του phishing. Μια τέτοια προσπάθεια μπορεί να υποδηλώνει μια πιο εξελιγμένη εκστρατεία, λαμβάνοντας υπόψη ότι οι εγκαταστάτες ενδέχεται να ρίχνουν μια δεύτερη ματιά στα πακέτα που πρόκειται να εγκαταστήσουν (είναι ενδιαφέρον ότι παρόμοια κακόβουλη εκστρατεία είχε εντοπιστεί στο παρελθόν από τα μοντέλα μηχανικής μάθησης που διαθέτουμε).
Το καλοήθες πακέτο aiotools δίπλα στο κακόβουλο aiotoolsbox
Κοιτάζοντας τα μεταδεδομένα των πακέτων, και τα δύο έχουν τον ίδιο συγγραφέα ενώ έχουν διαφορετικό συντηρητή. Βασιζόμενοι στο γεγονός ότι σύμφωνα με το πρωτόκολλο δημοσίευσης των πακέτων PyPI τα πεδία του συγγραφέα είναι ελεύθερου κειμένου ενώ ο συντηρητής είναι ένας πιστοποιημένος χρήστης, ο επιτιθέμενος μπορούσε εύκολα να μιμηθεί το πεδίο του συγγραφέα ενώ για τα πεδία του συντηρητή έπρεπε να βασιστεί σε κάτι άλλο.
Το καλοήθες πακέτο aiotools τα στοιχεία των συνεισφερόντων δίπλα στο κακόβουλο aiotoolsbox
Σύμφωνα με τα στοιχεία του συντηρητή του aiotoolsbox, είναι συνεργάτες του PyPI από το 2019. Δεδομένου του γεγονότος ότι τα δύο μόνο πακέτα που έχουν δημοσιεύτηκαν πρόσφατα, είναι δίκαιο να υποθέσουμε ότι αυτός ο λογαριασμός παραβιάστηκε πρόσφατα.
aiotoolsbox PyPI σελίδα maintainer
Εξετάζοντας τον κώδικα εγκατάστασης του aiotoolsbox περιλαμβάνει ένα παράξενο κομμάτι που ως μέρος της διαδικασίας εγκατάστασης, κατεβάζει ένα zip από το διαδίκτυο, το εξάγει, το εκτελεί και τελικά διαγράφει το περιεχόμενό του.
aiotoolsbox setup.py code
Το πρώτο ενδιαφέρον σημείο εδώ είναι το γεγονός ότι το zip κατεβαίνει από έναν διακομιστή που υποτίθεται ότι είναι ο ‘files.pythonhosted.org‘. Αυτό αποδεικνύεται ότι είναι το δεύτερο επίπεδο phishing της επίθεσης, καθώς ο διακομιστής προσπαθεί να κρυφτεί ως ο επίσημος ιστότοπος φιλοξενίας πακέτων PyPI.
To καλοήθες files.pythonhosted.org δίπλα στον κακόβουλο διακομιστή aiotoolsbox που χρησιμοποιείται
Ένα άλλο ενδιαφέρον σημείο είναι το όνομα του αρχείου που κατεβάζετε, το οποίο αντιστοιχεί στη χρησιμοποιούμενη έκδοση της python, δηλαδή για παράδειγμα κάποιος που χρησιμοποιεί python 3.9 θα λάβει ένα zip με το όνομα 39.zip. Αυτό φαίνεται να είναι ένα άλλο επίπεδο συσκοτίσεως του phishing, κάνοντας τον κοινό χρήστη να υποθέσει ότι πρόκειται για κάτι νόμιμο που βλέπει, πιθανώς κάποιο είδος εσωτερικής ροής του pip.
Εξετάζοντας το zip που κατέβηκε, συμπεριέλαβε έναν κώδικα με pyArmor, ο οποίος καθιστά δύσκολο να κατανοήσουμε σαφώς την κακόβουλη πρόθεσή του. Παρ’ όλα αυτά, κοιτάζοντας τα ονόματα των αρχείων που κατεβάστηκαν, είναι δίκαιο να υποθέσουμε ότι το πακέτο είναι ένας κλέφτης PII, που σκοπεύει να συλλέξει και να κλέψει τα μυστικά του εγκαταστάτη. Δεδομένου του γεγονότος ότι αυτό το zip κατέβηκε κρυφά κατά τη διάρκεια της διαδικασίας εγκατάστασης, μπορούμε να συμπεράνουμε ότι δεν πρόκειται για μια καλοήθη περίπτωση.
Τα downloaded zip περιεχόμενα
Το main.py entry script περιεχόμενο
Επανεξετάζοντας τη δομή του πακέτου aiotoolsbox, εκτός από το setup.py που αναφέρθηκε, τα υπόλοιπα αρχεία φαίνεται να προέρχονται από το καλοήθες πακέτο aiotools, κάνοντας τον κοινό χρήστη να λαμβάνει τις βασικές λειτουργίες που αναζητούσε, χωρίς να γνωρίζει ότι μόλις εγκατέστησε ένα κακόβουλο πακέτο.
Η καλοήθης δομή αρχείων aiotools δίπλα στο κακόβουλο aiotoolsbox
Ψάχνοντας για τις προηγούμενες εκδόσεις του aiotoolsbox μπορούμε να παρατηρήσουμε με ενδιαφέρον ότι ανέβηκε μερικές φορές με διαφορετικές εκδόσεις (πρώτα 1.4.7 και μόνο μετά 1.4.5 και 1.4.6).
Αναζήτηση για προηγούμενες κυκλοφορίες aiotoolsbox
Εξετάζοντας τη διαφορά μεταξύ αυτών των εκδόσεων αποδείχθηκε ότι είχαν την ίδια δομή, ενώ η μόνη διαφορά ήταν στο αρχείο setup.py και πιο συγκεκριμένα στην IP του διακομιστή που χρησιμοποιούν. Ελέγχοντας τα στοιχεία της IP η αρχική έκδοση ήταν μια ρωσική IP ενώ η μεταγενέστερη ήταν από τη Γερμανία. Πιθανώς και πάλι ένα άλλο επίπεδο συσκοτισμού, θεωρώντας ότι μια ρωσική IP θα είναι πιο ανησυχητική από μια γερμανική.
πρόσφατη έκδοση (1.4.6) aiotoolsbox έναντι της προηγούμενης (1.4.7)
Η πιο πρόσφατη (1.4.6) IP σε χρήση σε σχέση με την προηγούμενη (1.4.7)
Τέλος, εξετάζοντας το άλλο πακέτο του λογαριασμού – το async–proxy, στο αρχείο setup.py αναφέρει το aiotoolsbox ως τη μόνη του απαίτηση, κάνοντας όποιον το εγκαταστήσει να εγκαταστήσει και το κακόβουλο aiotoolsbox
async-proxy setup.py code
Disclosure
Αποκαλύψαμε τον λογαριασμό στο PyPI και αμέσως μετά τα αναφερόμενα πακέτα αφαιρέθηκαν από την ομάδα του PyPI.
Πως αποτρέπει αυτόν τον κίνδυνο το CloudGuard Spectral
Με τις επιθέσεις στην αλυσίδα εφοδιασμού να αυξάνονται ολοένα και περισσότερο, είναι απαραίτητο να διασφαλιστείτε επαληθεύοντας όλα τα συστατικά του λογισμικού που χρησιμοποιείτε, ιδίως εκείνα που δεν έχουν αναπτυχθεί από εσάς.
Στην Check Point, η αποστολή μας είναι να οικοδομήσουμε μια ασφαλή διαδικασία ανάπτυξης, εξοπλίζοντας τους προγραμματιστές με τα κατάλληλα εργαλεία για να το πετύχουμε αυτό. Για να καταπολεμήσουμε τα κακόβουλα πακέτα που οδηγούν σε κινδύνους στην αλυσίδα εφοδιασμού, παρακολουθούμε επαγρυπνώντας το PyPI και το NPM για κακόβουλες οντότητες.
Μετά τον εντοπισμό τους, ενημερώνουμε το NPM, προτρέποντας την άμεση αφαίρεσή τους. Αξιοποιώντας το CloudGuard Spectral, μπορείτε να παραμείνετε ασφαλείς και σε εγρήγορση, επιτρέποντάς σας να εντοπίζετε γρήγορα κακόβουλους φορείς.