Google skriver og omskriver dele af Android i Rust for at forbedre sikkerheden af operativsystemet som helhed vs. C og C++. Læs videre for at vide mere!
Android som en komplet OS-løsning involverer en masse bevægelige dele. Meget bredt set er disse dele appens økosystem og derefter selve OS. Som udvikler varierer dit valgte programmeringssprog afhængigt af hvilken del af Android du arbejder på. For app-udviklere er Java og Kotlin populære muligheder. For udviklere, der arbejder på OS og de lavere niveauer i det, har C og C++ været populære valg hidtil. I dag tilføjer Google en tredje mulighed for OS-udviklere, da Android Open Source Project nu understøtter programmeringssproget Rust til udvikling af selve OS.
Begrænsninger for C og C++
Lavere niveauer af Android OS kræver systemprogrammeringssprog som C og C++. Disse sprog giver udviklere kontrol og forudsigelighed, hvilket er vigtigt, når de får adgang til systemressourcer og hardware på lavt niveau.
Desværre giver C og C++ ikke hukommelsessikkerhedsgarantier, hvilket gør dem tilbøjelige til fejl og sikkerhedssårbarheder. Udvikleren er ansvarlig for at styre hukommelsens levetid på disse sprog, men i komplekse og flertrådede kodebaser er det lettere sagt end gjort.
C og C++ udgør tilsammen titusinder af linjer kode på Android-platformen. Disse hukommelsessikkerhedsfejl bliver den mest vanskelige at adressere kilde til ukorrekt kode, der repræsenterer ~70 % af Androids høje sikkerhedssårbarheder. Blot at rette disse fejl bliver utilstrækkeligt til at håndtere problemet, og en bedre tilgang ville være at forhindre dem i første omgang.
Manglen på hukommelsessikkerhedsgarantier tvinger udviklere til at køre Android-processer inden for stramt begrænsede og uprivilegerede sandkasser. Men sandkasser er dyre på ressourcer, de bruger ekstra overhead og introducerer latens. Sandboxing eliminerer heller ikke kodens sårbarheder fuldstændigt, og dens effektivitet er reduceret på grund af høj fejltæthed, hvilket yderligere tillader angribere at kæde flere sårbarheder.
En anden begrænsning, selvom den ikke er unik for C og C++, men gælder for alle hukommelsessikkerhedsproblemer, er, at den fejlagtige tilstand faktisk skal udløses i instrumenteret kode for at blive opdaget. Så selvom din kode har fremragende test, kan den faktiske fejl forblive uopdaget. Og når der bliver fundet fejl, er det en anden opgave at få dem rettet, som involverer en lang og dyr proces, som måske ikke altid fører til en korrekt rettelse. Således bliver fejldetektion upålidelig, og fejlforebyggelse er den bedste tilgang at tage i lyset af disse begrænsninger.
Det er her skiftet til et hukommelsessikkert sprog som Rust kommer ind i billedet.
Rust og dens fordele
Rust giver hukommelsessikkerhedsgarantier ved at bruge en kombination af kompileringstidstjek for at håndhæve objektets levetid/ejerskab og runtime-tjek for at sikre, at hukommelsesadgange er gyldige. Denne sikkerhed opnås samtidig med, at ydeevnen svarer til C og C++. Rust reducerer også behovet for sandboxing, hvilket giver udviklere mere overhead plads til at introducere nye funktioner, der er sikrere og lettere på ressourcerne.
Selvom Rust faktisk har sine fordele, er det ikke muligt at skifte hele Android OS til Rust natten over. Og det er måske ikke engang nødvendigt, da de fleste af Androids hukommelsesfejl forekommer i ny eller nyligt ændret kode, hvor omkring 50 % er mindre end et år gamle. Google mener, at dets hukommelsessikre sprogindsats bedst fokuserer på nye udviklinger i stedet for at omskrive moden C- og C++-kode.
Rust fokuserer også på at forhindre fejl i stedet for at læne sig meget op af detektering af fejl, hvilket resulterer i forbedret korrekthed af koden. Det har flere nøglefunktioner, såsom hukommelsessikkerhed, datasamtidighed, mere udtryksfulde typesystemer, uforanderlige referencer og variabler som standard, sikrere heltalshåndtering, bedre fejlhåndtering i standardbiblioteker og meget mere.
Hvad betyder skiftet til Rust for Android?
Google siger, at det har tilføjet Rust-understøttelse til Android Open Source Project i de sidste 18 måneder. Men at tilføje et nyt sprog til Android-platformen er en enorm opgave. Nogle værktøjskæder og afhængigheder skal vedligeholdes, testinfrastruktur og værktøj skal opdateres, og udviklere skal trænes.
Google har et par early adopter-projekter, som de vil dele i de kommende måneder. Men alligevel bliver det gjort klart, at skalering af Rust-understøttelse til flere af operativsystemet er et flerårigt projekt.
Fra hvad vi kan se, bruger Google allerede Rust nogle få steder. Androids nye Bluetooth-stak omskrivning med kodenavnet "Gabeldorsche" bliver skrevet i Rust. Arbejdet startede på Gabeldorsche omkring Android 11, men er stadig ikke i brug endnu. Androids Keystore 2.0 modul er skrevet i Rust, og det samme er brugerpladsdelen af binder, Androids IPC-driver. Selvom det ikke er relateret til Android, Fuchsiaer nyt netstack skrives også i Rust.
For app-udviklere ændrer switchen intet ved, hvordan du som app-udvikler skriver apps, eller hvordan framework-API'erne fungerer. Denne switch påvirker kun hvordan OS skrives. Ifølge et medlem af Android Developer Relations-teamet, planlægger Google heller ikke at frigive en Rust NDK i øjeblikket. De understøttede sprog til appudvikling vil fortsat være Kotlin, Java, C og C++.