Google schreibt Teile von Android in Rust und schreibt sie neu, um die Sicherheit des Betriebssystems insgesamt im Vergleich zu C und C++ zu verbessern. Lesen Sie weiter, um mehr zu erfahren!
Android als vollständige Betriebssystemlösung umfasst viele bewegliche Teile. Im Großen und Ganzen handelt es sich bei diesen Teilen um das App-Ökosystem und dann um das Betriebssystem selbst. Als Entwickler hängt die Programmiersprache Ihrer Wahl davon ab, an welchem Teil von Android Sie arbeiten. Für App-Entwickler sind Java und Kotlin beliebte Optionen. Für Entwickler, die am Betriebssystem und den unteren Ebenen darin arbeiten, waren C und C++ bisher beliebte Optionen. Heute fügt Google eine dritte Option für Betriebssystementwickler hinzu, da das Android Open Source Project nun die Programmiersprache Rust für die Entwicklung des Betriebssystems selbst unterstützt.
Einschränkungen von C und C++
Niedrigere Versionen des Android-Betriebssystems erfordern Systemprogrammiersprachen wie C und C++. Diese Sprachen bieten Entwicklern Kontrolle und Vorhersehbarkeit, was beim Zugriff auf Systemressourcen und Hardware auf niedriger Ebene wichtig ist.
Leider bieten C und C++ keine Garantien für die Speichersicherheit, wodurch sie anfällig für Fehler und Sicherheitslücken sind. Der Entwickler ist für die Verwaltung der Speicherlebensdauer dieser Sprachen verantwortlich, aber bei komplexen und Multithread-Codebasen ist das leichter gesagt als getan.
C und C++ bilden zusammen zig Millionen Codezeilen auf der Android-Plattform. Diese Sicherheitslücken im Speicher stellen die am schwierigsten zu behebende Quelle für fehlerhaften Code dar und machen etwa 70 % der schwerwiegenden Sicherheitslücken von Android aus. Das bloße Beheben dieser Fehler reicht nicht aus, um das Problem zu lösen, und ein besserer Ansatz wäre, sie von vornherein zu verhindern.
Der Mangel an Speichersicherheitsgarantien zwingt Entwickler dazu, Android-Prozesse in stark eingeschränkten und unprivilegierten Sandboxes auszuführen. Aber Sandboxes sind ressourcenintensiv, verbrauchen zusätzlichen Overhead und führen zu Latenz. Durch Sandboxing werden die Schwachstellen des Codes auch nicht vollständig beseitigt, und seine Wirksamkeit wird aufgrund der hohen Fehlerdichte verringert, was es Angreifern zusätzlich ermöglicht, mehrere Schwachstellen zu verketten.
Eine weitere Einschränkung, die zwar nicht nur für C und C++ gilt, aber für alle Speichersicherheitsprobleme gilt, besteht darin, dass der fehlerhafte Zustand tatsächlich im instrumentierten Code ausgelöst werden muss, um erkannt zu werden. Selbst wenn Ihr Code hervorragend getestet wurde, bleibt der eigentliche Fehler möglicherweise unentdeckt. Und wenn Fehler gefunden werden, ist deren Behebung eine weitere Aufgabe, die einen langen und kostspieligen Prozess erfordert, der möglicherweise nicht immer zu einer korrekten Behebung führt. Dadurch wird die Fehlererkennung unzuverlässig, und angesichts dieser Einschränkungen ist die Fehlervermeidung der bessere Ansatz.
Hier kommt der Wechsel zu einer speichersicheren Sprache wie Rust ins Spiel.
Rost und seine Vorteile
Rust bietet Garantien für die Speichersicherheit, indem es eine Kombination aus Prüfungen zur Kompilierungszeit verwendet, um die Lebensdauer/Besitz von Objekten durchzusetzen, und Laufzeitprüfungen, um sicherzustellen, dass Speicherzugriffe gültig sind. Diese Sicherheit wird bei gleichwertiger Leistung wie C und C++ erreicht. Rust reduziert auch den Bedarf an Sandboxing und gibt Entwicklern mehr Spielraum für die Einführung neuer Funktionen, die sicherer und ressourcenschonender sind.
Obwohl Rust tatsächlich seine Vorteile hat, ist es nicht möglich, das gesamte Android-Betriebssystem über Nacht auf Rust umzustellen. Und das ist möglicherweise nicht einmal nötig, da die meisten Speicherfehler von Android in neuem oder kürzlich geändertem Code auftreten und etwa 50 % weniger als ein Jahr alt sind. Google ist davon überzeugt, dass sich seine Bemühungen um eine speichersichere Sprache am besten auf neue Entwicklungen konzentrieren, anstatt ausgereiften C- und C++-Code neu zu schreiben.
Rust konzentriert sich auch auf die Vermeidung von Fehlern, anstatt sich stark auf die Erkennung von Fehlern zu verlassen, was zu einer verbesserten Korrektheit des Codes führt. Es verfügt über mehrere Schlüsselfunktionen wie Speichersicherheit, Datenparallelität, ausdrucksstärkere Typsysteme und Unveränderlichkeit Referenzen und Variablen standardmäßig, sicherere Ganzzahlbehandlung, bessere Fehlerbehandlung in Standardbibliotheken und vieles mehr mehr.
Was bedeutet der Wechsel zu Rust für Android?
Google gibt an, dass es seit 18 Monaten Rust-Unterstützung zum Android Open Source Project hinzufügt. Aber das Hinzufügen einer neuen Sprache zur Android-Plattform ist ein enormes Unterfangen. Einige Toolketten und Abhängigkeiten müssen gepflegt, Testinfrastruktur und Tools aktualisiert und Entwickler geschult werden.
Google hat einige Early-Adopter-Projekte, die in den kommenden Monaten vorgestellt werden. Dennoch wird deutlich, dass die Skalierung der Rust-Unterstützung auf weitere Betriebssysteme ein mehrjähriges Projekt ist.
Soweit wir sehen können, nutzt Google Rust bereits an einigen Stellen. Neufassung des neuen Bluetooth-Stacks von Android mit dem Codenamen „Gabeldorsche„wird in Rust geschrieben. Die Arbeiten an Gabeldorsche begannen etwa zur Zeit von Android 11, werden aber noch nicht verwendet. Androids Keystore 2.0 Das Modul ist in Rust geschrieben, ebenso wie der Userspace-Teil von Binder, dem IPC-Treiber von Android. Obwohl es nichts mit Android zu tun hat, Fuchsieist neu Netstack wird auch in Rust geschrieben.
Für App-Entwickler ändert sich durch die Umstellung nichts daran, wie Sie als App-Entwickler Apps schreiben oder wie die Framework-APIs funktionieren. Dieser Schalter beeinflusst nur, wie das Betriebssystem geschrieben wird. Laut einem Mitglied des Android Developer Relations-TeamsGoogle plant derzeit auch nicht, ein Rust NDK zu veröffentlichen. Die unterstützten Sprachen für die App-Entwicklung sind weiterhin Kotlin, Java, C und C++.