Στο πλαίσιο των προσπαθειών για την ενίσχυση της ασφάλειας κρίσιμων στοιχείων λογισμικού της πλατφόρμας Android Η Google έχει ξαναγράψει το firmware pvmfm στο Rust, το οποίο χρησιμοποιείται για την οργάνωση της λειτουργίας των εικονικών μηχανών που εκκινούνται από τον hypervisor pVM από το Android Πλαίσιο εικονικοποίησης. Προηγουμένως, το υλικολογισμικό γράφτηκε σε C και υλοποιήθηκε πάνω από το bootloader του U-Boot, του οποίου ο κώδικας είχε προηγουμένως βρεθεί ότι περιείχε ευπάθειες που προκαλούνταν από προβλήματα διαχείρισης μνήμης.
Το υλικολογισμικό που ξαναγράφηκε σε Rust περιλαμβάνεται στη συσκευασία. Android 14, και οι καθολικές βιβλιοθήκες που δημιουργήθηκαν κατά την ανάπτυξη του υλικολογισμικού έχουν συσκευαστεί ως πακέτα κιβωτίων και έχουν δωρηθεί στην κοινότητα του Rust. Για παράδειγμα, το πακέτο smccc έχει δημοσιευτεί για να υποστηρίξει τις διεπαφές PSCI (Power State Coordination Interface) και τις κλήσεις SMCCC (SMC Calling Convention) του ARM, καθώς και το πακέτο aarch64-pageing για τον χειρισμό πινάκων σελίδων μνήμης. Έχουν επίσης πραγματοποιηθεί εργασίες για τη διόρθωση σφαλμάτων και την επέκταση της λειτουργικότητας του υπάρχοντος πακέτου virtio-drivers με την υλοποίηση των προγραμμάτων οδήγησης VirtIO. Εκτός από την πλατφόρμα Android Τα συγκεκριμένα πακέτα χρησιμοποιούνται στο έργο Oak, το οποίο αναπτύσσει στοιχεία για τη μετάδοση, αποθήκευση και επεξεργασία δεδομένων σε προστατευμένα περιβάλλοντα (TEE, Trusted Execution Environment).
Ο υπερεπόπτης pVM αναλαμβάνει τον έλεγχο νωρίς στη διαδικασία εκκίνησης και παρέχει πλήρη απομόνωση μνήμης. εικονικές μηχανές και το περιβάλλον κεντρικού υπολογιστή, εμποδίζοντας το σύστημα κεντρικού υπολογιστή να έχει πρόσβαση σε προστατευμένες εικονικές μηχανές όπου γίνεται επεξεργασία ευαίσθητων δεδομένων. Το υλικολογισμικό pvmfm (Protected Virtual Machine Firmware) αναλαμβάνει τον έλεγχο αμέσως μετά την εκκίνηση της εικονικής μηχανής, επαληθεύει το δημιουργημένο περιβάλλον και αποφασίζει εάν θα διακόψει την εκκίνηση εάν εντοπιστούν προβλήματα ακεραιότητας ή δημιουργεί ένα πιστοποιητικό εκκίνησης για το σύστημα guest εάν επιβεβαιωθεί η αλυσίδα εμπιστοσύνης.
Η ανακατασκευή του Rust διευκολύνει και ασφαλέστερη τη συμμόρφωση με τον "κανόνα των δύο" που χρησιμοποιεί η Google για τη διατήρηση της ασφάλειας των στοιχείων του συστήματος. AndroidΣύμφωνα με αυτόν τον κανόνα, οποιοσδήποτε προστιθέμενος κώδικας πρέπει να πληροί το πολύ δύο από τις τρεις προϋποθέσεις: χειρισμό μη αξιόπιστων δεδομένων εισόδου, χρήση μη ασφαλούς γλώσσας προγραμματισμού (C/C++) και εκτέλεση με αυξημένα δικαιώματα. Αυτός ο κανόνας υποδηλώνει ότι ο κώδικας για την επεξεργασία εξωτερικών δεδομένων πρέπει είτε να έχει περιοριστεί στα ελάχιστα δικαιώματα (να έχει απομονωθεί) είτε να είναι γραμμένος σε ασφαλή γλώσσα προγραμματισμού. Σύμφωνα με τα στατιστικά στοιχεία της Google, περίπου το 70% όλων των επικίνδυνων ευπαθειών που εντοπίστηκαν στο Android, που προκαλείται από σφάλματα κατά την εργασία με τη μνήμη.
Το Rust εστιάζει στην ασφάλεια της μνήμης και μειώνει τον κίνδυνο ευπαθειών που προκαλούνται από ζητήματα όπως η χρήση μετά την απελευθέρωση και οι υπερβάσεις buffer. Το Rust παρέχει ασφάλεια μνήμης κατά τη μεταγλώττιση μέσω ελέγχου αναφορών, παρακολούθησης ιδιοκτησίας αντικειμένων και λογιστικής διάρκειας ζωής αντικειμένων (εμβέλειας), καθώς και μέσω επικύρωσης πρόσβασης στη μνήμη κατά τον χρόνο εκτέλεσης. Το Rust παρέχει επίσης προστασία από υπερχειλίσεις ακεραίων, απαιτεί την αρχικοποίηση των μεταβλητών πριν από τη χρήση, χειρίζεται καλύτερα τα σφάλματα στην τυπική βιβλιοθήκη, χρησιμοποιεί την έννοια των αμετάβλητων αναφορών και μεταβλητών από προεπιλογή και προσφέρει ισχυρή στατική τυποποίηση για την ελαχιστοποίηση των λογικών σφαλμάτων.
Μία από τις δυσκολίες που αντιμετωπίζονται κατά την ανάπτυξη στοιχείων χαμηλού επιπέδου, όπως τα προγράμματα οδήγησης, στο Rust είναι η ανάγκη εργασίας με γυμνούς δείκτες σε μη ασφαλή λειτουργία, καθώς το Rust έχει σχεδιαστεί με γνώμονα τη χρήση της μνήμης που έχει διατεθεί στο πρόγραμμα και σε κώδικα που εκτελείται χωρίς επίπεδα πάνω από το υλικό, είναι απαραίτητη η πρόσβαση σε κοινόχρηστη μνήμη και MMIO. Προς το παρόν, οι δυνατότητες του Rust για εργασία με γυμνούς δείκτες αφήνουν πολλά να είναι επιθυμητά, αλλά αυτό θα πρέπει να αλλάξει μόλις σταθεροποιηθεί η υποστήριξη για τις μακροεντολές offset_of, slice_ptr_get και slice_ptr_len.
Μεταξύ των ελλείψεων, αξίζει επίσης να σημειωθεί η ανάγκη για βελτιωμένη σύνταξη για την πρόσβαση σε πεδία δομής και δείκτες πινάκων μέσω γυμνών δεικτών χωρίς τη δημιουργία αναφορών, καθώς και οι περιορισμοί στη δημιουργία ασφαλών συνδέσεων σε μη ασφαλείς λειτουργίες που μπορούν να προκαλέσουν απροσδιόριστη συμπεριφορά και δεν μπορούν να ελεγχθούν από τον μεταγλωττιστή. Για παράδειγμα, τέτοιες συνδέσεις δεν μπορούν να δημιουργηθούν για λειτουργίες με πίνακες σελίδων μνήμης, καθώς η αντιστοίχιση σελίδων σε ένα μέρος του προγράμματος μπορεί να επηρεάσει άλλα μέρη.
Όσον αφορά το μέγεθος του προκύπτοντος κώδικα, η παλιά έκδοση του firmware pVM κατείχε 220 kB και η νέα - 460 kB, αλλά ταυτόχρονα προστέθηκαν νέες δυνατότητες στην ξαναγραμμένη έκδοση, χάρη στις οποίες ήταν δυνατό να απαλλαγούμε από ορισμένα άλλα στοιχεία που χρησιμοποιήθηκαν κατά τη φόρτωση. Ως αποτέλεσμα, το συνολικό μέγεθος όλων των παλιών και νέων στοιχείων φόρτωσης αποδείχθηκε συγκρίσιμο. Σημειώνεται ότι όταν το μέγεθος είναι πιο σημαντικό από την απόδοση, αποτελέσματα συγκρίσιμα με τη γλώσσα C μπορούν να επιτευχθούν ενεργοποιώντας πρόσθετες λειτουργίες βελτιστοποίησης μεγέθους στον μεταγλωττιστή, απορρίπτοντας περιττές εξαρτήσεις και μη χρησιμοποιώντας εργαλεία μορφοποίησης συμβολοσειρών.
Επιπλέον, αναφέρεται η συνέχιση των εργασιών για την υλοποίηση της δυνατότητας εκτέλεσης αξιόπιστων εφαρμογών (Trusted Application) γραμμένων στη γλώσσα Rust στο λειτουργικό σύστημα Trusty, η οποία παρέχει ένα TEE (Trusted Execution Environment) για Android, που εκτελείται παράλληλα με Android στον ίδιο επεξεργαστή σε ξεχωριστό, απομονωμένο περιβάλλον. Το Trusty χρησιμοποιείται σε συσκευές Pixel και χρησιμοποιεί ήδη το Rust σε βιβλιοθήκες και στοιχεία συστήματος (ο πυρήνας παραμένει σε C).
Πηγή: opennet.ru
