Αποτελεσματική παράκαμψη των πολιτικών SELinux
Στα τέλη του περασμένου Μαΐου, Sean Fish, ένας ερευνητής ασφάλειας γκοινές πληροφορίες καιn στο blog του για μια μέθοδο που βρήκε για να παρακάμψετε τη μονάδα ασφαλείας SELinux.
Στην ανάρτησή του στο blog, γΜοιράστηκε μια επίδειξη για το πώς είναι δυνατόν να παρακαμφθεί η απαγόρευση φόρτωσης μονάδων πυρήνα, υλοποιείται σε συγκεκριμένους κανόνες SELinux σε μία από τις συσκευές που μελετήθηκαν (δεν διευκρινίζεται για ποια συσκευή είναι και πόσο επηρεάζει το πρόβλημα τους κανόνες SELinux σε υλικολογισμικό και διανομές).
Για όσους δεν το γνωρίζουν SELinux (Security Enhanced Linux) θα πρέπει να γνωρίζουν ότι αυτό πΕίναι μια μονάδα ασφαλείας για τον πυρήνα του Linux, που βελτιώνει την ασφάλεια του συστήματος και, σε περίπτωση παραβίασης της ασφάλειας, αποτρέπει την εξάπλωσή του σε όλο το σύστημα.
Το SELinux λειτουργεί σε τρεις λειτουργίες. "Απενεργοποίηση, επιτρεπτή και επιβολή." Στη λειτουργία Απενεργοποίησης, το SELinux παραμένει εντελώς απενεργοποιημένο. Εάν το SELinux είναι ενεργοποιημένο, θα είναι σε λειτουργία Permissive ή Executor mode. Σε επιτρεπτή λειτουργία, το SELinux θα παρακολουθεί μόνο την αλληλεπίδραση. Στη λειτουργία επιβολής, το SELinux θα φιλτράρει επίσης την αλληλεπίδραση με την παρακολούθηση.
Η ακαμψία της ασφάλειάς του μπορεί να γίνει κατανοητή από το γεγονός ότι με το SELinux, ότι ακόμη και αν το σύστημα έχει παραβιαστεί, δεν είναι δυνατή η πρόσβαση σε αρχεία στα οποία δεν παρέχεται πρόσβαση.
Έχοντας ήδη εξηγήσει πολύ επιφανειακά το SELinux, για την παράκαμψη Sean Pesce αναφέρει ότι οι μονάδες αποκλεισμού στους σχετικούς κανόνες SELinux βασίστηκε στον περιορισμό της πρόσβασης στην κλήση συστήματος finit_module, το οποίο επιτρέπει τη φόρτωση μιας λειτουργικής μονάδας από ένα αρχείο και χρησιμοποιείται σε βοηθητικά προγράμματα όπως insmod.
Πρόσφατα κοίταξα μια άγνωστη συσκευή που βασίζεται σε Linux ως προσωπικό έργο του Σαββατοκύριακου. Χρησιμοποιώντας μερικές απλές τεχνικές που δεν θα συζητήσω εδώ, απέκτησα πρόσβαση στο root shell. Για να αποφευχθεί η αποκάλυψη περιττών λεπτομερειών σχετικά με την υλοποίηση του στόχου, πληροφορίες όπως ονόματα αρχείων και περιβάλλοντα SELinux έχουν αλλάξει στο άρθρο.
Αναφέρεται ότι Ως εκ τούτου, δεν είναι απαραίτητα υποχρεωτικό να απενεργοποιήσετε το SELinux, αλλά για να αποφευχθούν πολλές επιπλοκές φορτώνεται μια προσαρμοσμένη μονάδα πυρήνα "θα ήταν το καλύτερο". Όχι όμως σε αυτήν την περίπτωση, καθώς για να το παρακάμψω μοιράζεται ότι πρώτα αποφασίζω να κλωνοποιήσω μια από τις υπάρχουσες μονάδες πυρήνα από το σύστημα αρχείων της συσκευής χρησιμοποιώντας μια δέσμη ενεργειών και η οποία είναι διορθωμένη στη συνάρτηση module_init η οποία μπορεί επίσης να χρησιμοποιηθεί για τη φόρτωση μονάδων πυρήνα απευθείας από ένα buffer στη μνήμη.
Συνδέοντας με το αντίστροφο κέλυφος μου, συνειδητοποίησα γρήγορα ότι το σύστημα είχε ενεργοποιημένο το SELinux. Αν και η πολιτική δεν ήταν τόσο αυστηρή όσο η τυπική πολιτική που μπορεί να βρείτε σε μια τυπική συσκευή Android, ήταν αρκετά αυστηρή για να με αποτρέψει από το να κάνω πολλά χρήσιμα πράγματα (για παράδειγμα, προσάρτηση συστημάτων αρχείων και πρόσβαση σε αρχεία στο /etc/ ) . Ευτυχώς, μπόρεσα να γράφω και να εκτελώ αρχεία στο /tmp/, οπότε είχα ακόμα έναν εύκολο τρόπο να δημιουργήσω και να εκτελέσω προσαρμοσμένα εργαλεία.
Αναφέρει περαιτέρω ότι υπάρχουν δύο διαφορετικές κλήσεις συστήματος που μπορούν να χρησιμοποιηθούν για τη φόρτωση μιας λειτουργικής μονάδας πυρήνα: το int init_module που φορτώνει μια λειτουργική μονάδα πυρήνα που είναι αποθηκευμένη στη μνήμη, ενώ int finit_module φορτώνει μια λειτουργική μονάδα πυρήνα από το δίσκο.
Με αυτό, εκμεταλλεύεται τη δυνατότητα φόρτωσης μονάδων πυρήνα, τα οποία μπορούν να μεταγλωττιστούν ως προσαρμοσμένα modules για να κάνουν κάτι πιο προηγμένο και με τις απαραίτητες διαμορφώσεις, μπορεί να επιτευχθεί μια επιτυχημένη εκτέλεση του πυρήνα με πρόσβαση στο χώρο χρήστη.
Το περιβάλλον SELinux δεν καταργείται. Μάλλον, μεταβαίνουμε στο πλαίσιο εργασιών εκκίνησης (γενικά μιλώντας, αυτό το πλαίσιο έχει πιθανώς πολύ λίγους, αν υπάρχουν, περιορισμούς).
Για την επίδειξη της μεθόδου, ετοιμάστηκε ένα λειτουργικό πρωτότυπο ότι επιτρέπει την εκτέλεση κώδικα σε επίπεδο πυρήνα φορτώνοντας τη μονάδα του και την πλήρη απενεργοποίηση της προστασίας SELinux, εάν έχετε περιορισμένη πρόσβαση root στο σύστημα χρησιμοποιώντας το SELinux.
Τέλος, εάν ενδιαφέρεστε να μάθετε περισσότερα για αυτό, μπορείτε να ελέγξετε τις λεπτομέρειες στην αρχική δημοσίευση στο τον ακόλουθο σύνδεσμο.