Ευπάθεια στην Python που επιτρέπει την κλήση εντολών συστήματος από μεμονωμένα σενάρια

Έχει δημοσιευτεί μια μέθοδος για την παράκαμψη απομονωμένων συστημάτων εκτέλεσης κώδικα στην Python, βασισμένη στη χρήση ενός γνωστού σφάλματος που εμφανίστηκε στην Python 2.7, εντοπίστηκε το 2012 και δεν έχει διορθωθεί ακόμη στην Python 3. Το σφάλμα επιτρέπει τη χρήση ειδικά συνδεδεμένων Κώδικας Python για την εκκίνηση της πρόσβασης σε ήδη ελευθερωμένη μνήμη (Use-After-Free) στην Python. Αρχικά, θεωρήθηκε ότι το σφάλμα δεν αποτελούσε απειλή για την ασφάλεια και μόνο σε πολύ σπάνιες περιπτώσεις, που συνήθως δημιουργήθηκαν τεχνητά, θα μπορούσε να οδηγήσει σε ανώμαλο τερματισμό του σεναρίου.

Ένας ερευνητής ασφαλείας με το ψευδώνυμο kn32 ενδιαφέρθηκε για το πρόβλημα και κατάφερε να προετοιμάσει ένα λειτουργικό exploit που καθιστά δυνατή την κλήση οποιασδήποτε εντολής συστήματος χωρίς άμεση πρόσβαση σε μεθόδους όπως το os.system. Το exploit υλοποιείται σε καθαρή Python και λειτουργεί χωρίς εισαγωγή εξωτερικών βιβλιοθηκών και χωρίς εγκατάσταση του προγράμματος χειρισμού "code.__new__". Από τα άγκιστρα χρησιμοποιείται μόνο το “builtin.__id__”, το οποίο συνήθως δεν απαγορεύεται. Από την πρακτική πλευρά, ο προτεινόμενος κώδικας μπορεί να χρησιμοποιηθεί για την παράκαμψη μηχανισμών απομόνωσης σε διάφορες υπηρεσίες και περιβάλλοντα (για παράδειγμα, σε περιβάλλοντα μάθησης, διαδικτυακά κελύφη, ενσωματωμένους χειριστές κ.λπ.), που επιτρέπουν την εκτέλεση κώδικα Python, αλλά περιορίζουν την διαθέσιμες κλήσεις και δεν επιτρέπουν μεθόδους κλήσεων όπως το os.system.

Ο προτεινόμενος κώδικας είναι ένα ανάλογο της κλήσης os.system, το οποίο λειτουργεί με την εκμετάλλευση μιας ευπάθειας στο CPython. Το exploit λειτουργεί με όλες τις εκδόσεις της Python 3 σε συστήματα με αρχιτεκτονική x86-64 και επιδεικνύει σταθερή λειτουργία στο Ubuntu 22.04, ακόμη και όταν είναι ενεργοποιημένες οι λειτουργίες προστασίας PIE, RELRO και CET. Η εργασία καταλήγει στη λήψη πληροφοριών από τον κώδικα Python σχετικά με τη διεύθυνση μιας από τις συναρτήσεις στον εκτελέσιμο κώδικα CPython. Με βάση αυτή τη διεύθυνση, υπολογίζεται η βασική διεύθυνση του CPython στη μνήμη και η διεύθυνση της συνάρτησης system() στην παρουσία libc που έχει φορτωθεί στη μνήμη. Στο τέλος, ξεκινά μια άμεση μετάβαση σε μια συγκεκριμένη διεύθυνση συστήματος με την αντικατάσταση του δείκτη του πρώτου ορίσματος στη γραμμή "/bin/sh".

Ευπάθεια στην Python που επιτρέπει την κλήση εντολών συστήματος από μεμονωμένα σενάρια


Πηγή: opennet.ru

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