Rust fĂĽr Firmware: Sicherheit durch speichersichere Programmiersprachen
Das Android-Team erläutert die schrittweise Einführung von Rust in Firmware, um Sicherheitslücken zu reduzieren und die Speichersicherheit zu erhöhen.
Android setzt bereits seit einiger Zeit auf speichersichere Programmiersprachen wie Rust, um die Sicherheit des Betriebssystems zu erhöhen. Nun wird dieser Ansatz auch auf die Firmware ausgeweitet, insbesondere in sicherheitskritischen Bereichen. Dazu findet sich in Googles Security Blog ein Beitrag aus dem Android-Team, in dem die beiden Autoren Ivan Lozano und Dominik Maier die Vorteile und den Prozess der Einführung von Rust in bestehende Firmware-Codebasen erläutern.
Speichersicherheit fĂĽr Firmware
Firmware agiert als Schnittstelle zwischen Hardware und höherwertiger Software und ist laut Blogbeitrag oft in unsichereren Programmiersprachen wie C oder C++ geschrieben. Diese Sprachen sind offenbar anfällig für Sicherheitslücken, die Angreifer ausnutzen können. Für die Autoren des Beitrags bietet Rust eine speichersichere Alternative mit vergleichbarer Leistung und soll die Interoperabilität mit C ohne zusätzlichen Overhead ermöglichen.
Schrittweise EinfĂĽhrung von Rust
Die EinfĂĽhrung von Rust in bestehende Firmware-Codebasen soll schrittweise erfolgen. Zuerst sollen neue und besonders risikoreiche Codeabschnitte ersetzt werden. Dies umfasst vor allem Code, der externe, nicht vertrauenswĂĽrdige Eingaben verarbeitet. Durch den Einsatz von Rust fĂĽr neue Entwicklungen und die schrittweise Ersetzung bestehender Komponenten soll sich die Anzahl der SicherheitslĂĽcken langfristig reduzieren.
Technische Herausforderungen
Die Einführung von Rust in Firmware erfordert jedoch einige technische Anpassungen. Dazu gehört beispielsweise die Verwendung von no_std
, um Rust ohne die Standardbibliothek zu nutzen, die Erstellung von Foreign Function Interface (FFI)-Bindings fĂĽr die Interaktion mit vorhandenem C-Code und die Anpassung an Bare-Metal-Umgebungen, in denen kein Betriebssystem vorhanden ist.
Bei der Auswahl geeigneter Rust-Bibliotheken sollten diese laut Blogbeitrag gut dokumentiert, getestet und no_std
-kompatibel sein. In Fällen, in denen Bibliotheken nicht no_std
-kompatibel sind, können sie portiert werden. Dieses Vorgehen erfordert jedoch Anpassungen im Code, um die Abhängigkeit von der Standardbibliothek zu entfernen.
Am 5. November findet zum vierten Mal die betterCode() Rust statt. Dieses Jahr steht die Embedded-Entwicklung im Fokus, und ein Vortrag wird sich dem Einsatz von Rust in sicherheitskritischen Systemen widmen.
Das Programm der von iX und dpunkt.verlag ausgerichteten Online-Konferenz wird Ende Juni veröffentlicht. Bis dahin sind Tickets zum besonders günstigen Blind-Bird-Preis von 199,- Euro (zzgl. 19 % MwSt.) verfügbar.
Erstellung eines Rust-Shims
Ein Shim in Rust kommt zu Einsatz, um bestehende C/C++ APIs zu integrieren. Das ermöglicht offenbar die Nutzung sicherer Rust-Funktionsweisen in der Firmware.
Ein Rust Shim ist eine dünne Schicht oder ein Adapter, der dazu dient, Rust-Code in bestehende Systeme, die in einer anderen Programmiersprache (meistens C oder C++) geschrieben sind, zu integrieren. Der Shim übernimmt die Aufgabe, die Schnittstellen (APIs) der bestehenden Bibliotheken oder Funktionen nachzubilden und ermöglicht so eine nahtlose Interoperabilität zwischen Rust und der anderen Programmiersprache.
Optimierungen des Speicherbedarfs
Um die Leistung und den Speicherbedarf zu optimieren, empfiehlt das Android-Team, Link-Time Optimization (LTO) und andere Compiler-Einstellungen zu verwenden. Diese Optimierungen können die Ausgabegröße der Bibliothek reduzieren und die Leistung verbessern.
Nähere Informationen zur schrittweisen Einführung von Rust in bestehende Firmware-Codebasen finden sich im Beitrag auf dem Google Security Blog.
(mdo)