Ευπάθεια στον πυρήνα του Linux που επιτρέπει την καταστροφή αρχείων μόνο για ανάγνωση

Εντοπίστηκε μια ευπάθεια στον πυρήνα του Linux (CVE-2022-0847) που επιτρέπει την αντικατάσταση των περιεχομένων της προσωρινής μνήμης σελίδων για οποιαδήποτε αρχεία, συμπεριλαμβανομένων αυτών σε λειτουργία μόνο για ανάγνωση, που ανοίγουν με τη σημαία O_RDONLY ή βρίσκονται σε συστήματα αρχείων τοποθετημένο σε λειτουργία μόνο για ανάγνωση. Πρακτικά, η ευπάθεια θα μπορούσε να χρησιμοποιηθεί για την εισαγωγή κώδικα σε αυθαίρετες διαδικασίες ή για την καταστροφή δεδομένων σε ανοιχτά αρχεία. Για παράδειγμα, μπορείτε να αλλάξετε τα περιεχόμενα του αρχείου authorized_keys για τη διαδικασία sshd. Ένα πρωτότυπο του exploit είναι διαθέσιμο για δοκιμή.

Το πρόβλημα έχει την κωδική ονομασία Dirty Pipe, παρόμοια με την κρίσιμη ευπάθεια Dirty COW που εντοπίστηκε το 2016. Σημειώνεται ότι σε επίπεδο επικινδυνότητας, το Dirty Pipe βρίσκεται στο ίδιο επίπεδο με το Dirty COW, αλλά είναι πολύ πιο εύκολο στη λειτουργία του. Η ευπάθεια εντοπίστηκε κατά την ανάλυση καταγγελιών για περιοδική καταστροφή αρχείων που λήφθηκαν μέσω του δικτύου σε ένα σύστημα που κατεβάζει συμπιεσμένα αρχεία από διακομιστή καταγραφής (37 βλάβες σε 3 μήνες σε ένα φορτωμένο σύστημα), η προετοιμασία του οποίου χρησιμοποιούσε τη λειτουργία splice() και σωλήνες χωρίς όνομα.

Η ευπάθεια εμφανίζεται ξεκινώντας από τον πυρήνα Linux 5.8, που κυκλοφόρησε τον Αύγουστο του 2020, δηλ. υπάρχει στο Debian 11, αλλά δεν επηρεάζει τον βασικό πυρήνα στο Ubuntu 20.04 LTS. Οι πυρήνες RHEL 8.x και openSUSE/SUSE 15 βασίζονται αρχικά σε παλιούς κλάδους, αλλά είναι πιθανό η αλλαγή που προκάλεσε το πρόβλημα να μεταφέρθηκε σε αυτούς (δεν υπάρχουν ακόμη ακριβή δεδομένα). Μπορείτε να παρακολουθείτε τη δημοσίευση ενημερώσεων πακέτων σε διανομές σε αυτές τις σελίδες: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Μια επιδιόρθωση για την ευπάθεια προτάθηκε στις εκδόσεις 5.16.11, 5.15.25 και 5.10.102. Η επιδιόρθωση περιλαμβάνεται επίσης στον πυρήνα που χρησιμοποιείται στην πλατφόρμα Android.

Η ευπάθεια προκαλείται από την έλλειψη αρχικοποίησης της τιμής "buf->flags" στον κώδικα των συναρτήσεων copy_page_to_iter_pipe() και push_pipe(), παρά το γεγονός ότι η μνήμη δεν εκκαθαρίζεται κατά την εκχώρηση μιας δομής και κατά τη διάρκεια ορισμένων χειρισμών με σωλήνες χωρίς όνομα, μια τιμή από άλλη λειτουργία. Χρησιμοποιώντας αυτήν τη δυνατότητα, ένας μη προνομιούχος τοπικός χρήστης μπορεί να επιτύχει την εμφάνιση της τιμής PIPE_BUF_FLAG_CAN_MERGE στη σημαία, η οποία σας επιτρέπει να οργανώσετε την αντικατάσταση δεδομένων στη μνήμη cache της σελίδας, γράφοντας απλώς νέα δεδομένα σε έναν ειδικά προετοιμασμένο μη κατονομασμένο σωλήνα.

Για μια επίθεση, το αρχείο προορισμού πρέπει να είναι αναγνώσιμο και επειδή τα δικαιώματα πρόσβασης δεν ελέγχονται κατά την εγγραφή στη διοχέτευση, η αντικατάσταση στη μνήμη cache σελίδας μπορεί επίσης να γίνει για αρχεία που βρίσκονται σε διαμερίσματα που έχουν τοποθετηθεί μόνο για ανάγνωση (για παράδειγμα, για αρχεία c CD- ROM). Μετά την αντικατάσταση των πληροφοριών στην προσωρινή μνήμη σελίδας, κατά την ανάγνωση δεδομένων από ένα αρχείο, η διεργασία δεν θα λάβει τα πραγματικά δεδομένα, αλλά τα δεδομένα που αντικαταστάθηκαν.

Η λειτουργία καταλήγει στη δημιουργία ενός καναλιού χωρίς όνομα και στην πλήρωσή του με αυθαίρετα δεδομένα, προκειμένου να διασφαλιστεί ότι η σημαία PIPE_BUF_FLAG_CAN_MERGE έχει οριστεί σε όλες τις δομές δακτυλίου που σχετίζονται με αυτό. Στη συνέχεια, τα δεδομένα διαβάζονται από το κανάλι, αλλά η σημαία παραμένει καθορισμένη σε όλες τις περιπτώσεις της δομής pipe_buffer στις δομές δακτυλίου pipe_inode_info. Στη συνέχεια γίνεται μια κλήση στο splice() για την ανάγνωση δεδομένων από το αρχείο προορισμού σε έναν μη ονοματοποιημένο σωλήνα, ξεκινώντας από την επιθυμητή μετατόπιση. Κατά την εγγραφή δεδομένων σε αυτόν τον ανώνυμο σωλήνα, λόγω της ρύθμισης της σημαίας PIPE_BUF_FLAG_CAN_MERGE, τα δεδομένα στη μνήμη cache σελίδας θα αντικατασταθούν αντί να δημιουργηθεί μια νέα παρουσία της δομής pipe_buffer.

Πηγή: opennet.ru

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