Google schrijft en herschrijft delen van Android in Rust om de beveiliging van het besturingssysteem als geheel te verbeteren, vergeleken met C en C++. Lees verder om meer te weten!
Android als complete OS-oplossing omvat veel bewegende delen. Heel breed gesproken zijn deze onderdelen het app-ecosysteem en vervolgens het besturingssysteem zelf. Als ontwikkelaar varieert de programmeertaal van uw keuze, afhankelijk van aan welk deel van Android u werkt. Voor app-ontwikkelaars zijn Java en Kotlin populaire opties. Voor ontwikkelaars die aan het besturingssysteem en de lagere niveaus daarin werken, zijn C en C++ tot nu toe populaire keuzes geweest. Vandaag voegt Google een derde optie toe voor OS-ontwikkelaars, aangezien het Android Open Source Project nu de programmeertaal Rust ondersteunt voor het ontwikkelen van het besturingssysteem zelf.
Beperkingen van C en C++
Lagere niveaus van het Android-besturingssysteem vereisen systeemprogrammeertalen zoals C en C++. Deze talen bieden ontwikkelaars controle en voorspelbaarheid, wat belangrijk is bij toegang tot systeembronnen en hardware op laag niveau.
Helaas bieden C en C++ geen garanties voor geheugenveiligheid, waardoor ze gevoelig zijn voor bugs en beveiligingsproblemen. De ontwikkelaar is verantwoordelijk voor het beheer van de geheugenlevensduur in deze talen, maar in complexe codebases met meerdere threads is dat makkelijker gezegd dan gedaan.
C en C++ vormen samen tientallen miljoenen regels code op het Android-platform. Deze geheugenveiligheidsbugs worden de moeilijkst te verhelpen bron van onjuiste code en vertegenwoordigen ongeveer 70% van de zeer ernstige beveiligingskwetsbaarheden in Android. Alleen het oplossen van deze bugs is onvoldoende om het probleem op te lossen, en een betere aanpak zou zijn om ze in de eerste plaats te voorkomen.
Het gebrek aan geheugenveiligheidsgaranties dwingt ontwikkelaars om Android-processen uit te voeren binnen strak beperkte en onbevoorrechte sandboxes. Maar sandboxen kosten veel resources, kosten extra overhead en introduceren latentie. Sandboxing elimineert de kwetsbaarheden van de code ook niet volledig, en de doeltreffendheid ervan wordt verminderd vanwege de hoge bugdichtheid, waardoor aanvallers meerdere kwetsbaarheden aan elkaar kunnen koppelen.
Een andere beperking, hoewel niet uniek voor C en C++ maar van toepassing op alle geheugenveiligheidsproblemen, is dat de foutieve status daadwerkelijk moet worden geactiveerd in geïnstrumenteerde code om te worden gedetecteerd. Dus zelfs als uw code uitstekend is getest, kan de daadwerkelijke bug onopgemerkt blijven. En als er bugs worden gevonden, is het oplossen ervan een andere taak, waarbij een lang en kostbaar proces betrokken is dat niet altijd tot een correcte oplossing leidt. Bugdetectie wordt dus onbetrouwbaar en bugpreventie is de betere aanpak in het licht van deze beperkingen.
Dit is waar de overstap naar een geheugenveilige taal zoals Rust in beeld komt.
Roest en zijn voordelen
Rust biedt geheugenveiligheidsgaranties door gebruik te maken van een combinatie van compilatiecontroles om de levensduur/eigendom van objecten af te dwingen, en runtimecontroles om ervoor te zorgen dat geheugentoegang geldig is. Deze veiligheid wordt bereikt terwijl de prestaties gelijkwaardig zijn aan die van C en C++. Rust vermindert ook de behoefte aan sandboxing, waardoor ontwikkelaars meer overheadruimte krijgen om nieuwe functies te introduceren die veiliger zijn en minder middelen verbruiken.
Hoewel Rust inderdaad zijn voordelen heeft, is het niet haalbaar om van de ene op de andere dag het hele Android-besturingssysteem naar Rust over te zetten. En dat is misschien niet eens nodig, aangezien de meeste geheugenbugs van Android voorkomen in nieuwe of onlangs gewijzigde code, waarbij ongeveer 50% minder dan een jaar oud is. Google is van mening dat zijn inspanningen op het gebied van geheugenveilige taal het beste gericht kunnen zijn op nieuwe ontwikkelingen in plaats van op het herschrijven van volwassen C- en C++-code.
Rust richt zich ook op het voorkomen van bugs in plaats van zwaar te leunen op het detecteren van bugs, wat resulteert in een verbeterde correctheid van de code. Het heeft verschillende belangrijke kenmerken, zoals geheugenveiligheid, gelijktijdigheid van gegevens, expressievere systemen en onveranderlijk standaard referenties en variabelen, veiliger afhandeling van gehele getallen, betere foutafhandeling in standaardbibliotheken, en nog veel meer meer.
Wat betekent de overstap naar Rust voor Android?
Google zegt dat het de afgelopen 18 maanden Rust-ondersteuning heeft toegevoegd aan het Android Open Source Project. Maar het toevoegen van een nieuwe taal aan het Android-platform is een enorme onderneming. Sommige toolchains en afhankelijkheden moeten worden onderhouden, de testinfrastructuur en tooling moeten worden bijgewerkt en ontwikkelaars moeten worden opgeleid.
Google heeft een aantal early adopter-projecten die ze de komende maanden zullen delen. Maar toch wordt duidelijk gemaakt dat het opschalen van Rust-ondersteuning naar een groter deel van het besturingssysteem een meerjarig project is.
Voor zover we kunnen zien, gebruikt Google Rust al op een paar plaatsen. Android's nieuwe Bluetooth-stack herschrijft met codenaam "Gabeldorsche" wordt geschreven in Rust. De werkzaamheden aan Gabeldorsche zijn begonnen rond de tijd van Android 11, maar zijn nog steeds niet in gebruik. Android's Sleutelarchief 2.0 module is geschreven in Rust, en dat geldt ook voor het gebruikersruimtegedeelte van binder, het IPC-stuurprogramma van Android. Hoewel niet gerelateerd aan Android, Fuchsia'is nieuw netstack wordt ook in Rust geschreven.
Voor app-ontwikkelaars verandert de overstap niets aan de manier waarop je als app-ontwikkelaar apps schrijft of hoe de framework-API’s werken. Deze schakelaar heeft alleen invloed op de manier waarop het besturingssysteem is geschreven. Volgens een lid van het Android Developer Relations-teamGoogle is momenteel ook niet van plan een Rust NDK uit te brengen. De ondersteunde talen voor app-ontwikkeling blijven Kotlin, Java, C en C++.