Im Linux-Kernel 6.18 wurde die Binder IPC-Implementierung für Android aufgenommen, die in Rust geschrieben wurde.

In den Code-Basis des Linux-Kernels, auf dessen Grundlage die Version 6.18 erstellt wird, ist die Implementierung des Inter-Prozess-Kommunikationsmechanismus Binder aufgenommen, der in Rust geschrieben wurde. Binder wird in Android verwendet, um die Interaktion zwischen Prozessen zu organisieren und entfernte Methodenaufrufe zu ermöglichen (ein Android-Prozess kann eine Methode oder Funktion in einem anderen Android-Prozess aufrufen, indem er Binder verwendet, um zwischen Prozessen zu identifizieren, zu rufen und Argumente zu übermitteln). Der Code von Binder wurde im Rahmen eines Projekts zur Verbesserung der Sicherheit, Förderung sicherer Programmierpraktiken und zur Steigerung der Effizienz bei der Erkennung von Speicherproblemen in Android auf Rust umgeschrieben (etwa 70 % aller gefährlichen Sicherheitslücken, die in Android entdeckt wurden, sind auf Speicherfehler zurückzuführen).

Die Verwendung von Rust hat es ermöglicht, einige Probleme zu lösen, mit denen die Entwickler von Binder konfrontiert waren, einschließlich Fehlern im Zusammenhang mit der Zählerüberprüfung, Sperrungen und Grenzkontrollen, sowie die Komplexität der Fehlerbehandlung erheblich zu reduzieren. Die Implementierung von Binder in Rust ist in Bezug auf die Funktionalität mit der ursprünglichen C-Version vergleichbar, besteht alle AOSP (Android Open-Source Project)-Tests und kann zur Erstellung funktionierender Android-Romanzen verwendet werden. Trotz der erweiterten Funktionen und der Unterstützung von Objekten mit komplexer Besitzsemantik ist der Rust-Treiber kleiner als die C-Version – 5,5 gegenüber 5,8 Tausend Codezeilen.

Im Commit-Beschreibung erwähnt der Autor folgende Beweggründe für das Umschreiben von Binder:

  • Binder entwickelt sich seit 15 Jahren, und in dieser Zeit haben sich seine Funktionalität und Komplexität erheblich erhöht – das Projekt liegt an der Schnittstelle aller Android-Komponenten und umfasst viele Aufgaben, die über IPC hinausgehen:
    • korrekte Analyse und Umwandlung des Inhalts von Transaktionen, die mehrere Objekte unterschiedlicher Typen (z. B. Zeiger, Dateideskriptoren) enthalten können, die miteinander interagieren;
    • Kontrolle der Größe von Thread-Pools im Benutzerraum und Gewährleistung der Zuweisung von Transaktionen an Threads, um gegenseitige Sperrungen bei Erschöpfung der Threads im Pool zu vermeiden;
    • Überwachung der Zähler für Objekte, die von mehreren Prozessen gemeinsam genutzt werden, indem Änderungen der Zähler zwischen den Prozessen korrekt übermittelt werden;
    • Verarbeitung einer Vielzahl von Fehlerszenarien und Kombination von 13 verschiedenen Sperren, 7 Linkzählern und atomaren Variablen. Dabei sollte er solche Aufgaben so schnell und korrekt wie möglich ausführen.
  • Im alten Code hat sich eine signifikante technische Schulden angehäuft, die sowohl die Fehlersuche als auch die weitere Entwicklung erschwerte. Beispielsweise finden sich im Kern umfangreiche Funktionen mit mehr als tausend Codezeilen, fragwürdige Methoden zur Fehlerbehandlung und verworrene Strukturen.
  • Der Binder ist ein sicherheitskritisches Element von Android, da Plattformbestandteile, 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 in Verbindung mit technischen Schulden erschwert das Aufrechterhalten eines hohen Sicherheitsniveaus im Binder.

Quelle: opennet.ru

60GB SSD 8Gb DDR4