Google utvikler deler av Android i Rust for å forbedre sikkerheten

Google skriver og omskriver deler av Android i Rust for å forbedre sikkerheten til operativsystemet som helhet, kontra C og C++. Les videre for å vite mer!

Android som en komplett OS-løsning innebærer mange bevegelige deler. Svært bredt sett er disse delene appens økosystem og deretter selve operativsystemet. Som utvikler varierer programmeringsspråket ditt avhengig av hvilken del av Android du jobber med. For apputviklere er Java og Kotlin populære alternativer. For utviklere som jobber med operativsystemet og de lavere nivåene i det, har C og C++ vært populære valg så langt. I dag legger Google til et tredje alternativ for OS-utviklere, ettersom Android Open Source Project nå støtter programmeringsspråket Rust for å utvikle selve OS.

Begrensninger for C og C++

Lavere nivåer av Android OS krever systemprogrammeringsspråk som C og C++. Disse språkene gir utviklere kontroll og forutsigbarhet, noe som er viktig når de får tilgang til systemressurser og maskinvare på lavt nivå.

Dessverre klarer ikke C og C++ å gi minnesikkerhetsgarantier, noe som gjør dem utsatt for feil og sikkerhetssårbarheter. Utvikleren er ansvarlig for å administrere minnelevetiden på disse språkene, men i komplekse og flertrådede kodebaser er det lettere sagt enn gjort.

C og C++ utgjør til sammen titalls millioner linjer med kode på Android-plattformen. Disse minnesikkerhetsfeilene blir den mest vanskelig å adressere kilden til feil kode, og representerer ~70 % av Androids sikkerhetssårbarheter med høy alvorlighetsgrad. Bare å fikse disse feilene blir utilstrekkelig for å håndtere problemet, og en bedre tilnærming ville være å forhindre dem i utgangspunktet.

Mangelen på minnesikkerhetsgarantier tvinger utviklere til å kjøre Android-prosesser innenfor stramt begrensede og uprivilegerte sandkasser. Men sandkasser er dyre på ressurser, forbruker ekstra overhead og introduserer latens. Sandboxing eliminerer heller ikke kodens sårbarheter helt, og dens effektivitet reduseres på grunn av høy feiltetthet, noe som ytterligere lar angripere lenke flere sårbarheter.

En annen begrensning, selv om den ikke er unik for C og C++, men som gjelder for alle minnesikkerhetsproblemer, er at den feilaktige tilstanden faktisk må utløses i instrumentert kode for å bli oppdaget. Så selv om koden din har utmerket testing, kan den faktiske feilen forbli uoppdaget. Og når det blir funnet feil, er det en annen oppgave å fikse dem, som involverer en lang og kostbar prosess som kanskje ikke alltid fører til en riktig løsning. Dermed blir feildeteksjon upålitelig, og feilforebygging er den bedre tilnærmingen å ta i lys av disse begrensningene.

Det er her overgangen til et minnesikkert språk som Rust kommer inn i bildet.

Rust og dens fordeler

Rust gir minnesikkerhetsgarantier ved å bruke en kombinasjon av kompileringstidskontroller for å håndheve objektlevetid/eierskap, og kjøretidskontroller for å sikre at minnetilganger er gyldige. Denne sikkerheten oppnås samtidig som den gir tilsvarende ytelse som C og C++. Rust reduserer også behovet for sandboxing, noe som gir utviklere mer overhead plass til å introdusere nye funksjoner som er tryggere og lettere for ressurser.

Selv om Rust faktisk har sine fordeler, er det ikke mulig å bytte hele Android OS til Rust over natten. Og det er kanskje ikke engang nødvendig, ettersom de fleste av Androids minnefeil forekommer i ny eller nylig modifisert kode, med omtrent 50 % som er mindre enn ett år gamle. Google mener at dets minnesikre språkinnsats er best fokusert på nye utviklinger i stedet for å omskrive moden C- og C++-kode.

Rust fokuserer også på å forhindre feil i stedet for å lene seg tungt på deteksjon av feil, noe som resulterer i forbedret korrekthet av koden. Den har flere nøkkelfunksjoner, som minnesikkerhet, datasamtidighet, mer uttrykksfulle typesystemer, uforanderlig referanser og variabler som standard, sikrere heltallshåndtering, bedre feilhåndtering i standardbiblioteker og mye mer.

Hva betyr bytte til Rust for Android?

Google sier at de har lagt til Rust-støtte til Android Open Source Project de siste 18 månedene. Men å legge til et nytt språk til Android-plattformen er en enorm oppgave. Noen verktøykjeder og avhengigheter må vedlikeholdes, testinfrastruktur og verktøy må oppdateres, og utviklere må trenes.

Google har noen få tidlige brukerprosjekter som de vil dele i løpet av de kommende månedene. Men likevel blir det gjort klart at skalering av Rust-støtte til flere av operativsystemet er et flerårig prosjekt.

Etter det vi kan se, bruker Google allerede Rust noen få steder. Androids nye Bluetooth-stack-omskriving med kodenavn "Gabeldorsche" blir skrevet i Rust. Arbeidet startet med Gabeldorsche rundt Android 11, men er fortsatt ikke i bruk ennå. Android sine Keystore 2.0 modulen er skrevet i Rust, og det samme er brukerområdedelen av binderen, Androids IPC-driver. Selv om det ikke er relatert til Android, Fuchsiaer nytt nettstack skrives også i Rust.

For apputviklere endrer ikke bryteren noe om hvordan du som apputvikler skriver apper eller hvordan ramme-API-ene fungerer. Denne bryteren påvirker bare hvordan operativsystemet skrives. I følge et medlem av Android Developer Relations-teamet, Google planlegger heller ikke å gi ut en Rust NDK for øyeblikket. De støttede språkene for apputvikling vil fortsatt være Kotlin, Java, C og C++.