In den Code des Linux-Kernels, der die Version 6.18 bildet, wurde die Implementierung des Inter-Process Communication (IPC)-Mechanismus Binder, geschrieben in Rust, integriert. Binder wird in Android verwendet, um die Interaktion zwischen Prozessen und Remote-Methodenaufrufen zu organisieren (ein Android-Prozess kann eine Methode oder Funktion in einem anderen Android-Prozess aufrufen, indem er Binder zur Identifizierung, zum Aufruf und zur Übertragung von Argumenten zwischen Prozessen nutzt). Der Binder-Code wurde im Rahmen eines Projekts zur Verbesserung der Sicherheit, zur Förderung sicherer Programmierpraktiken und zur Steigerung der Effizienz bei der Erkennung von Speicherproblemen in Android überarbeitet (etwa 70 % aller kritischen Sicherheitsanfälligkeiten in Android resultieren aus Speicherfehlern).
Der Einsatz von Rust hat dazu beigetragen, einige Probleme zu lösen, mit denen Binder-Entwickler konfrontiert waren, einschließlich Referenzzählungsfehlern, Blockierungen und Grenzprüfungen, und hat die Komplexität der Fehlerbehandlung erheblich reduziert. Die Implementierung von Binder in Rust weist funktional ähnliche Merkmale auf wie die ursprüngliche Version in C, besteht alle Tests des AOSP (Android Open-Source Project) und kann zur Erstellung funktionierender Android-Betriebssystemversionen verwendet werden. Trotz der fortschrittlichen Funktionen und der Unterstützung von Objekten mit komplexen Besitzsemantiken ist der Rust-Treiber kleiner als die C-Version – 5,5 im Vergleich zu 5,8 Tausend Codezeilen.
Im Commit-Beschreibung erwähnt der Autor folgende Motive für die Neuschreibung von Binder:
- Binder hat sich bereits 15 Jahre lang entwickelt und in dieser Zeit haben sich sowohl seine Funktionalität als auch seine Komplexität erheblich erhöht – das Projekt befindet sich an der Schnittstelle aller Android-Komponenten und umfasst zahlreiche Aufgaben, die über IPC hinausgehen:
- eine korrekte Analyse und Umwandlung des Inhalts von Transaktionen, die mehrere Objekte verschiedener Typen (z. B. Zeiger, Dateideskriptoren) enthalten können, die miteinander interagieren;
- Kontrolle der Größe von Stream-Pools im Benutzerspeicher und Sicherstellung der Zuweisung von Transaktionen zu Streams, um Deadlocks bei Erschöpfung der Streams im Pool zu vermeiden;
- Überwachung der Zähler von Objektverweisen, die von mehreren Prozessen gemeinsam genutzt werden, mit korrekter Weiterleitung der Änderungen der Verweiszähler zwischen den Prozessen;
- Verarbeitung zahlreicher Fehler-Szenarien sowie die Kombination von 13 verschiedenen Sperren, 7 Verweiszählern und atomaren Variablen. Dabei sollte er die Aufgaben so schnell und korrekt wie möglich ausführen.
- Im alten Code hat sich eine erhebliche technische Schuldenlast angesammelt, die sowohl die Fehlersuche als auch die Weiterentwicklung erschwerte. Zum Beispiel gibt es im Kern große Funktionen mit mehr als tausend Zeilen Code, fragwürdige Methoden zur Fehlerbehandlung und verworrene Strukturen.
- Binder ist ein kritisches Sicherheitskomponente von Android, da Plattformelemente, die in isolierten Sandbox-Umgebungen arbeiten, wie der Renderprozess in Chrome und SW Codec, direkten Zugriff darauf haben. Eine Schwachstelle im Binder könnte die Isolation umgehen. Die hohe Komplexität und der technische Schulden belasten zudem die Gewährleistung eines hohen Sicherheitsniveaus im Binder erheblich.
Quelle: opennet.ru
