Som en del af bestræbelserne på at styrke sikkerheden af kritiske softwarekomponenter på platformen Android Google har omskrevet pvmfm-firmwaren i Rust, som bruges til at organisere driften af virtuelle maskiner, der startes af pVM-hypervisoren fra Android Virtualiseringsrammeværk. Tidligere blev firmwaren skrevet i C og implementeret oven på U-Boot bootloader, hvis kode tidligere havde vist sig at indeholde sårbarheder forårsaget af problemer med hukommelsesstyring.
Firmware omskrevet i Rust er inkluderet i pakken Android 14, og de universelle biblioteker, der blev oprettet under firmwareudviklingen, er blevet pakket som crate-pakker og doneret til Rust-fællesskabet. For eksempel er smccc-pakken blevet udgivet for at understøtte ARMs PSCI (Power State Coordination Interface)-grænseflader og SMCCC (SMC Calling Convention)-kald, samt aarch64-paging-pakken til manipulation af hukommelsessidetabeller. Der er også blevet udført arbejde på at rette fejl og udvide funktionaliteten af den eksisterende virtio-drivers-pakke med implementeringen af VirtIO-drivere. Ud over platformen Android De specificerede pakker bruges i Oak-projektet, som udvikler komponenter til transmission, lagring og behandling af data i beskyttede miljøer (TEE, Trusted Execution Environment).
pVM-hypervisoren tager kontrol tidligt i opstartsprocessen og giver fuld hukommelsesisolering. virtuel maskine og værtsmiljøet, hvilket forhindrer værtssystemet i at få adgang til beskyttede virtuelle maskiner, hvor følsomme data behandles. Pvmfm (Protected Virtual Machine Firmware)-firmwaren tager kontrol umiddelbart efter, at den virtuelle maskine starter, verificerer det oprettede miljø og beslutter, om opstarten skal afbrydes, hvis der registreres integritetsproblemer, eller genererer et opstartscertifikat til gæstesystemet, hvis tillidskæden bekræftes.
Refactoring i Rust gør det nemmere og sikrere at overholde "to-reglen", som Google bruger til at opretholde sikkerheden af systemkomponenter. AndroidIfølge denne regel må enhver tilføjet kode opfylde højst to af tre betingelser: håndtering af upålidelige inputdata, brug af et usikkert programmeringssprog (C/C++) og kørsel med forhøjede rettigheder. Denne regel indebærer, at kode til behandling af eksterne data enten skal reduceres til minimumsrettigheder (isoleres) eller skrives i et sikkert programmeringssprog. Ifølge Googles statistikker er cirka 70 % af alle farlige sårbarheder identificeret i Android, forårsaget af fejl ved arbejde med hukommelse.
Rust fokuserer på hukommelsessikkerhed og reducerer risikoen for sårbarheder forårsaget af problemer som use-after-free og bufferoverløb. Rust giver hukommelsessikkerhed ved kompileringstid gennem referencekontrol, sporing af objektejerskab og objektlevetid (scope)-regnskab, samt gennem validering af adgang til runtime-hukommelse. Rust giver også beskyttelse mod heltalsoverløb, kræver, at variabler initialiseres før brug, håndterer fejl i standardbiblioteket bedre, bruger konceptet med uforanderlige referencer og variabler som standard og tilbyder stærk statisk typning for at minimere logiske fejl.
En af de vanskeligheder, man støder på i udviklingen af komponenter på lavt niveau, såsom drivere i Rust, er behovet for at arbejde med nøgne pointere i usikker tilstand, da Rust er designet med øje for brugen af hukommelsen allokeret i programmet, og i kode, der kører uden lag oven på hardwaren, er det nødvendigt at få adgang til delt hukommelse og MMIO. Rusts muligheder for at håndtere nøgne pointere er i øjeblikket dårlige, men dette bør ændre sig, når understøttelsen af offset_of, slice_ptr_get og slice_ptr_len makroerne stabiliseres.
Andre bemærkelsesværdige mangler omfatter behovet for forbedret syntaks til at få adgang til strukturfelter og array-indekser gennem blottede pointere uden at skabe referencer, samt begrænsninger i at skabe sikre wrappers omkring usikre operationer, der kan forårsage udefineret adfærd og ikke kan kontrolleres af compileren. For eksempel kan sådanne bindinger ikke oprettes til operationer med hukommelsessidetabeller, da sidetilknytning i en del af programmet kan påvirke andre dele.
Hvad angår størrelsen på den resulterende kode, optog den gamle version af pVM-firmwaren 220 kB, og den nye 460 kB, men samtidig blev der tilføjet nye funktioner til den omskrevne version, hvilket gjorde det muligt at slippe af med nogle andre komponenter, der blev brugt under indlæsning. Som et resultat viste den samlede størrelse af alle gamle og nye indlæsningskomponenter sig at være sammenlignelig. Det bemærkes, at når størrelse er vigtigere end ydeevne, kan resultater, der er sammenlignelige med C-sproget, opnås ved at aktivere yderligere størrelsesoptimeringstilstande i compileren, fjerne unødvendige afhængigheder og undlade at bruge strengformateringsværktøjer.
Derudover nævnes det fortsættelsen af arbejdet med implementeringen af muligheden for at køre betroede applikationer (Trusted Application) skrevet i Rust-sproget i Trusty-operativsystemet, som leverer et TEE (Trusted Execution Environment) til Android, udført parallelt med Android på den samme processor i et separat, isoleret miljø. Trusty bruges i Pixel-enheder og bruger allerede Rust i biblioteker og systemkomponenter (kernen forbliver i C).
Kilde: opennet.ru
