Google utvecklar delar av Android i Rust för att förbättra säkerheten

Google skriver och skriver om delar av Android i Rust för att förbättra säkerheten för operativsystemet som helhet, jämfört med C och C++. Läs vidare för att veta mer!

Android som en komplett OS-lösning innefattar många rörliga delar. Mycket brett sett är dessa delar appens ekosystem och sedan själva operativsystemet. Som utvecklare varierar ditt val av programmeringsspråk beroende på vilken del av Android du arbetar med. För apputvecklare är Java och Kotlin populära alternativ. För utvecklare som arbetar med operativsystemet och de lägre nivåerna inom det har C och C++ varit populära val hittills. Idag lägger Google till ett tredje alternativ för OS-utvecklare, eftersom Android Open Source Project nu stöder programmeringsspråket Rust för att utveckla själva operativsystemet.

Begränsningar för C och C++

Lägre nivåer av Android OS kräver systemprogrammeringsspråk som C och C++. Dessa språk ger utvecklare kontroll och förutsägbarhet, vilket är viktigt när de får åtkomst till systemresurser och hårdvara på låg nivå.

Tyvärr, C och C++ misslyckas med att tillhandahålla minnessäkerhetsgarantier, vilket gör dem utsatta för buggar och säkerhetssårbarheter. Utvecklaren ansvarar för att hantera minneslivslängden på dessa språk, men i komplexa och flertrådade kodbaser är det lättare sagt än gjort.

C och C++ utgör tillsammans tiotals miljoner rader kod på Android-plattformen. Dessa minnessäkerhetsbuggar blir den svårast att åtgärda källan till felaktig kod, och representerar ~70 % av Androids säkerhetssårbarheter. Att bara fixa dessa buggar blir otillräckligt för att hantera problemet, och ett bättre tillvägagångssätt skulle vara att förhindra dem i första hand.

Bristen på minnessäkerhet tvingar utvecklare att köra Android-processer inom hårt begränsade och oprivilegierade sandlådor. Men sandlådor är dyra på resurser, förbrukar extra omkostnader och introducerar latens. Sandboxing eliminerar inte heller kodens sårbarheter helt, och dess effektivitet minskar på grund av hög buggdensitet, vilket ytterligare tillåter angripare att kedja ihop flera sårbarheter.

En annan begränsning, även om den inte är unik för C och C++ men tillämplig på alla minnessäkerhetsproblem, är att det felaktiga tillståndet faktiskt måste utlösas i instrumenterad kod för att kunna upptäckas. Så även om din kod har utmärkta tester, kan den faktiska buggen förbli oupptäckt. Och när buggar hittas är det en annan uppgift att fixa dem, som involverar en lång och kostsam process som kanske inte alltid leder till en korrekt fix. Sålunda blir buggdetektering opålitlig, och buggförebyggande är det bättre sättet att ta i ljuset av dessa begränsningar.

Det är här övergången till ett minnessäkert språk som Rust kommer in i bilden.

Rost och dess fördelar

Rust tillhandahåller minnessäkerhetsgarantier genom att använda en kombination av kompileringskontroller för att upprätthålla objektets livslängd/ägande, och runtime-kontroller för att säkerställa att minnesåtkomster är giltiga. Denna säkerhet uppnås samtidigt som den ger samma prestanda som C och C++. Rust minskar också behovet av sandboxning, vilket ger utvecklare mer utrymme för att introducera nya funktioner som är säkrare och lättare på resurser.

Även om Rust verkligen har sina fördelar, är det inte möjligt att byta hela Android OS till Rust över natten. Och det kanske inte ens behövs, eftersom de flesta av Androids minnesbuggar uppstår i ny eller nyligen modifierad kod, där cirka 50 % är mindre än ett år gamla. Google anser att dess minnessäkra språkinsatser är bäst inriktade på nyutveckling snarare än att skriva om mogen C- och C++-kod.

Rust fokuserar också på att förebygga buggar snarare än att luta sig tungt på upptäckten av buggar, vilket resulterar i förbättrad korrekthet av koden. Den har flera nyckelfunktioner, såsom minnessäkerhet, datasamtidighet, mer uttrycksfulla system, oföränderlig referenser och variabler som standard, säkrare heltalshantering, bättre felhantering i standardbibliotek och mycket Mer.

Vad betyder bytet till Rust för Android?

Google säger att de har lagt till Rust-stöd till Android Open Source Project under de senaste 18 månaderna. Men att lägga till ett nytt språk till Android-plattformen är ett enormt åtagande. Vissa verktygskedjor och beroenden måste underhållas, testinfrastruktur och verktyg måste uppdateras och utvecklare måste utbildas.

Google har några early adopter-projekt som de kommer att dela under de kommande månaderna. Men ändå görs det klart att skalning av Rust-stöd till mer av operativsystemet är ett flerårigt projekt.

Vad vi kan se använder Google redan Rust på några ställen. Androids nya Bluetooth-stack omskrivning med kodnamnet "Gabeldorsche" skrivs i Rust. Arbetet började med Gabeldorsche runt tiden för Android 11 men är fortfarande inte i användning ännu. Androids Keystore 2.0 modulen är skriven i Rust, och så är användarutrymmesdelen av binder, Androids IPC-drivrutin. Även om det inte är relaterat till Android, Fuchsiaär nytt nätstack skrivs också i Rust.

För apputvecklare ändrar switchen ingenting om hur du som apputvecklare skriver appar eller hur ram-API: erna fungerar. Denna switch påverkar bara hur operativsystemet skrivs. Enligt en medlem av Android Developer Relations-teamet, Google planerar inte heller att släppa en Rust NDK för tillfället. De språk som stöds för apputveckling kommer att fortsätta att vara Kotlin, Java, C och C++.