Κρίσιμη ευπάθεια στο PolKit που επιτρέπει την πρόσβαση root στις περισσότερες διανομές Linux

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

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

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

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

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

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

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

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



Πηγή: opennet.ru

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