Το Project Zero της Google ανακάλυψε πώς να παρακάμψετε το Knox Hypervisor της Samsung (διορθώθηκε στην ενημερωμένη έκδοση κώδικα του Ιανουαρίου)

Στην τελευταία ανάρτηση ιστολογίου του Project Zero, η ομάδα ανακάλυψε έναν τρόπο να παρακάμψει την προστασία πυρήνα της Samsung σε πραγματικό χρόνο, που ονομάζεται Knox Hypervisor.

Η ομάδα του Project Zero της Google έχει επαληθεύσει μια σειρά από εκμεταλλεύσεις που επιτρέπουν στα τηλέφωνα της Samsung που εκτελούν την υποτιθέμενη ασφαλή σουίτα ασφαλείας Samsung Knox να δέχονται επίθεση. Το ιστολόγιο σημειώνει ότι όλα τα τρωτά σημεία έχουν περάσει στη Samsung, η οποία όντως κυκλοφόρησε διορθώσεις για αυτά σε μια ενημέρωση λογισμικού τον Ιανουάριο.


Ιστορικό

Ως μέρος της σουίτας λογισμικού ασφαλείας Samsung Knox που εισήγαγε η Samsung, υπάρχει ένα κομμάτι λογισμικού που βρίσκεται ανάμεσα σε εφαρμογές Android και στον πυρήνα που ονομάζεται Υπερεπόπτη. Αυτό μπορεί να χρησιμοποιηθεί ως πρόσθετο επίπεδο για την περαιτέρω ασφάλεια των συσκευών Android. Το Samsung Knox Hypervisor ονομάζεται "Προστασία πυρήνα σε πραγματικό χρόνο" ή RKP για συντομία, όπως θα το αναφέρω στο υπόλοιπο αυτού του άρθρου.

Ο πυρήνας βρίσκεται κάτω από το RKP στη στοίβα λογισμικού Android και οι εφαρμογές που εκτελούνται στη συσκευή βρίσκονται στην κορυφή. Η ιδέα πίσω από το RKP είναι να παρέχει ένα επιπλέον επίπεδο ασφάλειας για τη συσκευή καθώς όλα τα αιτήματα (μνήμη και άλλοι πόροι) γίνονται από οι εφαρμογές στον πυρήνα πρέπει πρώτα να περάσουν από το Knox, το οποίο προσπαθεί να εντοπίσει εάν μια εφαρμογή κάνει κάτι δεν θα έπρεπε. Το RKP παρέχει επίσης ασφάλεια μέσω της αφάνειας με ένα επιπλέον επίπεδο για την απόκρυψη ευαίσθητων πληροφοριών που μια εφαρμογή θα μπορούσε να χρησιμοποιήσει για να παραβιάσει τη συσκευή.

Η ανάρτηση του ιστολογίου εμβαθύνει στον τρόπο λειτουργίας της μνήμης Android, του RKP και των Λειτουργικών Συστημάτων γενικά, επομένως το έχω συμπυκνώσει και απλοποιήσει για να δώσω μια γρήγορη επισκόπηση του τι ανακαλύφθηκε. Ωστόσο, σας ενθαρρύνω να διαβάσετε ολόκληρο το άρθρο αν έχετε χρόνο, καθώς είναι πολύ διαφωτιστικό.


Εκμετάλλευση #1:

KASLR ή Kernel Address Space Layout Randomization είναι η διαδικασία αλλαγής της θέσης του κώδικα του πυρήνα στη μνήμη κατά ένα τυχαίο ποσό κατά την εκκίνηση. Κάθε φορά που εκκινείται η συσκευή, ο πυρήνας φορτώνεται σε διαφορετικό χώρο διευθύνσεων (περιοχή στη μνήμη). Η ιδέα είναι να δυσκολευτείτε να βρείτε πού βρίσκεται ο κώδικας του πυρήνα για να του επιτεθείτε γιατί μετά από κάθε εκκίνηση ο κώδικας του πυρήνα "μετατοπίζεται" κατά ένα τυχαίο ποσό στη μνήμη. Αυτό ακούγεται σαν ένα εξαιρετικό βήμα για την αποτροπή επίδοξων επιτιθέμενων αλλά πρόσφατο έρευνα έχει δείξει ότι μπορείτε πραγματικά να το νικήσετε χωρίς να απαιτείται σφάλμα λογισμικού ή ευπάθεια, καθώς το KASLR είναι στην πραγματικότητα πολύ δύσκολο να εφαρμοστεί με ισχυρό τρόπο ενάντια στους τοπικούς εισβολείς.

Στην περίπτωση του λογισμικού RKP, η δυνατότητα παράκαμψης του KASLR είναι στην πραγματικότητα απλούστερη από την έρευνα που αναφέρθηκε παραπάνω. Η μνήμη όλων των συσκευών Android αναφέρεται με δείκτες και για να προστατεύονται οι συσκευές από επίθεση, όποτε εκτυπώνονται ή εξάγονται συσκευές Android (είτε για οθόνη είτε για να αρχειοθετήσετε αρχεία καταγραφής ή εντοπισμό σφαλμάτων), οι αναφορές δεικτών είναι ανώνυμες, - καθιστώντας αδύνατο να βρείτε πού δείχνει πραγματικά ο δείκτης κατά την ανάγνωση του παραγωγή.

Σκεφτείτε τους δείκτες μνήμης σαν μια πινακίδα του δρόμου που δείχνει σε μια τοποθεσία και σκεφτείτε την ανωνυμοποίηση ως θόλωση αυτής. Όπως και η τηλεόραση, η ανωνυμοποίηση γίνεται μετά το γύρισμα, το Android εφαρμόζει επίσης αυτήν την ανωνυμοποίηση κατά την έξοδο και μόνο εάν η ανωνυμοποίηση έχει ρυθμιστεί σωστά και ο συγγραφέας δηλώνει ότι κάθε συσκευή που συναντά έχει διαμορφωθεί σωστά η ανωνυμοποίηση δείκτη. Αυτό μπορεί να ακούγεται σαν να είναι πολύ δύσκολο να σπάσει, αλλά το μόνο που χρειάζεται να κάνετε είναι να βρείτε έναν μόνο δείκτη (σκεφτείτε την πινακίδα του δρόμου) που δεν ήταν ανώνυμη (θολή) από τον προγραμματιστή του πυρήνα (προσοχή δεν είναι ο μέσος προγραμματιστής της εφαρμογής Android σας) όταν ο δείκτης γράφεται στα αρχεία καταγραφής ή σε άλλη τοποθεσία π.χ. οθόνη ή α αρχείο.

Έτσι, εάν μπορείτε να βρείτε έναν δείκτη που δεν ήταν ανώνυμος, τότε μπορείτε να υπολογίσετε την τυχαία μετατόπιση διεύθυνσης του πυρήνα ως τη διαφορά μεταξύ των δύο. Είναι ενδιαφέρον ότι ο συγγραφέας δεν μπόρεσε να βρει έναν εκμεταλλεύσιμο δείκτη στον πυρήνα, αλλά τον βρήκε μέσα στο RPK όπου οι προγραμματιστές ξέχασαν να ανωνυμοποιήσουν έναν δείκτη στην έξοδο εντοπισμού σφαλμάτων (καταγραφή), το οποίο προέκυψε μέσω ενός τυπογραφικό λάθος. Για να ανωνυμοποιήσετε τους δείκτες στο Android, πρέπει να χρησιμοποιήσετε έναν ειδικό κωδικό και αποδεικνύεται ότι οι προγραμματιστές RPK χρησιμοποίησαν κατά λάθος έναν πεζό 'k' αντί για ένα κεφαλαίο "K". Ως εκ τούτου, ήταν σχετικά απλό να υπολογίσουμε την ποσότητα τυχαίας μετατόπισης του κώδικα του πυρήνα και να του επιτεθούμε.


Εκμετάλλευση #2:

Το επόμενο exploit είναι λίγο πιο περίπλοκο: το Samsung Knox προστατεύει τη συσκευή σας εφαρμόζοντας ένα σύνολο κανόνων στη μνήμη της συσκευής για να σταματήσει τον κακόβουλο κώδικα. Οι κανόνες είναι οι εξής:

  1. Όλες οι σελίδες (κώδικας στη μνήμη), με εξαίρεση τον κώδικα του πυρήνα, επισημαίνονται ως "Προνομιακή εκτέλεση ποτέ" (που σημαίνει ότι ο κώδικας εδώ δεν μπορεί ποτέ να εκτελεστεί)
  2. Οι σελίδες δεδομένων πυρήνα (δεδομένα που χρησιμοποιούνται από το πρόγραμμα στη μνήμη) δεν επισημαίνονται ποτέ ως εκτελέσιμες (άρα ο κώδικας εδώ δεν μπορεί ποτέ να εκτελεστεί)
  3. Οι σελίδες κώδικα πυρήνα (κώδικας στη μνήμη) δεν επισημαίνονται ποτέ ως εγγράψιμες (άρα κανένας κακόβουλος κώδικας δεν μπορεί να τον αλλάξει)
  4. Όλες οι σελίδες του πυρήνα επισημαίνονται ως μόνο για ανάγνωση στον πίνακα μετάφρασης του σταδίου 2 (ο πίνακας που βρίσκεται μεταξύ της εφαρμογής και του πυρήνα για να εμποδίζει περαιτέρω τις εφαρμογές να γνωρίζουν για πραγματικές θέσεις μνήμης)
  5. Όλες οι εγγραφές μετάφρασης μνήμης επισημαίνονται ως μόνο για ανάγνωση για εφαρμογές.

Θα επικεντρωθούμε στον κανόνα 3, καθώς εδώ ο συγγραφέας βρήκε πρόβλημα με την εφαρμογή των παραπάνω κανόνων. Το RPK στην πραγματικότητα επισημαίνει τη μνήμη για τον πυρήνα ως μόνο για ανάγνωση, ωστόσο ως παράβλεψη στο KASL ανακαλύφθηκε μια τρύπα, η οποία οδήγησε σε εγγραφή κώδικα στην υποτιθέμενη ενότητα "μόνο για ανάγνωση".. Για να αποκρύψετε τη θέση του πυρήνα κατά την εκκίνηση, η μνήμη εκχωρείται στον πυρήνα, αλλά αυτή η ποσότητα μνήμης είναι πολύ μεγαλύτερη από το τμήμα κειμένου του πυρήνα. Με την εκχώρηση μεγαλύτερης ποσότητας μνήμης, είναι πολύ πιο δύσκολο να βρεθεί ο πραγματικός κώδικας του πυρήνα που θα μπορούσε να βρίσκεται οπουδήποτε, και όπως είδαμε παραπάνω μετακινείται τυχαία σε κάθε εκκίνηση της συσκευής.

_text και _etext επισημαίνουν την προστατευμένη περιοχή

Ο συγγραφέας μπόρεσε να επιβεβαιώσει ότι η μνήμη που χρησιμοποιήθηκε από τον πυρήνα είχε όντως επισημανθεί ως "μόνο για ανάγνωση", ωστόσο η υπόλοιπη μεγάλη ποσότητα μνήμης που χρησιμοποιήθηκε για την απόκρυψη του πυρήνα ήταν δεν επισημαίνεται ως "μόνο για ανάγνωση". Αυτό συμβαίνει επειδή το RKP προστατεύει μόνο την περιοχή που περιέχει το κείμενο του πυρήνα μετά την εφαρμογή της διαφάνειας KASLR.


Εκμετάλλευση #3

Στο τρίτο exploit, ο συγγραφέας μπόρεσε να αποκτήσει πρόσβαση σε μια άλλη περιοχή της μνήμης που θα έπρεπε επίσης να περιοριστεί σε μόνο για ανάγνωση. Το RKP προστατεύει τη μνήμη και χρησιμοποιεί α Μητρώο διαμόρφωσης Hypervisor (HCR) για τον έλεγχο βασικών λειτουργιών πυρήνα. Ο σκοπός του HCR είναι να επιτρέπει σε έγκυρες και πραγματικές λειτουργίες πυρήνα να έχουν πρόσβαση στα μητρώα και να αποκλείουν κακόβουλες επιθέσεις. Αυτό το κάνει ελέγχοντας τις κλήσεις που γίνονται στα μητρώα που διέπουν τις δυνατότητες εικονικοποίησης. Το HCR έχει ρυθμιστεί ώστε να αποκλείει συγκεκριμένες λειτουργίες που θα χειρίζονταν κανονικά επιτρέποντας στο RKP να επιλέξει εάν θα επιτρέψει ή θα απορρίψει ένα αίτημα.

Σε αυτό το exploit ο έλεγχος HCR ήταν δεν καλύπτει δύο μητρώα που αποδείχθηκε πολύ σημαντικό. Ο συγγραφέας έσκαψε βαθιά στο εγχειρίδιο ARM Reference και ανακάλυψε ότι το πρώτο μητρώο του επέτρεπε να απενεργοποιήσει βασικά το RKP για εφαρμογές. Ο "System Control Register for EL1 (SCTLR_EL1) παρέχει έλεγχο ανώτατου επιπέδου στο σύστημα, συμπεριλαμβανομένου του συστήματος μνήμηςΣε έναν τέλειο κόσμο, η εφαρμογή θα χρησιμοποιούσε μνήμη που είχε αντιστοιχιστεί μέσω του RKP, έτσι ώστε το RKP να μπορεί να ελέγχει σε τι θα μπορούσε να έχει πρόσβαση η εφαρμογή. Ωστόσο, η απενεργοποίηση αυτού του μητρώου επέτρεψε το RKP να απενεργοποιηθεί επαναφέροντας αποτελεσματικά τη συσκευή στην κατάσταση λειτουργίας της πριν από την εγκατάσταση του RKP - που σημαίνει ότι η συσκευή αντιστοιχίζεται στη φυσική μνήμη χωρίς την επιπλέον ασφάλεια που παρέχει το RKP. Αυτό με τη σειρά του σήμαινε ότι ο συγγραφέας μπορούσε να διαβάζει και να γράφει στη μνήμη που είχε αρχικά και σωστά αποκλειστεί από το λογισμικό RKP.

Το δεύτερο μητρώο που χάθηκε είχε μια πιο λεπτή επίδραση, αλλά τελικά εξίσου καταστροφική για την ασφάλεια. ο Μητρώο ελέγχου μετάφρασης για το EL1 Ο καταχωρητής (TCR_EL1) σχετίζεται άμεσα με την ποσότητα μνήμης με την οποία λειτουργεί μια εφαρμογή που ονομάζεται σελίδα. Το RKP είναι κωδικοποιημένο σε μέγεθος σελίδας 4kb επειδή οι πυρήνες Linux AARCH64 (όπως το Android) χρησιμοποιούν μέγεθος μετάφρασης 4KB. Ο εν λόγω καταχωρητής (TCR_EL1) ορίζει τα chipset ARM στο μέγεθος της μνήμης που πρόκειται να επιστραφεί. Τελικά φαίνεται πως αυτό το μητρώο δεν προστατεύεται από το HCR και επομένως ένας εισβολέας μπορεί να το αλλάξει όπως ο συγγραφέας το άλλαξε σε μέγεθος σελίδας 64 kb.

Αυτό σημαίνει ότι όταν το αίτημα εκπληρωθεί από το RKP, η πραγματική διαθέσιμη ποσότητα μνήμης είναι τώρα 64 kb αντί για 4 kb. Ο λόγος είναι ότι το chipset ARM εξακολουθεί να ελέγχει το μέγεθος της σελίδας και ορίστηκε στα 64 kb από το exploit. Δεδομένου ότι το RKP προστατεύει τη μνήμη από την εγγραφή, ως μέρος των κανόνων που αναφέρονται στο exploit #2, η μνήμη εξακολουθεί να προστατεύεται πραγματικά. Αλλά εδώ είναι το αλιευτικό - δεδομένου ότι το RKP είναι κωδικοποιημένο σε 4 kb, δεν αλλάζει σε μέγεθος σελίδας 64 kb όταν ενημερώθηκε το μητρώο, οπότε μόνο τα πρώτα 4kb μνήμης προστατεύονται επιτρέποντας στον εισβολέα να κάνει ότι θέλει με τα υπόλοιπα 60kb.


Εκμετάλλευση #4

Η τελευταία εκμετάλλευση που δείχνει ο συγγραφέας είναι η αναφορά στη μνήμη όπου βρίσκεται το λογισμικό RKP, έτσι ώστε ο εισβολέας να μπορεί να επιτεθεί στο ίδιο το λογισμικό RKP. Ένα κόλπο για να σταματήσετε αυτόν τον τύπο επίθεσης που χρησιμοποιούν και οι πυρήνες του Linux είναι να αφαιρέσετε τη χαρτογράφηση του προγράμματός σας από τον χώρο διευθύνσεων εικονικής μνήμης, έτσι ώστε καμία εφαρμογή να μην μπορεί να του επιτεθεί επειδή δεν μπορεί να το αναφέρει.

Να θυμάστε ότι η μνήμη αφορά δείκτες και πίνακες που αντιστοιχίζουν τη φυσική μνήμη στην εικονική μνήμη. Σύμφωνα με την κανονική άμυνα σε αυτόν τον τύπο επίθεσης, το RKP ξεχωρίζει τον εαυτό του έτσι ώστε να μην μπορεί να επιτεθεί. Ωστόσο, όπου ο πυρήνας δεν παρέχει τέτοιες δυνατότητες, το RKP επιτρέπει σε ένα κομμάτι της μνήμης να αντιστοιχιστεί και να επισημανθεί ως Read/Write. Ο μόνος έλεγχος είναι ότι δεν είναι ο ίδιος ο υποκείμενος πυρήνας, καθώς το RKP δεν κάνει κανέναν έλεγχο για να δει εάν οι διευθύνσεις που ζητούνται να αντιστοιχιστούν είναι η περιοχή όπου το ίδιο το RKP βρίσκεται στη μνήμη. Βασικά, RKP επιτρέπει στον εαυτό του να χαρτογραφηθεί εκ νέου πίσω στο χώρο διευθύνσεων στον οποίο μπορούν να έχουν πρόσβαση οι εφαρμογές και ως πλευρικό να επηρεάσουν το Η μνήμη επισημαίνεται αυτόματα ως Ανάγνωση/Εγγραφή έτσι ένας εισβολέας μπορεί τώρα να χρησιμοποιήσει τη μνήμη όπως θέλει.


συμπέρασμα

Ένα από τα μεγαλύτερα προβλήματα με τα τέσσερα exploit που αναφέρονται παραπάνω είναι ότι ο συγγραφέας αναφέρει πόσο δύσκολο θα ήταν να εκτελεστούν λόγω της έλλειψης λειτουργιών στον βασικό πυρήνα Android. Κατά ειρωνικό τρόπο, ο ασφαλής RKP Hypervisor παρείχε όλα τα εργαλεία που απαιτούνταν για την πραγματοποίηση των επιθέσεων. Φαίνεται ότι μερικές φορές το λογισμικό με καλές προθέσεις προκαλεί περισσότερα προβλήματα από αυτά που λύνει και είμαστε τυχεροί που έχουμε κόσμο όπως ο Gal Beniamini πρόθυμος να λερώσει τα χέρια του και να δοκιμάσει ότι η τεκμηρίωση ταιριάζει με αυτό που πραγματικά το λογισμικό κάνει.

Παρόλο που αυτά τα exploits φαίνονται τρομακτικά και κάνουν το Knox να ακούγεται πολύ ευάλωτο, θα ήθελα να διαβεβαιώσω όλους ότι όλα αυτά τα ζητήματα ήταν διορθώθηκε στην ενημέρωση Ιανουαρίου από τη Samsung. Επιπλέον, αυτά τα exploits απαιτούν πολύ βαθιά κατανόηση των επεξεργαστών ARM και του προγραμματισμού, επομένως το εμπόδιο για την είσοδο στη χρήση αυτών των exploits είναι αστρονομικά υψηλό.


Πηγή: Project Zero