Ένα κρίσιμο κενό ασφαλείας στο PolKit επιτρέπει πρόσβαση root στις περισσότερες διανομές. Linux

Η Qualys εντόπισε μια ευπάθεια (CVE-2021-4034) στο στοιχείο συστήματος Polkit (πρώην PolicyKit), το οποίο χρησιμοποιείται σε διανομές για να επιτρέπει σε μη προνομιούχους χρήστες να εκτελούν ενέργειες που απαιτούν αυξημένα δικαιώματα πρόσβασης. Η ευπάθεια επιτρέπει σε έναν μη προνομιούχο τοπικό χρήστη να κλιμακώσει τα δικαιώματά του για να κάνει root και να αποκτήσει τον πλήρη έλεγχο του συστήματος. Το πρόβλημα, με την κωδική ονομασία PwnKit, είναι αξιοσημείωτο για την ανάπτυξη ενός λειτουργικού exploit που λειτουργεί στην προεπιλεγμένη διαμόρφωση στις περισσότερες διανομές. Linux.

Το πρόβλημα υπάρχει στο βοηθητικό πρόγραμμα PolKit pkexec, το οποίο παρέχεται με τη σημαία root SUID και έχει σχεδιαστεί για να εκτελεί εντολές με τα δικαιώματα ενός άλλου χρήστη σύμφωνα με τους καθορισμένους κανόνες PolKit. Λόγω λανθασμένης επεξεργασίας των ορισμάτων γραμμής εντολών που διαβιβάζονται στο pkexec, ένας χρήστης χωρίς δικαιώματα θα μπορούσε να παρακάμψει τον έλεγχο ταυτότητας και να εκτελέσει τον κώδικά του με δικαιώματα root, ανεξάρτητα από τους κανόνες πρόσβασης που έχουν οριστεί. Για μια επίθεση, δεν έχει σημασία ποιες ρυθμίσεις και περιορισμοί έχουν οριστεί στο PolKit, αρκεί το εκτελέσιμο αρχείο με το βοηθητικό πρόγραμμα pkexec να έχει ορίσει τη σημαία root SUID.

Το Pkexec δεν ελέγχει την εγκυρότητα του ορίσματος γραμμής εντολών count (argc) που διαβιβάζεται κατά την εκκίνηση μιας διεργασίας. Οι προγραμματιστές του pkexec υπέθεσαν ότι η πρώτη καταχώρηση του πίνακα argv περιείχε πάντα το όνομα της διεργασίας (pkexec) και η δεύτερη ήταν είτε NULL είτε το όνομα της εντολής που εκκινήθηκε μέσω του pkexec. Δεδομένου ότι το όρισμα count δεν ελέγχθηκε σε σχέση με το πραγματικό περιεχόμενο του πίνακα και θεωρήθηκε ότι είναι πάντα μεγαλύτερο από 1, εάν ένας κενός πίνακας argv διαβιβαζόταν στη διεργασία, κάτι που επιτρέπεται από τη συνάρτηση execve στο Linux, το pkexec αντιμετώπισε το NULL ως το πρώτο όρισμα (το όνομα της διεργασίας) και τη μνήμη που ακολουθεί το τέλος του buffer ως το υπόλοιπο του πίνακα. |———+———+———+————+———|———+————+———+———| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-option" NULL "value" "PATH=name" NULL

Το πρόβλημα είναι ότι ο πίνακας envp, ο οποίος περιέχει μεταβλητές περιβάλλοντος, τοποθετείται στη μνήμη μετά τον πίνακα argv. Έτσι, εάν ο πίνακας argv είναι κενός, το pkexec εξάγει δεδομένα σχετικά με την εντολή που εκτελείται με αυξημένα δικαιώματα από το πρώτο στοιχείο του πίνακα μεταβλητών περιβάλλοντος (το argv[1] γίνεται πανομοιότυπο με το envp[0]), το περιεχόμενο του οποίου μπορεί να ελεγχθεί από τον εισβολέα.

Έχοντας λάβει την τιμή argv[1], το pkexec προσπαθεί να προσδιορίσει την πλήρη διαδρομή προς το εκτελέσιμο αρχείο λαμβάνοντας υπόψη τις διαδρομές αρχείων στο PATH και να γράψει έναν δείκτη σε μια συμβολοσειρά με την πλήρη διαδρομή πίσω στο argv[1], η οποία οδηγεί στην αντικατάσταση της τιμής της πρώτης μεταβλητής περιβάλλοντος, καθώς το argv[1] είναι πανομοιότυπο με το envp[0]. Χειριζόμενος το όνομα της πρώτης μεταβλητής περιβάλλοντος, ένας εισβολέας μπορεί να αντικαταστήσει μια άλλη μεταβλητή περιβάλλοντος στο pkexec, για παράδειγμα, να αντικαταστήσει τη μεταβλητή περιβάλλοντος "LD_PRELOAD", η οποία δεν επιτρέπεται σε προγράμματα suid, και να οργανώσει τη φόρτωση της κοινόχρηστης βιβλιοθήκης του στη διεργασία.

Το λειτουργικό exploit αντικαθιστά τη μεταβλητή GCONV_PATH, η οποία χρησιμοποιείται για τον προσδιορισμό της διαδρομής προς τη βιβλιοθήκη μετατροπής χαρακτήρων, η οποία φορτώνεται δυναμικά κατά την κλήση της συνάρτησης g_printerr(), στον κώδικα της οποίας χρησιμοποιείται η iconv_open(). Επαναπροσδιορίζοντας τη διαδρομή στο GCONV_PATH, ο εισβολέας μπορεί να επιτύχει τη φόρτωση όχι της τυπικής βιβλιοθήκης iconv, αλλά της δικής του βιβλιοθήκης, οι χειριστές από την οποία θα εκτελεστούν κατά την έξοδο του μηνύματος σφάλματος στο στάδιο που το pkexec εξακολουθεί να εκτελείται με δικαιώματα root και πριν ελέγξει την αρχή εκκίνησης.

Σημειώνεται ότι, παρά το γεγονός ότι το πρόβλημα προκαλείται από αλλοίωση μνήμης, μπορεί να αξιοποιηθεί αξιόπιστα και επαναλαμβανόμενα ανεξάρτητα από την αρχιτεκτονική υλικού που χρησιμοποιείται. Το προετοιμασμένο exploit δοκιμάστηκε με επιτυχία στο Ubuntu, Debian, Fedora και CentOS, αλλά μπορεί να χρησιμοποιηθεί και σε άλλες διανομές. Το αρχικό exploit δεν είναι ακόμη διαθέσιμο στο κοινό, γεγονός που υποδηλώνει ότι είναι ασήμαντο και μπορεί εύκολα να αναδημιουργηθεί από άλλους ερευνητές. Επομένως, είναι σημαντικό να εγκαταστήσετε την ενημέρωση κώδικα το συντομότερο δυνατό σε συστήματα πολλαπλών χρηστών. Το Polkit είναι επίσης διαθέσιμο για συστήματα BSD και Solaris, αλλά η εκμετάλλευση σε αυτά δεν έχει μελετηθεί. Είναι γνωστό μόνο ότι η επίθεση δεν μπορεί να πραγματοποιηθεί στο OpenBSD, καθώς ο πυρήνας του OpenBSD δεν επιτρέπει τη μετάδοση τιμής μηδενικού argc στην κλήση execve().

Το πρόβλημα υπάρχει από τον Μάιο του 2009, όταν προστέθηκε η εντολή pkexec. Μια επιδιόρθωση για το θέμα ευπάθειας στο PolKit είναι προς το παρόν διαθέσιμη ως ενημέρωση κώδικα (δεν έχει κυκλοφορήσει καμία διορθωτική έκδοση), αλλά επειδή οι προγραμματιστές διανομών ειδοποιήθηκαν εκ των προτέρων για το πρόβλημα, οι περισσότερες διανομές δημοσίευσαν μια ενημέρωση ταυτόχρονα με την αποκάλυψη του θέματος ευπάθειας. Το πρόβλημα διορθώνεται στο RHEL 6/7/8. Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Κενό Linux, Αρχιτεκτονική Linux και Manjaro. Ως προσωρινό μέτρο για τον αποκλεισμό της ευπάθειας, μπορείτε να καταργήσετε τη σημαία root SUID από το πρόγραμμα /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



Πηγή: opennet.ru
Αγοράστε αξιόπιστη φιλοξενία για ιστότοπους με προστασία DDoS, διακομιστές VPS VDS 🔥 Αγοράστε αξιόπιστη φιλοξενία ιστοσελίδων με προστασία DDoS, διακομιστές VPS VDS | ProHoster