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
