Google hat die Firmware pvmfm, die in Android verwendet wird, in Rust neu geschrieben

Im Rahmen der Sicherheitsverstärkung von kritischen Softwarekomponenten der Android-Plattform hat Google die Firmware pvmfm in der Programmiersprache Rust neu geschrieben. Diese Firmware wird zur Organisation der virtuellen Maschinen genutzt, die vom pVM-Hypervisor im Android Virtualization Framework gestartet werden. Zuvor war die Firmware in der Programmiersprache C geschrieben und lief auf dem U-Boot-Bootloader, in dessen Code früher Sicherheitsanfälligkeiten aufgrund von Problemen mit dem Speicher identifiziert wurden.

Die in Rust neu geschriebene Firmware ist Bestandteil von Android 14. Die während der Entwicklung entstandenen universellen Bibliotheken wurden in Form von Crate-Paketen bereitgestellt und an die Rust-Community übergeben. So wurde beispielsweise das Paket smccc zur Unterstützung von ARM-Schnittstellen wie PSCI (Power State Coordination Interface) und SMCCC (SMC Calling Convention) sowie das Paket aarch64-paging zur Manipulation von Speichertabellen veröffentlicht. Zudem wurden Fehler beheben und die Funktionalität des bestehenden Pakets virtio-drivers mit der Implementierung von VirtIO-Treibern erweitert. Neben der Android-Plattform werden die genannten Pakete auch im Oak-Projekt verwendet, das Komponenten für die sichere Übertragung, Speicherung und Verarbeitung von Daten in geschützten Umgebungen (TEE, Trusted Execution Environment) entwickelt.

Der pVM-Hypervisor übernimmt in der frühen Phase des Bootvorgangs die Kontrolle und garantiert eine vollständige Isolierung des Speichers virtuellen Maschinen und der Host-Umgebung. Dies verhindert, dass das Host-System auf die gesicherten virtuellen Maschinen zugreift, in denen vertrauliche Daten verarbeitet werden. Die Firmware pvmfm (Protected Virtual Machine Firmware) übernimmt direkt nach dem Start der virtuellen Maschine die Kontrolle, überprüft die bereitgestellte Umgebung und entscheidet über einen Notfallabbruch des Bootvorgangs bei Feststellung von Integritätsproblemen oder erstellt ein Boot-Zertifikat für das Gastbetriebssystem, falls die Vertrauenskette bestätigt wird.

Die Überarbeitung in der Sprache Rust ermöglicht eine einfachere und sicherere Einhaltung der "Zwei-Regel", die von Google zur Gewährleistung der Sicherheit der Systemkomponenten von Android verwendet wird. Laut dieser Regel muss jeder hinzugefügte Code nicht mehr als zwei von drei Bedingungen erfüllen: den Umgang mit unzuverlässigen Eingabedaten, die Verwendung einer unsicheren Programmiersprache (C/C++) und die Ausführung mit erhöhten Berechtigungen. Daraus folgt, dass der Code zur Verarbeitung externer Daten entweder auf minimale Berechtigungen beschränkt (isoliert) oder in einer sicheren Programmiersprache geschrieben sein sollte. Statistisch gesehen sind etwa 70 % aller gefährlichen Schwachstellen, die in Android entdeckt wurden, auf Fehler im Umgang mit dem Speicher zurückzuführen.

Rust ist auf sichere Speicherverwaltung fokussiert und reduziert das Risiko von Sicherheitsanfälligkeiten, die durch Probleme wie den Zugriff auf freigegebenen Speicher und Pufferüberläufe verursacht werden. Die sichere Arbeit mit Speicher wird in Rust während der Kompilierung durch Referenzprüfungen, das Tracking des Eigentums von Objekten und das Management der Lebensdauer (Sichtbarkeit) von Objekten gewährleistet. Zudem bewertet Rust die korrekte Speicherzugriffsregelung zur Laufzeit. Rust bietet auch Schutzmaßnahmen gegen Ganzzahlüberläufe, verlangt die zwingende Initialisierung von Variablenwerten vor deren Verwendung, behandelt Fehler in der Standardbibliothek besser, verwendet standardmäßig das Konzept von unveränderlichen (immutable) Referenzen und Variablen und bietet eine starke statische Typisierung zur Minimierung logischer Fehler.

Die Herausforderungen bei der Entwicklung von low-level Komponenten wie Treibern in der Programmiersprache Rust umfassen die Notwendigkeit, mit rohen Zeigern im unsafe-Modus zu arbeiten. Rust wurde mit einem Fokus auf die Verwaltung des Speichers, der im Programm verwendet wird, entwickelt. Bei Code, der direkt auf die Hardware zugreift, muss man auf gemeinsamen Speicher und MMIO zugreifen. Aktuell sind die Fähigkeiten von Rust im Umgang mit rohen Zeigern noch ausbaufähig, jedoch wird sich die Situation nach der Stabilisierung der Unterstützung für die Makros offset_of, slice_ptr_get und slice_ptr_len ändern.

Ein weiteres Manko ist der dringende Bedarf an verbessertem Syntax, um auf Felder von Strukturen und Indizes von Arrays über rohe Zeiger zuzugreifen, ohne Referenzen erstellen zu müssen. Außerdem gibt es Einschränkungen bei der Erstellung sicherer Wrapper über unsafe-Operationen, die zu undefiniertem Verhalten führen können und vom Compiler nicht überprüft werden können. Zum Beispiel ist es nicht möglich, solche Wrapper für Operationen mit Seitenwechsel-Tabellen zu erstellen, da die Seitenzuordnung in einem Teil des Programms Auswirkungen auf andere Teile haben kann.

Was die Größe des resultierenden Codes betrifft, so benötigte die alte Firmware-Version pVM 220 kB, während die neue 460 kB in Anspruch nimmt. Dabei wurden im überarbeiteten Code neue Funktionen hinzugefügt, die es ermöglichten, auf einige andere Komponenten, die beim Booten verwendet wurden, zu verzichten. Insgesamt wurde festgestellt, dass die Gesamtgröße aller alten und neuen Boot-Komponenten vergleichbar ist. Es wird darauf hingewiesen, dass man vergleichbare Ergebnisse mit der Programmiersprache C erzielen kann, wenn im Compiler zusätzliche Optimierungsmodi für die Größe aktiviert werden, überflüssige Abhängigkeiten entfernt werden und auf die Nutzung von String-Formatierungswerkzeugen verzichtet wird.

Zusätzlich wird die Fortsetzung der Arbeiten an der Implementierung der Möglichkeit erwähnt, vertrauenswürdige Anwendungen (Trusted Applications), die in der Programmiersprache Rust geschrieben sind, im Betriebssystem Trusty auszuführen. Trusty bietet eine TEE-Umgebung (Trusted Execution Environment) für Android, die parallel mit Android auf demselben Prozessor in einer separaten isolierten Umgebung läuft. Trusty kommt in Pixel-Geräten zum Einsatz und verwendet bereits Rust in Bibliotheken und Systemkomponenten (der Kernel bleibt in C).

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster